diff --git a/AUTHORS b/AUTHORS index 7cf996b5..7cb43b9 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -1004,6 +1004,7 @@ Vivek Galatage <vivek.vg@samsung.com> Volker Sorge <volker.sorge@gmail.com> Waihung Fu <fufranci@amazon.com> +Wojciech Bielawski <wojciech.bielawski@gmail.com> Wanming Lin <wanming.lin@intel.com> Wei Li <wei.c.li@intel.com> Wenxiang Qian <leonwxqian@gmail.com>
diff --git a/DEPS b/DEPS index e23f56d6..153d72ea 100644 --- a/DEPS +++ b/DEPS
@@ -175,11 +175,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '6d3bc2951dd61e25752a7370b56880222517654e', + 'skia_revision': 'afbf2aa737c8f0b48dfa28c88c51f56a46d32843', # 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': '26e6018d4793e0419c769e5e76c0f4791a40f204', + 'v8_revision': '1f44ca7be02a46d01e0958142c3b4f11e08a2a69', # 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. @@ -187,11 +187,11 @@ # 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': 'd2de511efbdc5e78423774a32888f0b5d41dc03c', + 'angle_revision': '84323449dfafc97e5b18dcfa6c91602faf7920d6', # 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': '3942f5cbdde7fa79ad27bb13d759d9229752950d', + 'swiftshader_revision': 'bdb6807825ac8479b9dc3fe5fdc58caae294f21b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -238,7 +238,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': '504782cdbabfbe1f6e9042090dafa4fc8e4ecba1', + 'catapult_revision': 'eda150cb220866746a5d3dbd6ea7ce1186a6e264', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -246,7 +246,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '7767e4fa4792344739d65d4a0fdf44e7e074db28', + 'devtools_frontend_revision': '029854ebc99733c84af62356e4d5e408f8ebd127', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -298,11 +298,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. - 'shaderc_revision': 'f175adffa9d2da6ae18a5f8d54e7b5f27df0f1c2', + 'shaderc_revision': '4e3bbd9c5f1a164add8faca83d28f24c960c752c', # 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': 'be73a51136ace05b5c21ab74e14f243616dff298', + 'dawn_revision': 'f526d777e0b378392c0666f4c414072cf64c1007', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -852,7 +852,7 @@ # Build tools for Chrome OS. Note: This depends on third_party/pyelftools. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '6f4de37e7b3206ddd20ef20305a206cc533f4d33', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'ca6b5b7a178116b8f514462b7b8c27bdd7cc4e4c', 'condition': 'checkout_linux', }, @@ -877,7 +877,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '89624cdfd788eb9ea4e632f97ba43f522c57a1d2', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '06c0b50c29e0c9fa3876052363a6eefb643f5af6', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1128,7 +1128,7 @@ }, 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + '104adb2aa3e650ac81d94f1cf0fcbe9f89d039a0', + Var('chromium_git') + '/webm/libvpx.git' + '@' + '1717ac939c12e31a358056a36c2fa7a8882e71ed', 'src/third_party/libwebm/source': Var('chromium_git') + '/webm/libwebm.git' + '@' + '51ca718c3adf0ddedacd7df25fe45f67dc5a9ce1', @@ -1211,7 +1211,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '59b20e348f4dff95941dae02a0dfdd47c8faec5b', + Var('chromium_git') + '/openscreen' + '@' + '9508a74c93b37b13e17c70749883c6790212814b', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '9e97b73e7dd2bfc07745489d728f6a36665c648f', @@ -1228,7 +1228,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'bf277d6ad9242d30b4ee7cc933ac420e644e6cca', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '91aecef3b39e245791203a1c2130ffc2a0ff1c2b', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1306,7 +1306,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': '7YlCgase5GlIanqHn-nZClSlZ5kQETJyVUYRF7Jjy6UC' + 'version': 'lSCFQ4UGjipxIuu1PuSjqToisv4f2egofcYsRJ4_5wsC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1533,7 +1533,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@fb7cf9786cf1b9eb61b127eb780fe9adada33484', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3549e2d6063ca84322e1ab969baa637714b955c7', 'condition': 'checkout_src_internal', },
diff --git a/ash/keyboard/keyboard_controller_impl.cc b/ash/keyboard/keyboard_controller_impl.cc index 3d2a2c5..275d2836 100644 --- a/ash/keyboard/keyboard_controller_impl.cc +++ b/ash/keyboard/keyboard_controller_impl.cc
@@ -183,6 +183,12 @@ keyboard_ui_controller_->SetDraggableArea(bounds); } +bool KeyboardControllerImpl::SetWindowBoundsInScreen( + const gfx::Rect& bounds_in_screen) { + return keyboard_ui_controller_->SetKeyboardWindowBoundsInScreen( + bounds_in_screen); +} + void KeyboardControllerImpl::AddObserver(KeyboardControllerObserver* observer) { observers_.AddObserver(observer); }
diff --git a/ash/keyboard/keyboard_controller_impl.h b/ash/keyboard/keyboard_controller_impl.h index cca487c8..3297d7e0 100644 --- a/ash/keyboard/keyboard_controller_impl.h +++ b/ash/keyboard/keyboard_controller_impl.h
@@ -77,6 +77,7 @@ void SetHitTestBounds(const std::vector<gfx::Rect>& bounds) override; bool SetAreaToRemainOnScreen(const gfx::Rect& bounds) override; void SetDraggableArea(const gfx::Rect& bounds) override; + bool SetWindowBoundsInScreen(const gfx::Rect& bounds_in_screen) override; void AddObserver(KeyboardControllerObserver* observer) override; void RemoveObserver(KeyboardControllerObserver* observer) override;
diff --git a/ash/keyboard/keyboard_controller_impl_unittest.cc b/ash/keyboard/keyboard_controller_impl_unittest.cc index 6ad1cbf..48851e5 100644 --- a/ash/keyboard/keyboard_controller_impl_unittest.cc +++ b/ash/keyboard/keyboard_controller_impl_unittest.cc
@@ -19,6 +19,7 @@ #include "ash/test/ash_test_helper.h" #include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h" #include "base/bind.h" +#include "base/optional.h" #include "base/run_loop.h" #include "base/stl_util.h" #include "base/test/bind_test_util.h" @@ -61,7 +62,8 @@ gfx::Rect AdjustSetBoundsRequest( const gfx::Rect& display_bounds, const gfx::Rect& requested_bounds_in_screen_coords) override { - return gfx::Rect(); + return adjusted_bounds_in_screen_ ? *adjusted_bounds_in_screen_ + : requested_bounds_in_screen_coords; } void SetCanonicalBounds(aura::Window* container, @@ -110,11 +112,16 @@ return area_to_remain_on_screen_; } + void set_adjusted_bounds_in_screen(const gfx::Rect& rect) { + adjusted_bounds_in_screen_ = rect; + } + private: keyboard::ContainerType type_ = keyboard::ContainerType::kFullWidth; gfx::Rect occluded_bounds_; gfx::Rect draggable_area_; gfx::Rect area_to_remain_on_screen_; + base::Optional<gfx::Rect> adjusted_bounds_in_screen_; }; class KeyboardControllerImplTest : public AshTestBase { @@ -363,6 +370,40 @@ EXPECT_EQ(bounds, behavior->area_to_remain_on_screen()); } +TEST_F(KeyboardControllerImplTest, SetWindowBoundsInScreen) { + // Enable the keyboard. + keyboard_controller()->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled); + + // Override the container behavior. + auto scoped_behavior = std::make_unique<TestContainerBehavior>(); + keyboard_ui_controller()->set_container_behavior_for_test( + std::move(scoped_behavior)); + + gfx::Rect bounds(1, 1, 300, 400); + keyboard_controller()->SetWindowBoundsInScreen(bounds); + EXPECT_EQ(bounds, + keyboard_ui_controller()->GetKeyboardWindow()->GetBoundsInScreen()); +} + +TEST_F(KeyboardControllerImplTest, + SetWindowBoundsInScreenShouldRespectAdjustedBounds) { + gfx::Rect adjusted_bounds_in_screen(10, 10, 30, 40); + + // Enable the keyboard. + keyboard_controller()->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled); + + // Override the container behavior. + auto scoped_behavior = std::make_unique<TestContainerBehavior>(); + scoped_behavior->set_adjusted_bounds_in_screen(adjusted_bounds_in_screen); + keyboard_ui_controller()->set_container_behavior_for_test( + std::move(scoped_behavior)); + + gfx::Rect requested_bounds(1, 1, 300, 400); + keyboard_controller()->SetWindowBoundsInScreen(requested_bounds); + EXPECT_EQ(adjusted_bounds_in_screen, + keyboard_ui_controller()->GetKeyboardWindow()->GetBoundsInScreen()); +} + TEST_F(KeyboardControllerImplTest, ChangingSessionRebuildsKeyboard) { // Enable the keyboard. keyboard_controller()->SetEnableFlag(KeyboardEnableFlag::kExtensionEnabled);
diff --git a/ash/keyboard/ui/keyboard_ui_controller.cc b/ash/keyboard/ui/keyboard_ui_controller.cc index 62aa3401..4c3abdb 100644 --- a/ash/keyboard/ui/keyboard_ui_controller.cc +++ b/ash/keyboard/ui/keyboard_ui_controller.cc
@@ -1020,6 +1020,25 @@ return true; } +bool KeyboardUIController::SetKeyboardWindowBoundsInScreen( + const gfx::Rect& bounds_in_screen) { + const display::Display& current_display = + display_util_.GetNearestDisplayToWindow(GetRootWindow()); + + gfx::Rect display_bounds = current_display.bounds(); + if (bounds_in_screen.width() > display_bounds.width() || + bounds_in_screen.height() > display_bounds.height()) { + return false; + } + + gfx::Rect constrained_bounds_in_screen = + AdjustSetBoundsRequest(current_display.bounds(), bounds_in_screen); + + GetKeyboardWindow()->SetBoundsInScreen(constrained_bounds_in_screen, + current_display); + return true; +} + gfx::Rect KeyboardUIController::AdjustSetBoundsRequest( const gfx::Rect& display_bounds, const gfx::Rect& requested_bounds_in_screen) const {
diff --git a/ash/keyboard/ui/keyboard_ui_controller.h b/ash/keyboard/ui/keyboard_ui_controller.h index 979a384..03c73b8 100644 --- a/ash/keyboard/ui/keyboard_ui_controller.h +++ b/ash/keyboard/ui/keyboard_ui_controller.h
@@ -199,6 +199,9 @@ // here are relative to the window's origin. bool SetAreaToRemainOnScreen(const gfx::Rect& bounds_in_window); + // Sets the bounds of the keyboard window in screen coordinates. + bool SetKeyboardWindowBoundsInScreen(const gfx::Rect& bounds_in_screen); + ContainerType GetActiveContainerType() const { return container_behavior_->GetType(); }
diff --git a/ash/keyboard/ui/keyboard_ui_controller_unittest.cc b/ash/keyboard/ui/keyboard_ui_controller_unittest.cc index 8e2eb44..4e06dd0e 100644 --- a/ash/keyboard/ui/keyboard_ui_controller_unittest.cc +++ b/ash/keyboard/ui/keyboard_ui_controller_unittest.cc
@@ -747,6 +747,21 @@ controller().SetAreaToRemainOnScreen(gfx::Rect(50, 50, 400, 600))); } +TEST_F(KeyboardUIControllerTest, + SetWindowBoundsInScreenShouldRejectInvalidBounds) { + ShowKeyboard(); + gfx::Rect root_bounds = root_window()->bounds(); + + EXPECT_FALSE(controller().SetKeyboardWindowBoundsInScreen( + gfx::Rect(0, 0, root_bounds.width() + 1, 100))); + EXPECT_TRUE(controller().SetKeyboardWindowBoundsInScreen( + gfx::Rect(0, 0, root_bounds.width(), 100))); + EXPECT_FALSE(controller().SetKeyboardWindowBoundsInScreen( + gfx::Rect(0, 0, 100, root_bounds.height() + 1))); + EXPECT_TRUE(controller().SetKeyboardWindowBoundsInScreen( + gfx::Rect(0, 0, 100, root_bounds.height()))); +} + class MockKeyboardControllerObserver : public ash::KeyboardControllerObserver { public: MockKeyboardControllerObserver() = default;
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc index 82941877..6e8b09d 100644 --- a/ash/public/cpp/ash_features.cc +++ b/ash/public/cpp/ash_features.cc
@@ -255,7 +255,7 @@ return base::FeatureList::IsEnabled(kSystemTrayMicGainSetting); } -bool IsDisplayIdentificationlEnabled() { +bool IsDisplayIdentificationEnabled() { return base::FeatureList::IsEnabled(kDisplayIdentification); }
diff --git a/ash/public/cpp/ash_features.h b/ash/public/cpp/ash_features.h index be44caf..3e1dab1 100644 --- a/ash/public/cpp/ash_features.h +++ b/ash/public/cpp/ash_features.h
@@ -213,7 +213,7 @@ ASH_PUBLIC_EXPORT bool IsSystemTrayMicGainSettingEnabled(); -ASH_PUBLIC_EXPORT bool IsDisplayIdentificationlEnabled(); +ASH_PUBLIC_EXPORT bool IsDisplayIdentificationEnabled(); // These two functions are supposed to be temporary functions to set or get // whether "WebUITabStrip" feature is enabled from Chrome.
diff --git a/ash/public/cpp/keyboard/keyboard_controller.h b/ash/public/cpp/keyboard/keyboard_controller.h index f72af06..b5d24a901 100644 --- a/ash/public/cpp/keyboard/keyboard_controller.h +++ b/ash/public/cpp/keyboard/keyboard_controller.h
@@ -100,6 +100,9 @@ // Sets the region of the keyboard window that can be used as a drag handle. virtual void SetDraggableArea(const gfx::Rect& bounds) = 0; + // Sets the bounds of the keyboard window in screen coordinates. + virtual bool SetWindowBoundsInScreen(const gfx::Rect& bounds) = 0; + // Adds/removes a KeyboardControllerObserver. virtual void AddObserver(KeyboardControllerObserver* observer) = 0; virtual void RemoveObserver(KeyboardControllerObserver* observer) = 0;
diff --git a/ash/shell.cc b/ash/shell.cc index e9e4940..470e8463 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -1190,7 +1190,7 @@ std::make_unique<MediaNotificationControllerImpl>(); } - if (features::IsDisplayIdentificationlEnabled()) { + if (features::IsDisplayIdentificationEnabled()) { display_highlight_controller_ = std::make_unique<DisplayHighlightController>(); }
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 3a89a43..41c721c 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Meld almal af</translation> <translation id="2277103315734023688">Soek vorentoe</translation> <translation id="2292698582925480719">Vertoonskaal</translation> +<translation id="2295777434187870477">Mikrofoon is aan. Wissel om invoer te demp.</translation> <translation id="2298170939937364391">Volskermvergrootglas is geaktiveer. Druk weer Ctrl+Search+M om dit af te skakel.</translation> <translation id="2302092602801625023">Hierdie rekening word deur Family Link bestuur</translation> <translation id="2303600792989757991">Wissel tussen vensteroorsig</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Klik en sleep</translation> <translation id="2700493154570097719">Stel jou sleutelbord</translation> <translation id="2704781753052663061">Sluit aan by ander Wi-Fi-netwerke</translation> +<translation id="2705001408393684014">Wissel mikrofoon. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Aandbeligting</translation> <translation id="2727977024730340865">By 'n laekrag-laaier ingeprop. Laai van battery is dalk nie betroubaar nie.</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -297,6 +299,7 @@ <translation id="4665114317261903604">Wissel Moenie Steur Nie. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Ontsluit toestel met ouerkode</translation> <translation id="4702647871202761252">Privaatheidskerm is af</translation> +<translation id="4705716602320768426">Dien terugvoer in</translation> <translation id="4710243778082831592">IME-instellings</translation> <translation id="4731797938093519117">Ouertoegang</translation> <translation id="4734965478015604180">Horisontaal</translation> @@ -377,6 +380,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Aan</translation> +<translation id="5920710855273935292">Mikrofoon is gedemp.</translation> <translation id="5947494881799873997">Stel terug</translation> <translation id="595202126637698455">Prestasie-nasporing geaktiveer</translation> <translation id="5957083217255311415">Mobiele data is afgeskakel.</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index bf3aeb1..3647bc4 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">সকলো ছাইন আউট কৰক</translation> <translation id="2277103315734023688">আগলৈ যাওক</translation> <translation id="2292698582925480719">ডিছপ্লে’ৰ স্কে’ল</translation> +<translation id="2295777434187870477">মাইক অন কৰা আছে, ট’গল কৰিলে ইনপুট মিউট হ’ব।</translation> <translation id="2298170939937364391">পূর্ণ স্ক্ৰীনৰ বিৱৰ্ধক সক্ষম কৰা হৈছে। ইয়াক ট’গল অফ কৰিবলৈ আকৌ Ctrl+Search+H টিপক।</translation> <translation id="2302092602801625023">এই একাউণ্টটো পাৰিবাৰিক লিংকৰ দ্বাৰা পৰিচালনা কৰা হয়</translation> <translation id="2303600792989757991">ৱিণ্ড‘ অৱলোকন ট‘গল কৰক</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">ক্লিক কৰি টানি আনক</translation> <translation id="2700493154570097719">আপোনাৰ কীব’র্ড ছেট কৰক</translation> <translation id="2704781753052663061">অন্য ৱাই-ফাই নেটৱৰ্কসমূহত যোগদান কৰক</translation> +<translation id="2705001408393684014">মাইক ট’গল কৰক। <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">ৰাতিৰ পোহৰ</translation> <translation id="2727977024730340865">কম পাৱাৰৰ এটা চাৰ্জাৰত প্লাগ ইন কৰা হৈছে। বেটাৰীৰ চাৰ্জিং বিশ্বাসযোগ্য নহ'বও পাৰে।</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">অসুবিধা নিদিব ট’গল কৰক। <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">অভিভাৱকৰ প্ৰৱেশ ক'ডৰ সহায়ত ডিভাইচ আনলক কৰক</translation> <translation id="4702647871202761252">গোপনীয়তাৰ স্ক্ৰীনখন অফ আছে</translation> +<translation id="4705716602320768426">মতামত ফাইল কৰক</translation> <translation id="4710243778082831592">IME ছেটিংসমূহ</translation> <translation id="4731797938093519117">অভিভাৱকৰ এক্সেছ</translation> <translation id="4734965478015604180">আনুভূমিক</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">অন আছে</translation> +<translation id="5920710855273935292">মাইক মিউট কৰা আছে।</translation> <translation id="5947494881799873997">পূৰ্বাৱস্থালৈ নিয়ক</translation> <translation id="595202126637698455">কার্যদক্ষতা ট্ৰে’চ কৰাটো সক্ষম কৰা হৈছে</translation> <translation id="5957083217255311415">ম’বাইল ডেটা অফ কৰা হৈছে।</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 1bc227f..e938e93 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Изход за всички</translation> <translation id="2277103315734023688">Придвижване напред</translation> <translation id="2292698582925480719">Мащаб на показване</translation> +<translation id="2295777434187870477">Микрофонът е включен. Превключването ще го заглуши.</translation> <translation id="2298170939937364391">Лупата за увеличаване на целия екран е активирана. За да я изключите, натиснете отново Ctrl + клавиша „Търсене“ + M.</translation> <translation id="2302092602801625023">Този профил се управлява от Family Link</translation> <translation id="2303600792989757991">Превключване на общия преглед на прозорците</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Кликване и преместване с плъзгане</translation> <translation id="2700493154570097719">Задайте клавиатура</translation> <translation id="2704781753052663061">Присъединяване към други Wi-Fi мрежи</translation> +<translation id="2705001408393684014">Превключване на микрофона. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Нощно осветление</translation> <translation id="2727977024730340865">Използва се зарядно устройство с малка мощност. Зареждането на батерията може да не е надеждно.</translation> <translation id="2792498699870441125">Alt + търсене</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Превключване на режима „Не безпокойте“. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Отключване на устройството с код на родител</translation> <translation id="4702647871202761252">Екранът за поверителност е изключен</translation> +<translation id="4705716602320768426">Изпращане на отзиви</translation> <translation id="4710243778082831592">Настройки за редактора за метод на въвеждане</translation> <translation id="4731797938093519117">Достъп на родител</translation> <translation id="4734965478015604180">Хоризонтална ориентация</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift + Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Включено</translation> +<translation id="5920710855273935292">Микрофонът е заглушен.</translation> <translation id="5947494881799873997">Възстановяване</translation> <translation id="595202126637698455">Проследяването на ефективността е активирано</translation> <translation id="5957083217255311415">Мобилните данни са изключени.</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 4643cb1..98a365d 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -18,7 +18,7 @@ <translation id="1190609913194133056">বিজ্ঞপ্তি কেন্দ্র</translation> <translation id="1195412055398077112">ওভারস্ক্যান</translation> <translation id="119944043368869598">সব পরিষ্কার করুন</translation> -<translation id="1199716647557067911">আপনি কি সত্যিই সুইচ অ্যাক্সেস ফিচার বন্ধ করতে চান?</translation> +<translation id="1199716647557067911">আপনি কি সত্যিই 'অ্যাক্সেস পাল্টান' ফিচার বন্ধ করতে চান?</translation> <translation id="1247372569136754018">মাইক্রোফোন (অভ্যন্তরীণ)</translation> <translation id="1252999807265626933"><ph name="POWER_SOURCE" /> থেকে চার্জ হচ্ছে</translation> <translation id="1255033239764210633">আবহাওয়া কি রকম?</translation> @@ -432,7 +432,7 @@ <translation id="6537924328260219877">সিগন্যাল: <ph name="SIGNAL_STRENGTH" />, ফোনের ব্যাটারি <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771"><ph name="RECEIVER_NAME" /> এ কাস্ট করা হচ্ছে</translation> <translation id="6559976592393364813">অ্যাডমিনিস্ট্রেটরকে জিজ্ঞাসা করুন</translation> -<translation id="6584550827717945790">সুইচ অ্যাক্সেস ফিচার বন্ধ করুন</translation> +<translation id="6584550827717945790">'অ্যাক্সেস পাল্টান' ফিচার বন্ধ করুন</translation> <translation id="6585808820553845416"><ph name="SESSION_TIME_REMAINING" /> এর মধ্যে সেশন শেষ হয়ে যাবে৷</translation> <translation id="661203523074512333"><ph name="SECURITY_STATUS" />, সিগন্যাল: <ph name="SIGNAL_STRENGTH" />, আপনার অ্যাডমিনিস্ট্রেটর ম্যানেজ করে</translation> <translation id="6614169507485700968">গোপনীয়তা স্ক্রিন চালু করা আছে</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 639e72a25..78e3bcd 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Odjavi se sa svega</translation> <translation id="2277103315734023688">Pomicanje naprijed</translation> <translation id="2292698582925480719">Razmjer prikaza</translation> +<translation id="2295777434187870477">Mikrofon je uključen. Deaktiviranjem će se isključiti unos govora.</translation> <translation id="2298170939937364391">Omogućeno je povećalo cijelog ekrana. Ponovo pritisnite Ctrl+Search+M da ga isključite.</translation> <translation id="2302092602801625023">Ovim računom upravlja Family Link</translation> <translation id="2303600792989757991">Uključivanje/isključivanje pregleda prozora</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Kliknite i prevucite</translation> <translation id="2700493154570097719">Postavite tastaturu</translation> <translation id="2704781753052663061">Pridružite se drugim WiFi mrežama</translation> +<translation id="2705001408393684014">Uključite/isključite mikrofon. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Noćno svjetlo</translation> <translation id="2727977024730340865">Priključeno na niskonaponski punjač. Punjenje baterije može biti nepouzdano.</translation> <translation id="2792498699870441125">Alt + tipka za pretraživanje</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Uključi/isključi način rada Ne ometaj. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Otključajte uređaj pomoću koda roditelja</translation> <translation id="4702647871202761252">Ekran za privatnost je isključen</translation> +<translation id="4705716602320768426">Pošaljite povratne informacije</translation> <translation id="4710243778082831592">Postavke za IME</translation> <translation id="4731797938093519117">Pristup roditelja</translation> <translation id="4734965478015604180">Horizontalno</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift + Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Uključeno</translation> +<translation id="5920710855273935292">Mikrofon je isključen.</translation> <translation id="5947494881799873997">Vrati</translation> <translation id="595202126637698455">Praćenje performansi je omogućeno</translation> <translation id="5957083217255311415">Prijenos podataka na mobilnoj mreži je isključen.</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index e05839d9..05eb70a 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Tanca la sessió de tots els usuaris</translation> <translation id="2277103315734023688">Avança</translation> <translation id="2292698582925480719">Escala de visualització</translation> +<translation id="2295777434187870477">El micròfon està activat. En commutar-lo, se silenciarà l'entrada.</translation> <translation id="2298170939937364391">La lupa de pantalla completa està activada. Torna a prémer Ctrl+Cerca+M per desactivar-la.</translation> <translation id="2302092602801625023">Family Link gestiona aquest compte</translation> <translation id="2303600792989757991">Commuta la visió general de la finestra</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Fes clic i arrossega</translation> <translation id="2700493154570097719">Defineix el teu teclat</translation> <translation id="2704781753052663061">Uneix-te a altres xarxes Wi-Fi</translation> +<translation id="2705001408393684014">Commuta el micròfon. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Llum nocturna</translation> <translation id="2727977024730340865">S'ha connectat a un carregador de baix consum. És possible que la càrrega de la bateria no sigui fiable.</translation> <translation id="2792498699870441125">Alt+Cerca</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Activa o desactiva el mode No molestis. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Desbloqueja el dispositiu amb el codi parental</translation> <translation id="4702647871202761252">La pantalla de privadesa està desactivada</translation> +<translation id="4705716602320768426">Envia suggeriments</translation> <translation id="4710243778082831592">Configuració d'IME</translation> <translation id="4731797938093519117">Accés parental</translation> <translation id="4734965478015604180">Horitzontal</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Maj + Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Activat</translation> +<translation id="5920710855273935292">El micròfon està silenciat.</translation> <translation id="5947494881799873997">Reverteix</translation> <translation id="595202126637698455">Traça del rendiment activada</translation> <translation id="5957083217255311415">Les dades mòbils estan desactivades.</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 587c134..7850ecc 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -18,7 +18,7 @@ <translation id="1190609913194133056">Underretningcenter</translation> <translation id="1195412055398077112">overscan</translation> <translation id="119944043368869598">Ryd alle</translation> -<translation id="1199716647557067911">Er du sikker på, du vil deaktivere kontaktadgang?</translation> +<translation id="1199716647557067911">Er du sikker på, at du vil deaktivere kontaktadgang?</translation> <translation id="1247372569136754018">Mikrofon (indbygget)</translation> <translation id="1252999807265626933">Oplader fra <ph name="POWER_SOURCE" /></translation> <translation id="1255033239764210633">Hvordan er vejret?</translation> @@ -105,6 +105,7 @@ <translation id="2268813581635650749">Log alle ud</translation> <translation id="2277103315734023688">Spol frem</translation> <translation id="2292698582925480719">Visningsskala</translation> +<translation id="2295777434187870477">Mikrofonen er slået til. Hvis du skifter indstilling, kan andre ikke høre dig.</translation> <translation id="2298170939937364391">Forstørrelse af fuld skærm er aktiveret. Tryk på Ctrl+Søg+M igen for at deaktivere funktionen.</translation> <translation id="2302092602801625023">Denne konto administreres af Family Link</translation> <translation id="2303600792989757991">Skift vinduesoversigt</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Klik og træk</translation> <translation id="2700493154570097719">Angiv dit tastatur</translation> <translation id="2704781753052663061">Opret forbindelse til andre Wi-Fi-netværk</translation> +<translation id="2705001408393684014">Slå mikrofon til/fra. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Nattelys</translation> <translation id="2727977024730340865">Tilsluttet en oplader med lav kraft. Batteriopladningen er muligvis ikke pålidelig.</translation> <translation id="2792498699870441125">Alt+Søg</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Slå Forstyr ikke til eller fra. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Lås enheden op med forældrekode</translation> <translation id="4702647871202761252">Privatlivsskærmen er slået fra</translation> +<translation id="4705716602320768426">Giv feedback</translation> <translation id="4710243778082831592">IME-indstillinger</translation> <translation id="4731797938093519117">Forældreadgang</translation> <translation id="4734965478015604180">Vandret</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Til</translation> +<translation id="5920710855273935292">Mikrofonen er slået fra.</translation> <translation id="5947494881799873997">Fortryd</translation> <translation id="595202126637698455">Sporing af ydelsen er aktiveret</translation> <translation id="5957083217255311415">Mobildata er slået fra.</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index b4fb25a2..58ec16c 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Αποσύνδεση όλων</translation> <translation id="2277103315734023688">Αναζήτηση προς τα εμπρός</translation> <translation id="2292698582925480719">Κλίμακα προβολής</translation> +<translation id="2295777434187870477">Το μικρόφωνο είναι ενεργοποιημένο, η εναλλαγή θα ενεργοποιήσει τη σίγαση εισόδου.</translation> <translation id="2298170939937364391">Η Μεγέθυνση πλήρους οθόνης ενεργοποιήθηκε. Πατήστε Ctrl+Search+M ξανά για να τον απενεργοποιήσετε.</translation> <translation id="2302092602801625023">Αυτός ο λογαριασμός είναι διαχειριζόμενος από το Family Link</translation> <translation id="2303600792989757991">Επισκόπηση εναλλαγής παραθύρων</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Κάντε κλικ και σύρετε</translation> <translation id="2700493154570097719">Ρύθμιση του πληκτρολογίου σας</translation> <translation id="2704781753052663061">Σύνδεση σε άλλα δίκτυα Wi-Fi</translation> +<translation id="2705001408393684014">Εναλλαγή μικροφώνου. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Νυχτερινός φωτισμός</translation> <translation id="2727977024730340865">Σύνδεση με φορτιστή χαμηλής ισχύος. Η φόρτιση της μπαταρίας ενδέχεται να μη γίνεται με αξιόπιστο τρόπο.</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Εναλλαγή λειτουργίας Μην ενοχλείτε. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Ξεκλείδωμα συσκευής με κωδικό γονέα</translation> <translation id="4702647871202761252">Η οθόνη απορρήτου είναι απενεργοποιημένη.</translation> +<translation id="4705716602320768426">Υποβολή σχολίων</translation> <translation id="4710243778082831592">Ρυθμίσεις IME</translation> <translation id="4731797938093519117">Γονική πρόσβαση</translation> <translation id="4734965478015604180">Οριζόντια περιστροφή</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Ενεργό</translation> +<translation id="5920710855273935292">Έγινε σίγαση του μικροφώνου</translation> <translation id="5947494881799873997">Επαναφορά</translation> <translation id="595202126637698455">Η παρακολούθηση απόδοσης έχει ενεργοποιηθεί</translation> <translation id="5957083217255311415">Τα δεδομένα κινητής τηλεφωνίας είναι απενεργοποιημένα.</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index f0b2114..76f839b0 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Sign out all</translation> <translation id="2277103315734023688">Seek forwards</translation> <translation id="2292698582925480719">Display scale</translation> +<translation id="2295777434187870477">Mic is on, toggling will mute input.</translation> <translation id="2298170939937364391">Full-screen Magnifier enabled. Press Ctrl+Search+M again to toggle it off.</translation> <translation id="2302092602801625023">This account is managed by Family Link</translation> <translation id="2303600792989757991">Toggle window overview</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Click and drag</translation> <translation id="2700493154570097719">Set your keyboard</translation> <translation id="2704781753052663061">Join other Wi-Fi networks</translation> +<translation id="2705001408393684014">Toggle mic. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Night Light</translation> <translation id="2727977024730340865">Plugged in to a low-power charger. Battery charging may not be reliable.</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Toggle Do Not Disturb. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Unlock device with parent code</translation> <translation id="4702647871202761252">Privacy screen is off</translation> +<translation id="4705716602320768426">File feedback</translation> <translation id="4710243778082831592">IME settings</translation> <translation id="4731797938093519117">Parent access</translation> <translation id="4734965478015604180">Horizontal</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">On</translation> +<translation id="5920710855273935292">Mic is muted.</translation> <translation id="5947494881799873997">Revert</translation> <translation id="595202126637698455">Performance tracing enabled</translation> <translation id="5957083217255311415">Mobile data is turned off.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 9082aca..cdec254 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Odjavi sve</translation> <translation id="2277103315734023688">Traži prema naprijed</translation> <translation id="2292698582925480719">Skala prikaza</translation> +<translation id="2295777434187870477">Mikrofon je uključen, prebacivanjem će se isključiti unos.</translation> <translation id="2298170939937364391">Omogućeno je povećalo za cijeli zaslon. Ponovo pritisnite Ctrl+Search+M da biste ga isključili.</translation> <translation id="2302092602801625023">Tim računom upravlja Family Link</translation> <translation id="2303600792989757991">Prebaci na prozor pregleda</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Klikanje i povlačenje</translation> <translation id="2700493154570097719">Postavite tipkovnicu</translation> <translation id="2704781753052663061">Pridružite se drugim Wi-Fi mrežama</translation> +<translation id="2705001408393684014">Prebacite mikrofon. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Noćno svjetlo</translation> <translation id="2727977024730340865">Uređaj je priključen na punjač male snage. Punjenje baterije možda nije pouzdano.</translation> <translation id="2792498699870441125">Alt + Pretraživanje</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Prebacivanje načina Ne uznemiravaj. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Otključajte uređaj roditeljskim kodom</translation> <translation id="4702647871202761252">Zaslon privatnosti je isključen</translation> +<translation id="4705716602320768426">Pošaljite povratne informacije</translation> <translation id="4710243778082831592">Postavke za IME</translation> <translation id="4731797938093519117">Roditeljski pristup</translation> <translation id="4734965478015604180">Vodoravno</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift + Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Uključi</translation> +<translation id="5920710855273935292">Mikrofon je isključen.</translation> <translation id="5947494881799873997">Vrati</translation> <translation id="595202126637698455">Omogućeno je praćenje izvedbe</translation> <translation id="5957083217255311415">Mobilni su podaci isključeni.</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index f712e17a..7782af1c 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Összes kijelentkeztetése</translation> <translation id="2277103315734023688">Ugrás előre</translation> <translation id="2292698582925480719">Megjelenítés méret</translation> +<translation id="2295777434187870477">A mikrofon be van kapcsolva, a gombra kattintva elnémítja.</translation> <translation id="2298170939937364391">Teljes képernyős nagyító bekapcsolva. A kikapcsoláshoz nyomja le ismét a Ctrl + Keresés + M billentyűparancsot.</translation> <translation id="2302092602801625023">Ezt a fiókot a Family Linkkel kezelik</translation> <translation id="2303600792989757991">Ablakáttekintési mód váltása</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Kattintás és húzás</translation> <translation id="2700493154570097719">Billentyűzetet beállítása</translation> <translation id="2704781753052663061">Csatlakozás másik Wi-Fi-hálózatokhoz</translation> +<translation id="2705001408393684014">Mikrofon be-/kikapcsolása. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Éjszakai fény</translation> <translation id="2727977024730340865">Kis teljesítményű töltőt csatlakoztatott. Az akkumulátor töltése nem megbízható.</translation> <translation id="2792498699870441125">Alt + Keresés</translation> @@ -297,6 +299,7 @@ <translation id="4665114317261903604">A Ne zavarjanak funkció ki- vagy bekapcsolása. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Zárolás feloldása szülői kóddal</translation> <translation id="4702647871202761252">Az adatvédelmi képernyő ki van kapcsolva</translation> +<translation id="4705716602320768426">Visszajelzés küldése</translation> <translation id="4710243778082831592">IME-beállítások</translation> <translation id="4731797938093519117">Szülői hozzáférés</translation> <translation id="4734965478015604180">Vízszintes</translation> @@ -377,6 +380,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Be</translation> +<translation id="5920710855273935292">A mikrofon le van némítva.</translation> <translation id="5947494881799873997">Visszavonás</translation> <translation id="595202126637698455">Teljesítménykövetés engedélyezve</translation> <translation id="5957083217255311415">A mobiladat-kapcsolat ki van kapcsolva.</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 7a46ba7..339f7181 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Դուրս գալ բոլորից</translation> <translation id="2277103315734023688">Առաջ գնալ</translation> <translation id="2292698582925480719">Էկրանի մասշտաբ</translation> +<translation id="2295777434187870477">Խոսափողը միացված է։ Անջատելու համար սեղմեք այս կոճակը։</translation> <translation id="2298170939937364391">Լիաէկրան խոշորացույցը միացավ: Այն անջատելու համար նորից սեղմեք Ctrl+Search+M:</translation> <translation id="2302092602801625023">Այս հաշիվը կառավարվում է Family Link-ի կողմից</translation> <translation id="2303600792989757991">Փոխարկել պատուհանի համատեսքը</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Սեղմել և քաշել</translation> <translation id="2700493154570097719">Ընտրեք ստեղնաշարը</translation> <translation id="2704781753052663061">Միացեք այլ Wi-Fi ցանցերի</translation> +<translation id="2705001408393684014">Միացնել/անջատել խոսափողը։ <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Գիշերային ռեժիմ</translation> <translation id="2727977024730340865">Միացված է թույլ լիցքավորիչի: Մարտկոցի լիցքավորումը կարող է հուսալի չլինել:</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Միացնել/անջատել «Չանհանգստացնել» ռեժիմը։ <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Մուտքագրեք ծնողի մուտքի կոդը</translation> <translation id="4702647871202761252">Գաղտնիության էկրանն անջատված է</translation> +<translation id="4705716602320768426">Հաղորդել վրիպակի մասին</translation> <translation id="4710243778082831592">IME կարգավորումներ</translation> <translation id="4731797938093519117">Ծնողի մուտք</translation> <translation id="4734965478015604180">Հորիզոնական</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Միացնել</translation> +<translation id="5920710855273935292">Խոսափողի ձայնն անջատված է։</translation> <translation id="5947494881799873997">Հետադարձել</translation> <translation id="595202126637698455">Կատարողականության հետագծումը միացված է</translation> <translation id="5957083217255311415">Բջջային ինտերնետն անջատված է:</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index fe81e3a..cd57195 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Skrá alla út</translation> <translation id="2277103315734023688">Spóla áfram</translation> <translation id="2292698582925480719">Skjástærð</translation> +<translation id="2295777434187870477">Kveikt er á hljóðnemanum, ef hnappurinn er valinn verður slökkt á hljóðinntaki.</translation> <translation id="2298170939937364391">Kveikt er á stækkunargleri á öllum skjánum. Ýttu aftur á Ctrl+leitarhnappinn+M til að loka því.</translation> <translation id="2302092602801625023">Þessum reikningi er stjórnað með Family Link</translation> <translation id="2303600792989757991">Víxla gluggayfirliti</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Smella og draga</translation> <translation id="2700493154570097719">Veldu lyklaborð</translation> <translation id="2704781753052663061">Tengjast við önnur Wi-Fi net</translation> +<translation id="2705001408393684014">Kveikja/slökkva á hljóðnema. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Næturljós</translation> <translation id="2727977024730340865">Tengt við afllítið hleðslutæki. Hleðsla rafhlöðunnar kann að vera brigðul.</translation> <translation id="2792498699870441125">Alt+leitarhnappur</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Kveikja/slökkva á „Ónáðið ekki“. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Opna tæki með kóða foreldris</translation> <translation id="4702647871202761252">Slökkt er á persónuverndarskjá</translation> +<translation id="4705716602320768426">Skrá ábendingu</translation> <translation id="4710243778082831592">Stillingar innsláttaraðferðar</translation> <translation id="4731797938093519117">Foreldraaðgangur</translation> <translation id="4734965478015604180">Lárétt</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Kveikt</translation> +<translation id="5920710855273935292">Slökkt er á hljóðnemanum.</translation> <translation id="5947494881799873997">Afturkalla</translation> <translation id="595202126637698455">Kveikt á afkastarakningu</translation> <translation id="5957083217255311415">Slökkt er á farsímagögnum.</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 410eea5..7dbb0da 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Disconnetti tutti</translation> <translation id="2277103315734023688">Vai avanti</translation> <translation id="2292698582925480719">Scala di visualizzazione</translation> +<translation id="2295777434187870477">L'audio del microfono è attivo: la disattivazione impedirà l'ingresso audio.</translation> <translation id="2298170939937364391">Ingrandimento a schermo intero attivato. Premi di nuovo CTRL + tasto per la ricerca + M per disattivarlo.</translation> <translation id="2302092602801625023">Questo account è gestito da Family Link</translation> <translation id="2303600792989757991">Attiva/disattiva panoramica finestra</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Fai clic e trascina</translation> <translation id="2700493154570097719">Imposta la tastiera</translation> <translation id="2704781753052663061">Visualizza altre reti Wi-Fi</translation> +<translation id="2705001408393684014">Attiva/disattiva il microfono. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Luminosità notturna</translation> <translation id="2727977024730340865">Collegato a un caricabatterie a basso consumo. La carica della batteria potrebbe non essere affidabile.</translation> <translation id="2792498699870441125">Alt+tasto per la ricerca</translation> @@ -297,6 +299,7 @@ <translation id="4665114317261903604">Attiva/disattiva Non disturbare. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Sblocca con codice genitore</translation> <translation id="4702647871202761252">Schermata sulla privacy non attiva</translation> +<translation id="4705716602320768426">Invia feedback</translation> <translation id="4710243778082831592">Impostazioni IME</translation> <translation id="4731797938093519117">Accesso genitore</translation> <translation id="4734965478015604180">Orizzontale</translation> @@ -377,6 +380,7 @@ <translation id="5901316534475909376">MAIUSC+ESC</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">On</translation> +<translation id="5920710855273935292">L'audio del microfono è disattivato.</translation> <translation id="5947494881799873997">Ripristina</translation> <translation id="595202126637698455">Rilevamento del rendimento attivo</translation> <translation id="5957083217255311415">I dati mobili non sono attivi.</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 1f73d46..07fd4f24 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">הוצא את כולם</translation> <translation id="2277103315734023688">הרצה קדימה</translation> <translation id="2292698582925480719">קנה המידה של התצוגה</translation> +<translation id="2295777434187870477">המיקרופון פועל. החלפת המצב תשתיק אותו.</translation> <translation id="2298170939937364391">הגדלה של כל המסך הופעלה. כדי להשבית אותה יש להקיש שוב על Ctrl+Search+M.</translation> <translation id="2302092602801625023">החשבון הזה מנוהל באמצעות Family Link</translation> <translation id="2303600792989757991">החלף סקירת חלון</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">לחיצה וגרירה</translation> <translation id="2700493154570097719">בחירת מקלדת</translation> <translation id="2704781753052663061">הצטרפות לרשתות Wi-Fi אחרות</translation> +<translation id="2705001408393684014">החלפת מצב המיקרופון. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">תאורת לילה</translation> <translation id="2727977024730340865">מחובר למטען בעל מתח נמוך. ייתכן שטעינת הסוללה לא תהיה אמינה.</translation> <translation id="2792498699870441125">Alt + חיפוש</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">החלפת מצב 'נא לא להפריע'. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">ביטול נעילת המכשיר באמצעות קוד הורה</translation> <translation id="4702647871202761252">מסך הפרטיות כבוי</translation> +<translation id="4705716602320768426">מילוי משוב</translation> <translation id="4710243778082831592">הגדרות IME</translation> <translation id="4731797938093519117">גישת הורים</translation> <translation id="4734965478015604180">אופקי</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">פועל</translation> +<translation id="5920710855273935292">המיקרופון מושתק.</translation> <translation id="5947494881799873997">חזרה לגרסה הקודמת</translation> <translation id="595202126637698455">מעקב אחר הביצועים מופעל</translation> <translation id="5957083217255311415">חבילת הגלישה מושבתת.</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 33c0362..b665d447 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">ყველას გამოსვლა</translation> <translation id="2277103315734023688">წინ გადახვევა</translation> <translation id="2292698582925480719">ჩვენების მასშტაბი</translation> +<translation id="2295777434187870477">მიკროფონი ჩართულია, გადართვისას აუდიოშეყვანა დადუმდება.</translation> <translation id="2298170939937364391">სრულეკრანიანი ლუპა ჩართულია. გამოსართავად ხელახლა დააჭირეთ კლავიშთა კომბინაციას: Ctrl+Search+M.</translation> <translation id="2302092602801625023">ეს ანგარიში იმართება Family Link-ის მეშვეობით</translation> <translation id="2303600792989757991">ფანჯრის მიმოხილვის გადართვა</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">დაწკაპუნება და ჩავლებით გადატანა</translation> <translation id="2700493154570097719">დააყენეთ კლავიატურა</translation> <translation id="2704781753052663061">სხვა Wi-Fi ქსელებში გაწევრიანება</translation> +<translation id="2705001408393684014">მიკროფონის გადართვა. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">ღამის განათება</translation> <translation id="2727977024730340865">შეერთებულია დაბალი სიმძლავრის დამტენთან. ბატარეის დატენვა შეიძლება არ იყოს სანდო.</translation> <translation id="2792498699870441125">Alt+ძიება</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">„არ შემაწუხოთ“ რეჟიმის გადართვა. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">განბლოკეთ მოწყობილობა მშობლის კოდით</translation> <translation id="4702647871202761252">კონფიდენციალურობის ეკრანი გამორთულია</translation> +<translation id="4705716602320768426">გამოხმაურება</translation> <translation id="4710243778082831592">IME პარამეტრები</translation> <translation id="4731797938093519117">მშობლის წვდომა</translation> <translation id="4734965478015604180">ჰორიზონტალური</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">ჩართვა</translation> +<translation id="5920710855273935292">მიკროფონი დადუმებულია.</translation> <translation id="5947494881799873997">დაბრუნება</translation> <translation id="595202126637698455">ეფექტურობის ტრასირება ჩართულია</translation> <translation id="5957083217255311415">მობილური ინტერნეტი გამორთულია.</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index e02f4cf..fc2399b 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">ລົງຊື່ອອກທັງໝົດ</translation> <translation id="2277103315734023688">ເລື່ອນໄປໜ້າ</translation> <translation id="2292698582925480719">ສະແດງຂະໜາດ</translation> +<translation id="2295777434187870477">ໄມເປີດຢູ່, ການປິດໄມຈະປິດສຽງການປ້ອນຂໍ້ມູນ.</translation> <translation id="2298170939937364391">ເປີດນຳໃຊ້ແວ່ນຂະຫຍາຍເຕັມຈໍແລ້ວ. ກະລຸນາກົດ Ctrl+Search+M ອີກຄັ້ງເພື່ອປິດມັນ.</translation> <translation id="2302092602801625023">ບັນຊີນີ້ຖືກຈັດການໂດຍ Family Link</translation> <translation id="2303600792989757991">ສະຫຼັບແຜນຜັງໜ້າຕ່າງ</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">ຄລິກ ແລ້ວລາກ</translation> <translation id="2700493154570097719">ຕັ້ງຄ່າແປ້ນພິມຂອງທ່ານ</translation> <translation id="2704781753052663061">ເຂົ້າຮ່ວມເຄືອຂ່າຍ Wi-Fi ອື່ນ</translation> +<translation id="2705001408393684014">ເປີດໄມ. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">ແສງກາງຄືນ</translation> <translation id="2727977024730340865">ສຽບໃສ່ເຄື່ອງສາກໄຟຕໍ່າແລ້ວ. ການສາກແບັດເຕີຣີອາດຈະບໍ່ເຊື່ອຖືໄດ້.</translation> <translation id="2792498699870441125">Alt+ຊອກຫາ</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">ປິດເປີດຫ້າມລົບກວນ. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">ປົດລັອກອຸປະກອນດ້ວຍລະຫັດພໍ່ແມ່</translation> <translation id="4702647871202761252">ໜ້າຈໍຄວາມເປັນສ່ວນຕົວປິດຢູ່</translation> +<translation id="4705716602320768426">ຄຳຕິຊົມໄຟລ໌</translation> <translation id="4710243778082831592">ການຕັ້ງຄ່າ IME</translation> <translation id="4731797938093519117">ສິດເຂົ້າເຖິງຂອງພໍ່ແມ່</translation> <translation id="4734965478015604180">ລວງນອນ</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">ເປີດ</translation> +<translation id="5920710855273935292">ໄມປິດສຽງຢູ່.</translation> <translation id="5947494881799873997">ກັບຄືນ</translation> <translation id="595202126637698455">ການຕິດຕາມການປະຕິບັດເປີດໃຊ້ງານແລ້ວ</translation> <translation id="5957083217255311415">ຂໍ້ມູນມືຖືປິດຢູ່.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index b3c7c214..f09efdf 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Atjungti visus</translation> <translation id="2277103315734023688">Prasukti pirmyn</translation> <translation id="2292698582925480719">Ekrano mastelis</translation> +<translation id="2295777434187870477">Mikrofonas įjungtas; perjungiant įvestis bus nutildyta.</translation> <translation id="2298170939937364391">Viso ekrano didinimas įgalintas. Dar kartą paspauskite „Ctrl“ + paieškos klavišą + M, kad išjungtumėte režimą.</translation> <translation id="2302092602801625023">Ši paskyra tvarkoma naudojant „Family Link“</translation> <translation id="2303600792989757991">Perjungti lango apžvalgą</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Spustelėti ir vilkti</translation> <translation id="2700493154570097719">Klaviatūros nustatymas</translation> <translation id="2704781753052663061">Prisijungti prie kitų „Wi-Fi“ tinklų</translation> +<translation id="2705001408393684014">Perjungti mikrofoną. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Nakties šviesa</translation> <translation id="2727977024730340865">Prijungtas mažos galios įkroviklis. Akumuliatoriaus įkrovimas gali būti nepatikimas.</translation> <translation id="2792498699870441125">„Alt“ + paieškos klavišas</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Perjungti netrukdymo režimą. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Atrakinkite įrenginį naudodami tėvų kodą</translation> <translation id="4702647871202761252">Privatumo ekranas išjungtas</translation> +<translation id="4705716602320768426">Pateikti atsiliepimų</translation> <translation id="4710243778082831592">IMRP nustatymai</translation> <translation id="4731797938093519117">Tėvų prieiga</translation> <translation id="4734965478015604180">Horizontaliai</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">„Shift“ + „Esc“</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Įjungta</translation> +<translation id="5920710855273935292">Mikrofonas nutildytas.</translation> <translation id="5947494881799873997">Grąžinti</translation> <translation id="595202126637698455">Įgalintas našumo stebėjimas</translation> <translation id="5957083217255311415">Mobiliojo ryšio duomenys išjungti.</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 92b2db0..a540a01 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Одјави се од сите</translation> <translation id="2277103315734023688">Премотај нанапред</translation> <translation id="2292698582925480719">Приказ на скала</translation> +<translation id="2295777434187870477">Микрофонот е вклучен. Ако смените, ќе се исклучи звукот на влезот.</translation> <translation id="2298170939937364391">Овозможена е лупата за цел екран. Притиснете Ctrl+Search+M повторно за да ја исклучите.</translation> <translation id="2302092602801625023">Оваа сметка е управувана од Family Link</translation> <translation id="2303600792989757991">Префрли преглед во прозорец</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Кликни и повлечи</translation> <translation id="2700493154570097719">Поставете ја вашата тастатура</translation> <translation id="2704781753052663061">Поврзете се на други Wi-Fi мрежи</translation> +<translation id="2705001408393684014">Вклучете/исклучете го микрофонот. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Ноќно светло</translation> <translation id="2727977024730340865">Приклучен на полнач со мало напојување. Полнењето на батеријата може да не е веродостојно.</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -297,6 +299,7 @@ <translation id="4665114317261903604">Вклучи/исклучи „Не вознемирувај“. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Отклучете го уредот со код на родител</translation> <translation id="4702647871202761252">Исклучен е екранот за приватност</translation> +<translation id="4705716602320768426">Испратете повратни информации</translation> <translation id="4710243778082831592">Поставки за IME</translation> <translation id="4731797938093519117">Пристап за родители</translation> <translation id="4734965478015604180">Хоризонтално</translation> @@ -377,6 +380,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Вклучено</translation> +<translation id="5920710855273935292">Звукот на микрофонот е исклучен.</translation> <translation id="5947494881799873997">Врати</translation> <translation id="595202126637698455">Овозможено е следење на изведбата</translation> <translation id="5957083217255311415">Мобилниот интернет е исклучен.</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index a83d711..5e88efce 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Log keluar semua</translation> <translation id="2277103315734023688">Cari Ke Hadapan</translation> <translation id="2292698582925480719">Skala paparan</translation> +<translation id="2295777434187870477">Mikrofon dihidupkan, tindakan menogol akan meredamkan input.</translation> <translation id="2298170939937364391">Penggadang Skrin Penuh didayakan. Tekan Ctrl+Cari+M semula untuk mematikannya.</translation> <translation id="2302092602801625023">Akaun ini diurus oleh Family Link</translation> <translation id="2303600792989757991">Togol gambaran keseluruhan tetingkap</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Klik dan seret</translation> <translation id="2700493154570097719">Tetapkan papan kekunci anda</translation> <translation id="2704781753052663061">Sertai rangkaian Wi-Fi yang lain</translation> +<translation id="2705001408393684014">Togol Mikrofon. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Cahaya Malam</translation> <translation id="2727977024730340865">Dipalamkan pada pengecas berkuasa rendah. Pengecasan bateri mungkin tidak boleh diharapkan.</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -297,6 +299,7 @@ <translation id="4665114317261903604">Togol Jangan ganggu. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Buka kunci peranti menggunakan kod ibu bapa</translation> <translation id="4702647871202761252">Skrin privasi dimatikan</translation> +<translation id="4705716602320768426">Failkan maklum balas</translation> <translation id="4710243778082831592">Tetapan IME</translation> <translation id="4731797938093519117">Akses ibu bapa</translation> <translation id="4734965478015604180">Mendatar</translation> @@ -377,6 +380,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Hidupkan</translation> +<translation id="5920710855273935292">Mikrofon diredamkan.</translation> <translation id="5947494881799873997">Berbalik</translation> <translation id="595202126637698455">Penjejakan prestasi didayakan</translation> <translation id="5957083217255311415">Data mudah alih dimatikan.</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 60022d73..98fc1b9 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">အားလုံး ထွက်</translation> <translation id="2277103315734023688">အရှေ့သို့ ရစ်ရန်</translation> <translation id="2292698582925480719">မြင်ကွင်း စကေး</translation> +<translation id="2295777434187870477">မိုက်ဖွင့်ထားသည်၊ ပိတ်လိုက်ခြင်းဖြင့် အသံတိတ်သွားပါမည်။</translation> <translation id="2298170939937364391">'မျက်နှာပြင်အပြည့် မှန်ဘီလူး' ကို ဖွင့်ထားပါသည်။ ၎င်းကို ပိတ်ရန် Ctrl+Search+M ကို ထပ်နှိပ်ပါ။</translation> <translation id="2302092602801625023">ဤအကောင့်ကို Family Link က ကြီးကြပ်ထားသည်</translation> <translation id="2303600792989757991">ဝင်ဒိုး ခြုံငုံမြင်ရပုံ ကစားကြည့်ခြင်း</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">နှိပ်ပြီး ဖိဆွဲပါ</translation> <translation id="2700493154570097719">သင်၏ ကီးဘုတ်ကို သတ်မှတ်ပါ</translation> <translation id="2704781753052663061">အခြား Wi-Fi ကွန်ရက်များသို့ ချိတ်ဆက်ရန်</translation> +<translation id="2705001408393684014">မိုက်ခလုတ်ကို ပြောင်းပါ။ <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">ညအလင်းရောင်</translation> <translation id="2727977024730340865">ပါဝါနည်းသည့် အားသွင်းကိရိယာသို့ ချိတ်ဆက်ထားသည်။ ဘတ်ထရီအားသွင်းခြင်း အားကိုး၍ရမည် မဟုတ်ပါ။</translation> <translation id="2792498699870441125">Alt+Search</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">'မနှောင့်ယှက်ရ' ဖွင့်/ပိတ်ရန်။ <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">စက်ပစ္စည်းကို မိဘသုံးကုဒ်ဖြင့် ဖွင့်ပါ</translation> <translation id="4702647871202761252">ပုဂ္ဂိုလ်ရေးလုံခြုံမှု ဖန်သားပြင်ကို ပိတ်ထားသည်</translation> +<translation id="4705716602320768426">ဖိုင်အကြံပြုချက်</translation> <translation id="4710243778082831592">IME ဆက်တင်များ</translation> <translation id="4731797938093519117">မိဘ သုံးခွင့်</translation> <translation id="4734965478015604180">အလျားလိုက်</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">ဖွင့်ရန်</translation> +<translation id="5920710855273935292">မိုက်ပိတ်ထားသည်။</translation> <translation id="5947494881799873997">မူလအခြေအနေ ပြန်သွားရန်</translation> <translation id="595202126637698455">ဆောင်ရွက်ချက်များကို ခြေရာခံနေသည်။</translation> <translation id="5957083217255311415">မိုဘိုင်းဒေတာကို ပိတ်ထားပါသည်။</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 2de81fd..0bffb3d 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Iedereen uitloggen</translation> <translation id="2277103315734023688">Vooruit zoeken</translation> <translation id="2292698582925480719">Weergaveschaal</translation> +<translation id="2295777434187870477">Microfoon is ingeschakeld. Als je deze uitzet, wordt de invoer gedempt.</translation> <translation id="2298170939937364391">'Vergrootglas voor volledig scherm' is ingeschakeld. Druk nog een keer op Ctrl+Zoeken+M om dit uit te schakelen.</translation> <translation id="2302092602801625023">Dit account wordt beheerd door Family Link</translation> <translation id="2303600792989757991">Overzicht venster in-/uitschakelen</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Klikken en slepen</translation> <translation id="2700493154570097719">Je toetsenbord instellen</translation> <translation id="2704781753052663061">Verbinden met andere wifi-netwerken</translation> +<translation id="2705001408393684014">Microfoon in-/uitschakelen. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Nachtverlichting</translation> <translation id="2727977024730340865">Aangesloten op een laag-vermogen-lader. Opladen van de batterij mogelijk niet betrouwbaar.</translation> <translation id="2792498699870441125">Alt+Zoeken</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">'Niet storen' in-/uitschakelen. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Apparaat ontgrendelen met oudercode</translation> <translation id="4702647871202761252">Privacyscherm is uitgeschakeld</translation> +<translation id="4705716602320768426">Feedback indienen</translation> <translation id="4710243778082831592">IME-instellingen</translation> <translation id="4731797938093519117">Toegang door ouders</translation> <translation id="4734965478015604180">Horizontaal</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Aan</translation> +<translation id="5920710855273935292">Microfoon is gedempt.</translation> <translation id="5947494881799873997">Terugzetten</translation> <translation id="595202126637698455">Bijhouden van prestaties ingeschakeld</translation> <translation id="5957083217255311415">Mobiele data zijn uitgeschakeld.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 4d591ae..5845c10 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -431,7 +431,7 @@ <translation id="6537924328260219877">Signalstyrke <ph name="SIGNAL_STRENGTH" /> – telefonbatterinivå <ph name="BATTERY_STATUS" /></translation> <translation id="6542521951477560771">Caster til <ph name="RECEIVER_NAME" /></translation> <translation id="6559976592393364813">Spør administratoren</translation> -<translation id="6584550827717945790">Slå av brytertilgangen</translation> +<translation id="6584550827717945790">Slå av brytertilgang</translation> <translation id="6585808820553845416">Økten slutter om <ph name="SESSION_TIME_REMAINING" />.</translation> <translation id="661203523074512333"><ph name="SECURITY_STATUS" /> – signalstyrke <ph name="SIGNAL_STRENGTH" /> – administreres av administratoren din</translation> <translation id="6614169507485700968">Personvernskjermen er på</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index c130a7db..4ed09d166 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Wyloguj wszystkich</translation> <translation id="2277103315734023688">Przewiń do przodu</translation> <translation id="2292698582925480719">Skala wyświetlania</translation> +<translation id="2295777434187870477">Mikrofon jest włączony. Przełączając go, wyciszysz odbierane dźwięki.</translation> <translation id="2298170939937364391">Lupa pełnego ekranu została włączona. Aby ją wyłączyć, naciśnij ponownie Ctrl+Search+M.</translation> <translation id="2302092602801625023">To konto jest zarządzane przez Family Link</translation> <translation id="2303600792989757991">Przełącz widok ogólny okna</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Kliknij i przeciągnij</translation> <translation id="2700493154570097719">Ustaw klawiaturę</translation> <translation id="2704781753052663061">Połącz z innymi sieciami Wi-Fi</translation> +<translation id="2705001408393684014">Przełącz stan mikrofonu. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Podświetlenie nocne</translation> <translation id="2727977024730340865">Podłączono ładowarkę o małej mocy. Ładowanie baterii może być nieprawidłowe.</translation> <translation id="2792498699870441125">Alt+Szukaj</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Włącz lub wyłącz tryb Nie przeszkadzać. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Odblokuj urządzenie kodem rodzica</translation> <translation id="4702647871202761252">Ekran chroniący prywatność jest wyłączony</translation> +<translation id="4705716602320768426">Zgłoś opinię</translation> <translation id="4710243778082831592">Ustawienia IME</translation> <translation id="4731797938093519117">Dostęp rodzica</translation> <translation id="4734965478015604180">Orientacja pozioma</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Włączone</translation> +<translation id="5920710855273935292">Mikrofon jest wyciszony.</translation> <translation id="5947494881799873997">Przywróć</translation> <translation id="595202126637698455">Śledzenie wydajności jest włączone</translation> <translation id="5957083217255311415">Mobilna transmisja danych jest wyłączona.</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 3a898aae..cf45888 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Desconectar todos</translation> <translation id="2277103315734023688">Avançar</translation> <translation id="2292698582925480719">Escala de exibição</translation> +<translation id="2295777434187870477">O microfone está ativado. Alterná-lo silenciará a entrada.</translation> <translation id="2298170939937364391">Lupa de tela cheia ativada. Pressione Ctrl+Pesquisa+M novamente para desativá-la.</translation> <translation id="2302092602801625023">Esta conta é gerenciada pelo Family Link</translation> <translation id="2303600792989757991">Visão geral da janela de alternância</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Clicar e arrastar</translation> <translation id="2700493154570097719">Configurar teclado</translation> <translation id="2704781753052663061">Conectar-se a outras redes Wi-Fi</translation> +<translation id="2705001408393684014">Alternar microfone. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Modo noturno</translation> <translation id="2727977024730340865">Conectado a um carregador de baixa potência. O carregamento da bateria pode não ser confiável.</translation> <translation id="2792498699870441125">Alt + Pesquisar</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Alternar "Não perturbe". <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Desbloquear dispositivo usando o código de pai/mãe</translation> <translation id="4702647871202761252">A tela de privacidade está desativada</translation> +<translation id="4705716602320768426">Feedback do arquivo</translation> <translation id="4710243778082831592">Configurações do IME</translation> <translation id="4731797938093519117">Acesso de pai/mãe</translation> <translation id="4734965478015604180">Horizontal</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Ativado</translation> +<translation id="5920710855273935292">O microfone está desativado.</translation> <translation id="5947494881799873997">Reverter</translation> <translation id="595202126637698455">Rastreamento de desempenho ativado</translation> <translation id="5957083217255311415">Os dados móveis estão desativados.</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index c5b7f3b..e8f5fffc 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Terminar sessão de todos</translation> <translation id="2277103315734023688">Procurar para a frente</translation> <translation id="2292698582925480719">Escala de apresentação</translation> +<translation id="2295777434187870477">O microfone está ativado. Se o desativar, irá desativar a entrada de som.</translation> <translation id="2298170939937364391">Lupa de ecrã inteiro ativada. Prima Ctrl + Pesquisa + M novamente para a desativar.</translation> <translation id="2302092602801625023">Esta conta é gerida pelo Family Link</translation> <translation id="2303600792989757991">Ativar/desativar vista geral das janelas</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Clique e arraste</translation> <translation id="2700493154570097719">Definir o teclado</translation> <translation id="2704781753052663061">Estabelecer ligação a outras redes Wi-Fi</translation> +<translation id="2705001408393684014">Ative/desative o microfone. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Luz noturna</translation> <translation id="2727977024730340865">Ligado a um carregador de baixo consumo. O carregamento da bateria pode não ser fiável.</translation> <translation id="2792498699870441125">Alt + Pesquisar</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Ative/desative o modo Não incomodar. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Desbloquear o dispositivo com o código parental</translation> <translation id="4702647871202761252">O ecrã de privacidade está desligado</translation> +<translation id="4705716602320768426">Enviar comentários</translation> <translation id="4710243778082831592">Definições do IME</translation> <translation id="4731797938093519117">Acesso parental</translation> <translation id="4734965478015604180">Horizontal</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Ativado</translation> +<translation id="5920710855273935292">O som do microfone está desativado.</translation> <translation id="5947494881799873997">Reverter</translation> <translation id="595202126637698455">Rastreio do desempenho ativado</translation> <translation id="5957083217255311415">Os dados móveis estão desativados.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index fe4b621c..4f8c0d8 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Deconectați toți utilizatorii</translation> <translation id="2277103315734023688">Derulează înainte</translation> <translation id="2292698582925480719">Scară afișaj</translation> +<translation id="2295777434187870477">Microfonul este activat. Comutarea îl va dezactiva.</translation> <translation id="2298170939937364391">Lupa de ecran complet este activată. Apasă din nou pe Ctrl + tasta de căutare + M pentru a o dezactiva.</translation> <translation id="2302092602801625023">Acest cont este gestionat de Family Link</translation> <translation id="2303600792989757991">Activați/Dezactivați prezentarea ferestrei</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Dă clic și trage</translation> <translation id="2700493154570097719">Setează tastatura</translation> <translation id="2704781753052663061">Alătură-te altor rețele Wi-Fi</translation> +<translation id="2705001408393684014">Comută microfonul. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Lumină de noapte</translation> <translation id="2727977024730340865">V-ați conectat la un încărcător de putere joasă. Încărcarea bateriei poate fi nesigură.</translation> <translation id="2792498699870441125">Alt+Căutare</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Comută Nu deranja. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Deblochează dispozitivul cu codul părintelui</translation> <translation id="4702647871202761252">Ecranul de confidențialitate este dezactivat</translation> +<translation id="4705716602320768426">Feedback pentru fișiere</translation> <translation id="4710243778082831592">Setări IME</translation> <translation id="4731797938093519117">Acces pentru părinți</translation> <translation id="4734965478015604180">Orizontal</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift + Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Activat</translation> +<translation id="5920710855273935292">Microfonul este dezactivat.</translation> <translation id="5947494881799873997">Reveniți</translation> <translation id="595202126637698455">Urmărirea performanței este activată</translation> <translation id="5957083217255311415">Datele mobile sunt dezactivate.</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 2b85e586..35e01cc0 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">සියල්ලේ ප්රවිෂ්ටයෙන් ඉවත් වන්න</translation> <translation id="2277103315734023688">ඉදිරියට සොයන්න</translation> <translation id="2292698582925480719">සංදර්ශන පරිමාණය</translation> +<translation id="2295777434187870477">මයිකය ක්රියාත්මකයි, ටොගල කිරීම ආදානය නිහඬ කරනු ඇත.</translation> <translation id="2298170939937364391">පූර්ණ තිර විශාලකය සබලයි. එය ක්රියාවිරහිත කිරීම ටොගල කිරීමට නැවත Ctrl+Search+H ඔබන්න.</translation> <translation id="2302092602801625023">මෙම ගිණුම Family Link විසින් කළමනා කෙරේ</translation> <translation id="2303600792989757991">ටොගල් කවුළු සමාලෝචනය</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">ක්ලික් කර අදින්න</translation> <translation id="2700493154570097719">ඔබගේ යතුරු පුවරුව සකසන්න</translation> <translation id="2704781753052663061">වෙනත් Wi-Fi ජාලවලට එක් වන්න</translation> +<translation id="2705001408393684014">මයිකය ටොගල් කරන්න. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">රාත්රී ආලෝකය</translation> <translation id="2727977024730340865">අඩු බල චාජරයකට ප්ලග් ඉන් කර ඇත. බැටරිය චාජ් කිරිම විශ්වාස නැති විය හැක.</translation> <translation id="2792498699870441125">Alt+සෙවීම</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">බාධා නොකරන්න ටොගල් කරන්න. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">මාපිය කේතය සමඟ උපාංගය අඟුලු අරින්න</translation> <translation id="4702647871202761252">පෞද්ගලිකත්ව තිරය අක්රියයි</translation> +<translation id="4705716602320768426">ප්රතිපෝෂණය ගොනු කරන්න</translation> <translation id="4710243778082831592">IME සැකසීම්</translation> <translation id="4731797938093519117">මාපිය ප්රවේශය</translation> <translation id="4734965478015604180">තිරස්</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> <ph name="MAIL" /></translation> <translation id="5916664084637901428">සක්රීය</translation> +<translation id="5920710855273935292">මයිකය නිහඬයි.</translation> <translation id="5947494881799873997">ප්රතිවර්තනය</translation> <translation id="595202126637698455">ක්රියාකරිත්ව හඹායෑම සබල කෙරිණි</translation> <translation id="5957083217255311415">ජංගම දත්ත ක්රියාවිරහිතයි.</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index f2a99626..fd0c68cd 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Odjava vseh</translation> <translation id="2277103315734023688">Išči naprej</translation> <translation id="2292698582925480719">Zaslonsko razmerje</translation> +<translation id="2295777434187870477">Mikrofon je vklopljen; če ga preklopite bo izklopljen vhodni zvok.</translation> <translation id="2298170939937364391">Celozaslonska lupa je omogočena. Če jo želite izklopiti, znova pritisnite Ctrl + tipko za iskanje + M.</translation> <translation id="2302092602801625023">Ta račun upravlja Family Link</translation> <translation id="2303600792989757991">Preklop pregleda okna</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Klikanje in vlečenje</translation> <translation id="2700493154570097719">Nastavitev tipkovnice</translation> <translation id="2704781753052663061">Pridružitev drugih omrežij Wi-Fi</translation> +<translation id="2705001408393684014">Preklop mikrofona. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Nočna svetloba</translation> <translation id="2727977024730340865">Priključen je nizkoenergijski polnilnik. Polnjenje akumulatorja morda ne bo zanesljivo.</translation> <translation id="2792498699870441125">Alt + iskanje</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Preklop načina »ne moti«. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Odklepanje naprave s kodo starša</translation> <translation id="4702647871202761252">Zaslon za zasebnost je izklopljen</translation> +<translation id="4705716602320768426">Pošiljanje povratnih informacij</translation> <translation id="4710243778082831592">Nastavitve UNV-ja</translation> <translation id="4731797938093519117">Starševski dostop</translation> <translation id="4734965478015604180">Vodoravno</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift + Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Vklopljeno</translation> +<translation id="5920710855273935292">Zvok mikrofona je izklopljen.</translation> <translation id="5947494881799873997">Razveljavi</translation> <translation id="595202126637698455">Sledenje učinkovitosti delovanja je omogočeno</translation> <translation id="5957083217255311415">Prenos podatkov v mobilnem omrežju je izklopljen.</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index dc48e959..2b76dfc 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Odjavi sve</translation> <translation id="2277103315734023688">Premotaj unapred</translation> <translation id="2292698582925480719">Razmera prikaza</translation> +<translation id="2295777434187870477">Mikrofon je uključen. Možete da ga isključite pomeranjem prekidača.</translation> <translation id="2298170939937364391">Lupa za ceo ekran je omogućena. Ponovo pritisnite Ctrl + taster za pretragu + M da biste je isključili.</translation> <translation id="2302092602801625023">Ovim nalogom upravlja Family Link</translation> <translation id="2303600792989757991">Uključi/isključi pregled prozora</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Kliknite i prevucite</translation> <translation id="2700493154570097719">Podesite tastaturu</translation> <translation id="2704781753052663061">Pridruži se drugim Wi-Fi mrežama</translation> +<translation id="2705001408393684014">Uključite/isključite mikrofon. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Noćno svetlo</translation> <translation id="2727977024730340865">Uređaj je uključen u punjač male snage. Punjenje baterije možda neće biti pouzdano.</translation> <translation id="2792498699870441125">Alt + taster za pretragu</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Uključite/isključite režim Ne uznemiravaj. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Otključajte uređaj pomoću koda roditelja</translation> <translation id="4702647871202761252">Ekran za privatnost je isključen</translation> +<translation id="4705716602320768426">Pošaljite povratne informacije</translation> <translation id="4710243778082831592">Podešavanja IME-a</translation> <translation id="4731797938093519117">Roditeljski pristup</translation> <translation id="4734965478015604180">Horizontalno</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Uključeno</translation> +<translation id="5920710855273935292">Mikrofon je isključen.</translation> <translation id="5947494881799873997">Vrati</translation> <translation id="595202126637698455">Praćenje učinka je omogućeno</translation> <translation id="5957083217255311415">Mobilni podaci su isključeni.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index e30ac0b..0169083 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Одјави све</translation> <translation id="2277103315734023688">Премотај унапред</translation> <translation id="2292698582925480719">Размера приказа</translation> +<translation id="2295777434187870477">Микрофон је укључен. Можете да га искључите померањем прекидача.</translation> <translation id="2298170939937364391">Лупа за цео екран је омогућена. Поново притисните Ctrl + тастер за претрагу + M да бисте је искључили.</translation> <translation id="2302092602801625023">Овим налогом управља Family Link</translation> <translation id="2303600792989757991">Укључи/искључи преглед прозора</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Кликните и превуците</translation> <translation id="2700493154570097719">Подесите тастатуру</translation> <translation id="2704781753052663061">Придружи се другим Wi-Fi мрежама</translation> +<translation id="2705001408393684014">Укључите/искључите микрофон. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Ноћно светло</translation> <translation id="2727977024730340865">Уређај је укључен у пуњач мале снаге. Пуњење батерије можда неће бити поуздано.</translation> <translation id="2792498699870441125">Alt + тастер за претрагу</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Укључите/искључите режим Не узнемиравај. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Откључајте уређај помоћу кода родитеља</translation> <translation id="4702647871202761252">Екран за приватност је искључен</translation> +<translation id="4705716602320768426">Пошаљите повратне информације</translation> <translation id="4710243778082831592">Подешавања IME-а</translation> <translation id="4731797938093519117">Родитељски приступ</translation> <translation id="4734965478015604180">Хоризонтално</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Укључено</translation> +<translation id="5920710855273935292">Микрофон је искључен.</translation> <translation id="5947494881799873997">Врати</translation> <translation id="595202126637698455">Праћење учинка је омогућено</translation> <translation id="5957083217255311415">Мобилни подаци су искључени.</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index cae61f08..23f2151 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Ondoa wote</translation> <translation id="2277103315734023688">Sogeza Mbele</translation> <translation id="2292698582925480719">Kipimo cha mwonekano</translation> +<translation id="2295777434187870477">Maikrofoni imewasha, ukigeuza swichi utaizima.</translation> <translation id="2298170939937364391">Umewasha Kikuza Skrini Nzima. Bonyeza Ctrl+Search+M tena ili ukizime.</translation> <translation id="2302092602801625023">Akaunti hii inasimamiwa na Family Link</translation> <translation id="2303600792989757991">Geuza muhtasari wa dirisha</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Bofya na uburute</translation> <translation id="2700493154570097719">Weka kibodi yako</translation> <translation id="2704781753052663061">Jiunge kwenye mitandao mingine ya Wi-Fi</translation> +<translation id="2705001408393684014">Washa Maikrofoni. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Mwanga wa Usiku</translation> <translation id="2727977024730340865">Imechomekwa katika chaja ya kawi ya chini. Huenda kuchaji kwa betri hakutakuwa kuzuri.</translation> <translation id="2792498699870441125">Alt + Utafutaji</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Washa/zima 'Usinisumbue'. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Fungua kifaa ukitumia msimbo wa mzazi</translation> <translation id="4702647871202761252">Skrini ya faragha imezimwa</translation> +<translation id="4705716602320768426">Tuma maoni</translation> <translation id="4710243778082831592">Mipangilio ya Programu Inayotambua Mbinu za Kuingiza Data (IME)</translation> <translation id="4731797938093519117">Idhini ya mzazi</translation> <translation id="4734965478015604180">Kimlalo</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Imewashwa</translation> +<translation id="5920710855273935292">Umezima maikrofoni.</translation> <translation id="5947494881799873997">Rejesha</translation> <translation id="595202126637698455">Ufuatiliaji wa utendaji umewashwa</translation> <translation id="5957083217255311415">Data ya mtandao wa simu imezimwa.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 9840699c6..e8e96b7 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">ออกจากระบบทั้งหมด</translation> <translation id="2277103315734023688">ไปข้างหน้า</translation> <translation id="2292698582925480719">ระดับการแสดงผล</translation> +<translation id="2295777434187870477">ไมค์เปิดอยู่ การปิดไมค์จะปิดเสียงการป้อนข้อมูล</translation> <translation id="2298170939937364391">เปิดใช้แว่นขยายทั้งหน้าจอแล้ว กด Ctrl+Search+M อีกครั้งเพื่อสลับเป็นปิด</translation> <translation id="2302092602801625023">บัญชีนี้จัดการโดย Family Link</translation> <translation id="2303600792989757991">ภาพรวมการสลับหน้าต่าง</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">คลิกแล้วลาก</translation> <translation id="2700493154570097719">ตั้งค่าแป้นพิมพ์</translation> <translation id="2704781753052663061">เข้าร่วมเครือข่าย Wi-Fi อื่น</translation> +<translation id="2705001408393684014">เปิด/ปิดไมค์ <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">แสงตอนกลางคืน</translation> <translation id="2727977024730340865">เสียบอยู่กับที่ชาร์จพลังงานต่ำ การชาร์จแบตเตอรี่อาจไม่น่าเชื่อถือ</translation> <translation id="2792498699870441125">Alt+ค้นหา</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">เปิด/ปิด "ห้ามรบกวน" <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">ปลดล็อกอุปกรณ์ด้วยรหัสของผู้ปกครอง</translation> <translation id="4702647871202761252">หน้าจอส่วนตัวปิดอยู่</translation> +<translation id="4705716602320768426">ความคิดเห็นเกี่ยวกับไฟล์</translation> <translation id="4710243778082831592">การตั้งค่า IME</translation> <translation id="4731797938093519117">การเข้าถึงของผู้ปกครอง</translation> <translation id="4734965478015604180">แนวนอน</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">เปิด</translation> +<translation id="5920710855273935292">ปิดเสียงไมค์อยู่</translation> <translation id="5947494881799873997">ย้อนกลับ</translation> <translation id="595202126637698455">เปิดใช้งานการติดตามการปฏิบัติงานแล้ว</translation> <translation id="5957083217255311415">เน็ตมือถือปิดอยู่</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index f21b862..86b7c92 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Вийти з усіх облікових записів</translation> <translation id="2277103315734023688">Перейти вперед</translation> <translation id="2292698582925480719">Масштаб дисплея</translation> +<translation id="2295777434187870477">Мікрофон увімкнено. Його можна вимкнути за допомогою перемикача.</translation> <translation id="2298170939937364391">Увімкнено повноекранну лупу. Щоб вимкнути її, знову натисніть комбінацію Ctrl + клавіша пошуку + M.</translation> <translation id="2302092602801625023">Цим обліковим записом керують через Family Link</translation> <translation id="2303600792989757991">Увімкнення чи вимкнення вікна перегляду</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Натиснути й перетягнути</translation> <translation id="2700493154570097719">Вибрати клавіатуру</translation> <translation id="2704781753052663061">Підключитися до інших мереж Wi-Fi</translation> +<translation id="2705001408393684014">Перемикач мікрофона. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Нічний режим</translation> <translation id="2727977024730340865">Підключено до зарядного пристрою низької потужності. Акумулятор може заряджатися неналежним чином.</translation> <translation id="2792498699870441125">Alt+клавіша пошуку</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Увімкнути/вимкнути режим "Не турбувати". <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Введіть код доступу батьків</translation> <translation id="4702647871202761252">Екран конфіденційності вимкнено</translation> +<translation id="4705716602320768426">Надіслати відгук</translation> <translation id="4710243778082831592">Налаштування IME</translation> <translation id="4731797938093519117">Батьківський доступ</translation> <translation id="4734965478015604180">Горизонтально</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Увімкнути</translation> +<translation id="5920710855273935292">Мікрофон вимкнено.</translation> <translation id="5947494881799873997">Повернути</translation> <translation id="595202126637698455">Відстеження ефективності ввімкнено</translation> <translation id="5957083217255311415">Мобільне передавання даних вимкнено.</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index fb0fc2b..a640764 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Hammani tizimdan chiqarish</translation> <translation id="2277103315734023688">Oldinga o‘tkazish</translation> <translation id="2292698582925480719">Ekran ko‘lami</translation> +<translation id="2295777434187870477">Yoniq, ustiga bosish orqali ovoz qilish mumkin.</translation> <translation id="2298170939937364391">Butun ekran rejimidagi lupa yoniq. Uni olib tashlash uchun Ctrl+Qidiruv+M tugmalarini bosing.</translation> <translation id="2302092602801625023">Ushbu hisob Family Link orqali boshqariladi</translation> <translation id="2303600792989757991">Ko‘rish rejimiga almashtirish</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Bosib torting</translation> <translation id="2700493154570097719">Klaviaturani tanlash</translation> <translation id="2704781753052663061">Boshqa Wi-Fi tarmoqlarga ulanish</translation> +<translation id="2705001408393684014">Mikrofon: <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Tungi rejim</translation> <translation id="2727977024730340865">Kam quvvatli zaryadlash vositasi ulanildi. Quvvatlantirishda muammolar bo‘lishi mumkin.</translation> <translation id="2792498699870441125">Alt + Search</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">“Bezovta qilinmasin” tugmasi. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Ota-ona kodi bilan qurilmani qulfdan chiqarish</translation> <translation id="4702647871202761252">Maxfiylik ekrani yoniq emas</translation> +<translation id="4705716602320768426">Fikr-mulohaza yuborish</translation> <translation id="4710243778082831592">IME sozlamalari</translation> <translation id="4731797938093519117">Ota-ona kirishi</translation> <translation id="4734965478015604180">Gorizontal</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift + Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Yoniq</translation> +<translation id="5920710855273935292">Ovozsiz.</translation> <translation id="5947494881799873997">Bekor qilish</translation> <translation id="595202126637698455">Unumdorlik kuzatuvi yoniq</translation> <translation id="5957083217255311415">Mobil internet yoqilmagan.</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index c9075fe..4bd09ae 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -105,6 +105,7 @@ <translation id="2268813581635650749">Phuma ngemvume kuwo wonke</translation> <translation id="2277103315734023688">Funela phambili</translation> <translation id="2292698582925480719">Isikala sokubonisa</translation> +<translation id="2295777434187870477">I-mic ivuliwe, ukuguqula kuzothulisa okokufaka.</translation> <translation id="2298170939937364391">Isikhulisis sesikrini esigcwele sinikwe amandla. Cindzela u-Ctrl+Search+M futhi ukuze uyivale.</translation> <translation id="2302092602801625023">Le akhawunti iphethwe i-Family Link</translation> <translation id="2303600792989757991">Shintsha ukuhlola kuqala iwindi</translation> @@ -138,6 +139,7 @@ <translation id="2658778018866295321">Chofoza uphinde uhudule</translation> <translation id="2700493154570097719">Setha ikhibhodi yakho</translation> <translation id="2704781753052663061">Joyina amanye amanethiwekhi we-Wi-Fi</translation> +<translation id="2705001408393684014">Guqula i-Mic. <ph name="STATE_TEXT" /></translation> <translation id="2718395828230677721">Ukukhanya kwasebusuku</translation> <translation id="2727977024730340865">Ixhunye kushaja yamandla aphansi. Ukushaja ibhethri kungenzeka kungathembeki.</translation> <translation id="2792498699870441125">I-Alt+Search</translation> @@ -296,6 +298,7 @@ <translation id="4665114317261903604">Shintsha okuthi ungaphazamisi. <ph name="STATE_TEXT" /></translation> <translation id="4696813013609194136">Vula idivayisi ngekhodi yomzali</translation> <translation id="4702647871202761252">Isikrini sobumfihlo sivaliwe</translation> +<translation id="4705716602320768426">Impendulo yefayela</translation> <translation id="4710243778082831592">Izilungiselelo ze-IME</translation> <translation id="4731797938093519117">Ukufinyelela komzali</translation> <translation id="4734965478015604180">Okuvundlile</translation> @@ -376,6 +379,7 @@ <translation id="5901316534475909376">Shift+Esc</translation> <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation> <translation id="5916664084637901428">Vuliwe</translation> +<translation id="5920710855273935292">I-mic ithulisiwe.</translation> <translation id="5947494881799873997">Buyela</translation> <translation id="595202126637698455">Ukulandelela ukusebenza kunikwe amandla</translation> <translation id="5957083217255311415">Idatha yeselula ivaliwe.</translation>
diff --git a/base/BUILD.gn b/base/BUILD.gn index 8df68ae8..c2245a9e 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -2291,6 +2291,7 @@ "message_loop/message_pump_perftest.cc", "observer_list_perftest.cc", "strings/string_util_perftest.cc", + "task/job_perftest.cc", "task/sequence_manager/sequence_manager_perftest.cc", "task/thread_pool/thread_pool_perftest.cc", "threading/thread_local_storage_perftest.cc",
diff --git a/base/task/job_perftest.cc b/base/task/job_perftest.cc new file mode 100644 index 0000000..2e6782a --- /dev/null +++ b/base/task/job_perftest.cc
@@ -0,0 +1,388 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <stddef.h> +#include <atomic> +#include <utility> +#include <vector> + +#include "base/bind_helpers.h" +#include "base/containers/queue.h" +#include "base/containers/stack.h" +#include "base/optional.h" +#include "base/synchronization/lock.h" +#include "base/task/post_job.h" +#include "base/task/post_task.h" +#include "base/test/bind_test_util.h" +#include "base/test/task_environment.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/perf/perf_test.h" + +namespace base { + +namespace { + +// A thread-safe data structure that generates heuristic starting points in a +// range to process items in parallel. +// Note: we could expose this atomic-binary-search-index-generator in +// //base/util if it's useful for real-world use cases. +class IndexGenerator { + public: + explicit IndexGenerator(size_t size) : size_(size) { + AutoLock auto_lock(lock_); + pending_indices_.push(0); + ranges_to_split_.push({0, size_}); + } + + Optional<size_t> GetNext() { + AutoLock auto_lock(lock_); + if (!pending_indices_.empty()) { + // Return any pending index first. + auto index = pending_indices_.top(); + pending_indices_.pop(); + return index; + } + if (ranges_to_split_.empty()) + return nullopt; + + // Split the oldest running range in 2 and return the middle index as + // starting point. + auto range = ranges_to_split_.front(); + ranges_to_split_.pop(); + size_t size = range.second - range.first; + size_t mid = range.first + size / 2; + // Both sides of the range are added to |ranges_to_split_| so they may be + // further split if possible. + if (mid - range.first > 1) + ranges_to_split_.push({range.first, mid}); + if (range.second - mid > 1) + ranges_to_split_.push({mid, range.second}); + return mid; + } + + void GiveBack(size_t index) { + AutoLock auto_lock(lock_); + // Add |index| to pending indices so GetNext() may return it before anything + // else. + pending_indices_.push(index); + } + + private: + base::Lock lock_; + // Pending indices that are ready to be handed out, prioritized over + // |pending_ranges_| when non-empty. + base::stack<size_t> pending_indices_ GUARDED_BY(lock_); + // Pending [start, end] (exclusive) ranges to split and hand out indices from. + base::queue<std::pair<size_t, size_t>> ranges_to_split_ GUARDED_BY(lock_); + const size_t size_; + + DISALLOW_COPY_AND_ASSIGN(IndexGenerator); +}; + +struct WorkItem { + std::atomic_bool acquire{false}; + + bool TryAcquire() { + // memory_order_relaxed is sufficient as the WorkItem's state itself hasn't + // been modified since the beginning of its associated job. This is only + // atomically acquiring the right to work on it. + return acquire.exchange(true, std::memory_order_relaxed) == false; + } +}; + +class WorkList { + public: + WorkList(size_t num_work_items, RepeatingCallback<void(size_t)> process_item) + : num_incomplete_items_(num_work_items), + items_(num_work_items), + process_item_(std::move(process_item)) {} + + // Acquires work item at |index|. Returns true if successful, or false if the + // item was already acquired. + bool TryAcquire(size_t index) { return items_[index].TryAcquire(); } + + // Processes work item at |index|. Returns true if there are more work items + // to process, or false if all items were processed. + bool ProcessWorkItem(size_t index) { + process_item_.Run(index); + return num_incomplete_items_.fetch_sub(1, std::memory_order_relaxed) > 1; + } + + size_t NumIncompleteWorkItems() const { + // memory_order_relaxed is sufficient since this is not synchronized with + // other state. + return num_incomplete_items_.load(std::memory_order_relaxed); + } + + size_t NumWorkItems() const { return items_.size(); } + + private: + std::atomic_size_t num_incomplete_items_; + std::vector<WorkItem> items_; + RepeatingCallback<void(size_t)> process_item_; + + DISALLOW_COPY_AND_ASSIGN(WorkList); +}; + +RepeatingCallback<void(size_t)> BusyWaitCallback(TimeDelta delta) { + return base::BindRepeating( + [](base::TimeDelta duration, size_t index) { + const base::TimeTicks end_time = base::TimeTicks::Now() + duration; + while (base::TimeTicks::Now() < end_time) + ; + }, + delta); +} + +// Posts |task_count| no-op tasks every |delay|. +void DisruptivePostTasks(size_t task_count, TimeDelta delay) { + for (size_t i = 0; i < task_count; ++i) { + PostTask(FROM_HERE, {ThreadPool(), TaskPriority::USER_BLOCKING}, + DoNothing()); + } + PostDelayedTask(FROM_HERE, {ThreadPool(), TaskPriority::USER_BLOCKING}, + BindOnce(&DisruptivePostTasks, task_count, delay), delay); +} + +class JobPerfTest : public testing::Test { + public: + JobPerfTest() = default; + + // Process |num_work_items| items with |process_item| in parallel. Work is + // assigned by having each worker sequentially traversing all items and + // acquiring unvisited ones. + void RunJobWithNaiveAssignment(const std::string& trace, + size_t num_work_items, + RepeatingCallback<void(size_t)> process_item) { + WorkList work_list(num_work_items, std::move(process_item)); + + const TimeTicks job_run_start = TimeTicks::Now(); + + WaitableEvent complete; + auto handle = PostJob(FROM_HERE, {TaskPriority::USER_VISIBLE}, + BindRepeating( + [](WorkList* work_list, WaitableEvent* complete, + JobDelegate* delegate) { + for (size_t i = 0; + i < work_list->NumWorkItems() && + work_list->NumIncompleteWorkItems() != 0 && + !delegate->ShouldYield(); + ++i) { + if (!work_list->TryAcquire(i)) + continue; + if (!work_list->ProcessWorkItem(i)) { + complete->Signal(); + return; + } + } + }, + Unretained(&work_list), Unretained(&complete)), + BindRepeating(&WorkList::NumIncompleteWorkItems, + Unretained(&work_list))); + + complete.Wait(); + handle.Join(); + const TimeDelta job_duration = TimeTicks::Now() - job_run_start; + EXPECT_EQ(0U, work_list.NumIncompleteWorkItems()); + perf_test::PrintResult( + "Work throughput", "", trace, + size_t(num_work_items / job_duration.InMilliseconds()), "tasks/ms", + true); + } + + // Process |num_work_items| items with |process_item| in parallel. Work is + // assigned dynamically having each new worker given a different point far + // from other workers until all work is done. This is achieved by recursively + // splitting each range that was previously given in half. + void RunJobWithDynamicAssignment(const std::string& trace, + size_t num_work_items, + RepeatingCallback<void(size_t)> process_item, + bool disruptive_post_tasks = false) { + WorkList work_list(num_work_items, std::move(process_item)); + IndexGenerator generator(num_work_items); + + // Post extra tasks to disrupt Job execution and cause workers to yield. + if (disruptive_post_tasks) + DisruptivePostTasks(10, TimeDelta::FromMilliseconds(1)); + + const TimeTicks job_run_start = TimeTicks::Now(); + + WaitableEvent complete; + auto handle = PostJob( + FROM_HERE, {TaskPriority::USER_VISIBLE}, + BindRepeating( + [](IndexGenerator* generator, WorkList* work_list, + WaitableEvent* complete, JobDelegate* delegate) { + while (work_list->NumIncompleteWorkItems() != 0 && + !delegate->ShouldYield()) { + Optional<size_t> index = generator->GetNext(); + if (!index) + return; + for (size_t i = *index; i < work_list->NumWorkItems(); ++i) { + if (delegate->ShouldYield()) { + generator->GiveBack(i); + return; + } + if (!work_list->TryAcquire(i)) { + // If this was touched already, get a new starting point. + break; + } + if (!work_list->ProcessWorkItem(i)) { + complete->Signal(); + return; + } + } + } + }, + Unretained(&generator), Unretained(&work_list), + Unretained(&complete)), + BindRepeating(&WorkList::NumIncompleteWorkItems, + Unretained(&work_list))); + + complete.Wait(); + handle.Join(); + const TimeDelta job_duration = TimeTicks::Now() - job_run_start; + EXPECT_EQ(0U, work_list.NumIncompleteWorkItems()); + perf_test::PrintResult( + "Work throughput", "", trace, + size_t(num_work_items / job_duration.InMilliseconds()), "tasks/ms", + true); + } + + // Process |num_work_items| items with |process_item| in parallel. Work is + // assigned having each new worker given a different starting point far from + // other workers and loop over all work items from there. This is achieved by + // recursively splitting each range that was previously given in half. + void RunJobWithLoopAround(const std::string& trace, + size_t num_work_items, + RepeatingCallback<void(size_t)> process_item, + bool disruptive_post_tasks = false) { + WorkList work_list(num_work_items, std::move(process_item)); + IndexGenerator generator(num_work_items); + + // Post extra tasks to disrupt Job execution and cause workers to yield. + if (disruptive_post_tasks) + DisruptivePostTasks(10, TimeDelta::FromMilliseconds(1)); + + const TimeTicks job_run_start = TimeTicks::Now(); + + WaitableEvent complete; + auto handle = + PostJob(FROM_HERE, {TaskPriority::USER_VISIBLE}, + BindRepeating( + [](IndexGenerator* generator, WorkList* work_list, + WaitableEvent* complete, JobDelegate* delegate) { + Optional<size_t> index = generator->GetNext(); + if (!index) + return; + size_t i = *index; + while (true) { + if (delegate->ShouldYield()) { + generator->GiveBack(i); + return; + } + if (!work_list->TryAcquire(i)) { + // If this was touched already, skip. + continue; + } + if (!work_list->ProcessWorkItem(i)) { + // This will cause the loop to exit if there's no work + // left. + complete->Signal(); + return; + } + ++i; + if (i == work_list->NumWorkItems()) + i = 0; + } + }, + Unretained(&generator), Unretained(&work_list), + Unretained(&complete)), + BindRepeating(&WorkList::NumIncompleteWorkItems, + Unretained(&work_list))); + + complete.Wait(); + handle.Join(); + const TimeDelta job_duration = TimeTicks::Now() - job_run_start; + EXPECT_EQ(0U, work_list.NumIncompleteWorkItems()); + perf_test::PrintResult( + "Work throughput", "", trace, + size_t(num_work_items / job_duration.InMilliseconds()), "tasks/ms", + true); + } + + private: + test::TaskEnvironment task_environment; + + DISALLOW_COPY_AND_ASSIGN(JobPerfTest); +}; + +} // namespace + +// The perftest implements the following assignment strategy: +// - Naive: See RunJobWithNaiveAssignment(). +// - Dynamic: See RunJobWithDynamicAssignment(). +// - Loop around: See RunJobWithLoopAround(). +// The following test setups exists for different strategies, although +// not every combination is performed: +// - No-op: Work items are no-op tasks. +// - No-op + disrupted: 10 disruptive tasks are posted every 1ms. +// - Busy wait: Work items are busy wait for 5us. +// - Busy wait + disrupted + +TEST_F(JobPerfTest, NoOpWorkNaiveAssignment) { + RunJobWithNaiveAssignment("No-Op naive", 10000000, DoNothing()); +} + +TEST_F(JobPerfTest, BusyWaitNaiveAssignment) { + RepeatingCallback<void(size_t)> callback = + BusyWaitCallback(TimeDelta::FromMicroseconds(5)); + RunJobWithNaiveAssignment("BusyWait naive", 500000, std::move(callback)); +} + +TEST_F(JobPerfTest, NoOpWorkDynamicAssignment) { + RunJobWithDynamicAssignment("No-Op dynamic", 10000000, DoNothing()); +} + +TEST_F(JobPerfTest, NoOpDisruptedWorkDynamicAssignment) { + RunJobWithDynamicAssignment("No-Op dynamic disrupted", 10000000, DoNothing(), + true); +} + +TEST_F(JobPerfTest, BusyWaitWorkDynamicAssignment) { + RepeatingCallback<void(size_t)> callback = + BusyWaitCallback(TimeDelta::FromMicroseconds(5)); + RunJobWithDynamicAssignment("BusyWait dynamic", 500000, std::move(callback)); +} + +TEST_F(JobPerfTest, BusyWaitDisruptedWorkDynamicAssignment) { + RepeatingCallback<void(size_t)> callback = + BusyWaitCallback(TimeDelta::FromMicroseconds(5)); + RunJobWithDynamicAssignment("BusyWait dynamic disrupted", 500000, + std::move(callback), true); +} + +TEST_F(JobPerfTest, NoOpWorkLoopAround) { + RunJobWithLoopAround("No-Op loop around", 10000000, DoNothing()); +} + +TEST_F(JobPerfTest, NoOpDisruptedWorkLoopAround) { + RunJobWithLoopAround("No-Op loop around disrupted", 10000000, DoNothing(), + true); +} + +TEST_F(JobPerfTest, BusyWaitWorkLoopAround) { + RepeatingCallback<void(size_t)> callback = + BusyWaitCallback(TimeDelta::FromMicroseconds(5)); + RunJobWithLoopAround("BusyWait loop around", 500000, std::move(callback)); +} + +TEST_F(JobPerfTest, BusyWaitDisruptedWorkLoopAround) { + RepeatingCallback<void(size_t)> callback = + BusyWaitCallback(TimeDelta::FromMicroseconds(5)); + RunJobWithLoopAround("BusyWait loop around disrupted", 500000, + std::move(callback), true); +} + +} // namespace base
diff --git a/build/config/chromecast_build.gni b/build/config/chromecast_build.gni index 0dc6ec0..97304c3 100644 --- a/build/config/chromecast_build.gni +++ b/build/config/chromecast_build.gni
@@ -49,7 +49,7 @@ # Configures media options for cast. See media/media_options.gni cast_mojo_media_services = [] -cast_mojo_media_host = "none" +cast_mojo_media_host = "" if (enable_cast_renderer) { # In this path, mojo media services are hosted in two processes:
diff --git a/cc/input/scrollbar_controller.cc b/cc/input/scrollbar_controller.cc index b4d2ef53..56ceda2 100644 --- a/cc/input/scrollbar_controller.cc +++ b/cc/input/scrollbar_controller.cc
@@ -34,21 +34,6 @@ RecomputeAutoscrollStateIfNeeded(); } -gfx::Vector2dF ScrollbarController::GetThumbRelativePoint( - const ScrollbarLayerImplBase* scrollbar, - const gfx::PointF position_in_widget) { - bool clipped; - const gfx::PointF position_in_layer = - GetScrollbarRelativePosition(scrollbar, position_in_widget, &clipped); - - if (clipped) - return gfx::Vector2d(0, 0); - - const gfx::RectF thumb_rect(scrollbar->ComputeThumbQuadRect()); - DCHECK(thumb_rect.Contains(position_in_layer)); - return position_in_layer - gfx::PointF(thumb_rect.origin()); -} - // Retrieves the ScrollbarLayerImplBase corresponding to the stashed ElementId. ScrollbarLayerImplBase* ScrollbarController::ScrollbarLayer() { if (!captured_scrollbar_metadata_.has_value()) @@ -111,8 +96,7 @@ scroll_result.scroll_units = Granularity(scrollbar_part, shift_modifier); if (scrollbar_part == ScrollbarPart::THUMB) { drag_state_ = DragState(); - drag_state_->anchor_relative_to_thumb_ = - GetThumbRelativePoint(scrollbar, position_in_widget); + drag_state_->drag_origin = position_in_widget; // Record the current scroller offset. This will be needed to snap the // thumb back to its original position if the pointer moves too far away @@ -249,69 +233,23 @@ return delta * GetScrollerToScrollbarRatio(scrollbar); } -gfx::ScrollOffset ScrollbarController::GetScrollOffsetForDragPosition( +gfx::ScrollOffset ScrollbarController::GetScrollDeltaForDragPosition( const ScrollbarLayerImplBase* scrollbar, const gfx::PointF pointer_position_in_widget) { - layer_tree_host_impl_->active_tree()->UpdateScrollbarGeometries(); - - if (SnapToDragOrigin(scrollbar, pointer_position_in_widget)) { - const float delta = - scrollbar->current_pos() - drag_state_->scroll_position_at_start_; - return scrollbar->orientation() == ScrollbarOrientation::VERTICAL - ? gfx::ScrollOffset(0, -delta) - : gfx::ScrollOffset(-delta, 0); - } - - const gfx::Rect thumb_rect(scrollbar->ComputeThumbQuadRect()); - const gfx::PointF drag_position_relative_to_layer = - gfx::PointF(thumb_rect.origin()) + drag_state_->anchor_relative_to_thumb_; - - bool clipped = false; - const gfx::PointF pointer_position_in_layer = GetScrollbarRelativePosition( - scrollbar, pointer_position_in_widget, &clipped); - - if (clipped) - return gfx::ScrollOffset(0, 0); - - // Calculate the delta based on the previously known thumb drag point. - const gfx::Vector2dF pointer_delta = - pointer_position_in_layer - drag_position_relative_to_layer; - - float scaled_scroller_to_scrollbar_ratio = - GetScrollerToScrollbarRatio(scrollbar); - float current_scroll_position = scrollbar->current_pos(); - - // Thumb position needs to be floored and Values between 0 and 1 are rounded - // to one to match main thread per pixel behavior. Corresponding main thread - // code in ScrollbarTheme::ThumbPosition - float thumb_position = std::max(0.0f, current_scroll_position) / - scaled_scroller_to_scrollbar_ratio; - thumb_position = (thumb_position < 1.0 && thumb_position > 0.0) - ? 1.0 - : floorf(thumb_position); - - float delta_in_orientation = + const float pointer_delta = scrollbar->orientation() == ScrollbarOrientation::VERTICAL - ? pointer_delta.y() - : pointer_delta.x(); + ? pointer_position_in_widget.y() - drag_state_->drag_origin.y() + : pointer_position_in_widget.x() - drag_state_->drag_origin.x(); - // This is effectively equal to delta_in_orientation * - // scaled_scroller_to_scrollbar_ratio but is necessary due to truncated delta - // value. Floored thumb_position cancels out the rounding error introduced - // in pointer_delta due to static_cast<int> in - // ScrollbarLayerImplBase::ComputeThumbQuadRectWithThumbThicknessScale - float scroll_delta = (delta_in_orientation + thumb_position) * - scaled_scroller_to_scrollbar_ratio - - current_scroll_position; - - gfx::ScrollOffset scaled_thumb_drag_delta; + const float new_offset = + pointer_delta * GetScrollerToScrollbarRatio(scrollbar); + const float scroll_delta = drag_state_->scroll_position_at_start_ + + new_offset - scrollbar->current_pos(); // Scroll delta floored to match main thread per pixel behavior - scrollbar->orientation() == ScrollbarOrientation::VERTICAL - ? scaled_thumb_drag_delta.set_y(floorf(scroll_delta)) - : scaled_thumb_drag_delta.set_x(floorf(scroll_delta)); - - return scaled_thumb_drag_delta; + return scrollbar->orientation() == ScrollbarOrientation::VERTICAL + ? gfx::ScrollOffset(0, floorf(scroll_delta)) + : gfx::ScrollOffset(floorf(scroll_delta), 0); } // Performs hit test and prepares scroll deltas that will be used by GSU. @@ -338,6 +276,18 @@ if (drag_processed_for_current_frame_) return scroll_result; + if (SnapToDragOrigin(scrollbar, position_in_widget)) { + const float delta = + scrollbar->current_pos() - drag_state_->scroll_position_at_start_; + scroll_result.scroll_units = ui::ScrollGranularity::kScrollByPrecisePixel; + scroll_result.scroll_offset = + scrollbar->orientation() == ScrollbarOrientation::VERTICAL + ? gfx::ScrollOffset(0, -delta) + : gfx::ScrollOffset(-delta, 0); + drag_processed_for_current_frame_ = true; + return scroll_result; + } + // When initiating a thumb drag, a pointerdown and a pointermove can both // arrive a the ScrollbarController in succession before a GSB would have // been dispatched. So, querying LayerTreeHostImpl::CurrentlyScrollingNode() @@ -354,7 +304,7 @@ // If scroll_offset can't be consumed, there's no point in continuing on. const gfx::ScrollOffset scroll_offset( - GetScrollOffsetForDragPosition(scrollbar, position_in_widget)); + GetScrollDeltaForDragPosition(scrollbar, position_in_widget)); const gfx::Vector2dF clamped_scroll_offset( layer_tree_host_impl_->ComputeScrollDelta( *target_node, ScrollOffsetToVector2dF(scroll_offset)));
diff --git a/cc/input/scrollbar_controller.h b/cc/input/scrollbar_controller.h index ab93bde6..7de72e9 100644 --- a/cc/input/scrollbar_controller.h +++ b/cc/input/scrollbar_controller.h
@@ -163,9 +163,8 @@ }; struct CC_EXPORT DragState { - // This is used to track the pointer location relative to the thumb origin - // when a drag has started. - gfx::Vector2dF anchor_relative_to_thumb_; + // This marks the point at which the drag initiated (relative to the widget) + gfx::PointF drag_origin; // This is needed for thumb snapping when the pointer moves too far away // from the track while scrolling. @@ -233,16 +232,11 @@ ui::ScrollGranularity Granularity(const ScrollbarPart scrollbar_part, bool shift_modifier); - // Calculates the scroll_offset based on position_in_widget and - // drag_anchor_relative_to_thumb_. - gfx::ScrollOffset GetScrollOffsetForDragPosition( + // Calculates the scroll_offset based on position_in_widget and drag_origin. + gfx::ScrollOffset GetScrollDeltaForDragPosition( const ScrollbarLayerImplBase* scrollbar, const gfx::PointF pointer_position_in_widget); - // Returns a Vector2dF for position_in_widget relative to the scrollbar thumb. - gfx::Vector2dF GetThumbRelativePoint(const ScrollbarLayerImplBase* scrollbar, - const gfx::PointF position_in_widget); - // Returns the ratio of the scroller length to the scrollbar length. This is // needed to scale the scroll delta for thumb drag. float GetScrollerToScrollbarRatio(const ScrollbarLayerImplBase* scrollbar);
diff --git a/cc/layers/heads_up_display_layer_impl.cc b/cc/layers/heads_up_display_layer_impl.cc index e45fae1c..e832a3e1 100644 --- a/cc/layers/heads_up_display_layer_impl.cc +++ b/cc/layers/heads_up_display_layer_impl.cc
@@ -553,6 +553,15 @@ FrameRateCounter* fps_counter = layer_tree_impl()->frame_rate_counter(); fps_graph_.value = fps_counter->GetAverageFPS(); fps_counter->GetMinAndMaxFPS(&fps_graph_.min, &fps_graph_.max); + current_throughput = layer_tree_impl()->current_universal_throughput(); + if (current_throughput.has_value()) { + if (!max_throughput.has_value() || + current_throughput.value() > max_throughput.value()) + max_throughput = current_throughput; + if (!min_throughput.has_value() || + current_throughput.value() < min_throughput.value()) + min_throughput = current_throughput; + } } if (debug_state.ShowMemoryStats()) { @@ -682,7 +691,8 @@ const int kHistogramWidth = 37; int width = kGraphWidth + kHistogramWidth + 4 * kPadding; - int height = kTitleFontHeight + kFontHeight + kGraphHeight + 6 * kPadding + 2; + int height = + 2 * kTitleFontHeight + 2 * kFontHeight + kGraphHeight + 10 * kPadding + 2; int left = 0; SkRect area = SkRect::MakeXYWH(left, top, width, height); @@ -702,6 +712,7 @@ SkRect::MakeXYWH(graph_bounds.right() + kGap, graph_bounds.top(), kHistogramWidth, kGraphHeight); + // Draw the fps meter. const std::string title("Frame Rate"); const std::string value_text = base::StringPrintf("%5.1f fps", fps_graph_.value); @@ -722,7 +733,32 @@ DrawGraphLines(canvas, &flags, graph_bounds, fps_graph_); - // Collect graph and histogram data. + // Draw the throughput meter. + int current_top = histogram_bounds.bottom() + kPadding; + const std::string throughput_title("Throughput"); + const std::string throughput_value_text = + current_throughput.has_value() + ? base::StringPrintf("%d %%", current_throughput.value()) + : base::StringPrintf("n/a"); + + VLOG(1) << throughput_value_text; + + flags.setColor(DebugColors::HUDTitleColor()); + DrawText(canvas, flags, throughput_title, TextAlign::kLeft, kTitleFontHeight, + title_bounds.left(), title_bounds.bottom() + current_top); + + flags.setColor(DebugColors::FPSDisplayTextAndGraphColor()); + DrawText(canvas, flags, throughput_value_text, TextAlign::kLeft, kFontHeight, + text_bounds.left(), text_bounds.bottom() + current_top); + if (min_throughput.has_value()) { + const std::string throughput_min_max_text = base::StringPrintf( + "%d-%d", min_throughput.value(), max_throughput.value()); + DrawText(canvas, flags, throughput_min_max_text, TextAlign::kRight, + kFontHeight, text_bounds.right(), + text_bounds.bottom() + current_top); + } + + // Collect fps graph and histogram data. SkPath path; const int kHistogramSize = 20;
diff --git a/cc/layers/heads_up_display_layer_impl.h b/cc/layers/heads_up_display_layer_impl.h index e0784ff..6892529a 100644 --- a/cc/layers/heads_up_display_layer_impl.h +++ b/cc/layers/heads_up_display_layer_impl.h
@@ -164,6 +164,11 @@ int layout_shift_rects_fade_step_ = 0; std::vector<DebugRect> paint_rects_; std::vector<DebugRect> layout_shift_debug_rects_; + base::Optional<int> current_throughput; + // The worst and best throughput we have seen so far, they either both have no + // value, or both have value. + base::Optional<int> min_throughput; + base::Optional<int> max_throughput; base::TimeTicks time_of_last_graph_update_; };
diff --git a/cc/metrics/frame_sequence_tracker.cc b/cc/metrics/frame_sequence_tracker.cc index 6601e6fd..7772095 100644 --- a/cc/metrics/frame_sequence_tracker.cc +++ b/cc/metrics/frame_sequence_tracker.cc
@@ -533,8 +533,16 @@ accumulated_metrics_.erase(key); } - if (metrics->HasEnoughDataForReporting()) + if (metrics->HasEnoughDataForReporting()) { + if (tracker->type() == FrameSequenceTrackerType::kUniversal) { + uint32_t frames_expected = metrics->impl_throughput().frames_expected; + uint32_t frames_produced = + metrics->aggregated_throughput().frames_produced; + current_universal_throughput_ = std::floor( + 100 * frames_produced / static_cast<float>(frames_expected)); + } metrics->ReportMetrics(); + } if (metrics->HasDataLeftForReporting()) accumulated_metrics_[key] = std::move(metrics); }
diff --git a/cc/metrics/frame_sequence_tracker.h b/cc/metrics/frame_sequence_tracker.h index b45fd72d..554e3d69 100644 --- a/cc/metrics/frame_sequence_tracker.h +++ b/cc/metrics/frame_sequence_tracker.h
@@ -232,6 +232,10 @@ void SetUkmManager(UkmManager* manager); + base::Optional<int> current_universal_throughput() { + return current_universal_throughput_; + } + private: friend class FrameSequenceTrackerTest; @@ -261,6 +265,7 @@ std::pair<FrameSequenceTrackerType, FrameSequenceMetrics::ThreadType>, std::unique_ptr<FrameSequenceMetrics>> accumulated_metrics_; + base::Optional<int> current_universal_throughput_; }; // Tracks a sequence of frames to determine the throughput. It tracks this by
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h index 2352d8e..1786403 100644 --- a/cc/trees/layer_tree_host_impl.h +++ b/cc/trees/layer_tree_host_impl.h
@@ -18,6 +18,7 @@ #include "base/containers/flat_set.h" #include "base/memory/memory_pressure_listener.h" #include "base/memory/shared_memory_mapping.h" +#include "base/optional.h" #include "base/sequenced_task_runner.h" #include "base/time/time.h" #include "cc/base/synced_property.h" @@ -637,6 +638,9 @@ std::unique_ptr<ScrollAndScaleSet> ProcessScrollDeltas(); FrameRateCounter* fps_counter() { return fps_counter_.get(); } + base::Optional<int> current_universal_throughput() { + return frame_trackers_.current_universal_throughput(); + } MemoryHistory* memory_history() { return memory_history_.get(); } DebugRectHistory* debug_rect_history() { return debug_rect_history_.get(); } viz::ClientResourceProvider* resource_provider() {
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 45f7e570..ed48825f 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -1585,6 +1585,10 @@ return host_impl_->fps_counter(); } +base::Optional<int> LayerTreeImpl::current_universal_throughput() { + return host_impl_->current_universal_throughput(); +} + MemoryHistory* LayerTreeImpl::memory_history() const { return host_impl_->memory_history(); }
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index f87d0c3..fd00ebb4 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h
@@ -128,6 +128,7 @@ ImageDecodeCache* image_decode_cache() const; ImageAnimationController* image_animation_controller() const; FrameRateCounter* frame_rate_counter() const; + base::Optional<int> current_universal_throughput(); MemoryHistory* memory_history() const; DebugRectHistory* debug_rect_history() const; bool IsActiveTree() const;
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index d534dd1..91e1ad3 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -160,6 +160,7 @@ "junit/src/org/chromium/chrome/browser/omnibox/geo/VisibleNetworksTest.java", "junit/src/org/chromium/chrome/browser/omnibox/geo/VisibleNetworksTrackerTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java", + "junit/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewBinderUnitTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb index 95f8fcc..a9d28dd5 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_bn.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bn"> -<translation id="1552477655783980595">কয়েকটি ট্যাপ করেই \n সিনেমার টিকিট কাটুন</translation> +<translation id="1552477655783980595">মাত্র কয়েক বার ট্যাপ করেই \n সিনেমার টিকিট কাটুন</translation> <translation id="1625889395409731085">এক্সটারনাল লিঙ্ক খুলতে চান?</translation> <translation id="1699570257714336246">সম্পূর্ণ তথ্য দেওয়া হয়নি</translation> <translation id="1932278019417741381">আপনাকে টাস্কগুলি সম্পূর্ণ করতে সাহায্য করার জন্য, যে যে সাইটে Assistant ব্যবহার করেন সেগুলির কন্টেন্ট ও ইউআরএল, তার সাথে Assistant-এর মাধ্যমে আপনার জমা দেওয়া যেকোনও তথ্য Google-কে পাঠানো হবে। এই তথ্য আপনার Google অ্যাকাউন্টে সেভ করা হতে পারে। আপনি Chrome সেটিংস থেকে Assistant বন্ধ করে দিতে পারেন। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation> @@ -12,7 +12,7 @@ <translation id="4850886885716139402">দেখুন</translation> <translation id="4952448020231702394">Google Assistant আপনাকে ওয়েবে সার্চ এবং চেক-আউটের মতো কাজগুলি চটপট করে নিতে সাহায্য করে।</translation> <translation id="5267269112080050255">Chrome-এ Google অ্যাসিস্ট্যান্ট পুরো স্ক্রিন জুড়ে খোলা আছে।</translation> -<translation id="6111473266581160404">কয়েকটি ট্যাপ করে \n গাড়ি ভাড়া করুন</translation> +<translation id="6111473266581160404">মাত্র কয়েক বার ট্যাপ করেই \n গাড়ি ভাড়া করুন</translation> <translation id="6555233628095991027">Chrome-এ Google অ্যাসিস্ট্যান্ট অর্ধেক স্ক্রিন জুড়ে খোলা আছে।</translation> <translation id="6620345200476149840">Chrome-এ \n Google Assistant ব্যবহার করে দেখুন</translation> <translation id="6785872064505734160">Chrome-এ Google Assistant আপনার হয়ে সমস্ত ওয়েবসাইটে বিভিন্ন অ্যাকশন সম্পূর্ণ করতে পারে</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb index 0051352..7307225 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_eu.xtb
@@ -12,7 +12,7 @@ <translation id="4850886885716139402">Ikusi</translation> <translation id="4952448020231702394">Google-ren Laguntzailea eginbideari esker, denbora aurreztuko duzu webguneko ekintzak bizkorrago eginda, hala nola bilaketak eta ordainketak.</translation> <translation id="5267269112080050255">Altuera osoan ireki da Chrome-ko Google-ren Laguntzailea.</translation> -<translation id="6111473266581160404">Alokatu kotxe bat \n sakatze gutxi batzuekin</translation> +<translation id="6111473266581160404">Alokatu auto bat \n sakatze gutxi batzuekin</translation> <translation id="6555233628095991027">Altuera erdian ireki da Chrome-ko Google-ren Laguntzailea.</translation> <translation id="6620345200476149840">Erabili Google-ren Laguntzailea \n Chrome-n</translation> <translation id="6785872064505734160">Webguneetan ekintzak egin ditzake Chrome-ko Google-ren Laguntzailea eginbideak</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_is.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_is.xtb index 96f7b58da..dc729b2 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_is.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_is.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="is"> -<translation id="1552477655783980595">Kaupa bíómiða \n í örfáum skrefum</translation> +<translation id="1552477655783980595">Kauptu bíómiða \n í örfáum skrefum</translation> <translation id="1625889395409731085">Viltu opna ytri tengil?</translation> <translation id="1699570257714336246">Upplýsingar vantar</translation> <translation id="1932278019417741381">Google fær vefslóðir og innihald vefsvæða þar sem þú notar hjálparann, auk upplýsinga sem þú sendir með hjálparanum, til að hjálpa þér að ljúka við verkefni. Þessar upplýsingar gætu verið vistaðar á Google reikningnum þínum. Þú getur slökkt á hjálparanum í stillingum Chrome. <ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /></translation> @@ -12,7 +12,7 @@ <translation id="4850886885716139402">Yfirlit</translation> <translation id="4952448020231702394">Google hjálparinn sparar þér tíma með því að aðstoða þig við að gera hluti á vefnum eins og að leita og ganga frá kaupum.</translation> <translation id="5267269112080050255">Google hjálpari opnaður í fullri hæð.</translation> -<translation id="6111473266581160404">Leigja bíl \n í örfáum skrefum</translation> +<translation id="6111473266581160404">Leigðu bíl \n í örfáum skrefum</translation> <translation id="6555233628095991027">Google hjálpari í Chrome opnaður í hálfri hæð.</translation> <translation id="6620345200476149840">Prófaðu Google hjálpara \n í Chrome</translation> <translation id="6785872064505734160">Google hjálparinn í Chrome getur lokið aðgerðum á ýmsum vefsíðum fyrir þig</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb index 1402d945..e0c202db 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_iw.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="iw"> -<translation id="1552477655783980595">אפשר לקנות כרטיסים לסרט \n בכמה הקשות בלבד</translation> +<translation id="1552477655783980595">קונים כרטיסים לסרט \n בכמה הקשות בלבד</translation> <translation id="1625889395409731085">לפתוח את הקישור החיצוני?</translation> <translation id="1699570257714336246">חסר מידע</translation> <translation id="1932278019417741381">כדי לעזור לך להשלים משימות, Google תקבל את כתובות ה-URL והתוכן של אתרים שבהם נעשה שימוש ב-Assistent, וכן את המידע שנשלח דרך Assistant. המידע הזה עשוי להיות מאוחסן בחשבון Google שלך. ניתן להשבית את Assistant דרך ההגדרות של Chrome. <ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> @@ -12,7 +12,7 @@ <translation id="4850886885716139402">הצגה</translation> <translation id="4952448020231702394">כדי לחסוך לך זמן, Google Assistant עוזר לך להשלים פעולות באינטרנט כמו חיפוש ותשלום בקופה.</translation> <translation id="5267269112080050255">Google Assistant ב-Chrome נפתח בגובה מלא.</translation> -<translation id="6111473266581160404">אפשר לשכור רכב \n בכמה הקשות בלבד</translation> +<translation id="6111473266581160404">שוכרים רכב \n בכמה הקשות בלבד</translation> <translation id="6555233628095991027">Google Assistant ב-Chrome נפתח בחצי גובה.</translation> <translation id="6620345200476149840">Google Assistant \n עומד לרשותך ב-Chrome</translation> <translation id="6785872064505734160">Google Assistant ב-Chrome יכול להשלים עבורך פעולות באתרים</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb index 06cb286..b77962ed 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
@@ -12,7 +12,7 @@ <translation id="4850886885716139402">Visning</translation> <translation id="4952448020231702394">Google-assistenten sparer tid ved å hjelpe deg med å gjennomføre handlinger på nettet, som å søke og handle.</translation> <translation id="5267269112080050255">Google-assistenten i Chrome er åpnet i full høyde.</translation> -<translation id="6111473266581160404">Lei en bil \n på bare noen få trykk</translation> +<translation id="6111473266581160404">Lei en bil \n med bare noen få trykk</translation> <translation id="6555233628095991027">Google-assistenten i Chrome er åpnet i halv høyde.</translation> <translation id="6620345200476149840">Prøv Google-assistenten \n i Chrome</translation> <translation id="6785872064505734160">Google-assistenten i Chrome kan utføre handlinger for deg på ulike nettsteder</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb index b1aeb80..9180933e 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ru"> -<translation id="1552477655783980595">Купите билеты в кино.\nПотребуется всего несколько нажатий.</translation> +<translation id="1552477655783980595">Покупать билеты в кино\nтеперь ещё удобнее.</translation> <translation id="1625889395409731085">Открыть внешнюю ссылку?</translation> <translation id="1699570257714336246">Данные отсутствуют</translation> <translation id="1932278019417741381">Чтобы вы смогли выполнять действия в Chrome с помощью Ассистента, в Google будет отправляться контент и URL сайтов, а также информация, которую вы сообщаете Ассистенту. Эта информация может храниться в вашем аккаунте Google. Отключить Ассистента можно в настройках Chrome. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> @@ -12,10 +12,10 @@ <translation id="4850886885716139402">Посмотреть</translation> <translation id="4952448020231702394">Google Ассистент экономит ваше время, помогая вам выполнять действия в Интернете. Например, находить нужную информацию и оформлять заказы.</translation> <translation id="5267269112080050255">Окно Google Ассистента в Chrome открыто полностью.</translation> -<translation id="6111473266581160404">Возьмите автомобиль напрокат.\nПотребуется всего несколько нажатий.</translation> +<translation id="6111473266581160404">Брать автомобиль напрокат\nтеперь ещё удобнее.</translation> <translation id="6555233628095991027">Окно Google Ассистента в Chrome открыто наполовину.</translation> <translation id="6620345200476149840">Google Ассистент\nв Chrome</translation> -<translation id="6785872064505734160">Google Ассистент в Chrome может выполнять для вас различные действия на сайтах.</translation> +<translation id="6785872064505734160">Google Ассистент в Chrome может помогать вам выполнять действия на сайтах.</translation> <translation id="6973932557599545801">Извините, я ничем не могу помочь. Продолжите самостоятельно.</translation> <translation id="7658239707568436148">Отмена</translation> <translation id="8253702004019660079">Google Ассистент в Chrome</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb index 3461ef5..a5572df 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_uz.xtb
@@ -1,7 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="uz"> -<translation id="1552477655783980595">Bir nechta bosish orqali \n kinoga chipta sotib oling</translation> +<translation id="1552477655783980595">Bir nechta harakat bilan \n kinoga chipta sotib oling</translation> <translation id="1625889395409731085">Tashqi havola ochilsinmi?</translation> <translation id="1699570257714336246">Axborot butunlay kiritilmadi</translation> <translation id="1932278019417741381">Google internetda ishlashingizni osonlashtirish uchun Assistent orqali kirilgan saytlarning URL manzillari va kontentlarini, shuningdek, soʻrovlarni ham oladi Bu axborot Google hisobingizga saqlanishi mumkin. Chrome sozlamalari ichidan Assistentni faolsizlantirishingiz mumkin. <ph name="BEGIN_LINK" />Batafsil axborot<ph name="END_LINK" /></translation> @@ -12,7 +12,7 @@ <translation id="4850886885716139402">Ko‘rish</translation> <translation id="4952448020231702394">Google Assistent internetdagi faoliyatingizda yordam beradi. Masalan, kerakli axborotlarni topadi va buyurtmalarni rasmiylashiradi.</translation> <translation id="5267269112080050255">Chromedagi Google Assistent toʻliq hajmda ochildi.</translation> -<translation id="6111473266581160404">Bir nechta bosish orqali \n avtomobilni ijaraga oling</translation> +<translation id="6111473266581160404">Bir nechta harakat bilan \n avtomobilni ijaraga oling</translation> <translation id="6555233628095991027">Chromedagi Google Assistent yarim hajmda ochildi.</translation> <translation id="6620345200476149840">Chrome brauzerida \n Google Assistentdan foydalaning</translation> <translation id="6785872064505734160">Chromedagi Google Assistent buyruqlaringizni saytlararo bajarishi mumkin</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb index 4b25293..b92e18e0 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_vi.xtb
@@ -12,10 +12,10 @@ <translation id="4850886885716139402">Xem</translation> <translation id="4952448020231702394">Trợ lý Google tiết kiệm thời gian cho bạn bằng cách giúp bạn hoàn thành các thao tác trên web, chẳng hạn như tìm kiếm và xác nhận mua hàng.</translation> <translation id="5267269112080050255">Trợ lý Google trong Chrome đã mở trên toàn màn hình.</translation> -<translation id="6111473266581160404">Thuê ô tô \n chỉ với một vài thao tác nhấn</translation> +<translation id="6111473266581160404">Thuê ô tô \n chỉ trong vài thao tác nhấn</translation> <translation id="6555233628095991027">Trợ lý Google trong Chrome đã mở ở nửa dưới của màn hình.</translation> <translation id="6620345200476149840">Dùng thử Trợ lý Google \n trong Chrome</translation> -<translation id="6785872064505734160">Trợ lý Google trong Chrome có thể giúp bạn hoàn thành các thao tác trên trang web</translation> +<translation id="6785872064505734160">Trợ lý Google trong Chrome có thể giúp bạn làm các việc trên trang web</translation> <translation id="6973932557599545801">Rất tiếc, tôi không thể trợ giúp được nữa. Bạn vui lòng tự thực hiện việc này.</translation> <translation id="7658239707568436148">Hủy</translation> <translation id="8253702004019660079">Trợ lý Google trong Chrome.</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb index e88c6766..e0192478 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-CN.xtb
@@ -12,7 +12,7 @@ <translation id="4850886885716139402">视图</translation> <translation id="4952448020231702394">Google 助理可帮助您在网络上完成所需操作(例如搜索和结算),从而节省您的时间。</translation> <translation id="5267269112080050255">Chrome 中的 Google 助理已全屏打开。</translation> -<translation id="6111473266581160404">只需点按几下,\n即可租车</translation> +<translation id="6111473266581160404">点按几下,\n即可租车</translation> <translation id="6555233628095991027">Chrome 中的 Google 助理已半屏打开。</translation> <translation id="6620345200476149840">在 Chrome 中的\n试用 Google 助理</translation> <translation id="6785872064505734160">Chrome 中的 Google 助理可帮您在各网站上完成所需操作</translation>
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb index 1c3c513..d46314cb 100644 --- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb +++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_zh-TW.xtb
@@ -12,10 +12,10 @@ <translation id="4850886885716139402">檢視</translation> <translation id="4952448020231702394">當你瀏覽網頁時,Google 助理可幫助你完成各項操作 (例如搜尋和結帳),為你省下寶貴時間。</translation> <translation id="5267269112080050255">Chrome 版 Google 助理已開啟,顯示於整個畫面。</translation> -<translation id="6111473266581160404">只要輕觸幾下\n即可租車</translation> +<translation id="6111473266581160404">如要租車\n只需輕觸幾下</translation> <translation id="6555233628095991027">Chrome 版 Google 助理已開啟,顯示在畫面下半部。</translation> <translation id="6620345200476149840">試用 Chrome 中的\n Google 助理</translation> -<translation id="6785872064505734160">Chrome 中的 Google 助理可協助你在不同的網站上完成動作</translation> +<translation id="6785872064505734160">Chrome 版 Google 助理可協助你在不同的網站上完成動作</translation> <translation id="6973932557599545801">抱歉,目前無法提供協助,請自行填入資料。</translation> <translation id="7658239707568436148">取消</translation> <translation id="8253702004019660079">Chrome 版 Google 助理。</translation>
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java index bd966562..6256197 100644 --- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java +++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -34,6 +34,7 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.rotateDeviceToOrientation; import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabModelTabCount; import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabSwitcherCardCount; +import static org.chromium.chrome.test.util.browser.RecyclerViewTestUtils.waitForStableRecyclerView; import static org.chromium.components.embedder_support.util.UrlConstants.NTP_URL; import static org.chromium.content_public.browser.test.util.CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL; import static org.chromium.content_public.browser.test.util.CriteriaHelper.DEFAULT_POLLING_INTERVAL; @@ -892,29 +893,29 @@ // New tab tile should be showing. enterGTSWithThumbnailChecking(); - onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(3)); + onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); verifyTabModelTabCount(cta, 2, 0); // Clicking new tab tile in normal mode should create a normal tab. onView(withId(R.id.new_tab_tile)).perform(click()); CriteriaHelper.pollUiThread(() -> !cta.getOverviewModeBehavior().overviewVisible()); enterGTSWithThumbnailChecking(); - onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(4)); + onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); verifyTabModelTabCount(cta, 3, 0); // New tab tile should be showing in incognito mode. switchTabModel(true); - onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); + onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); // Clicking new tab tile in incognito mode should create an incognito tab. onView(withId(R.id.new_tab_tile)).perform(click()); CriteriaHelper.pollUiThread(() -> !cta.getOverviewModeBehavior().overviewVisible()); enterGTSWithThumbnailChecking(); - onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(2)); + onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); verifyTabModelTabCount(cta, 3, 1); // Close all normal tabs and incognito tabs, the new tab tile should still show in both @@ -1582,6 +1583,11 @@ CriteriaHelper.pollUiThread(Criteria.equals(isIncognito, () -> mActivityTestRule.getActivity().getTabModelSelector().isIncognitoSelected())); + + // Wait for tab list recyclerView to finish animation after tab model switch. + RecyclerView recyclerView = + mActivityTestRule.getActivity().findViewById(R.id.tab_list_view); + waitForStableRecyclerView(recyclerView); } /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestion.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestion.java index 8d96ce9f5b..72a0c359 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestion.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestion.java
@@ -35,7 +35,8 @@ public TabSuggestion(List<TabContext.TabInfo> tabsInfo, @TabSuggestionAction int action, String providerName, Integer tabGroupId) { - mTabsInfo = Collections.unmodifiableList(tabsInfo); + mTabsInfo = + tabsInfo == null ? Collections.emptyList() : Collections.unmodifiableList(tabsInfo); mAction = action; mProviderName = providerName; mTabGroupId = tabGroupId;
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionTest.java new file mode 100644 index 0000000..3a485a5 --- /dev/null +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionTest.java
@@ -0,0 +1,65 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.tasks.tab_management.suggestions; + +import org.junit.Assert; +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.MockitoAnnotations; +import org.robolectric.annotation.Config; + +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +import java.util.Arrays; + +/** + * Tests functionality related to TabContext + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class TabSuggestionTest { + private static final @TabSuggestion.TabSuggestionAction int TAB_SUGGESTION_ACTION = + TabSuggestion.TabSuggestionAction.CLOSE; + private static final String PROVIDER_NAME = "providerName"; + private static final int TAB_GROUP_ID = 1; + private static final int ID = 1; + private static final String TITLE = "title"; + private static final String TAB_URL = "url"; + private static final String ORIGINAL_URL = "original_url"; + private static final String REFERRER_URL = "referrer_url"; + private static final long TIMESTAMP = 4352345L; + private static final String VISIBLE_URL = "visible_url"; + private static final TabContext.TabInfo TAB_INFO = new TabContext.TabInfo( + ID, TITLE, TAB_URL, ORIGINAL_URL, REFERRER_URL, TIMESTAMP, VISIBLE_URL); + + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testNonEmptySuggestions() { + TabSuggestion tabSuggestion = new TabSuggestion( + Arrays.asList(TAB_INFO), TAB_SUGGESTION_ACTION, PROVIDER_NAME, TAB_GROUP_ID); + Assert.assertNotNull(tabSuggestion.getTabsInfo()); + Assert.assertEquals(tabSuggestion.getTabsInfo().size(), 1); + Assert.assertEquals(tabSuggestion.getTabsInfo().get(0), TAB_INFO); + } + + @Test + public void testNullSuggestions() { + TabSuggestion tabSuggestion = + new TabSuggestion(null, TAB_SUGGESTION_ACTION, PROVIDER_NAME, TAB_GROUP_ID); + Assert.assertNotNull(tabSuggestion.getTabsInfo()); + Assert.assertEquals(tabSuggestion.getTabsInfo().size(), 0); + } +}
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 90c36784..57a3115 100644 --- a/chrome/android/features/tab_ui/tab_management_java_sources.gni +++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -77,6 +77,7 @@ "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/StaleTabSuggestionProviderTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextObserverTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabContextTest.java", + "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsClientFetcherTest.java", "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/suggestions/TabSuggestionsOrchestratorTest.java", ]
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedListContentManager.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedListContentManager.java index f2e9356..7dd13b1 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedListContentManager.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/v2/FeedListContentManager.java
@@ -94,13 +94,23 @@ } /** + * Returns the content at the specified position. + * + * @param index The index at which to get the content. + * @return The content. + */ + public FeedContent getContent(int index) { + return mFeedContentList.get(index); + } + + /** * Adds a list of the contents, starting at the specified position. * * @param index The index at which to insert the first content from the specified collection. * @param contents The collection containing contents to be added. */ public void addContents(int index, List<FeedContent> contents) { - assert index >= 0 && index < mFeedContentList.size(); + assert index >= 0 && index <= mFeedContentList.size(); mFeedContentList.addAll(index, contents); for (ListContentManagerObserver observer : mObservers) { observer.onItemRangeInserted(index, contents.size()); @@ -115,10 +125,10 @@ */ public void removeContents(int index, int count) { assert index >= 0 && index < mFeedContentList.size(); - assert index + count < mFeedContentList.size(); + assert index + count <= mFeedContentList.size(); mFeedContentList.subList(index, index + count).clear(); for (ListContentManagerObserver observer : mObservers) { - observer.onItemRangeInserted(index, count); + observer.onItemRangeRemoved(index, count); } } @@ -130,7 +140,7 @@ */ public void updateContents(int index, List<FeedContent> contents) { assert index >= 0 && index < mFeedContentList.size(); - assert index + contents.size() < mFeedContentList.size(); + assert index + contents.size() <= mFeedContentList.size(); int pos = index; for (FeedContent content : contents) { mFeedContentList.set(pos++, content); @@ -146,7 +156,7 @@ * @param curIndex The index of the content to be moved. * @param newIndex The new index where the content is being moved to. */ - public void moveContents(int curIndex, int newIndex) { + public void moveContent(int curIndex, int newIndex) { assert curIndex >= 0 && curIndex < mFeedContentList.size(); assert newIndex >= 0 && newIndex < mFeedContentList.size(); int lowIndex;
diff --git a/chrome/android/feed/feed_java_sources.gni b/chrome/android/feed/feed_java_sources.gni index 72e71e0..72fd575 100644 --- a/chrome/android/feed/feed_java_sources.gni +++ b/chrome/android/feed/feed_java_sources.gni
@@ -638,6 +638,7 @@ "junit/src/org/chromium/chrome/browser/feed/FutureTaskConsumerTest.java", "junit/src/org/chromium/chrome/browser/feed/NtpStreamLifecycleManagerTest.java", "junit/src/org/chromium/chrome/browser/feed/action/FeedActionHandlerTest.java", + "junit/src/org/chromium/chrome/browser/feed/v2/FeedListContentManagerTest.java", ] feed_test_java_sources = [
diff --git a/chrome/android/feed/merging.md b/chrome/android/feed/merging.md index daa4998..3936bcf7 100644 --- a/chrome/android/feed/merging.md +++ b/chrome/android/feed/merging.md
@@ -8,4 +8,4 @@ The hash below represents the last commit from that repo that was reviewed for the potential need to merge here. -Last checked commit ID: f1bd7d30fd0bbb9fb9c8d7c0d99432be45330179 \ No newline at end of file +Last checked commit ID: e0d3e906ad2a04bff9ef9347a621cdad22df91dc
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 5c88c7c..1b4b961 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -68,12 +68,14 @@ import org.chromium.components.browser_ui.widget.CompositeTouchDelegate; import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.content_public.browser.LoadUrlParams; +import org.chromium.content_public.common.ResourceRequestBody; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.PageTransition; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.util.ColorUtils; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; /** @@ -908,6 +910,12 @@ */ @Override public void loadUrl(String url, @PageTransition int transition, long inputStart) { + loadUrlWithPostData(url, transition, inputStart, null, null); + } + + @Override + public void loadUrlWithPostData(String url, @PageTransition int transition, long inputStart, + @Nullable String postDataType, @Nullable byte[] postData) { Tab currentTab = getCurrentTab(); // The code of the rest of this class ensures that this can't be called until the native @@ -937,6 +945,24 @@ loadUrlParams.setInputStartTimestamp(inputStart); } + if (!TextUtils.isEmpty(postDataType)) { + StringBuilder headers = new StringBuilder(); + String prevHeader = loadUrlParams.getVerbatimHeaders(); + if (prevHeader != null && !prevHeader.isEmpty()) { + headers.append(prevHeader); + headers.append("\r\n"); + } + loadUrlParams.setExtraHeaders(new HashMap<String, String>() { + { put("Content-Type", postDataType); } + }); + headers.append(loadUrlParams.getExtraHttpRequestHeadersString()); + loadUrlParams.setVerbatimHeaders(headers.toString()); + } + + if (postData != null && postData.length != 0) { + loadUrlParams.setPostData(ResourceRequestBody.createFromBytes(postData)); + } + currentTab.loadUrl(loadUrlParams); RecordUserAction.record("MobileOmniboxUse"); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java index 748b583..e644ea41 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
@@ -297,7 +297,8 @@ int[] contentClassificationStyles, String description, int[] descriptionClassificationOffsets, int[] descriptionClassificationStyles, SuggestionAnswer answer, String fillIntoEdit, String url, String imageUrl, - String imageDominantColor, boolean isStarred, boolean isDeletable) { + String imageDominantColor, boolean isStarred, boolean isDeletable, + String postContentType, byte[] postData) { assert contentClassificationOffsets.length == contentClassificationStyles.length; List<MatchClassification> contentClassifications = new ArrayList<>(); for (int i = 0; i < contentClassificationOffsets.length; i++) { @@ -314,7 +315,8 @@ return new OmniboxSuggestion(nativeType, isSearchType, relevance, transition, contents, contentClassifications, description, descriptionClassifications, answer, - fillIntoEdit, url, imageUrl, imageDominantColor, isStarred, isDeletable); + fillIntoEdit, url, imageUrl, imageDominantColor, isStarred, isDeletable, + postContentType, postData); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate.java index 660894c..3cb26606 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteDelegate.java
@@ -45,6 +45,19 @@ void loadUrl(String url, @PageTransition int transition, long inputStart); /** + * Requests that the given URL be loaded in the current tab. + * + * @param url The URL to be loaded. + * @param transition The transition type associated with the url load. + * @param inputStart The time the input started for the load request. + * @param postDataType postData type. + * @param postData Post-data to include in the tab URL's request body, ex. bitmap when + * image search. + */ + void loadUrlWithPostData(String url, @PageTransition int transition, long inputStart, + String postDataType, byte[] postData); + + /** * @return Whether the omnibox was focused via the NTP fakebox. */ boolean didFocusUrlFromFakebox();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java index 51e34b3e..eeb4d91 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -1166,6 +1166,12 @@ transition = PageTransition.LINK; } + + if (suggestion.getType() == OmniboxSuggestionType.CLIPBOARD_IMAGE) { + mDelegate.loadUrlWithPostData(url, transition, inputStart, + suggestion.getPostContentType(), suggestion.getPostData()); + return; + } mDelegate.loadUrl(url, transition, inputStart); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestion.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestion.java index 80359d6..db70065 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestion.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestion.java
@@ -7,6 +7,7 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.text.TextUtils; +import android.util.Base64; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -35,6 +36,10 @@ // private static final String KEY_PREFIX_ZERO_SUGGEST_ANSWER_TYPE = "zero_suggest_answer_type"; private static final String KEY_PREFIX_ZERO_SUGGEST_IS_DELETABLE = "zero_suggest_is_deletable"; private static final String KEY_PREFIX_ZERO_SUGGEST_IS_STARRED = "zero_suggest_is_starred"; + private static final String KEY_PREFIX_ZERO_SUGGEST_POST_CONTENT_TYPE = + "zero_suggest_post_content_type"; + private static final String KEY_PREFIX_ZERO_SUGGEST_POST_CONTENT_DATA = + "zero_suggest_post_content_data"; /** * Specifies the style of portions of the suggestion text. @@ -81,12 +86,15 @@ private final int mTransition; private final boolean mIsStarred; private final boolean mIsDeletable; + private final String mPostContentType; + private final byte[] mPostData; public OmniboxSuggestion(int nativeType, boolean isSearchType, int relevance, int transition, String displayText, List<MatchClassification> displayTextClassifications, String description, List<MatchClassification> descriptionClassifications, SuggestionAnswer answer, String fillIntoEdit, String url, String imageUrl, - String imageDominantColor, boolean isStarred, boolean isDeletable) { + String imageDominantColor, boolean isStarred, boolean isDeletable, + String postContentType, byte[] postData) { mType = nativeType; mIsSearchType = isSearchType; mRelevance = relevance; @@ -102,6 +110,8 @@ mImageDominantColor = imageDominantColor; mIsStarred = isStarred; mIsDeletable = isDeletable; + mPostContentType = postContentType; + mPostData = postData; } public int getType() { @@ -172,6 +182,14 @@ return mIsDeletable; } + public String getPostContentType() { + return mPostContentType; + } + + public byte[] getPostData() { + return mPostData; + } + /** * @return The relevance score of this suggestion. */ @@ -230,8 +248,15 @@ .putInt(KEY_PREFIX_ZERO_SUGGEST_NATIVE_TYPE + i, suggestion.getType()) .putBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_SEARCH_TYPE + i, !suggestion.isUrlSuggestion()) - .putBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_DELETABLE + i, suggestion.mIsDeletable) - .putBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_STARRED + i, suggestion.mIsStarred) + .putBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_DELETABLE + i, suggestion.isDeletable()) + .putBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_STARRED + i, suggestion.isStarred()) + .putString(KEY_PREFIX_ZERO_SUGGEST_POST_CONTENT_TYPE + i, + suggestion.getPostContentType()) + .putString(KEY_PREFIX_ZERO_SUGGEST_POST_CONTENT_DATA + i, + suggestion.getPostData() == null + ? "" + : Base64.encodeToString( + suggestion.getPostData(), Base64.DEFAULT)) .apply(); } } @@ -260,13 +285,21 @@ String description = prefs.getString(KEY_PREFIX_ZERO_SUGGEST_DESCRIPTION + i, ""); int nativeType = prefs.getInt(KEY_PREFIX_ZERO_SUGGEST_NATIVE_TYPE + i, -1); boolean isSearchType = - prefs.getBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_SEARCH_TYPE, true); + prefs.getBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_SEARCH_TYPE + i, true); boolean isStarred = prefs.getBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_STARRED + i, false); boolean isDeletable = prefs.getBoolean(KEY_PREFIX_ZERO_SUGGEST_IS_DELETABLE + i, false); - OmniboxSuggestion suggestion = new OmniboxSuggestion(nativeType, !isSearchType, 0, - 0, displayText, classifications, description, classifications, null, "", - url, null, null, isStarred, isDeletable); + String postContentType = + prefs.getString(KEY_PREFIX_ZERO_SUGGEST_POST_CONTENT_TYPE + i, ""); + byte[] postData = Base64.decode( + prefs.getString(KEY_PREFIX_ZERO_SUGGEST_POST_CONTENT_DATA + i, ""), + Base64.DEFAULT); + + OmniboxSuggestion suggestion = new OmniboxSuggestion(nativeType, isSearchType, 0, 0, + displayText, classifications, description, classifications, null, "", url, + null, null, isStarred, isDeletable, + postContentType.isEmpty() ? null : postContentType, + postData.length == 0 ? null : postData); suggestions.add(suggestion); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProvider.java index 5f4a48d..587216a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProvider.java
@@ -122,7 +122,7 @@ classifications.add(new MatchClassification(0, MatchClassificationStyle.NONE)); suggestions.add(new OmniboxSuggestion(OmniboxSuggestionType.VOICE_SUGGEST, true, 0, 1, result.getMatch(), classifications, null, classifications, null, null, voiceUrl, - null, null, false, false)); + null, null, false, false, null, null)); } private boolean doesVoiceResultHaveMatch(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS index 748a1e1..0861005 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS
@@ -1,4 +1,5 @@ dominickn@chromium.org +hartmanng@chromium.org mlamouri@chromium.org peconn@chromium.org peter@chromium.org
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java index a5a10167..e04ace91 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java
@@ -27,10 +27,11 @@ import org.chromium.base.test.util.RetryOnFailure; import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.test.ChromeActivityTestRule; +import org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.components.javascript_dialogs.JavascriptAppModalDialog; import org.chromium.content_public.browser.GestureStateListener; import org.chromium.content_public.browser.test.util.Criteria; @@ -52,8 +53,7 @@ @Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class JavascriptAppModalDialogTest { @Rule - public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = - new ChromeActivityTestRule<>(ChromeActivity.class); + public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); private static final String TAG = "JSAppModalDialogTest"; private static final String EMPTY_PAGE = UrlUtils.encodeHtmlDataUri( @@ -104,6 +104,33 @@ } /** + * Verifies behavior when the tab that has an onBeforeUnload handler has no history stack + * (pressing back should still show the dialog). + * + * Regression test for https://crbug.com/1055540 + */ + @Test + @MediumTest + @Feature({"Browser", "Main"}) + public void testBeforeUnloadDialogWithNoHistory() throws TimeoutException, ExecutionException { + ChromeTabbedActivity activity = mActivityTestRule.getActivity(); + TabUiTestHelper.verifyTabModelTabCount(activity, 1, 0); + mActivityTestRule.loadUrlInNewTab(BEFORE_UNLOAD_URL); + TabUiTestHelper.verifyTabModelTabCount(activity, 2, 0); + // JavaScript onbeforeunload dialogs require a user gesture. + tapViewAndWait(); + TestThreadUtils.runOnUiThreadBlocking(() -> { activity.onBackPressed(); }); + CriteriaHelper.pollInstrumentationThread(new JavascriptAppModalDialogShownCriteria( + "Could not spawn or locate a modal dialog.", true)); + + // Click leave and verify that the tab is closed. + JavascriptAppModalDialog jsDialog = getCurrentDialog(); + Assert.assertNotNull("No dialog showing.", jsDialog); + onView(withText(R.string.leave)).perform(click()); + TabUiTestHelper.verifyTabModelTabCount(activity, 1, 0); + } + + /** * Verifies that when showing a beforeunload dialogs as a result of a page * reload, the correct UI strings are used. */ @@ -178,7 +205,7 @@ executeJavaScriptAndWaitForDialog("history.back();"); TestThreadUtils.runOnUiThreadBlocking(() -> { - ChromeActivity activity = mActivityTestRule.getActivity(); + ChromeTabbedActivity activity = mActivityTestRule.getActivity(); activity.getCurrentTabModel().closeTab(activity.getActivityTab()); });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java index ce5b0e2..427795f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
@@ -185,6 +185,9 @@ mFakebox = mNtp.getView().findViewById(R.id.search_box); mTileGridLayout = mNtp.getView().findViewById(R.id.tile_grid_layout); Assert.assertEquals(mSiteSuggestions.size(), mTileGridLayout.getChildCount()); + + // TODO(crbug.com/1068294): Remove the following line if this general issue is fixed. + mRenderTestRule.setPixelDiffThreshold(10); } @After
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProviderTest.java index 56212ed..bfb6f30e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProviderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/VoiceSuggestionProviderTest.java
@@ -41,7 +41,7 @@ classifications.add(new MatchClassification(0, MatchClassificationStyle.NONE)); return new OmniboxSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST, true, 0, 1, text, classifications, null, classifications, null, "", "http://www.google.com", null, - null, false, false); + null, false, false, null, null); } private static List<OmniboxSuggestion> createDummySuggestions(String... texts) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java index 8eb13b47..62bfd93 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java
@@ -340,10 +340,10 @@ classifications.add(new MatchClassification(0, MatchClassificationStyle.NONE)); OmniboxSuggestion mockSuggestion = new OmniboxSuggestion(0, true, 0, 0, "https://google.com", classifications, "https://google.com", classifications, null, - "", "https://google.com", null, null, false, false); + "", "https://google.com", null, null, false, false, null, null); OmniboxSuggestion mockSuggestion2 = new OmniboxSuggestion(0, true, 0, 0, "https://android.com", classifications, "https://android.com", classifications, - null, "", "https://android.com", null, null, false, false); + null, "", "https://android.com", null, null, false, false, null, null); List<OmniboxSuggestion> list = new ArrayList<>(); list.add(mockSuggestion); list.add(mockSuggestion2);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/v2/FeedListContentManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/v2/FeedListContentManagerTest.java new file mode 100644 index 0000000..0b52e3e --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/v2/FeedListContentManagerTest.java
@@ -0,0 +1,220 @@ +// 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. + +package org.chromium.chrome.browser.feed.v2; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.support.test.filters.SmallTest; + +import com.google.common.collect.ImmutableList; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.xsurface.ListContentManagerObserver; + +import java.util.List; + +/** Unit tests for {@link FeedListContentManager}. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class FeedListContentManagerTest implements ListContentManagerObserver { + private FeedListContentManager mManager; + + private boolean mItemRangeInserted; + private int mItemRangeInsertedStartIndex; + private int mItemRangeInsertedCount; + private boolean mItemRangeRemoved; + private int mItemRangeRemovedStartIndex; + private int mItemRangeRemovedCount; + private boolean mItemRangeChanged; + private int mItemRangeChangedStartIndex; + private int mItemRangeChangedCount; + private boolean mItemMoved; + private int mItemMovedCurIndex; + private int mItemMovedNewIndex; + + @Before + public void setUp() { + mManager = new FeedListContentManager(null, null); + mManager.addObserver(this); + } + + @Test + @SmallTest + public void testAddContents() { + FeedListContentManager.FeedContent c1 = createExternalViewContent("a"); + FeedListContentManager.FeedContent c2 = createExternalViewContent("b"); + FeedListContentManager.FeedContent c3 = createExternalViewContent("c"); + + addContents(0, ImmutableList.of(c1)); + assertEquals(1, mManager.getItemCount()); + assertEquals(c1, mManager.getContent(0)); + + addContents(0, ImmutableList.of(c2, c3)); + assertEquals(3, mManager.getItemCount()); + assertEquals(c2, mManager.getContent(0)); + assertEquals(c3, mManager.getContent(1)); + assertEquals(c1, mManager.getContent(2)); + + addContents(3, ImmutableList.of(c2, c3)); + assertEquals(5, mManager.getItemCount()); + assertEquals(c2, mManager.getContent(0)); + assertEquals(c3, mManager.getContent(1)); + assertEquals(c1, mManager.getContent(2)); + assertEquals(c2, mManager.getContent(3)); + assertEquals(c3, mManager.getContent(4)); + } + + @Test + @SmallTest + public void testRemoveContents() { + FeedListContentManager.FeedContent c1 = createExternalViewContent("a"); + FeedListContentManager.FeedContent c2 = createExternalViewContent("b"); + FeedListContentManager.FeedContent c3 = createExternalViewContent("c"); + FeedListContentManager.FeedContent c4 = createExternalViewContent("d"); + FeedListContentManager.FeedContent c5 = createExternalViewContent("e"); + + addContents(0, ImmutableList.of(c1, c2, c3, c4, c5)); + assertEquals(5, mManager.getItemCount()); + + removeContents(0, 2); + assertEquals(3, mManager.getItemCount()); + assertEquals(c3, mManager.getContent(0)); + assertEquals(c4, mManager.getContent(1)); + assertEquals(c5, mManager.getContent(2)); + + removeContents(1, 2); + assertEquals(1, mManager.getItemCount()); + assertEquals(c3, mManager.getContent(0)); + + removeContents(0, 1); + assertEquals(0, mManager.getItemCount()); + } + + @Test + @SmallTest + public void testUpdateContents() { + FeedListContentManager.FeedContent c1 = createExternalViewContent("a"); + FeedListContentManager.FeedContent c2 = createExternalViewContent("b"); + FeedListContentManager.FeedContent c3 = createExternalViewContent("c"); + FeedListContentManager.FeedContent c4 = createExternalViewContent("d"); + FeedListContentManager.FeedContent c5 = createExternalViewContent("e"); + + addContents(0, ImmutableList.of(c1, c2, c3)); + assertEquals(3, mManager.getItemCount()); + + updateContents(1, ImmutableList.of(c4, c5)); + assertEquals(3, mManager.getItemCount()); + assertEquals(c1, mManager.getContent(0)); + assertEquals(c4, mManager.getContent(1)); + assertEquals(c5, mManager.getContent(2)); + } + + @Test + @SmallTest + public void testMoveContent() { + FeedListContentManager.FeedContent c1 = createExternalViewContent("a"); + FeedListContentManager.FeedContent c2 = createExternalViewContent("b"); + FeedListContentManager.FeedContent c3 = createExternalViewContent("c"); + FeedListContentManager.FeedContent c4 = createExternalViewContent("d"); + FeedListContentManager.FeedContent c5 = createExternalViewContent("e"); + + addContents(0, ImmutableList.of(c1, c2, c3, c4, c5)); + assertEquals(5, mManager.getItemCount()); + + moveContent(0, 3); + assertEquals(5, mManager.getItemCount()); + assertEquals(c2, mManager.getContent(0)); + assertEquals(c3, mManager.getContent(1)); + assertEquals(c4, mManager.getContent(2)); + assertEquals(c1, mManager.getContent(3)); + assertEquals(c5, mManager.getContent(4)); + + moveContent(4, 2); + assertEquals(5, mManager.getItemCount()); + assertEquals(c2, mManager.getContent(0)); + assertEquals(c3, mManager.getContent(1)); + assertEquals(c5, mManager.getContent(2)); + assertEquals(c4, mManager.getContent(3)); + assertEquals(c1, mManager.getContent(4)); + } + + @Override + public void onItemRangeInserted(int startIndex, int count) { + mItemRangeInserted = true; + mItemRangeInsertedStartIndex = startIndex; + mItemRangeInsertedCount = count; + } + + @Override + public void onItemRangeRemoved(int startIndex, int count) { + mItemRangeRemoved = true; + mItemRangeRemovedStartIndex = startIndex; + mItemRangeRemovedCount = count; + } + + @Override + public void onItemRangeChanged(int startIndex, int count) { + mItemRangeChanged = true; + mItemRangeChangedStartIndex = startIndex; + mItemRangeChangedCount = count; + } + + @Override + public void onItemMoved(int curIndex, int newIndex) { + mItemMoved = true; + mItemMovedCurIndex = curIndex; + mItemMovedNewIndex = newIndex; + } + + private void addContents(int index, List<FeedListContentManager.FeedContent> contents) { + mItemRangeInserted = false; + mItemRangeInsertedStartIndex = -1; + mItemRangeInsertedCount = -1; + mManager.addContents(index, contents); + assertTrue(mItemRangeInserted); + assertEquals(index, mItemRangeInsertedStartIndex); + assertEquals(contents.size(), mItemRangeInsertedCount); + } + + private void removeContents(int index, int count) { + mItemRangeRemoved = false; + mItemRangeRemovedStartIndex = -1; + mItemRangeRemovedCount = -1; + mManager.removeContents(index, count); + assertTrue(mItemRangeRemoved); + assertEquals(index, mItemRangeRemovedStartIndex); + assertEquals(count, mItemRangeRemovedCount); + } + + private void updateContents(int index, List<FeedListContentManager.FeedContent> contents) { + mItemRangeChanged = false; + mItemRangeChangedStartIndex = -1; + mItemRangeChangedCount = -1; + mManager.updateContents(index, contents); + assertTrue(mItemRangeChanged); + assertEquals(index, mItemRangeChangedStartIndex); + assertEquals(contents.size(), mItemRangeChangedCount); + } + + private void moveContent(int curIndex, int newIndex) { + mItemMoved = false; + mItemMovedCurIndex = -1; + mItemMovedNewIndex = -1; + mManager.moveContent(curIndex, newIndex); + assertTrue(mItemMoved); + assertEquals(curIndex, mItemMovedCurIndex); + assertEquals(newIndex, mItemMovedNewIndex); + } + + private FeedListContentManager.FeedContent createExternalViewContent(String s) { + return new FeedListContentManager.ExternalViewContent(s.getBytes()); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java index d7a265f..8a1d577 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
@@ -116,7 +116,8 @@ null /* displayTextClassifications */, null /* description */, null /* descriptionClassifications */, null /* answer */, null /* fillIntoEdit */, null /* url */, null /* imageUrl */, - null /* imageDominantColor */, false /* isStarred */, false /* isDeletable */); + null /* imageDominantColor */, false /* isStarred */, false /* isDeletable */, + null /* postContentType */, null /* postData */); list.add(suggestion); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java new file mode 100644 index 0000000..c9b7c2b --- /dev/null +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java
@@ -0,0 +1,121 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.omnibox.suggestions; + +import android.text.TextUtils; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +import org.chromium.base.ContextUtils; +import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; +import org.chromium.testing.local.LocalRobolectricTestRunner; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Unit tests for {@link OmniboxSuggestion}. + */ +@RunWith(LocalRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class OmniboxSuggestionUnitTest { + @Before + public void setUp() { + ContextUtils.initApplicationContextForTests(ApplicationProvider.getApplicationContext()); + } + + /** + * Compare two cached {@link OmniboxSuggestion} to see if they are same. Only comparing cached + * fields here Since OmniboxSuggestion::cacheOmniboxSuggestionListForZeroSuggest do not cache + * all the fields. + * + * @return True if two {@link OmniboxSuggestion} are same, otherwise false. + */ + boolean isCachedOmniboxSuggestionMatch( + OmniboxSuggestion suggestion1, OmniboxSuggestion suggestion2) { + return suggestion1.getType() == suggestion2.getType() + && TextUtils.equals(suggestion1.getDisplayText(), suggestion2.getDisplayText()) + && TextUtils.equals(suggestion1.getDescription(), suggestion2.getDescription()) + && TextUtils.equals(suggestion1.getUrl(), suggestion2.getUrl()) + && suggestion1.isUrlSuggestion() == suggestion2.isUrlSuggestion() + && suggestion1.isStarred() == suggestion2.isStarred() + && suggestion1.isDeletable() == suggestion2.isDeletable() + && TextUtils.equals( + suggestion1.getPostContentType(), suggestion2.getPostContentType()) + && Arrays.equals(suggestion1.getPostData(), suggestion2.getPostData()); + } + + /** + * Compare two list of {@link OmniboxSuggestion} to see if they are same. + * + * @return True if two list of {@link OmniboxSuggestion} are same, otherwise false. + */ + boolean isOmniboxSuggestionListMatch( + List<OmniboxSuggestion> list1, List<OmniboxSuggestion> list2) { + if (list1.size() != list2.size()) return false; + for (OmniboxSuggestion suggestion1 : list1) { + for (OmniboxSuggestion suggestion2 : list2) { + if (isCachedOmniboxSuggestionMatch(suggestion1, suggestion2)) { + list2.remove(suggestion2); + break; + } + } + } + return list2.isEmpty(); + } + + /** + * Build a dummy suggestions list . + * @param count How many suggestions to create. + * @param hasPostData If suggestions contain post data. + * + * @return List of suggestions. + */ + private List<OmniboxSuggestion> buildDummySuggestionsList(int count, boolean hasPostData) { + List<OmniboxSuggestion> list = new ArrayList<>(); + + for (int index = 0; index < count; ++index) { + OmniboxSuggestion suggestion = new OmniboxSuggestion( + OmniboxSuggestionType.CLIPBOARD_IMAGE, false /* isSearchType */, + 0 /* relevance */, 0 /* transition */, "dummy text 1" + (index + 1), + null /* displayTextClassifications */, + "dummy description 1" + (index + 1) /* description */, + null /* descriptionClassifications */, null /* answer */, + null /* fillIntoEdit */, "dummy url" + (index + 1) /* url */, + null /* imageUrl */, null /* imageDominantColor */, false /* isStarred */, + false /* isDeletable */, + hasPostData ? "Dummy Content Type" + (index + 1) : null /* postContentType */, + hasPostData ? new byte[] {4, 5, 6, (byte) (index + 1)} : null /* postData */); + list.add(suggestion); + } + + return list; + } + + @Test + public void setNewSuggestions_cachedSuggestionsWithPostdataBeforeAndAfterAreSame() { + List<OmniboxSuggestion> list1 = buildDummySuggestionsList(2, true); + OmniboxSuggestion.cacheOmniboxSuggestionListForZeroSuggest(list1); + List<OmniboxSuggestion> list2 = + OmniboxSuggestion.getCachedOmniboxSuggestionsForZeroSuggest(); + Assert.assertTrue(isOmniboxSuggestionListMatch(list1, list2)); + } + + @Test + public void setNewSuggestions_cachedSuggestionsWithoutPostdataBeforeAndAfterAreSame() { + List<OmniboxSuggestion> list1 = buildDummySuggestionsList(2, false); + OmniboxSuggestion.cacheOmniboxSuggestionListForZeroSuggest(list1); + List<OmniboxSuggestion> list2 = + OmniboxSuggestion.getCachedOmniboxSuggestionsForZeroSuggest(); + Assert.assertTrue(isOmniboxSuggestionListMatch(list1, list2)); + } +}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java index d6b3dd4d..20b50d4 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java
@@ -145,7 +145,8 @@ /* descriptionClassifications */ null, /* suggestionAnswer */ null, /* fillIntoEdit */ "", /* url */ "", /* imageUrl */ "", /* imageDominantColor */ "", - /* isStarred */ false, /* isDeletable */ false); + /* isStarred */ false, /* isDeletable */ false, /* postContentType */ null, + /* postData */ null); PropertyModel model = mProcessor.createModelForSuggestion(suggestion); return new SuggestionTestHelper(suggestion, null, model, userQuery); } @@ -163,7 +164,8 @@ /* description */ null, /* descriptionClassifications */ null, answer, /* fillIntoEdit */ "", /* url */ "", /* imageUrl */ "", /* imageDominantColor */ "", - /* isStarred */ false, /* isDeletable */ false); + /* isStarred */ false, /* isDeletable */ false, /* postContentType */ null, + /* postData */ null); PropertyModel model = mProcessor.createModelForSuggestion(suggestion); return new SuggestionTestHelper(suggestion, answer, model, null); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java index f2782c1..ffca8bb 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java
@@ -111,7 +111,7 @@ /* descriptionClassifications */ new ArrayList<>(), /* suggestionAnswer */ null, /* fillIntoEdit */ null, url, /* imageUrl */ "", /* imageDominantColor */ "", false, - /* isDeletable */ false); + /* isDeletable */ false, /* postContentType */ null, /* postData */ null); mModel = mProcessor.createModelForSuggestion(mSuggestion); mProcessor.populateModel(mSuggestion, mModel, 0); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java index 1064a1b..23bd2f3d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java
@@ -137,7 +137,7 @@ /* descriptionClassifications */ new ArrayList<>(), /* suggestionAnswer */ null, /* fillIntoEdit */ null, url, /* imageUrl */ "", /* imageDominantColor */ "", isBookmark, - /* isDeletable */ false); + /* isDeletable */ false, /* postContentType */ null, /* postData */ null); mModel = mProcessor.createModelForSuggestion(mSuggestion); mProcessor.populateModel(mSuggestion, mModel, 0); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java index 59f5848..789c90b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java
@@ -93,7 +93,7 @@ /* descriptionClassifications */ new ArrayList<>(), /* suggestionAnswer */ null, /* fillIntoEdit */ null, url, /* imageUrl */ "", /* imageDominantColor */ "", false, - /* isDeletable */ false); + /* isDeletable */ false, /* postContentType */ null, /* postData */ null); mModel = mProcessor.createModelForSuggestion(mSuggestion); mProcessor.populateModel(mSuggestion, mModel, 0); SuggestionViewViewBinder.bind(mModel, mRootView, SuggestionViewProperties.TEXT_LINE_1_TEXT);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java index 4b2ebd51..950c72f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java
@@ -105,7 +105,8 @@ /* descriptionClassifications */ null, /* suggestionAnswer */ null, /* fillIntoEdit */ "", /* url */ "", /* imageUrl */ url, /* imageDominantColor */ color, - /* isStarred */ false, /* isDeletable */ false); + /* isStarred */ false, /* isDeletable */ false, /* postContentType */ null, + /* postData */ null); PropertyModel model = mProcessor.createModelForSuggestion(suggestion); return new SuggestionTestHelper(suggestion, model); }
diff --git a/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java index f374bd8..97f0d8b 100644 --- a/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java
@@ -17,6 +17,7 @@ import org.chromium.base.Callback; import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.CalledByNativeJavaTest; +import org.chromium.base.annotations.DisabledCalledByNativeJavaTest; import org.chromium.chrome.browser.UnitTestUtils; import org.chromium.chrome.browser.instantapps.InstantAppsHandler; import org.chromium.chrome.browser.profiles.Profile; @@ -788,7 +789,7 @@ /** Android app has a "site" field missing certain parts of the URI (scheme, host, port). */ // Disabled test: https://crbug.com/1052429 - //@CalledByNativeJavaTest + @DisabledCalledByNativeJavaTest public void testAssetStatementSiteMissingParts() throws Exception { RelatedApplication manifestRelatedApps[] = new RelatedApplication[] { createRelatedApplication(PLATFORM_ANDROID, PACKAGE_NAME_1, null)};
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb index ce614c71b..7b213ab3 100644 --- a/chrome/app/resources/chromium_strings_af.xtb +++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Pasmaak en beheer Chromium. Opdatering is beskikbaar.</translation> <translation id="6120345080069858279">Chromium sal hierdie wagwoord in jou Google-rekening stoor. Jy sal dit nie hoef te onthou nie.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> is gevaarlik en daarom het Chromium dit geblokkeer.</translation> +<translation id="6134968993075716475">Veiligblaai is afgeskakel. Chromium beveel aan dat jy dit aanskakel.</translation> <translation id="6212496753309875659">Hierdie rekenaar het reeds 'n meer onlangse weergawe van Chromium. As die sagteware nie werk nie, deïnstalleer Chromium en probeer weer.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium sal nou herbegin}=1{Chromium sal oor 1 sekonde herbegin}other{Chromium sal oor # sekondes herbegin}}</translation> <translation id="6248213926982192922">Maak Chromium die verstekblaaier</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb index 12634cf..502bdfb 100644 --- a/chrome/app/resources/chromium_strings_as.xtb +++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Chromium কাষ্টমাইজ আৰু নিয়ন্ত্ৰণ কৰক। আপডে'ট আছে।</translation> <translation id="6120345080069858279">Chromiumএ এই পাছৱৰ্ডটো আপোনাৰ Google একাউণ্টত ছেভ কৰিব৷ আপুনি ইয়াক মনত ৰাখিব নালাগে৷</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> ক্ষতিকাৰক বাবে Chromiumএ ইয়াক অৱৰোধ কৰিছে।</translation> +<translation id="6134968993075716475">সুৰক্ষিত ব্ৰাউজিং অফ আছে। Chromiumএ ইয়াক অন কৰাটো চুপাৰিছ কৰে।</translation> <translation id="6212496753309875659">এই কম্পিউটাৰটোত ইতিমধ্যে Chromiumৰ অধিক শেহতীয়া সংস্কৰণ আছে। যদি ছফ্টৱেৰটোৱে কাম কৰা নাই তেন্তে Chromium আনইনষ্টল কৰি আকৌ চেষ্টা কৰক।</translation> <translation id="6219195342503754812">{0,plural, =0{এতিয়া Chromium পুনৰ লঞ্চ হ’ব}=1{১ ছেকেণ্ডত Chromium পুনৰ লঞ্চ হ’ব}one{# ছেকেণ্ডত Chromium পুনৰ লঞ্চ হ’ব}other{# ছেকেণ্ডত Chromium পুনৰ লঞ্চ হ’ব}}</translation> <translation id="6248213926982192922">Chromiumক ডিফ’ল্ট ব্ৰাউজাৰ বনাওক</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index 689c2b2..d702434 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -124,6 +124,7 @@ <translation id="6096348254544841612">Персонализиране и управление на Chromium. Налице е актуализация.</translation> <translation id="6120345080069858279">Chromium ще запази тази парола в профила ви в Google. Няма да се налага да я помните.</translation> <translation id="6129621093834146363">Chromium блокира „<ph name="FILE_NAME" />“, тъй като файлът е опасен.</translation> +<translation id="6134968993075716475">Функцията „Безопасно сърфиране“ е изключена. Chromium препоръчва да я включите.</translation> <translation id="6212496753309875659">На този компютър вече има по-скорошна версия на Chromium. Ако софтуерът не работи, моля, деинсталирайте Chromium и опитайте отново.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium ще се стартира отново сега}=1{Chromium ще се стартира отново след 1 секунда}other{Chromium ще се стартира отново след # секунди}}</translation> <translation id="6248213926982192922">Нека Chromium да е браузърът по подразбиране</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index 5b6bdd8..f2399930 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Prilagodite i kontrolirajte Chromium. Dostupno je ažuriranje.</translation> <translation id="6120345080069858279">Chromium će sačuvati ovu lozinku na vašem Google računu. Nećete je morati zapamtiti.</translation> <translation id="6129621093834146363">Fajl <ph name="FILE_NAME" /> je opasan pa ga je Chromium blokirao.</translation> +<translation id="6134968993075716475">Sigurno pregledanje je isključeno. Chromium preporučuje da ga uključite.</translation> <translation id="6212496753309875659">Na ovom računaru se već nalazi novija verzija Chromiuma. Ako softver ne funkcionira, deinstalirajte Chromium i pokušajte ponovo.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium će se sada ponovo pokrenuti}=1{Chromium će se ponovo pokrenuti za 1 sekundu}one{Chromium će se ponovo pokrenuti za # sekundu}few{Chromium će se ponovo pokrenuti za # sekunde}other{Chromium će se ponovo pokrenuti za # sekundi}}</translation> <translation id="6248213926982192922">Postavi Chromium kao zadani preglednik</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index c1406007..f4a19e42 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Personalitza i controla Chromium. Hi ha una actualització disponible.</translation> <translation id="6120345080069858279">Chromium desarà aquesta contrasenya al Compte de Google. No caldrà que la recordis.</translation> <translation id="6129621093834146363">Chromium ha bloquejat <ph name="FILE_NAME" /> perquè és perillós.</translation> +<translation id="6134968993075716475">Navegació segura està desactivada. Chromium recomana activar-la.</translation> <translation id="6212496753309875659">Aquest equip ja té una versió més recent de Chromium. Si el programari no funciona, desinstal·leu Chromium i torneu-ho a provar.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium es reiniciarà ara}=1{Chromium es reiniciarà d'aquí a 1 segon}other{Chromium es reiniciarà d'aquí a # segons}}</translation> <translation id="6248213926982192922">Estableix Chromium com a navegador predeterminat</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index ed2be23c..988127d 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Tilpas og administrer Chromium. Der er en tilgængelig opdatering.</translation> <translation id="6120345080069858279">Chromium gemmer denne adgangskode på din Google-konto. Du behøver ikke at huske den.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> er skadelig, så Chromium har blokeret den.</translation> +<translation id="6134968993075716475">Beskyttet browsing er deaktiveret. Chromium anbefaler, at du aktiverer funktionen.</translation> <translation id="6212496753309875659">Computeren har allerede en nyere version af Chromium. Hvis softwaren ikke virker, skal du afinstallere Chromium og prøve igen.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium genstarter nu}=1{Chromium genstarter om 1 sekund}one{Chromium genstarter om # sekund}other{Chromium genstarter om # sekunder}}</translation> <translation id="6248213926982192922">Gør Chromium til din standardbrowser</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index 9fa15f7..dcb96d9 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Προσαρμόστε και ελέγξτε το Chromium. Υπάρχει διαθέσιμη ενημέρωση.</translation> <translation id="6120345080069858279">Το Chromium θα αποθηκεύσει αυτόν τον κωδικό πρόσβασης στον Λογαριασμό σας Google. Δεν χρειάζεται να τον απομνημονεύσετε.</translation> <translation id="6129621093834146363">Το αρχείο <ph name="FILE_NAME" /> είναι επικίνδυνο, επομένως έχει αποκλειστεί από το Chromium.</translation> +<translation id="6134968993075716475">Η Ασφαλής περιήγηση είναι απενεργοποιημένη. Το Chromium συνιστά να την ενεργοποιήσετε.</translation> <translation id="6212496753309875659">Αυτός ο υπολογιστής διαθέτει ήδη μια πιο πρόσφατη έκδοση του Chromium. Αν το λογισμικό δεν λειτουργεί, απεγκαταστήστε το Chromium και κατεβάστε το ξανά.</translation> <translation id="6219195342503754812">{0,plural, =0{Η επανεκκίνηση του Chromium θα γίνει τώρα}=1{Η επανεκκίνηση του Chromium θα γίνει σε 1 δευτερόλεπτο}other{Η επανεκκίνηση του Chromium θα γίνει σε # δευτερόλεπτα}}</translation> <translation id="6248213926982192922">Ορισμός Chromium ως προεπιλεγμένο πρόγραμμα</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 432d56b..fc88ea65 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Customise and control Chromium. Update is available.</translation> <translation id="6120345080069858279">Chromium will save this password in your Google Account. You won’t have to remember it.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> is dangerous, so Chromium has blocked it.</translation> +<translation id="6134968993075716475">Safe Browsing is off. Chromium recommends turning it on.</translation> <translation id="6212496753309875659">This computer already has a more recent version of Chromium. If the software is not working, please uninstall Chromium and try again.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium will relaunch now}=1{Chromium will relaunch in 1 second}other{Chromium will relaunch in # seconds}}</translation> <translation id="6248213926982192922">Make Chromium the default browser</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index 272f0a3..3700b0d 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Prilagodite i kontrolirajte Chromium. Dostupno je ažuriranje.</translation> <translation id="6120345080069858279">Chromium će spremiti tu zaporku na vaš Google račun. Ne morate je pamtiti.</translation> <translation id="6129621093834146363">Datoteka <ph name="FILE_NAME" /> opasna je, pa ju je Chromium blokirao.</translation> +<translation id="6134968993075716475">Sigurno je pregledavanje isključeno. Chromium preporučuje da ga uključite.</translation> <translation id="6212496753309875659">Ovo računalo već ima noviju verziju Chromiuma. Ako softver ne funkcionira, deinstalirajte Chromium i pokušajte ponovo.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium će se sada ponovo pokrenuti}=1{Chromium će se ponovo pokrenuti za jednu sekundu}one{Chromium će se ponovo pokrenuti za # sekundu}few{Chromium će se ponovo pokrenuti za # sekunde}other{Chromium će se ponovo pokrenuti za # sekundi}}</translation> <translation id="6248213926982192922">Neka Chromium bude zadani preglednik</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index 4d98d58a4..46ff00f 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">A Chromium személyre szabása és vezérlése. Van rendelkezésre álló frissítés.</translation> <translation id="6120345080069858279">A Chromium ezt a jelszót Google-fiókjába menti. Nem kell megjegyeznie.</translation> <translation id="6129621093834146363">A(z) <ph name="FILE_NAME" /> veszélyes, ezért a Chromium letiltotta.</translation> +<translation id="6134968993075716475">A Biztonságos Böngészés ki van kapcsolva. A Chromium a szolgáltatás bekapcsolását javasolja.</translation> <translation id="6212496753309875659">A számítógépen már megtalálható a Chromium újabb verziója. Ha a szoftver nem működik, kérjük, távolítsa el a Chromiumot, majd próbálkozzon újra.</translation> <translation id="6219195342503754812">{0,plural, =0{A Chromium most újraindul}=1{A Chromium 1 másodpercen belül újraindul}other{A Chromium # másodpercen belül újraindul}}</translation> <translation id="6248213926982192922">Legyen a Chromium az alapértelmezett böngészőm</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb index 05f7973..d778df7 100644 --- a/chrome/app/resources/chromium_strings_hy.xtb +++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Հասանելի է Chromium-ի նոր տարբերակը։</translation> <translation id="6120345080069858279">Chromium-ը կպահի այս գաղտնաբառը ձեր Google հաշվում: Գաղտնաբառը հիշելու կարիք չի լինի:</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> ֆայլը վտանգավոր է, և Chromium-ն արգելափակել է այն:</translation> +<translation id="6134968993075716475">Անվտանգ դիտարկումն անջատված է։ Chromium-ը խորհուրդ է տալիս միացնել այն։</translation> <translation id="6212496753309875659">Այս համակարգչում արդեն տեղադրված է Chromium-ի ավելի նոր տարբերակը: Եթե ծրագրակազմը չի աշխատում, ապատեղադրեք Chromium-ը և նորից փորձեք:</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium-ը հիմա կվերագործարկվի}=1{Chromium-ը կվերագործարկվի 1 վայրկյանից}one{Chromium-ը կվերագործարկվի # վայրկյանից}other{Chromium-ը կվերագործարկվի # վայրկյանից}}</translation> <translation id="6248213926982192922">Դարձնել Chromium-ը կանխադրված դիտարկիչ</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb index 922770a..91ea3027 100644 --- a/chrome/app/resources/chromium_strings_is.xtb +++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Sérstilltu og stjórnaðu Chromium. Uppfærsla er í boði.</translation> <translation id="6120345080069858279">Chromium mun vista þetta aðgangsorð á Google reikningnum þínum. Þú þarft ekki að muna það.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> er skaðleg skrá og Chromium útilokaði hana.</translation> +<translation id="6134968993075716475">Slökkt er á öruggri vefskoðun. Chromium mælir með því að kveikt sé á henni.</translation> <translation id="6212496753309875659">Á þessari tölvu er þegar nýrri útgáfa af Chromium. Ef hugbúnaðurinn virkar ekki skaltu fjarlægja Chromium og reyna aftur.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium verður endurræst núna}=1{Chromium verður endurræst eftir 1 sekúndu}one{Chromium verður endurræst eftir # sekúndu}other{Chromium verður endurræst eftir # sekúndur}}</translation> <translation id="6248213926982192922">Gera Chromium að sjálfgefnum vafra</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index c5433cd..40db147 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">È disponibile un nuovo aggiornamento.</translation> <translation id="6120345080069858279">Chromium salverà la password nel tuo Account Google affinché tu non debba memorizzarla.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> è pericoloso, pertanto è stato bloccato da Chromium.</translation> +<translation id="6134968993075716475">Navigazione sicura è disattivata. Chromium consiglia di attivarla.</translation> <translation id="6212496753309875659">Questo computer ha già una versione più recente di Chromium. Se il software non funziona, disinstalla Chromium e riprova.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium verrà riavviato ora}=1{Chromium verrà riavviato tra 1 secondo}other{Chromium verrà riavviato tra # secondi}}</translation> <translation id="6248213926982192922">Imposta Chromium come browser predefinito</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index 5a7f3c7..49bcc34 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -124,6 +124,7 @@ <translation id="6096348254544841612">כדי להתאים אישית את Google Chrome ולשלוט בו טוב יותר, כדאי להוריד את העדכון החדש.</translation> <translation id="6120345080069858279">הסיסמה הזאת תישמר על ידי Chromium בחשבון Google שלך. אין צורך לזכור אותה.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> מסוכן, ולכן Chromium חסם אותו.</translation> +<translation id="6134968993075716475">הגלישה הבטוחה כבויה. ההמלצה של Chromium היא להפעיל אותה.</translation> <translation id="6212496753309875659">במחשב זה קיימת כבר גרסה מתקדמת יותר של Chromium. אם התוכנה אינה פועלת, הסר את ההתקנה של Chromium ונסה שוב.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium יופעל מחדש עכשיו}=1{Chromium יופעל מחדש בעוד שנייה אחת}two{Chromium יופעל מחדש בעוד # שניות}many{Chromium יופעל מחדש בעוד # שניות}other{Chromium יופעל מחדש בעוד # שניות}}</translation> <translation id="6248213926982192922">הפוך את Chromium לדפדפן ברירת המחדל</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb index fc2f31b..49b0912 100644 --- a/chrome/app/resources/chromium_strings_ka.xtb +++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">მოირგეთ და გააკონტროლეთ Chromium. ხელმისაწვდომია განახლება.</translation> <translation id="6120345080069858279">Chromium შეინახავს ამ პაროლს თქვენს Google ანგარიშში. მისი დამახსოვრება აუცილებელი არ არის.</translation> <translation id="6129621093834146363">Chromium-მა დაბლოკა <ph name="FILE_NAME" />, რადგან ის სახიფათოა.</translation> +<translation id="6134968993075716475">Safe Browsing გამორთულია. Chromium გირჩევთ მის ჩართვას.</translation> <translation id="6212496753309875659">ამ კომპიუტერს უკვე აქვს Chromium.-ის უფრო ახალი ვერსია. იმ შემთხვევაში, თუ პროგრამა არ მუშაობს, გთხოვთ, განახორციელეთ Chromium-ის დეინსტალაცია და სცადეთ ისევ.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium ახლა ხელახლა გაეშვება}=1{Chromium ხელახლა გაეშვება 1 წამში}other{Chromium ხელახლა გაეშვება # წამში}}</translation> <translation id="6248213926982192922">Chromium გახდეს ნაგულისხმევი ბრაუზერი</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index e0c222f..90f0f4c 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">ປັບແຕ່ງ ແລະ ຄວບຄຸມ Chromium. ມີການອັບເດດແລ້ວ</translation> <translation id="6120345080069858279">Chromium ຈະບັນທຶກລະຫັດຜ່ານນີ້ໄວ້ໃນບັນຊີ Google ຂອງທ່ານ. ທ່ານຈະບໍ່ຈຳເປັນຕ້ອງຈື່ມັນ.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> ອັນຕະລາຍ, ສະນັ້ນ Chromium ໄດ້ບລັອກມັນໄວ້ແລ້ວ.</translation> +<translation id="6134968993075716475">Safe Browsing ປິດຢູ່. Chromium ຂໍແນະນຳໃຫ້ເປີດມັນ.</translation> <translation id="6212496753309875659">ຄອມພິວເຕີນີ້ມີ Chromium ລຸ້ນໃໝ່ກ່ວາຢູ່ຮຽບຮ້ອຍແລ້ວ. ຖ້າຊອບແວບໍ່ເຮັດວຽກ, ກະລຸນາຖອນຕິດຕັ້ງ Chromium ແລະລອງໃໝ່ອີກ.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium ຈະເປີດຄືນໃໝ່ດຽວນີ້}=1{Chromium ຈະເປີດຄືນໃໝ່ໃນ 1 ວິນາທີ}other{Chromium ຈະເປີດຄືນໃໝ່ໃນ # ວິນາທີ}}</translation> <translation id="6248213926982192922">ເຮັດ Chromium ເປັນບຣາວເຊີມາດຕະຖານ</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 8fed168..25ece09 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Tinkinkite ir valdykite „Chromium“. Pasiekiamas naujinys.</translation> <translation id="6120345080069858279">„Chromium“ išsaugos šį slaptažodį „Google“ paskyroje. Jums nereikia jo prisiminti.</translation> <translation id="6129621093834146363">Failas „<ph name="FILE_NAME" />“ pavojingas, todėl „Chromium“ jį užblokavo.</translation> +<translation id="6134968993075716475">Saugaus naršymo funkcija išjungta. „Chromium“ rekomenduoja ją įjungti.</translation> <translation id="6212496753309875659">Šiame kompiuteryje jau yra naujesnės versijos „Chromium“. Jei programinė įranga neveikia, pašalinkite „Chromium“ ir bandykite dar kartą.</translation> <translation id="6219195342503754812">{0,plural, =0{„Chromium“ bus paleista iš naujo dabar}=1{„Chromium“ bus paleista iš naujo po 1 sekundės}one{„Chromium“ bus paleista iš naujo po # sekundės}few{„Chromium“ bus paleista iš naujo po # sekundžių}many{„Chromium“ bus paleista iš naujo po # sekundės}other{„Chromium“ bus paleista iš naujo po # sekundžių}}</translation> <translation id="6248213926982192922">Padaryti „Chromium“ numatytąja naršykle</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb index 22fec471..929afc00 100644 --- a/chrome/app/resources/chromium_strings_mk.xtb +++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Приспособете го и контролирајте го Chromium. Достапно е ажурирање.</translation> <translation id="6120345080069858279">Chromium ќе ја зачува лозинкава во вашата сметка на Google. Не мора да ја запомните.</translation> <translation id="6129621093834146363">Датотеката <ph name="FILE_NAME" /> е опасна, па затоа Chromium ја блокираше.</translation> +<translation id="6134968993075716475">„Безбедното прелистување“ е исклучено. Chromium препорачува да го вклучите.</translation> <translation id="6212496753309875659">Овој компјутер веќе има најнова верзија на Chromium. Доколку софтверот не работи, деинсталирајте го Chromium и обидете се повторно.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium ќе се рестартира сега}=1{Chromium ќе се рестартира по 1 секунда}one{Chromium ќе се рестартира по # секунда}other{Chromium ќе се рестартира по # секунди}}</translation> <translation id="6248213926982192922">Постави го Chromium за стандарден прелистувач</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index 61de8da6..226a961 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Sesuaikan dan kawal Chromium. Kemas kini tersedia.</translation> <translation id="6120345080069858279">Chromium akan menyimpan kata laluan ini dalam Akaun Google anda. Anda tidak perlu mengingati kata laluan tersebut.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> berbahaya, jadi Chromium telah menyekat fail itu.</translation> +<translation id="6134968993075716475">Penyemakan Imbas Selamat dimatikan. Chromium mengesyorkan agar ciri ini dihidupkan.</translation> <translation id="6212496753309875659">Komputer ini telah mempunyai versi Chromium yang lebih baharu. Jika perisian tidak berfungsi, sila nyahpasang Chromium dan cuba lagi.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium akan dilancarkan semula sekarang}=1{Chromium akan dilancarkan semula dalam masa sesaat}other{Chromium akan dilancarkan semula dalam masa # saat}}</translation> <translation id="6248213926982192922">Jadikan Chromium penyemak imbas lalai</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index af77db2..a2c68bc 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -130,6 +130,7 @@ <translation id="6096348254544841612">Chromium ကို စိတ်ကြိုက်လုပ်ပြီး ထိန်းချုပ်ပါ။ အပ်ဒိတ် ရရှိပါပြီ။</translation> <translation id="6120345080069858279">Chromium သည် ဤစကားဝှက်ကို သင်၏ Google အကောင့်သို့ သိမ်းဆည်းသွားပါမည်။ သင်၎င်းကို မှတ်ထားစရာမလိုပါ။</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> သည် အန္တရာယ်ရှိသောကြောင့် Chromium က ၎င်းကို ပိတ်ဆို့ထားပါသည်။</translation> +<translation id="6134968993075716475">'လုံခြုံစွာ ကြည့်ရှုခြင်း' ပိတ်ထားသည်။ ၎င်းကိုဖွင့်ရန် Chromium က အကြံပြုပါသည်။</translation> <translation id="6212496753309875659">ဒီကွန်ပျူတာ ထဲမှာ ပိုပြီး နောက်ကျသော Chromium ဗားရှင်း ရှိနေပါပြီ။ ဆော့ဝဲ အလုပ်မလုပ်လျှင်၊ ကျေးဇူးပြုပြီး Chromium ကို ဖြုတ်လိုက်ပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium ကို ယခု ပြန်လည်စတင်ပါမည်}=1{Chromium ကို ၁ စက္ကန့်အကြာတွင် ပြန်လည်စတင်ပါမည်}other{Chromium ကို # စက္ကန့်အကြာတွင် ပြန်လည်စတင်ပါမည်}}</translation> <translation id="6248213926982192922">Chromium ကို ပုံသေ ဘရောင်ဇာ လုပ်လိုက်ရန်</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index b9f8d8d..8c9b2e1 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Chromium aanpassen en beheren. Update is beschikbaar</translation> <translation id="6120345080069858279">Chromium slaat dit wachtwoord op in je Google-account. Je hoeft het niet te onthouden.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> is gevaarlijk en is daarom door Chromium geblokkeerd.</translation> +<translation id="6134968993075716475">Safe Browsing is uitgeschakeld. Chromium raadt je aan deze functie in te schakelen.</translation> <translation id="6212496753309875659">Deze computer beschikt al over een recentere versie van Chromium. Als de software niet werkt, moet je Chromium verwijderen en het opnieuw proberen.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium wordt nu opnieuw gestart}=1{Chromium wordt over één seconde opnieuw gestart}other{Chromium wordt over # seconden opnieuw gestart}}</translation> <translation id="6248213926982192922">Chromium als standaardbrowser instellen</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index 035d837..b2d6cd0 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -124,6 +124,7 @@ <translation id="6096348254544841612">Dostosowywanie i kontrolowanie Chromium. Dostępna jest aktualizacja.</translation> <translation id="6120345080069858279">Chromium zapisze to hasło na Twoim koncie Google. Nie musisz go pamiętać.</translation> <translation id="6129621093834146363">Plik <ph name="FILE_NAME" /> jest niebezpieczny, dlatego został zablokowany przez Chromium.</translation> +<translation id="6134968993075716475">Bezpieczne przeglądanie jest wyłączone. Chromium zaleca jego włączenie.</translation> <translation id="6212496753309875659">Na tym komputerze jest już zainstalowana nowsza wersja Chromium. Jeśli program nie działa, odinstaluj go i spróbuj ponownie.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium uruchomi się ponownie teraz}=1{Chromium uruchomi się ponownie za 1 sekundę}few{Chromium uruchomi się ponownie za # sekundy}many{Chromium uruchomi się ponownie za # sekund}other{Chromium uruchomi się ponownie za # sekundy}}</translation> <translation id="6248213926982192922">Ustaw Chromium jako domyślną przeglądarkę</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index d819e5d8..515be22 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -124,6 +124,7 @@ <translation id="6096348254544841612">Personalize e controle o Chromium. Uma atualização está disponível.</translation> <translation id="6120345080069858279">O Chromium salvará essa senha na sua Conta do Google. Você não precisará se lembrar dela.</translation> <translation id="6129621093834146363">O arquivo <ph name="FILE_NAME" /> é perigoso. Por isso ele foi bloqueado pelo Chromium.</translation> +<translation id="6134968993075716475">O "Navegação segura" está desativado. O Chromium recomenda reativá-lo.</translation> <translation id="6212496753309875659">Este computador já tem uma versão mais recente do Chromium. Se o software não estiver funcionando, desinstale o Chromium e tente novamente.</translation> <translation id="6219195342503754812">{0,plural, =0{O Chromium será reiniciado agora}=1{O Chromium será reiniciado em 1 segundo}one{O Chromium será reiniciado em # segundo}other{O Chromium será reiniciado em # segundos}}</translation> <translation id="6248213926982192922">Tornar o Chromium o navegador padrão</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index 895d2b3..c9a452b8 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Personalize e controle o Chromium. Está disponível uma atualização.</translation> <translation id="6120345080069858279">O Chromium vai guardar esta palavra-passe na sua Conta Google. Não tem de a memorizar.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> é perigoso, por isso o Chromium bloqueou-o.</translation> +<translation id="6134968993075716475">A Navegação segura está desativada. O Chromium recomenda que a ative.</translation> <translation id="6212496753309875659">Este computador já tem uma versão mais recente do Chromium. Se o software não estiver a funcionar, desinstale o Chromium e tente novamente.</translation> <translation id="6219195342503754812">{0,plural, =0{O Chromium será reiniciado agora}=1{O Chromium será reiniciado dentro de 1 segundo}other{O Chromium será reiniciado dentro de # segundos}}</translation> <translation id="6248213926982192922">Definir o Chromium como navegador predefinido</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index c78eb6f..8f735e44 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Personalizează și controlează Chromium. Este disponibilă o actualizare.</translation> <translation id="6120345080069858279">Chromium va salva parola în Contul tău Google. Nu va trebui să o reții.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> este periculos, așadar Chromium l-a blocat.</translation> +<translation id="6134968993075716475">Navigarea sigură este dezactivată. Chromium îți recomandă s-o activezi.</translation> <translation id="6212496753309875659">Acest computer are deja o versiune mai recentă de Chromium. Dacă software-ul nu funcționează, dezinstalați Chromium și încercați din nou.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium se va relansa acum}=1{Chromium se va relansa într-o secundă}few{Chromium se va relansa în # secunde}other{Chromium se va relansa în # de secunde}}</translation> <translation id="6248213926982192922">Setați Chromium ca browser prestabilit</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb index e9c7799..b6e50207 100644 --- a/chrome/app/resources/chromium_strings_si.xtb +++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Chromium අභිරුචිකරණය සහ පාලනය කරන්න. යාවත්කාලීන ලද හැකිය.</translation> <translation id="6120345080069858279">Chromium මෙම මුරපදය ඔබගේ Google ගිණුම සමගින් සුරකිනු ඇත. ඔබට එය මතක තබා ගැනීමට සිදු නොවේ.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> අනතුරුදායකයි, එම නිසා Chromium එය අවහිර කර ඇත.</translation> +<translation id="6134968993075716475">සුරක්ෂිත පිරික්සුම ක්රියාවිරහිතයි. එය ක්රියාත්මක කිරීමට Chromium නිර්දේශ කරයි.</translation> <translation id="6212496753309875659">මෙම පරිගණකය සතුව දැනටමත් නව Chromium සංස්කරණයක් පවතී. මෘදුකාංගය ක්රියා නොකරයි නම් කරුණාකර Chromium ඉවත්කර නැවත උත්සහ කරන්න.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium දැන් යළි දියත් වෙයි}=1{Chromium 1 තත්පරයකින් යළි දියත් වෙයි}one{Chromium තත්පර # කින් යළි දියත් වෙයි}other{Chromium තත්පර # කින් යළි දියත් වෙයි}}</translation> <translation id="6248213926982192922">Chromium පෙරනිමි බ්රව්සරය බවට පත් කරන්න</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 96bf7739..5fd9d007 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Prilagodite in nadzirajte Chromium. Posodobitev je na voljo.</translation> <translation id="6120345080069858279">Chromium bo shranil to geslo v Google Računu. Ni si vam ga treba zapomniti.</translation> <translation id="6129621093834146363">Datoteka <ph name="FILE_NAME" /> je nevarna, zato jo je Chromium blokiral.</translation> +<translation id="6134968993075716475">Varno brskanje je izklopljeno. Chromium priporoča, da ga vklopite.</translation> <translation id="6212496753309875659">Ta računalnik že ima novejšo različico Chromiuma. Če programska oprema ne deluje, odstranite Chromium in poskusite znova.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium se bo zdaj znova zagnal}=1{Chromium se bo znova zagnal čez eno sekundo}one{Chromium se bo znova zagnal čez # sekundo}two{Chromium se bo znova zagnal čez # sekundi}few{Chromium se bo znova zagnal čez # sekunde}other{Chromium se bo znova zagnal čez # sekund}}</translation> <translation id="6248213926982192922">Nastavi Chromium kot privzeti brskalnik</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb index c2c3b38..82a18ae 100644 --- a/chrome/app/resources/chromium_strings_sr-Latn.xtb +++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Prilagodite i kontrolišite Chromium. Dostupno je ažuriranje.</translation> <translation id="6120345080069858279">Chromium će sačuvati ovu lozinku na Google nalogu. Nećete morati da je pamtite.</translation> <translation id="6129621093834146363">Datoteka <ph name="FILE_NAME" /> je opasna, pa ju je Chromium blokirao.</translation> +<translation id="6134968993075716475">Bezbedno pregledanje je isključeno. Chromium preporučuje da ga uključite.</translation> <translation id="6212496753309875659">Ovaj računar već ima noviju verziju Chromium-a. Ako softver ne funkcioniše, deinstalirajte Chromium i pokušajte ponovo.</translation> <translation id="6219195342503754812">{0,plural, =0{Ponovo ćemo pokrenuti Chromium}=1{Ponovo ćemo pokrenuti Chromium za 1 sekundu}one{Ponovo ćemo pokrenuti Chromium za # sekundu}few{Ponovo ćemo pokrenuti Chromium za # sekunde}other{Ponovo ćemo pokrenuti Chromium za # sekundi}}</translation> <translation id="6248213926982192922">Podesi Chromium za podrazumevani pregledač</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index c3a2b560..e2ceb13 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Прилагодите и контролишите Chromium. Доступно је ажурирање.</translation> <translation id="6120345080069858279">Chromium ће сачувати ову лозинку на Google налогу. Нећете морати да је памтите.</translation> <translation id="6129621093834146363">Датотека <ph name="FILE_NAME" /> је опасна, па ју је Chromium блокирао.</translation> +<translation id="6134968993075716475">Безбедно прегледање је искључено. Chromium препоручује да га укључите.</translation> <translation id="6212496753309875659">Овај рачунар већ има новију верзију Chromium-а. Ако софтвер не функционише, деинсталирајте Chromium и покушајте поново.</translation> <translation id="6219195342503754812">{0,plural, =0{Поново ћемо покренути Chromium}=1{Поново ћемо покренути Chromium за 1 секунду}one{Поново ћемо покренути Chromium за # секунду}few{Поново ћемо покренути Chromium за # секунде}other{Поново ћемо покренути Chromium за # секунди}}</translation> <translation id="6248213926982192922">Подеси Chromium за подразумевани прегледач</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index 2cfd1b7c..efac1d69 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Weka mapendeleo na udhibiti Chromium. Sasisho linapatikana.</translation> <translation id="6120345080069858279">Chromium itahifadhi nenosiri hili kwenye Akaunti yako ya Google. Hutahitaji kulikumbuka.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> ni hatari, kwa hivyo Chromium imeizuia.</translation> +<translation id="6134968993075716475">Kipengele cha Kuvinjari Salama kimezimwa. Chromium inapendekeza ukiwashe.</translation> <translation id="6212496753309875659">Kompyuta hii tayari ina toleo la hivi punde la Chromium. Ikiwa programu haifanyikazi, tafadhali ondoa Chromium kisha ujaribu tena.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium itafunguka upya hivi sasa}=1{Chromium itafunguka upya ndani ya sekunde 1}other{Chromium itafunguka upya ndani ya sekunde #}}</translation> <translation id="6248213926982192922">Fanya Chromium kuwa kivinjari chaguomsingi</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index 7d52868..4531d53 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">ปรับแต่งและควบคุม Chromium มีการอัปเดต</translation> <translation id="6120345080069858279">Chromium จะบันทึกรหัสผ่านนี้ในบัญชี Google คุณจะได้ไม่ต้องจำรหัสผ่านเอง</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> เป็นอันตราย Chromium จึงบล็อกไว้</translation> +<translation id="6134968993075716475">Google Safe Browsing ปิดอยู่ Chromium ขอแนะนำให้เปิด</translation> <translation id="6212496753309875659">คอมพิวเตอร์เครื่องนี้ติดตั้ง Chromium รุ่นที่ใหม่กว่าอยู่แล้ว ถ้าซอฟต์แวร์ไม่ทำงาน โปรดถอนการติดตั้ง Chromium และลองอีกครั้ง</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium จะเปิดขึ้นมาใหม่ตอนนี้}=1{Chromium จะเปิดขึ้นมาใหม่ใน 1 วินาที}other{Chromium จะเปิดขึ้นมาใหม่ใน # วินาที}}</translation> <translation id="6248213926982192922">ทำให้ Chromium เป็นเบราว์เซอร์เริ่มต้น</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index a76a41a..489a676 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -126,6 +126,7 @@ <translation id="6096348254544841612">Налаштуйте й контролюйте Chromium. Доступне оновлення.</translation> <translation id="6120345080069858279">Chromium збереже цей пароль в обліковому записі Google. Не потрібно його запам’ятовувати.</translation> <translation id="6129621093834146363">Файл <ph name="FILE_NAME" /> небезпечний, тому Chromium заблокував його.</translation> +<translation id="6134968993075716475">Безпечний перегляд вимкнено. Chromium радить увімкнути його.</translation> <translation id="6212496753309875659">На цьому комп’ютері вже встановлено новішу версію Chromium. Якщо програмне забезпечення не працює, видаліть Chromium і повторіть спробу.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium перезапуститься зараз}=1{Chromium перезапуститься через 1 секунду}one{Chromium перезапуститься через # секунду}few{Chromium перезапуститься через # секунди}many{Chromium перезапуститься через # секунд}other{Chromium перезапуститься через # секунди}}</translation> <translation id="6248213926982192922">Зробити Chromium переглядачем за умовчанням</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb index c5b6b48..6c19c68 100644 --- a/chrome/app/resources/chromium_strings_uz.xtb +++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -124,6 +124,7 @@ <translation id="6096348254544841612">Chromium uchun yangilanish chiqdi.</translation> <translation id="6120345080069858279">Chromium bu parolni Google hisobingizga saqlaydi. Uni eslab qolishingiz shart emas.</translation> <translation id="6129621093834146363"><ph name="FILE_NAME" /> xavfli edi, shuning uchun u Chromium tomonidan bloklandi.</translation> +<translation id="6134968993075716475">Saytlarni xavfsiz kezish yoniq emas. Chromium uni yoqishingizni tavsiya qiladi.</translation> <translation id="6212496753309875659">Bu kompyuterda allaqachon Chromium‘ning so‘nggi versiyasi o‘rnatilgan. Agar dastur ishlamayotgan bo‘lsa, uni o‘chirib qaytadan o‘rnatib ko‘ring.</translation> <translation id="6219195342503754812">{0,plural, =0{Chromium hozir qayta ishga tushadi}=1{Chromium 1 soniyadan keyin qayta ishga tushadi}other{Chromium # soniyadan keyin qayta ishga tushadi}}</translation> <translation id="6248213926982192922">Chromium‘ni standart brauzer etib tayinlash</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index 7d51b230..f1c6c3e2 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -128,6 +128,7 @@ <translation id="6096348254544841612">Enza ngendlela oyifisayo uphinde ulawule i-Chromium. Isibuyekezo siyatholakala.</translation> <translation id="6120345080069858279">I-Chromium izolondoloza le phasiwedi ku-akhawunti yakho ye-Google. Ngeke kudingeke ukuthi uyikhumbule.</translation> <translation id="6129621093834146363">I-<ph name="FILE_NAME" /> iyingozi, ngakho-ke i-Chromium iyivimbile.</translation> +<translation id="6134968993075716475">Ukuphequlula Okuphephile kuvaliwe. i-Chromium incoma ukuba kuvulwe.</translation> <translation id="6212496753309875659">Le khompyutha isivele inenguqulo yakamuva kakhulu ye-Chromium. Uma isofthiwe ingasebenzi, sicela ukhiphe i-Chromium uphinde uzame futhi.</translation> <translation id="6219195342503754812">{0,plural, =0{I-Chromium izoqalisa kabusha manje}=1{I-Chromium izoqalisa kabusha kusekhondi elingu-1}one{I-Chromium izoqalisa kabusha kumasekhondi angu-#}other{I-Chromium izoqalisa kabusha kumasekhondi angu-#}}</translation> <translation id="6248213926982192922">Yenza i-Chromium ibe yisiphequluli esizenzakalelayo</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 2569911..908e0ef2 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Maak in <ph name="APP" /> oop</translation> <translation id="2120297377148151361">Aktiwiteit en interaksies</translation> <translation id="2120639962942052471">Het <ph name="PERMISSION" /> geblokkeer</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Webkoekies word geblokkeer}=1{Webkoekies word geblokkeer; 1 uitsondering}other{Webkoekies word geblokkeer; {COUNT} uitsonderings}}</translation> <translation id="2121825465123208577">Verander grootte</translation> <translation id="2122305276694332719">As jy outomaties aan 'n versteekte netwerk koppel, laat dit ander mense toe om jou toestel en van jou netwerkinstellings te sien. Dit word nie aanbeveel nie.</translation> <translation id="2123766928840368256">Kies 'n ander lêer</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 8a4803a..35dd8a8 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1810,7 +1810,7 @@ <translation id="3424969259347320884">وصف ما كنت تفعله عندما تعطّلت علامة التبويب</translation> <translation id="3427092606871434483">السماح (تلقائي)</translation> <translation id="3428419049384081277">تم تسجيل دخولك!</translation> -<translation id="3428747202529429621">يوفّر لك هذا الوضع حماية في Chrome، ويمكن استخدامه لتحسين مستوى أمانك في تطبيقات Google الأخرى عند تسجيل الدخول.</translation> +<translation id="3428747202529429621">يوفّر لك هذا الوضع حماية في Chrome، ويمكن استخدامه لتحسين مستوى أمانك في تطبيقات Google الأخرى عندما تكون مسجلًا دخولك.</translation> <translation id="3429275422858276529">ضَع إشارة على هذه الصفحة لسهولة العثور عليها لاحقًا</translation> <translation id="3432227430032737297">إزالة كل العناصر المعروضة</translation> <translation id="3432757130254800023">إرسال الإعدادات الصوتية والفيديو لشاشات العرض على الشبكة المحلية</translation> @@ -1871,7 +1871,7 @@ <translation id="3492788708641132712">المزامنة لا تعمل. حاول تسجيل الدخول مرة أخرى.</translation> <translation id="3493486281776271508">الاتصال بالإنترنت مطلوب</translation> <translation id="3493881266323043047">الصلاحية</translation> -<translation id="3494155060718700400">لا يوفّر لك هذا الوضع حماية من الإضافات أو عمليات التنزيل أو المواقع الإلكترونية الضارة (غير مُستحسَن). وستظل تستفيد من حماية ميزة "التصفُّح الآمن" متى أمكن، في خدمات Google الأخرى، مثل Gmail و"بحث Google".</translation> +<translation id="3494155060718700400">لا يوفّر لك هذا الوضع حماية من الإضافات أو عمليات التنزيل أو المواقع الإلكترونية الضارة (غير مُستحسَن). وستظل تستفيد من ميزة "التصفُّح الآمن" متى أمكن في خدمات Google الأخرى، مثل Gmail و"بحث Google".</translation> <translation id="3494769164076977169">طلب الإذن عند محاولة أحد المواقع تنزيل الملفات تلقائيًا بعد الملف الأول (مستحسن)</translation> <translation id="3495660573538963482">إعدادات مساعد Google</translation> <translation id="3496213124478423963">تصغير</translation> @@ -2464,7 +2464,7 @@ <translation id="425573743389990240">بطارية تفريغ شحن البطارية بوحدة الوات (القيمة السالب تعني أنه جارٍ شحن البطارية)</translation> <translation id="4256316378292851214">حف&ظ الفيديو باسم...</translation> <translation id="4258348331913189841">أنظمة الملفات</translation> -<translation id="4260182282978351200">قد يكون <ph name="FILE_NAME" /> خطيرًا. هل تريد إرساله إلى برنامج "الحماية المتقدّمة" من Google لفحصه؟ ما عليك سوى الضغط على Shift+F6 للانتقال إلى منطقة شريط عمليات التنزيل.</translation> +<translation id="4260182282978351200">قد يكون الملف <ph name="FILE_NAME" /> خطيرًا. هل تريد إرساله إلى برنامج "الحماية المتقدّمة" من Google لفحصه؟ ما عليك سوى الضغط على Shift+F6 للانتقال إلى منطقة شريط عمليات التنزيل.</translation> <translation id="4263223596040212967">يُرجى التحقق من تنسيق لوحة المفاتيح وإعادة المحاولة.</translation> <translation id="4263757076580287579">تم إلغاء تسجيل الطابعة.</translation> <translation id="426564820080660648">للتحقق من وجود تحديثات، يُرجى استخدام شبكة Ethernet أو Wi-Fi أو بيانات الجوّال.</translation> @@ -5897,7 +5897,7 @@ <translation id="8895454554629927345">قائمة الإشارات المرجعية</translation> <translation id="8896022254727357590">يجب ألا يقلّ رقم التعريف الشخصي عن 4 أحرف كحد أدنى.</translation> <translation id="8898786835233784856">تحديد علامة التبويب التالية</translation> -<translation id="8898822736010347272">إرسال عناوين URL لبعض الصفحات التي تزورها، وعدد محدود من معلومات النظام، وبعض أنواع محتوى الصفحات إلى Google، وذلك للمساعدة على اكتشاف التهديدات الجديدة وتوفير الحماية لجميع المستخدمين على الويب</translation> +<translation id="8898822736010347272">إرسال عناوين URL الخاصّة ببعض الصفحات التي تزورها، وعدد محدود من معلومات النظام، وبعض أنواع محتوى الصفحات إلى Google، وذلك للمساعدة على اكتشاف التهديدات الجديدة وتوفير الحماية لجميع المستخدمين على الويب</translation> <translation id="8898840733695078011">قوة الإشارة</translation> <translation id="8899851313684471736">&فتح الرّابط في نافذة جديدة</translation> <translation id="8902667442496790482">فتح إعدادات الاختيار والاستماع</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 346983f..2ddd3e5d 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -823,6 +823,7 @@ <translation id="2119349053129246860"><ph name="APP" />ত খোলক</translation> <translation id="2120297377148151361">কার্যকলাপ আৰু ভাৱ-বিনিময়</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> অৱৰোধ কৰা হৈছে</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{কুকিসমূহ অৱৰোধ কৰা হৈছে}=1{কুকিসমূহক অৱৰোধ কৰা হৈছে, ১ টা ব্যতিক্ৰম}one{কুকিসমূহ অৱৰোধ কৰা হৈছে, {COUNT} টা ব্যতিক্ৰম}other{কুকিসমূহ অৱৰোধ কৰা হৈছে, {COUNT} টা ব্যতিক্ৰম}}</translation> <translation id="2121825465123208577">আকাৰ সলনি কৰক</translation> <translation id="2122305276694332719">লুকাই থকা কোনো নেটৱৰ্কত স্বয়ংক্ৰিয়ভাৱে সংযুক্ত কৰাটোৱে অন্য লোকক আপোনাৰ ডিভাইচ আৰু নেটৱৰ্কৰ কিছুমান ছেটিং চাবলৈ দিয়ে আৰু সেয়েহে সেয়া চুপাৰিছ কৰা নহয়।</translation> <translation id="2123766928840368256">বেলেগ এটা ফাইল বাছনি কৰক</translation> @@ -3381,7 +3382,7 @@ <translation id="5558125320634132440">এই ছাইটটো অৱৰোধ কৰা হৈছে কাৰণ ইয়াত প্ৰাপ্তবয়স্কৰ সমল থাকিব পাৰে</translation> <translation id="5558129378926964177">জুম &ইন কৰক</translation> <translation id="55601339223879446">আপোনাৰ ডেস্কটপৰ সীমাসমূহ ডিছপ্লে’ৰ ভিতৰত মিলাওক</translation> -<translation id="5561162485081632007">বিপজ্জনক ঘটনাবোৰৰ চিনাক্ত কৰে আৰু সেইবোৰ ঘটাৰ সময়ত আপোনাক সকীয়নি দিয়ে</translation> +<translation id="5561162485081632007">বিপজ্জনক ঘটনাবোৰ চিনাক্ত কৰে আৰু সেইবোৰ ঘটাৰ সময়ত আপোনাক সকীয়নি দিয়ে</translation> <translation id="5562781907504170924">এই টেবটো ব্লুটুথ ডিভাইচৰ সৈতে সংযোগ হৈ আছে।</translation> <translation id="556321030400250233">স্থানীয় অথবা শ্বেয়াৰ কৰা ফাইল</translation> <translation id="5563234215388768762">Googleত সন্ধান কৰক বা এটা URL টাইপ কৰক</translation> @@ -5284,7 +5285,7 @@ <translation id="8118488170956489476">আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ <ph name="BEGIN_LINK" />ব্ৰাউজাৰটো পৰিচালনা কৰে<ph name="END_LINK" /></translation> <translation id="8118860139461251237">আপোনাৰ ডাউনল’ড পৰিচালনা কৰক</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" />, আৰু বহুতো</translation> -<translation id="8120715633374652536">আপোনাৰ ডিভাইচটোৰ ষ্ট’ৰেজৰ খালী ঠাই কমিছে। Plugin VM ব্যৱহাৰ কৰিবলৈ অতি কমেও <ph name="MINIMUM_SPACE" /> খালী ঠাইৰ আৱশ্যক আৰু over <ph name="RECOMMENDED_SPACE" />তকৈ বেছি খালী ঠাই থকাটো চুপাৰিছ কৰা হয়। ঠাই খালী কৰিবলৈ ডিভাইচৰ ষ্ট’ৰেজৰ পৰা ফাইল মচক।</translation> +<translation id="8120715633374652536">আপোনাৰ ডিভাইচটোৰ ষ্ট’ৰেজৰ খালী ঠাই কমিছে। Plugin VM ব্যৱহাৰ কৰিবলৈ অতি কমেও <ph name="MINIMUM_SPACE" /> খালী ঠাইৰ আৱশ্যক আৰু <ph name="RECOMMENDED_SPACE" />তকৈ বেছি খালী ঠাই থকাটো চুপাৰিছ কৰা হয়। ঠাই খালী কৰিবলৈ ডিভাইচৰ ষ্ট’ৰেজৰ পৰা ফাইল মচক।</translation> <translation id="8123590694679414600">আপোনাৰ ছিংক পাছফ্ৰেজৰ সৈতে <ph name="TIME" />ত ডেটা এনক্ৰিপ্ট কৰা হৈছে। ইয়াত Google Payৰ পৰিশোধ পদ্ধতি আৰু ঠিকনাবোৰ অন্তৰ্ভুক্ত নহয়।</translation> <translation id="81238879832906896">হালধীয়া আৰু বগা ফুল</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 289b658..afe42ff 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -823,6 +823,7 @@ <translation id="2119349053129246860">Отваряне в/ъв <ph name="APP" /></translation> <translation id="2120297377148151361">Активност и взаимодействия</translation> <translation id="2120639962942052471">„<ph name="PERMISSION" />“ е блокирано</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{„Бисквитките“ са блокирани}=1{„Бисквитките“ са блокирани – 1 изключение}other{„Бисквитките“ са блокирани – {COUNT} изключения}}</translation> <translation id="2121825465123208577">Преоразмеряване</translation> <translation id="2122305276694332719">Автоматичното свързване със скрита мрежа дава възможност на другите хора да виждат устройството ви и някои мрежови настройки и не се препоръчва.</translation> <translation id="2123766928840368256">Избиране на друг файл</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 44e68647..aaf9ef2 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1923,7 +1923,7 @@ <translation id="3564848315152754834">ইউএসবি নিরাপত্তা কী</translation> <translation id="3566721612727112615">কোনো সাইট যোগ করা হয়নি</translation> <translation id="3569382839528428029">আপনি কি <ph name="APP_NAME" /> এর দ্বারা আপনার স্ক্রিন শেয়ার করতে চান?</translation> -<translation id="3569682580018832495"><ph name="ORIGIN" /> নিচে উল্লেখ করা ফাইল এবং ফোল্ডারগুলি এডিট করতে পারবে</translation> +<translation id="3569682580018832495"><ph name="ORIGIN" /> নিচে উল্লেখ করা ফাইল এবং ফোল্ডারগুলি দেখতে পারবে</translation> <translation id="3571734092741541777">সেট-আপ</translation> <translation id="3574210789297084292">সাইন-ইন করুন</translation> <translation id="3574917942258583917">ছদ্মবেশী মোড থেকে বেরিয়ে আসতে চান?</translation> @@ -1933,7 +1933,7 @@ <translation id="3578594933904494462">এই ট্যাবের কন্টেন্ট শেয়ার করা হচ্ছে৷</translation> <translation id="357886715122934472"><Strong> এ <ph name="SENDER" /> </ Strong> একটি মুদ্রক শেয়ার করতে চায় এবং <strong> <ph name="PRINTER_NAME" /> </ Strong> একটি দলের সঙ্গে আপনার নিজস্ব: <strong> এ <ph name="GROUP_NAME" /> করুন </ strong>। যদি আপনি স্বীকার করেন গোষ্ঠীর সকল সদস্যরা মুদ্রকে মুদ্রণ করতে সক্ষম হবে।</translation> <translation id="357889014807611375">মিটার্ড ওয়াই-ফাই</translation> -<translation id="3582057310199111521">এই পাসওয়ার্ড কোনও প্রতারণামূলক সাইটে এন্টার করা হয়েছিল এবং আপনার হ্যাক হওয়া ডেটাতেও এটি ছিল</translation> +<translation id="3582057310199111521">এই পাসওয়ার্ড কোনও প্রতারণামূলক সাইটে ব্যবহার করা হয়েছিল এবং হ্যাক হওয়া ডেটাবেসেও এটা পাওয়া গেছে</translation> <translation id="3584169441612580296">আপনার কম্পিউটার থেকে ফটো, সঙ্গীত ও অন্য মিডিয়া পডুন এবং পরিবর্তন করুন</translation> <translation id="3586806079541226322">এই ফাইল খোলা যাচ্ছে না</translation> <translation id="3586931643579894722">বিশদ বিবরণ লুকান</translation> @@ -3386,7 +3386,7 @@ <translation id="5558125320634132440">প্রাপ্তবয়স্কদের জন্য কন্টেন্ট থাকার কারণে হয়ত এই সাইট ব্লক করা হয়েছে</translation> <translation id="5558129378926964177">বড়ো করুন</translation> <translation id="55601339223879446">প্রদর্শনের মধ্যে আপনার ডেস্কটপ সীমানার সামঞ্জস্যবিধান করুন</translation> -<translation id="5561162485081632007">ব্রাউজিং করতে গিয়ে কোনও ঝুঁকিপূর্ণ ঘটনা ঘটলে সেটি শনাক্ত করে আপনাকে সতর্ক করা হয়</translation> +<translation id="5561162485081632007">ব্রাউজ করার সময় কোনও ঝুঁকিপূর্ণ ঘটনা ঘটলে সেটি শনাক্ত করে আপনাকে সতর্ক করা হয়</translation> <translation id="5562781907504170924">এই ট্যাবটি একটি ব্লুটুথ ডিভাইসে সংযুক্ত হয়ে আছে।</translation> <translation id="556321030400250233">স্থানীয় বা শেয়ার করা ফাইল</translation> <translation id="5563234215388768762">Google-এ সার্চ করুন অথবা URL টাইপ করুন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 9512a37..52ea5b0 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -291,7 +291,7 @@ <translation id="1397500194120344683">Nema uređaja koji ispunjavaju uslove. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="1398853756734560583">Povećaj maksimalno</translation> <translation id="139911022479327130">Otključajte telefon i potvrdite identitet</translation> -<translation id="1399511500114202393">Nema korisničke potvrde</translation> +<translation id="1399511500114202393">Nema korisničkog certifikata</translation> <translation id="1401308693935339022">Koristite lokaciju. Dozvolite aplikacijama i uslugama s odobrenjem za lokaciju da koriste lokaciju ovog uređaja. Google može povremeno prikupljati podatke o lokaciji i anonimno koristiti te podatke radi poboljšavanja preciznosti lokacije i usluga koje se zasnivaju na lokaciji.</translation> <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (nadgledani korisnik)</translation> <translation id="1405779994569073824">Došlo je do pada kartice.</translation> @@ -826,6 +826,7 @@ <translation id="2119349053129246860">Otvori u aplikaciji <ph name="APP" /></translation> <translation id="2120297377148151361">Aktivnosti i interakcije</translation> <translation id="2120639962942052471">Blokirano je odobrenje za <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Kolačići su blokirani}=1{Kolačići su blokirani, izuzev 1}one{Kolačići su blokirani, izuzev {COUNT}}few{Kolačići su blokirani, izuzev {COUNT}}other{Kolačići su blokirani, izuzev {COUNT}}}</translation> <translation id="2121825465123208577">Promijeni veličinu</translation> <translation id="2122305276694332719">Automatskim povezivanjem na skrivenu mrežu će se omogućiti drugima da vide vaš uređaj i neke postavke mreže, a to nije preporučljivo.</translation> <translation id="2123766928840368256">Odaberi drugi fajl</translation> @@ -1810,7 +1811,7 @@ <translation id="3424969259347320884">Opišite što ste radili kada se kartica srušila</translation> <translation id="3427092606871434483">Dozvoli (zadano)</translation> <translation id="3428419049384081277">Prijavljeni ste!</translation> -<translation id="3428747202529429621">Održava vas sigurnim na Chromeu i može se koristiti da poboljša vašu sigurnost u drugim Google aplikacijama kada ste prijavljeni</translation> +<translation id="3428747202529429621">Štiti vas na Chromeu i može se koristiti da poboljša vašu sigurnost u drugim Google aplikacijama kada ste prijavljeni</translation> <translation id="3429275422858276529">Označite ovu stranicu kako biste je kasnije lakše pronašli</translation> <translation id="3432227430032737297">Ukloni sve prikazano</translation> <translation id="3432757130254800023">Slati audio i video ekranima na lokalnoj mreži</translation> @@ -2467,7 +2468,7 @@ <translation id="425573743389990240">Stopa pražnjenja baterije u vatima (negativna vrijednost znači da se baterija puni)</translation> <translation id="4256316378292851214">Sač&uvaj videozapis kao…</translation> <translation id="4258348331913189841">Sistemi fajlova</translation> -<translation id="4260182282978351200">Fajl <ph name="FILE_NAME" /> može biti opasan. Poslati Googleovoj Naprednoj zaštiti radi skeniranja? Pritisnite Shift + F6 da odete u područje trake preuzetih fajlova.</translation> +<translation id="4260182282978351200">Fajl <ph name="FILE_NAME" /> može biti opasan. Poslati Googleovoj Naprednoj zaštiti radi skeniranja? Pritisnite Shift + F6 da odete u područje trake preuzetih fajlova.</translation> <translation id="4263223596040212967">Provjerite raspored tastature i pokušajte ponovo.</translation> <translation id="4263757076580287579">Registracija štampača je otkazana.</translation> <translation id="426564820080660648">Da provjerite ažuriranja, koristite ethernet, WiFi ili prijenos podataka na mobilnoj mreži.</translation> @@ -2773,7 +2774,7 @@ <translation id="470074695271471509">Želite se odjaviti da završite?</translation> <translation id="4701025263201366865">Prijavljivanje roditelja</translation> <translation id="4707302005824653064">Upravitelj (<ph name="CUSTODIAN_EMAIL" />) može pregledati upotrebu i povijest na adresi chrome.com.</translation> -<translation id="4707579418881001319">L2TP/IPsec + potvrda korisnika</translation> +<translation id="4707579418881001319">L2TP/IPsec + korisnički certifikat</translation> <translation id="4708794300267213770">Prikaži zaključan zaslon prilikom vraćanja iz mirovanja</translation> <translation id="4708849949179781599">Napusti <ph name="PRODUCT_NAME" /></translation> <translation id="4711638718396952945">Vrati postavke</translation> @@ -3059,7 +3060,7 @@ <translation id="5117930984404104619">Praćenje ponašanja drugih ekstenzija, uključujući posjećene URL-ove</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Vaš tvrdi disk je pun. Sačuvajte na drugoj lokaciji ili oslobodite više prostora na tvrdom disku.</translation> -<translation id="5122384452788334261">Na vašem uređaju ima malo prostora za pohranu. Da koristite Plugin VM, preporučuje se najmanje <ph name="RECOMMENDED_SPACE" /> slobodnog prostora. Izbrišite fajlove iz pohrane uređaja da oslobodite prostor.</translation> +<translation id="5122384452788334261">Na vašem uređaju ima malo prostora za pohranu. Da koristite Plugin VM, preporučuje se najmanje <ph name="RECOMMENDED_SPACE" /> slobodnog prostora. Da oslobodite prostor, izbrišite fajlove iz pohrane uređaja.</translation> <translation id="5123433949759960244">Košarka</translation> <translation id="5125751979347152379">Nevažeći URL.</translation> <translation id="5126611267288187364">Pogledajte promjene</translation> @@ -3347,7 +3348,7 @@ <translation id="5510775624736435856">Preuzmi opise slika s Googlea</translation> <translation id="5511379779384092781">Izuzetno mali</translation> <translation id="5511823366942919280">Jeste li sigurni da želite postaviti ovaj uređaj kao "Ajkulu"?</translation> -<translation id="5512653252560939721">Potvrda korisnika mora biti hardverski podržana.</translation> +<translation id="5512653252560939721">Korisnički certifikat mora biti hardverski podržan.</translation> <translation id="5515923816438946203">Odaberite šta se prikazuje na ekranu</translation> <translation id="5517304475148761050">Ovoj aplikaciji je potreban pristup Play trgovini</translation> <translation id="5517412723934627386"><ph name="NETWORK_TYPE" /> – <ph name="NETWORK_DISPLAY_NAME" /></translation> @@ -3818,7 +3819,7 @@ <translation id="6129938384427316298">Komentar potvrde Netscapea</translation> <translation id="6129953537138746214">Razmaknica</translation> <translation id="6136114942382973861">Zatvori traku preuzetih fajlova</translation> -<translation id="6137767437444130246">Potvrda korisnika</translation> +<translation id="6137767437444130246">Korisnički certifikat</translation> <translation id="6138680304137685902">X9.62 ECDSA potpis uz SHA-384</translation> <translation id="6138894911715675297"><ph name="NETWORK_TYPE" />, nema mreže</translation> <translation id="6141988275892716286">Potvrdite lozinku</translation> @@ -5300,7 +5301,7 @@ <translation id="8118488170956489476">Vašim <ph name="BEGIN_LINK" />preglednikom upravlja<ph name="END_LINK" /> vaša organizacija</translation> <translation id="8118860139461251237">Upravljanje preuzimanjima</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" /> i drugo</translation> -<translation id="8120715633374652536">Na vašem uređaju ima malo prostora za pohranu. Potrebno je najmanje <ph name="MINIMUM_SPACE" /> slobodnog prostora da koristite Plugin VM, a preporučuje se više od <ph name="RECOMMENDED_SPACE" /> slobodnog prostora. Izbrišite fajlove iz pohrane uređaja da oslobodite prostor.</translation> +<translation id="8120715633374652536">Na vašem uređaju ima malo prostora za pohranu. Potrebno je najmanje <ph name="MINIMUM_SPACE" /> slobodnog prostora da koristite Plugin VM, a preporučuje se više od <ph name="RECOMMENDED_SPACE" /> slobodnog prostora. Da oslobodite prostor, izbrišite fajlove iz pohrane uređaja.</translation> <translation id="8123590694679414600">Vaši podaci su šifrirani sinhroniziranim pristupnim izrazom dana <ph name="TIME" />. To ne obuhvata načine plaćanja i adrese iz Google Paya.</translation> <translation id="81238879832906896">Žuto-bijeli cvijet</translation> @@ -6135,7 +6136,7 @@ <translation id="936801553271523408">Dijagnostički podaci sistema</translation> <translation id="93766956588638423">Popravi ekstenziju</translation> <translation id="938339467127511841">Linux (Beta) pohrana</translation> -<translation id="938470336146445890">Instalirajte korisničku potvrdu.</translation> +<translation id="938470336146445890">Instalirajte korisnički certifikat.</translation> <translation id="939252827960237676">Pohranjivanje snimka ekrana nije uspjelo</translation> <translation id="939519157834106403">SSID</translation> <translation id="939598580284253335">Unesite pristupni izraz</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 6df2c008c..59cde37 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Obre a <ph name="APP" /></translation> <translation id="2120297377148151361">Activitat i interaccions</translation> <translation id="2120639962942052471">S'ha bloquejat <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Les galetes estan bloquejades}=1{Les galetes estan bloquejades, 1 excepció}other{Les galetes estan bloquejades, {COUNT} excepcions}}</translation> <translation id="2121825465123208577">Canvia la mida</translation> <translation id="2122305276694332719">La connexió automàtica a una xarxa amagada permet que altres usuaris puguin veure el teu dispositiu i algunes opcions de configuració de la xarxa. Per tant, no és recomanable.</translation> <translation id="2123766928840368256">Tria un altre fitxer</translation> @@ -3056,7 +3057,7 @@ <translation id="5117930984404104619">Control del comportament d'altres extensions, inclosos els URL visitats</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">El vostre disc dur és ple. Deseu-ho en una altra ubicació o allibereu espai del disc dur.</translation> -<translation id="5122384452788334261">Queda poc espai d'emmagatzematge al dispositiu. Per fer servir Plugin VM, es recomana tenir com a mínim <ph name="RECOMMENDED_SPACE" /> d'espai lliure. Per alliberar espai, suprimeix fitxers de l'emmagatzematge del dispositiu.</translation> +<translation id="5122384452788334261">Queda poc espai d'emmagatzematge al dispositiu. Per fer servir Plugin VM, es recomana tenir almenys <ph name="RECOMMENDED_SPACE" /> d'espai lliure. Per alliberar espai, suprimeix fitxers de l'emmagatzematge del dispositiu.</translation> <translation id="5123433949759960244">Pilota de bàsquet</translation> <translation id="5125751979347152379">URL no vàlid.</translation> <translation id="5126611267288187364">Mostra els canvis</translation> @@ -5299,7 +5300,7 @@ <translation id="8118488170956489476">La teva organització <ph name="BEGIN_LINK" />gestiona el navegador<ph name="END_LINK" /></translation> <translation id="8118860139461251237">Gestionar les baixades</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" /> i més</translation> -<translation id="8120715633374652536">Queda poc espai d'emmagatzematge al dispositiu. Cal tenir almenys <ph name="MINIMUM_SPACE" /> d'espai lliure per fer servir Plugin VM, tot i que es recomana tenir-ne, com a mínim, <ph name="RECOMMENDED_SPACE" />. Per alliberar espai, suprimeix fitxers de l'emmagatzematge del dispositiu.</translation> +<translation id="8120715633374652536">Queda poc espai d'emmagatzematge al dispositiu. Cal tenir almenys <ph name="MINIMUM_SPACE" /> d'espai lliure per fer servir Plugin VM, tot i que es recomana tenir-ne més de: <ph name="RECOMMENDED_SPACE" />. Per alliberar espai, suprimeix fitxers de l'emmagatzematge del dispositiu.</translation> <translation id="8123590694679414600">Les dades es van encriptar el dia <ph name="TIME" /> amb la teva frase de contrasenya de sincronització. No inclouen les formes de pagament ni les adreces de Google Pay.</translation> <translation id="81238879832906896">Flor groga i blanca</translation> <translation id="8124313775439841391">ONC gestionat</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 31bfcf3..c12d639 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -3057,7 +3057,7 @@ <translation id="5117930984404104619">Sledovat chování ostatních rozšíření (včetně navštívených adres URL)</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Pevný disk je plný. Uložte prosím soubor do jiného umístění nebo uvolněte místo na disku.</translation> -<translation id="5122384452788334261">V zařízení dochází úložný prostor K používání pluginu Plugin VM se doporučuje alespoň <ph name="RECOMMENDED_SPACE" /> volného místa. Místo uvolníte smazáním souborů z úložiště zařízení.</translation> +<translation id="5122384452788334261">V zařízení dochází úložný prostor Chcete-li používat Plugin VM, doporučuje se alespoň <ph name="RECOMMENDED_SPACE" /> volného místa. Místo uvolníte smazáním souborů z úložiště zařízení.</translation> <translation id="5123433949759960244">Basketbal</translation> <translation id="5125751979347152379">Neplatná adresa URL.</translation> <translation id="5126611267288187364">Zobrazit změny</translation> @@ -5298,7 +5298,7 @@ <translation id="8118488170956489476">Váš <ph name="BEGIN_LINK" />prohlížeč je spravován<ph name="END_LINK" /> vaší organizací</translation> <translation id="8118860139461251237">Správa stahování</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" /> a další</translation> -<translation id="8120715633374652536">V zařízení dochází úložný prostor K používání pluginu Plugin VM je potřeba alespoň <ph name="MINIMUM_SPACE" /> volného místa a doporučuje se více než <ph name="RECOMMENDED_SPACE" /> volného místa. Místo uvolníte smazáním souborů z úložiště zařízení.</translation> +<translation id="8120715633374652536">V zařízení dochází úložný prostor Použití modulu Plugin VM vyžaduje alespoň <ph name="MINIMUM_SPACE" /> volného místa a doporučuje se více než <ph name="RECOMMENDED_SPACE" /> volného místa. Místo uvolníte smazáním souborů z úložiště zařízení.</translation> <translation id="8123590694679414600">Data byla <ph name="TIME" /> zašifrována pomocí heslové fráze pro synchronizaci. Toto šifrování se nevztahuje na platební metody a adresy z Google Pay.</translation> <translation id="81238879832906896">Žluto-bílá květina</translation> <translation id="8124313775439841391">Spravovaná ONC</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 6e90ca6..58e9ba3 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Åbn i <ph name="APP" /></translation> <translation id="2120297377148151361">Aktivitet og interaktioner</translation> <translation id="2120639962942052471">Blokerede <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Cookies er blokeret}=1{Cookies er blokeret, 1 undtagelse}one{Cookies er blokeret, {COUNT} undtagelse}other{Cookies er blokeret, {COUNT} undtagelser}}</translation> <translation id="2121825465123208577">Tilpas størrelse</translation> <translation id="2122305276694332719">Vi anbefaler, at du ikke tillader automatisk forbindelse til skjulte netværk, da det gør det muligt for andre at se din enhed og visse netværksindstillinger.</translation> <translation id="2123766928840368256">Vælg en anden fil</translation> @@ -2072,7 +2073,7 @@ <translation id="3738924763801731196"><ph name="OID" />:</translation> <translation id="3739254215541673094">Vil du åbne <ph name="APPLICATION" />?</translation> <translation id="3742055079367172538">Screenshottet blev gemt</translation> -<translation id="3742666961763734085">Der kunne ikke findes nogen organisationsenhed med det pågældende navn. Prøv igen.</translation> +<translation id="3742666961763734085">Der blev ikke fundet nogen organisationsenhed med det pågældende navn. Prøv igen.</translation> <translation id="3744111561329211289">Synkronisering i baggrunden</translation> <translation id="3746127522257263495">Der kan ikke tilføjes G Suite for Education-konti i Android-apps.</translation> <translation id="3747039297326604768">Plugin VM kunne ikke åbnes</translation> @@ -4942,7 +4943,7 @@ <translation id="7690294790491645610">Bekræft den nye adgangskode</translation> <translation id="7690378713476594306">Vælg på listen</translation> <translation id="7690853182226561458">Tilføj &mappe...</translation> -<translation id="7691073721729883399">Cryptohome til terminalappen kunne ikke isættes.</translation> +<translation id="7691073721729883399">Cryptohome til terminalappen kunne ikke installeres.</translation> <translation id="7691077781194517083">Denne sikkerhedsnøgle kan ikke nulstilles. Fejl <ph name="ERROR_CODE" />.</translation> <translation id="7696063401938172191">På din "<ph name="PHONE_NAME" />":</translation> <translation id="7698408911093959127">{COUNT,plural, =1{1 element på listen over bogmærker}one{# element på listen over bogmærker}other{# elementer på listen over bogmærker}}</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 8249a9bd..121e227 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Άνοιγμα σε <ph name="APP" /></translation> <translation id="2120297377148151361">Δραστηριότητα και αλληλεπιδράσεις</translation> <translation id="2120639962942052471">Απέκλεισε την άδεια <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Αποκλείστηκαν τα cookie.}=1{Αποκλείστηκαν τα cookie, με 1 εξαίρεση}other{Αποκλείστηκαν τα cookie, με {COUNT} εξαιρέσεις}}</translation> <translation id="2121825465123208577">Προσαρμογή μεγέθους</translation> <translation id="2122305276694332719">Η αυτόματη σύνδεση σε ένα κρυφό δίκτυο επιτρέπει σε άλλα άτομα να βλέπουν τη συσκευή σας και ορισμένες ρυθμίσεις δικτύου σας και δεν συνιστάται.</translation> <translation id="2123766928840368256">Επιλέξτε διαφορετικό αρχείο</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 4d5fb53..748e061 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Open in <ph name="APP" /></translation> <translation id="2120297377148151361">Activity and interactions</translation> <translation id="2120639962942052471">Blocked <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Cookies are blocked}=1{Cookies are blocked – 1 exception}other{Cookies are blocked – {COUNT} exceptions}}</translation> <translation id="2121825465123208577">Re-size</translation> <translation id="2122305276694332719">Automatically connecting to a hidden network allows others to see your device and some network settings, and is not recommended.</translation> <translation id="2123766928840368256">Choose a different file</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 0514d7f..767bf85 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -5897,7 +5897,7 @@ <translation id="8895454554629927345">Lista de marcadores</translation> <translation id="8896022254727357590">El PIN debe tener al menos 4 caracteres</translation> <translation id="8898786835233784856">Seleccionar siguiente pestaña</translation> -<translation id="8898822736010347272">Envía a Google URL de páginas que visitas, información limitada del sistema y contenido de las páginas para ayudar a descubrir nuevas amenazas y proteger a los usuarios de la Web.</translation> +<translation id="8898822736010347272">Envía a Google las URL de las páginas que visitas, información limitada del sistema y contenido de las páginas para ayudar a descubrir nuevas amenazas y proteger a los usuarios de la Web.</translation> <translation id="8898840733695078011">Intensidad de la señal</translation> <translation id="8899851313684471736">Abrir enlace en una &ventana nueva</translation> <translation id="8902667442496790482">Abrir los ajustes de Enunciar Selección</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 49f2cd3e..232244e 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1810,7 +1810,7 @@ <translation id="3424969259347320884">Azaldu zer ari zinen egiten fitxak huts egin duenean</translation> <translation id="3427092606871434483">Baimendu (lehenetsia)</translation> <translation id="3428419049384081277">Hasi duzu saioa!</translation> -<translation id="3428747202529429621">Babestuta mantentzen zaitu Chrome-n eta segurtasuna hobetzeko erabil daiteke Google-ren beste aplikazio batzuetan saioa hasita daukazunean</translation> +<translation id="3428747202529429621">Babestuta mantentzen zaitu Chrome-n, eta segurtasuna hobetzeko erabil daiteke Google-ren beste aplikazio batzuetan saioa hasita daukazunean</translation> <translation id="3429275422858276529">Egin orri honen laster-marka, geroago bizkor aurkitzeko</translation> <translation id="3432227430032737297">Kendu erakutsitako guztiak</translation> <translation id="3432757130254800023">Bidali audioa eta bideoa sare lokaleko pantailetara</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index acce04d0..782c78e 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1870,7 +1870,7 @@ <translation id="3492788708641132712">A sincronización non funciona. Proba a volver iniciar sesión.</translation> <translation id="3493486281776271508">É necesaria unha conexión a Internet</translation> <translation id="3493881266323043047">Validez</translation> -<translation id="3494155060718700400">Non te protexe contra sitios web, descargas e extensións perigosos (non recomendado). Continuarás dispoñendo da protección da Navegación segura, sempre que estea dispoñible, noutros servizos de Google, como Gmail e Busca.</translation> +<translation id="3494155060718700400">Non te protexe contra sitios web, descargas e extensións perigosos (non recomendado). Continuarás dispoñendo da protección da Navegación segura, sempre que estea dispoñible, noutros servizos de Google, como Gmail e a Busca.</translation> <translation id="3494769164076977169">Preguntar cando un sitio tente descargar ficheiros automaticamente despois do primeiro ficheiro (recomendado)</translation> <translation id="3495660573538963482">Configuración do Asistente de Google</translation> <translation id="3496213124478423963">Afastar</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index bfd64892..726345e 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1934,7 +1934,7 @@ <translation id="3578594933904494462">इस टैब की सामग्री को शेयर किया जा रहा है.</translation> <translation id="357886715122934472"><strong><ph name="SENDER" /></strong> आपके स्वामित्व वाले समूह: <strong><ph name="GROUP_NAME" /></strong> से <strong><ph name="PRINTER_NAME" /></strong> प्रिंटर शेयर करना चाहता है. अगर आप स्वीकार करते हैं, तो समूह के सभी सदस्य प्रिंटर से प्रिंट कर पाएंगे.</translation> <translation id="357889014807611375">सीमित डेटा वाला वाई-फ़ाई</translation> -<translation id="3582057310199111521">यह पासवर्ड धोखाधड़ी वाली साइट पर डाला गया था. साथ ही, यह आपके हैक हो चुके डेटा में शामिल है</translation> +<translation id="3582057310199111521">यह पासवर्ड धोखाधड़ी वाली साइट पर डाला गया था और यह हैक हो चुका है</translation> <translation id="3584169441612580296">अपने कंप्यूटर से फ़ोटो, संगीत और अन्य मीडिया ऐक्सेस करें और उन्हें बदलें</translation> <translation id="3586806079541226322">यह फ़ाइल नहीं खुल सकती</translation> <translation id="3586931643579894722">विवरण छुपाएं</translation> @@ -3058,7 +3058,7 @@ <translation id="5117930984404104619">विज़िट किए गए यूआरएल के साथ-साथ दूसरे एक्सटेंशन के व्यवहार की निगरानी करें</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">आपकी हार्ड डिस्क भर गई है. कृपया किसी दूसरी जगह पर सेव करें या हार्ड डिस्क में जगह बनाएं.</translation> -<translation id="5122384452788334261">आपके डिवाइस में स्टोरेज के लिए कम जगह बची है. Plugin VM का इस्तेमाल करने के लिए, कम से कम <ph name="RECOMMENDED_SPACE" /> खाली जगह रखने का सुझाव दिया जाता है. जगह खाली करने के लिए, डिवाइस की मेमोरी से फ़ाइलें मिटाएं.</translation> +<translation id="5122384452788334261">आपके डिवाइस में स्टोरेज के लिए कम जगह बची है. Plugin VM का इस्तेमाल करने के लिए, कम से कम <ph name="RECOMMENDED_SPACE" /> जगह खाली रखने का सुझाव दिया जाता है. जगह खाली करने के लिए, डिवाइस की मेमोरी से फ़ाइलें मिटाएं.</translation> <translation id="5123433949759960244">बास्केटबॉल</translation> <translation id="5125751979347152379">गलत यूआरएल.</translation> <translation id="5126611267288187364">बदलाव देखें</translation> @@ -5298,7 +5298,7 @@ <translation id="8118488170956489476">आपका संगठन आपके <ph name="BEGIN_LINK" />ब्राउज़र को प्रबंधित करता<ph name="END_LINK" /> है</translation> <translation id="8118860139461251237">अपने डाउनलोड प्रबंधित करें</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" />, और अन्य</translation> -<translation id="8120715633374652536">आपके डिवाइस में स्टोरेज के लिए कम जगह बची है. Plugin VM का इस्तेमाल करने के लिए, कम से कम <ph name="MINIMUM_SPACE" /> खाली जगह की ज़रूरत होती है. साथ ही,<ph name="RECOMMENDED_SPACE" /> से ज़्यादा खाली जगह रखने का सुझाव दिया जाता है. जगह खाली करने के लिए, डिवाइस की मेमोरी से फ़ाइलें मिटाएं.</translation> +<translation id="8120715633374652536">आपके डिवाइस में स्टोरेज के लिए कम जगह बची है. Plugin VM का इस्तेमाल करने के लिए, कम से कम <ph name="MINIMUM_SPACE" /> जगह की ज़रूरत होती है. साथ ही, <ph name="RECOMMENDED_SPACE" /> से ज़्यादा जगह खाली रखने का सुझाव दिया जाता है. जगह खाली करने के लिए, डिवाइस की मेमोरी से फ़ाइलें मिटाएं.</translation> <translation id="8123590694679414600">आपका डेटा आपके सिंक लंबे पासवर्ड से <ph name="TIME" /> पर सुरक्षित किया गया था. इसमें Google Pay से भुगतान करने के तरीके और पते शामिल नहीं हैं.</translation> <translation id="81238879832906896">पीला और सफ़ेद फूल</translation> @@ -5896,7 +5896,7 @@ <translation id="8895454554629927345">बुकमार्क सूची</translation> <translation id="8896022254727357590">पासवर्ड में कम से कम चार वर्ण होने चाहिए</translation> <translation id="8898786835233784856">अगले टैब को चुनें</translation> -<translation id="8898822736010347272">आप जिन पेजों पर जाते हैं उनमें से कुछ के यूआरएल, सिस्टम की सीमित जानकारी, और पेज की कुछ सामग्री यह Google को भेजता है. ऐसा इसलिए जिससे कि नए खतरों को खोजा जा सके और वेब पर सभी सुरक्षित रहें.</translation> +<translation id="8898822736010347272">आप जिन पेजों पर जाते हैं उनमें से कुछ के यूआरएल, सिस्टम की सीमित जानकारी, और पेज की कुछ सामग्री को यह Google को भेजता है. ऐसा इसलिए जिससे कि नए खतरों को खोजा जा सके और वेब पर सभी सुरक्षित रहें.</translation> <translation id="8898840733695078011">सिग्नल शक्ति</translation> <translation id="8899851313684471736">लिंक को नई &विंडो में खोलें</translation> <translation id="8902667442496790482">चुनें और सुनें सेटिंग खोलें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index f964b95..fc190055 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Otvori u aplikaciji <ph name="APP" /></translation> <translation id="2120297377148151361">Aktivnost i interakcija</translation> <translation id="2120639962942052471">Blokirano je dopuštenje <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Kolačići su blokirani}=1{Kolačići su blokirani, 1 iznimka}one{Kolačići su blokirani, {COUNT} iznimka}few{Kolačići su blokirani, {COUNT} iznimke}other{Kolačići su blokirani, {COUNT} iznimaka}}</translation> <translation id="2121825465123208577">Promijeni veličinu</translation> <translation id="2122305276694332719">Automatsko povezivanje sa skrivenom mrežom omogućuje drugima da vide vaš uređaj i neke mrežne postavke i stoga se ne preporučuje.</translation> <translation id="2123766928840368256">Odaberite drugu datoteku</translation> @@ -1934,7 +1935,7 @@ <translation id="3578594933904494462">Sadržaj ove kartice dijeli se.</translation> <translation id="357886715122934472"><strong><ph name="SENDER" /></strong> želi dijeliti pisač <strong><ph name="PRINTER_NAME" /></strong> s grupom čiji ste vlasnik: <strong><ph name="GROUP_NAME" /></strong>. Ako prihvatite, svi članovi grupe moći će ispisivati putem pisača.</translation> <translation id="357889014807611375">Wi-Fi s ograničenim prometom</translation> -<translation id="3582057310199111521">Uneseno na obmanjujućoj web-lokaciji i pronađeno u povredi podataka</translation> +<translation id="3582057310199111521">Unesena na obmanjujućoj web-lokaciji i pronađena među zaporkama otkrivenim u povredi podataka</translation> <translation id="3584169441612580296">čitati i mijenjati fotografije, glazbu i druge medije s vašeg računala</translation> <translation id="3586806079541226322">Datoteku nije moguće otvoriti</translation> <translation id="3586931643579894722">Sakrij detalje</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 2b5a9fff..04baff8c 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Megnyitás a következőben: <ph name="APP" /></translation> <translation id="2120297377148151361">Tevékenység és interakciók</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> letiltva</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{A cookie-k le vannak tiltva}=1{A cookie-k le vannak tiltva, 1 kivétellel}other{A cookie-k le vannak tiltva, {COUNT} kivétellel}}</translation> <translation id="2121825465123208577">Átméretezés</translation> <translation id="2122305276694332719">A rejtett hálózatra való automatikus csatlakozás láthatóvá teszi mások számára az eszközt és bizonyos hálózati beállításokat, ezért nem ajánlott a használata.</translation> <translation id="2123766928840368256">Másik fájl kiválasztása</translation> @@ -1628,7 +1629,7 @@ <translation id="3159493096109238499">Bézs</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (hardverrel támogatott)</translation> <translation id="3161522574479303604">Minden nyelv</translation> -<translation id="3162899666601560689">A webhelyek használhatnak cookie-kat a böngészési élmény javítására például azáltal, hogy bejelentkezve tartják Önt, illetve azáltal, hogy megjegyzik a kosarában lévő termékeket.</translation> +<translation id="3162899666601560689">A webhelyek használhatnak cookie-kat a böngészési élmény javítására például úgy, hogy bejelentkezve tartják Önt, illetve megjegyzik a kosarában lévő termékeket.</translation> <translation id="3163201441334626963">Ismeretlen termék (<ph name="PRODUCT_ID" />) a következő forgalmazótól: <ph name="VENDOR_ID" /></translation> <translation id="3164329792803560526">Lap megosztása a következővel: <ph name="APP_NAME" /></translation> <translation id="3165390001037658081">Egyes szolgáltatók letilthatják ezt a funkciót.</translation> @@ -4831,7 +4832,7 @@ <translation id="7531779363494549572">Nyissa meg a Beállítások > Alkalmazások és értesítések > Értesítések menüpontot.</translation> <translation id="7532009420053991888">A(z) <ph name="LINUX_APP_NAME" /> nem válaszol. A bezárásához válassza a „Bezárás most” gombot.</translation> <translation id="7536333565791380193">Haladó biztonsági beállítások</translation> -<translation id="7537451260744431038">A webhelyek nem használhatnak cookie-kat a böngészési élmény javítására például azáltal, hogy bejelentkezve tartják Önt, illetve azáltal, hogy megjegyzik a kosarában lévő termékeket.</translation> +<translation id="7537451260744431038">A webhelyek nem használhatnak cookie-kat a böngészési élmény javítására például úgy, hogy bejelentkezve tartják Önt, illetve megjegyzik a kosarában lévő termékeket.</translation> <translation id="7539856059004947393">Bluetooth-os biztonsági hardverkulcs</translation> <translation id="7540972813190816353">Hiba történt a frissítések keresése közben: <ph name="ERROR" /></translation> <translation id="7541773865713908457"><ph name="ACTION_NAME" /> a következő alkalmazással: <ph name="APP_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 4b9b4a1..bead75a 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Բացել <ph name="APP" /> հավելվածում</translation> <translation id="2120297377148151361">Գործողություններ դիտարկիչում</translation> <translation id="2120639962942052471"><ph name="PERMISSION" />՝ արգելափակված է</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Քուքիներն արգելափակված են}=1{Բոլոր քուքիները՝ բացառությամբ 1-ի, արգելափակված են}one{Բոլոր քուքիները՝ բացառությամբ {COUNT}-ի, արգելափակված են}other{Բոլոր քուքիները՝ բացառությամբ {COUNT}-ի, արգելափակված են}}</translation> <translation id="2121825465123208577">Չափափոխել</translation> <translation id="2122305276694332719">Թաքցված ցանցին ավտոմատ միացումը մյուս օգտատերերին թույլ է տալիս տեսնել ձեր սարքը և ցանցային որոշ կարգավորումներ: Այդ իսկ պատճառով Խորհուրդ չի տրվում միացնել այս գործառույթը:</translation> <translation id="2123766928840368256">Ընտրել այլ պանակ</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 773713e1..29b18d5 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Opna í <ph name="APP" /></translation> <translation id="2120297377148151361">Virkni og aðrar aðgerðir</translation> <translation id="2120639962942052471">Lokað á: <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Lokað er á fótspor}=1{Lokað er á fótspor, 1 undantekning}one{Lokað er á fótspor, {COUNT} undantekning}other{Lokað er á fótspor, {COUNT} undantekningar}}</translation> <translation id="2121825465123208577">Breyta stærð</translation> <translation id="2122305276694332719">Ef tengt er sjálfkrafa við falið netkerfi geta aðrir séð tækið þitt og sumar netstillingar, og því er það ekki ráðlagt.</translation> <translation id="2123766928840368256">Veldu aðra skrá</translation> @@ -5897,7 +5898,7 @@ <translation id="8895454554629927345">Listi yfir bókamerki</translation> <translation id="8896022254727357590">PIN-númer verður að vera að minnsta kosti fjórir stafir</translation> <translation id="8898786835233784856">Velja næsta flipa</translation> -<translation id="8898822736010347272">Sendir vefslóðir sumra vefsíðna sem þú skoðar, takmarkaðar kerfisupplýsingar og tiltekið innihald síðna til Google til að hjálpa til við að finna og loka á nýjar ógnir og vernda alla notendur á vefnum.</translation> +<translation id="8898822736010347272">Sendir vefslóðir sumra vefsíðna sem þú skoðar, takmarkaðar kerfisupplýsingar og tiltekið innihald síðna til Google til að hjálpa til við að finna og loka á nýjar ógnir og vernda alla vefnotendur.</translation> <translation id="8898840733695078011">Sendistyrkur</translation> <translation id="8899851313684471736">Opna tengil í nýjum glugga</translation> <translation id="8902667442496790482">Opna stillingar fyrir textaupplestur</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 8a58518..7bc87288 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Apri in <ph name="APP" /></translation> <translation id="2120297377148151361">Attività e interazioni</translation> <translation id="2120639962942052471">Autorizzazione <ph name="PERMISSION" /> bloccata</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{I cookie sono bloccati}=1{I cookie sono bloccati, 1 eccezione}other{I cookie sono bloccati, {COUNT} eccezioni}}</translation> <translation id="2121825465123208577">Ridimensiona</translation> <translation id="2122305276694332719">La connessione automatica a una rete nascosta consente ad altre persone di rilevare il tuo dispositivo e alcune impostazioni di rete, pertanto è sconsigliata.</translation> <translation id="2123766928840368256">Scegli un file diverso</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 9d48cf24..b703a4c 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -823,6 +823,7 @@ <translation id="2119349053129246860">פתיחה באמצעות <ph name="APP" /></translation> <translation id="2120297377148151361">פעילות ואינטראקציות</translation> <translation id="2120639962942052471">ההרשאה <ph name="PERMISSION" /> נחסמה</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{קובצי cookie חסומים}=1{קובצי cookie חסומים, חריג אחד}two{קובצי cookie חסומים, {COUNT} חריגים}many{קובצי cookie חסומים, {COUNT} חריגים}other{קובצי cookie חסומים, {COUNT} חריגים}}</translation> <translation id="2121825465123208577">שנה גודל</translation> <translation id="2122305276694332719">חיבור אוטומטי לרשת מוסתרת מאפשר לאחרים לראות את המכשיר שלך וחלק מהגדרות הרשת. האפשרות הזו לא מומלצת.</translation> <translation id="2123766928840368256">בחירת קובץ אחר</translation> @@ -2465,7 +2466,7 @@ <translation id="425573743389990240">שיעור פריקת סוללה בוואט (המשמעות של ערך שלילי היא שהסוללה בטעינה)</translation> <translation id="4256316378292851214">שמו&ר סרטון וידאו כ...</translation> <translation id="4258348331913189841">מערכות קבצים</translation> -<translation id="4260182282978351200">הקובץ <ph name="FILE_NAME" /> עשוי להיות מסוכן. האם לשלוח אותו לסריקה באמצעות ההגנה המתקדמת של Google? אפשר להקיש על Shift+F6 כדי לעבור לאזור סרגל ההורדות.</translation> +<translation id="4260182282978351200">הקובץ <ph name="FILE_NAME" /> עלול להיות מסוכן. האם לשלוח אותו לסריקה באמצעות ההגנה המתקדמת של Google? אפשר להקיש על Shift+F6 כדי לעבור לאזור סרגל ההורדות.</translation> <translation id="4263223596040212967">כדאי לבדוק את פריסת המקלדת ולנסות שוב.</translation> <translation id="4263757076580287579">רישום המדפסת בוטל.</translation> <translation id="426564820080660648">כדי לבדוק אם יש עדכונים, השתמש ב-Ethernet, ב-Wi-Fi או בנתונים לנייד.</translation> @@ -3057,7 +3058,7 @@ <translation id="5117930984404104619">מעקב אחר ההתנהגות של תוספים אחרים, כולל כתובות אתרים שמבקרים בהם</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">הדיסק הקשיח מלא. שמור במיקום אחר או פנה מקום בדיסק הקשיח.</translation> -<translation id="5122384452788334261">אין מספיק שטח אחסון במכשיר. מומלץ שיהיה שטח פנוי בגודל <ph name="RECOMMENDED_SPACE" /> כדי להשתמש ב-Plugin VM. כדי לפנות שטח, עליך למחוק קבצים מאחסון המכשיר.</translation> +<translation id="5122384452788334261">אין מספיק שטח אחסון במכשיר. מומלץ שיהיה שטח פנוי של <ph name="RECOMMENDED_SPACE" /> לפחות כדי להשתמש ב-Plugin VM. כדי לפנות שטח, עליך למחוק קבצים מאחסון המכשיר.</translation> <translation id="5123433949759960244">כדורסל</translation> <translation id="5125751979347152379">כתובת אתר לא חוקית.</translation> <translation id="5126611267288187364">צפייה בשינויים</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 6f4b7a9..99b86fc 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860"><ph name="APP" />-ში გახსნა</translation> <translation id="2120297377148151361">აქტივობა და ინტერაქციები</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> დაბლოკილია</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{ქუქი-ჩანაწერები დაბლოკილია}=1{ქუქი-ჩანაწერები დაბლოკილია, 1 გამონაკლისი}other{ქუქი-ჩანაწერები დაბლოკილია, {COUNT} გამონაკლისი}}</translation> <translation id="2121825465123208577">ზომის შეცვლა</translation> <translation id="2122305276694332719">დამალულ ქსელთან ავტომატურად დაკავშირება საშუალებას მისცემს სხვებს, იხილონ თქვენი მოწყობილობა და ქსელის ზოგიერთი პარამეტრი, ამიტომ ეს არ არის რეკომენდებული.</translation> <translation id="2123766928840368256">სხვა ფაილის არჩევა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 9b106a3..a55f0334 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -3056,7 +3056,7 @@ <translation id="5117930984404104619">Басқа кеңейтімдердің, соның ішінде ашылған URL мекенжайларының әрекетін бақылау</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Қатты дискіңіз толған. Басқа орынға сақтаңыз немесе қатты дискіні босатыңыз.</translation> -<translation id="5122384452788334261">Құрылғыда бос орын аз қалды. Plugin VM пайдалану үшін кемінде <ph name="RECOMMENDED_SPACE" /> бос орын қажет. Орынды босату үшін құрылғы жадынан файлдарды жойыңыз.</translation> +<translation id="5122384452788334261">Құрылғыда бос орын аз қалды. Plugin VM пайдалану үшін кемінде <ph name="RECOMMENDED_SPACE" /> бос орын қажет. Орын босату үшін құрылғы жадынан файлдарды жойыңыз.</translation> <translation id="5123433949759960244">Баскетбол</translation> <translation id="5125751979347152379">Жарамсыз URL.</translation> <translation id="5126611267288187364">Өзгерістерді көру</translation> @@ -3385,7 +3385,7 @@ <translation id="5558125320634132440">Бұл сайт бөгелді, себебі құрамында ересектерге арналған мазмұн болуы мүмкін.</translation> <translation id="5558129378926964177">Үлкей&ту</translation> <translation id="55601339223879446">Дисплейдегі жұмыс үстелінің жиектерін реттеу</translation> -<translation id="5561162485081632007">Орын алған қауіпті әрекеттерді анықтайды және хабарлайды.</translation> +<translation id="5561162485081632007">Орын алған қауіпті іс-шараларды анықтайды және хабарлайды.</translation> <translation id="5562781907504170924">Бұл қойынды Bluetooth құрылғысына жалғанған.</translation> <translation id="556321030400250233">жергілікті немесе ортақ файл</translation> <translation id="5563234215388768762">Google-дан іздеңіз не URL мекенжайын теріңіз</translation> @@ -4938,7 +4938,7 @@ <translation id="7690294790491645610">Жаңа құпия сөзді қайталаңыз</translation> <translation id="7690378713476594306">Тізімнен таңдау</translation> <translation id="7690853182226561458">&Қалта қосу…</translation> -<translation id="7691073721729883399">Kiosk қолданбаның негізгі беттерін шифрлау функциясын қосу мүмкін емес.</translation> +<translation id="7691073721729883399">Kiosk қолданбасының негізгі беттерін шифрлау функциясын қосу мүмкін болмады.</translation> <translation id="7691077781194517083">Қауіпсіздік кілтін бастапқы күйіне қайтару мүмкін емес. Қате: <ph name="ERROR_CODE" />.</translation> <translation id="7696063401938172191">"<ph name="PHONE_NAME" />" телефонында:</translation> <translation id="7698408911093959127">{COUNT,plural, =1{Бетбелгілер тізімінде 1 элемент бар}other{Бетбелгілер тізімінде # элемент бар}}</translation> @@ -5296,7 +5296,7 @@ <translation id="8118488170956489476"><ph name="BEGIN_LINK" />Браузеріңізді<ph name="END_LINK" /> ұйым басқарады</translation> <translation id="8118860139461251237">Жүктеулеріңізді басқару</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" /> және тағы басқа</translation> -<translation id="8120715633374652536">Құрылғыда бос орын аз қалды. Plugin VM пайдалану үшін кемінде <ph name="MINIMUM_SPACE" /> бос орын қажет, сондай-ақ ол <ph name="RECOMMENDED_SPACE" /> үстінде болғаны жөн. Орынды босату үшін құрылғы жадынан файлдарды жойыңыз.</translation> +<translation id="8120715633374652536">Құрылғыда бос орын аз қалды. Plugin VM пайдалану үшін кемінде <ph name="MINIMUM_SPACE" /> бос орын қажет, сондай-ақ ол <ph name="RECOMMENDED_SPACE" /> артық болғаны жөн. Орын босату үшін құрылғы жадынан файлдарды жойыңыз.</translation> <translation id="8123590694679414600">Деректер <ph name="TIME" /> күні сақталған синхрондау құпия фразаңызбен шифрланған. Google Pay қызметіндегі төлеу әдістері мен мекенжайлар құпия фразамен шифрланбайды.</translation> <translation id="81238879832906896">Сары және ақ гүл</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 64c5f59..db760d4 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1871,7 +1871,7 @@ <translation id="3492788708641132712">សមកាលកម្មមិនដំណើរការទេ សូមសាកល្បងចូលគណនីម្តងទៀត។</translation> <translation id="3493486281776271508">តម្រូវឱ្យមានការតភ្ជាប់អ៊ីនធឺណិត</translation> <translation id="3493881266323043047">សុពលភាព</translation> -<translation id="3494155060718700400">មិនការពារអ្នកពីគេហទំព័រ ការទាញយក និងកម្មវិធីបន្ថែមដែលមានគ្រោះថ្នាក់ទេ (មិនណែនាំ)។ អ្នកនឹងនៅតែទទួលបានការការពារការរុករកដោយសុវត្ថិភាព ប្រសិនបើមាន នៅក្នុងសេវាកម្ម Google ផ្សេងទៀតដូចជា Gmail និងកម្មវិធីស្វែងរកជាដើម។</translation> +<translation id="3494155060718700400">មិនការពារអ្នកពីគេហទំព័រ ការទាញយក និងកម្មវិធីបន្ថែមដែលមានគ្រោះថ្នាក់ទេ (មិនណែនាំ)។ អ្នកនឹងនៅតែទទួលបានការការពារការរុករកដោយសុវត្ថិភាព (ប្រសិនបើមាន) នៅក្នុងសេវាកម្ម Google ផ្សេងទៀតដូចជា Gmail និងកម្មវិធីស្វែងរកជាដើម។</translation> <translation id="3494769164076977169">សួរនៅពេលគេហទំព័រព្យាយាមទាញយកឯកសារដោយស្វ័យប្រវត្តិ បន្ទាប់ពីឯកសារដំបូង (បានណែនាំ)</translation> <translation id="3495660573538963482">ការកំណត់ Google ជំនួយការ</translation> <translation id="3496213124478423963">បង្រួម</translation> @@ -4942,7 +4942,7 @@ <translation id="7690294790491645610">បញ្ជាក់ពាក្យសម្ងាត់ថ្មី</translation> <translation id="7690378713476594306">ជ្រើសរើសពីបញ្ជី</translation> <translation id="7690853182226561458">បន្ថែមថតឯកសារ...</translation> -<translation id="7691073721729883399">មិនអាចភ្ជាប់គ្រីបតូហ៊ូមសម្រាប់កម្មវិធីបញ្ជរបានទេ។</translation> +<translation id="7691073721729883399">មិនអាចភ្ជាប់ cryptohome សម្រាប់កម្មវិធីបញ្ជរបានទេ។</translation> <translation id="7691077781194517083">មិនអាចកំណត់សោសុវត្ថិភាពនេះឡើងវិញបានទេ។ <ph name="ERROR_CODE" /> មានបញ្ហា។</translation> <translation id="7696063401938172191">នៅលើ '<ph name="PHONE_NAME" />' របស់អ្នក៖</translation> <translation id="7698408911093959127">{COUNT,plural, =1{ធាតុ 1 នៅក្នុងបញ្ជីចំណាំ}other{ធាតុ # នៅក្នុងបញ្ជីចំណាំ}}</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index df583647..f31ccd5c 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -292,7 +292,7 @@ <translation id="1398853756734560583">Чоңойтуу</translation> <translation id="139911022479327130">Телефонуңуздун кулпусун ачып, сиз экениңизди ырастаңыз</translation> <translation id="1399511500114202393">Колдонуучунун тастыктамасы колдонулбасын</translation> -<translation id="1401308693935339022">Жайгашкан жер тууралуу маалыматты колдонуу. Колдонмолорго бул түзмөктүн жайгашкан жерин табууга жардам бериңиз. Google жайгашкан жер тууралуу маалыматты маал-маалы менен чогултуп, жайгашкан жерди тагыраак аныктоо үчүн жана жайгашкан жерге негизделген кызматтарда жашыруун колдонушу мүмкүн.</translation> +<translation id="1401308693935339022">Жайгашкан жер тууралуу маалыматты колдонуу. Колдонмолорго бул түзмөктүн жайгашкан жерин табууга жардам бериңиз. Google жайгашкан жер тууралуу маалыматты маал-маалы менен чогултуп, жайгашкан жерди тагыраак аныктоо үчүн, жана жайгашкан жерге негизделген кызматтарда жашыруун колдонушу мүмкүн.</translation> <translation id="140520891692800925"><ph name="PROFILE_DISPLAY_NAME" /> (Көзөмөлдөнгөн)</translation> <translation id="1405779994569073824">Бузулду.</translation> <translation id="1406500794671479665">Текшерүүдө…</translation> @@ -5984,7 +5984,7 @@ <translation id="9018218886431812662">Орнотуу аяктады</translation> <translation id="901834265349196618">электрондук почта</translation> <translation id="9019062154811256702">Автотолтуруу жөндөөлөрүн окуу жана өзгөртүү</translation> -<translation id="9019894137004772119">Жайгашкан жер маалыматын колдонуу. Колдонмолорго түзмөгүңүздүн жайгашкан жерин табууга жардам бериңиз. Google жайгашкан жер маалыматын маал-маалы менен чогултуп, жайгашкан жерди тагыраак аныктоо үчүн жана жайгашкан жерге негизделген кызматтарда жашыруун колдонушу мүмкүн.</translation> +<translation id="9019894137004772119">Жайгашкан жер маалыматын колдонуу. Колдонмолорго түзмөгүңүздүн жайгашкан жерин табууга жардам бериңиз. Google жайгашкан жер маалыматын маал-маалы менен чогултуп, жайгашкан жерди тагыраак аныктоо үчүн, жана жайгашкан жерге негизделген кызматтарда жашыруун колдонушу мүмкүн.</translation> <translation id="9020362265352758658">4x</translation> <translation id="9021662811137657072">Вирус табылды</translation> <translation id="9022847679183471841">Бул аккаунт бул компьютерде <ph name="AVATAR_NAME" /> тарабынан колдонулууда.</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 944e7b7..eecfba9 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -824,6 +824,7 @@ <translation id="2119349053129246860">ເປີດໃນ <ph name="APP" /></translation> <translation id="2120297377148151361">ການເຄື່ອນໄຫວ ແລະ ການໂຕ້ຕອບ</translation> <translation id="2120639962942052471">ບລັອກ <ph name="PERMISSION" /> ແລ້ວ</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{ບລັອກຄຸກກີ້ໄວ້}=1{ບລັອກຄຸກກີ້, ຍົກເວັ້ນ 1 ລາຍການ}other{ບລັອກຄຸກກີ້ໄວ້, ຍົກເວັ້ນ {COUNT} ລາຍການ}}</translation> <translation id="2121825465123208577">ປ່ຽນຂະໜາດ</translation> <translation id="2122305276694332719">ການເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍທີ່ເຊື່ອງໄວ້ໂດຍອັດຕະໂນມັດອະນຸຍາດໃຫ້ຄົນອື່ນເຫັນອຸປະກອນຂອງທ່ານ ແລະ ບາງການຕັ້ງຄ່າເຄືອຂ່າຍ ແລະ ບໍ່ແນະນຳໃຫ້ເຊື່ອມຕໍ່.</translation> <translation id="2123766928840368256">ເລືອກໄຟລ໌ອື່ນ</translation> @@ -5136,7 +5137,7 @@ <translation id="7915471803647590281">ກະລຸນາບອກໃຫ້ພວກເຮົາຮູ້ສິ່ງທີ່ກໍາລັງເກີດຂຶ້ນ ກ່ອນທີ່ຈະສົ່ງຄໍາຄິດເຫັນ.</translation> <translation id="7918257978052780342">ລົງທະບຽນ</translation> <translation id="7919210519031517829"><ph name="DURATION" />ວິ</translation> -<translation id="7920363873148656176"><ph name="ORIGIN" /> ສາມາດເບິ່ງໄດ້ <ph name="FILENAME" /></translation> +<translation id="7920363873148656176"><ph name="ORIGIN" /> ສາມາດເບິ່ງ <ph name="FILENAME" /> ໄດ້</translation> <translation id="7924358170328001543">ເກີດຜິດພາດໃນການສົ່ງຕໍ່ຜອດ</translation> <translation id="792514962475806987">ລະດັບການຊູມທີ່ຕັ້ງໄວ້ແລ້ວ:</translation> <translation id="7925247922861151263">ກວດເບິ່ງ AAA ບໍ່ສໍາເລັດ</translation> @@ -5296,7 +5297,7 @@ <translation id="8118488170956489476"><ph name="BEGIN_LINK" />ໂປຣແກຣມທ່ອງເວັບຂອງທ່ານຖືກຈັດການ<ph name="END_LINK" /> ໂດຍອົງການຈັດຕັ້ງຂອງທ່ານ</translation> <translation id="8118860139461251237">ຈັດການເລື່ອງການດາວໂຫຼດຂອງທ່ານ</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" /> ແລະ ອື່ນໆອີກ</translation> -<translation id="8120715633374652536">ດຽວນີ້ອຸປະກອນຂອງທ່ານມີພື້ນທີ່ເຈັດເກັບຂໍ້ມູນເຫຼືອໜ້ອຍ. ຈຳເປັນຕ້ອງມີພື້ນທີ່ຫວ່າງຢ່າງໜ້ອຍ <ph name="MINIMUM_SPACE" /> ຈິ່ງໃຊ້ Plugin VM ໄດ້ ແລະ ແນະນຳໃຫ້ມີພື້ນທີ່ຫວ່າງຫຼາຍກວ່າ <ph name="RECOMMENDED_SPACE" />. ເພື່ອຂະຫຍາຍພື້ນທີ່ຫວ່າງ, ໃຫ້ລຶບໄຟລ໌ຕ່າງໆຈາກບ່ອນເກັບຂໍ້ມູນຂອງອຸປະກອນ.</translation> +<translation id="8120715633374652536">ດຽວນີ້ອຸປະກອນຂອງທ່ານມີພື້ນທີ່ເຈັດເກັບຂໍ້ມູນເຫຼືອໜ້ອຍ. ຈຳເປັນຕ້ອງມີພື້ນທີ່ຫວ່າງຢ່າງໜ້ອຍ <ph name="MINIMUM_SPACE" /> ຈຶ່ງໃຊ້ Plugin VM ໄດ້ ແລະ ແນະນຳໃຫ້ມີພື້ນທີ່ຫວ່າງຫຼາຍກວ່າ <ph name="RECOMMENDED_SPACE" />. ເພື່ອຂະຫຍາຍພື້ນທີ່ຫວ່າງ, ໃຫ້ລຶບໄຟລ໌ຕ່າງໆຈາກບ່ອນເກັບຂໍ້ມູນຂອງອຸປະກອນ.</translation> <translation id="8123590694679414600">ເຂົ້າລະຫັດຂໍ້ມູນດ້ວຍລະຫັດຜ່ານການຊິ້ງຂໍ້ມູນຂອງທ່ານແລ້ວໃນວັນທີ <ph name="TIME" />. ນີ້ບໍ່ຮວມເອົາວິທີການຈ່າຍເງິນ ແລະ ທີ່ຢູ່ຈາກ Google Pay.</translation> <translation id="81238879832906896">ດອກໄມ້ສີເຫຼືອງ ແລະ ສີຂາວ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index f8ae9fc..878d43b 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Atidaryti naudojant „<ph name="APP" />“</translation> <translation id="2120297377148151361">Veikla ir sąveikos</translation> <translation id="2120639962942052471">Blokuojama: <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Slapukai užblokuoti}=1{Slapukai užblokuoti, 1 išimtis}one{Slapukai užblokuoti, {COUNT} išimtis}few{Slapukai užblokuoti, {COUNT} išimtys}many{Slapukai užblokuoti, {COUNT} išimties}other{Slapukai užblokuoti, {COUNT} išimčių}}</translation> <translation id="2121825465123208577">Keisti dydį</translation> <translation id="2122305276694332719">Automatiškai susiejus su paslėptu tinklu kiti gali matyti jūsų įrenginį ir kai kuriuos tinklo nustatymus (nerekomenduojama).</translation> <translation id="2123766928840368256">Pasirinkti kitą failą</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 2ddc24d..423d9bd 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Отвори во <ph name="APP" /></translation> <translation id="2120297377148151361">Активност и интеракции</translation> <translation id="2120639962942052471">Блокирана е <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Колачињата се блокирани}=1{Колачињата се блокирани, 1 исклучок}one{Колачињата се блокирани, {COUNT} исклучок}other{Колачињата се блокирани, {COUNT} исклучоци}}</translation> <translation id="2121825465123208577">Промени големина</translation> <translation id="2122305276694332719">Автоматското поврзување на скриена мрежа им овозможува на другите да го видат вашиот уред и некои други мрежни поставки и не се препорачува.</translation> <translation id="2123766928840368256">Изберете друга датотека</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index db6a2379..f684c6b 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1868,7 +1868,7 @@ <translation id="3492788708641132712">സമന്വയം പ്രവർത്തിക്കുന്നില്ല. വീണ്ടും സൈൻ ഇൻ ചെയ്യുന്നത് പരീക്ഷിച്ചുനോക്കൂ.</translation> <translation id="3493486281776271508">ഇന്റർനെറ്റ് കണക്ഷൻ ആവശ്യമാണ്</translation> <translation id="3493881266323043047">സാധുത</translation> -<translation id="3494155060718700400">അപകടകരമായ വെബ്സൈറ്റുകൾ, ഡൗൺലോഡുകൾ, വിപുലീകരണങ്ങൾ എന്നിവയിൽ നിന്ന് നിങ്ങളെ പരിരക്ഷിക്കില്ല (ശുപാർശ ചെയ്യുന്നില്ല). Gmail, Search എന്നിവ പോലുള്ള മറ്റ് Google സേവനങ്ങളിൽ അത് ലഭ്യമായിരിക്കുമ്പോൾ, നിങ്ങൾക്ക് തുടർന്നും സുരക്ഷിത ബ്രൗസിംഗ് പരിരക്ഷ ലഭിക്കും.</translation> +<translation id="3494155060718700400">അപകടകരമായ വെബ്സൈറ്റുകൾ, ഡൗൺലോഡുകൾ, വിപുലീകരണങ്ങൾ എന്നിവയിൽ നിന്ന് നിങ്ങളെ പരിരക്ഷിക്കില്ല (ശുപാർശ ചെയ്യുന്നില്ല). Gmail, Search പോലുള്ള മറ്റ് Google സേവനങ്ങളിൽ ഉള്ള സുരക്ഷിത ബ്രൗസിംഗ് പരിരക്ഷ നിങ്ങൾക്ക് തുടർന്നും ലഭിക്കും.</translation> <translation id="3494769164076977169">ആദ്യത്തെ ഫയലിനുശേഷം ഒരു സൈറ്റ് ഫയലുകൾ സ്വയമേവ ഡൗൺലോഡ് ചെയ്യാൻ ശ്രമിക്കുമ്പോൾ ആവശ്യപ്പെടുക (ശുപാർശ ചെയ്യുന്നു)</translation> <translation id="3495660573538963482">Google അസിസ്റ്റന്റ് ക്രമീകരണം</translation> <translation id="3496213124478423963">സൂം ഔട്ട് ചെയ്യുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 95a8e8a5..002e70f 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2110,7 +2110,7 @@ <translation id="3784472333786002075">कुकी म्हणजे वेबसाइटने तयार केलेल्या फाइल. दोन प्रकारच्या कुकी आहेत: पहिल्या पक्षाच्या कुकी तुम्ही भेट दिलेल्या साइटद्वारे तयार केल्या जातात. साइट अॅड्रेस बारवर दाखवली जाते. तृतीय पक्षीय कुकी इतर साइटद्वारे तयार केल्या जातात. या साइटमध्ये जाहिराती किंवा इमेज यांसारखा काही आशय आहे जो तुम्ही भेट देत असलेल्या वेबसाइटवर दिसतो.</translation> <translation id="3785308913036335955">अॅप्स शॉर्टकट दर्शवा</translation> <translation id="3785727820640310185">या साइटसाठी सेव्ह केलेले पासवर्ड</translation> -<translation id="3788301286821743879">कियोस्क ॲप्लिकेशन लाँच केले करता आले नाही.</translation> +<translation id="3788301286821743879">कियोस्क ॲप्लिकेशन लाँच करता आले नाही.</translation> <translation id="3788401245189148511">ते करू शकले असते:</translation> <translation id="3789841737615482174">स्थापना करा</translation> <translation id="379082410132524484">तुमचे कार्ड एक्सपायर झालेले आहे</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index e0bfdf3..72eb601 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Buka dalam <ph name="APP" /></translation> <translation id="2120297377148151361">Aktiviti dan interaksi</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> disekat</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Kuki disekat}=1{Kuki disekat, 1 pengecualian}other{Kuki disekat, {COUNT} pengecualian}}</translation> <translation id="2121825465123208577">Ubah saiz</translation> <translation id="2122305276694332719">Tindakan menyambung secara automatik ke rangkaian tersembunyi akan membolehkan orang lain melihat peranti anda dan sesetengah tetapan rangkaian, maka tindakan ini tidak disyorkan.</translation> <translation id="2123766928840368256">Pilih fail yang lain</translation> @@ -1861,7 +1862,7 @@ <translation id="3479552764303398839">Bukan sekarang</translation> <translation id="3479685872808224578">Tidak dapat mengesan pelayan cetak. Sila semak alamat dan cuba lagi.</translation> <translation id="3481268647794498892">Membuka dalam <ph name="ALTERNATIVE_BROWSER_NAME" /> dalam masa <ph name="COUNTDOWN_SECONDS" /> saat</translation> -<translation id="3482719661246593752"><ph name="ORIGIN" /> boleh melihat fail berikut</translation> +<translation id="3482719661246593752"><ph name="ORIGIN" /> boleh melihat fail yang berikut</translation> <translation id="3484273680291419129">Mengalih keluar perisian berbahaya...</translation> <translation id="3484869148456018791">Dapatkan sijil baharu</translation> <translation id="3487007233252413104">fungsi awanama</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index ce6e4fb..b4688a5 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -827,6 +827,7 @@ <translation id="2119349053129246860"><ph name="APP" /> တွင် ဖွင့်ရန်</translation> <translation id="2120297377148151361">လုပ်ဆောင်ချက်နှင့် အပြန်အလှန်ဆက်သွယ်ချက်များ</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> ကို ပိတ်ထားသည်</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{ကွတ်ကီးများကို ပိတ်ထားသည်။}=1{ကွတ်ကီးများကို ပိတ်ထားသည်၊ ခြွင်းချက် ၁ ခု}other{ကွတ်ကီးများကို ပိတ်ထားသည်၊ ခြွင်းချက် {COUNT} ခု}}</translation> <translation id="2121825465123208577">အရွယ်အစားပြောင်းရန်</translation> <translation id="2122305276694332719">ဝှက်ထားသည့် ကွန်ရက်သို့ အလိုအလျောက် ချိတ်ဆက်ခြင်းဖြင့် အခြားသူများသည် သင့်စက်ပစ္စည်းနှင့် အချို့သော ကွန်ရက်ဆက်တင်များကို မြင်ရနိုင်သောကြောင့် အကြံမပြုပါ။</translation> <translation id="2123766928840368256">အခြားဖိုင်တစ်ခု ရွေးချယ်ရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 6afd54b..1db2121 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -3055,7 +3055,7 @@ <translation id="5117930984404104619">गरिएका युआरएलहरू समावेश गर्दै, अन्य विस्तारहरूको व्यवहारलाई सञ्चालन अनुश्रवण गर्नुहोस्।</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">तपाईंको हार्ड डिस्क भरिएको छ । कृपया अर्को स्थानमा बचत गर्नुहोस् वा हार्डडिस्कमा थप खाली ठाउँ बनाउनुहोस् ।</translation> -<translation id="5122384452788334261">तपाईंको यन्त्रको भण्डारणको खाली ठाउँ कम छ। Plugin VM प्रयोग गर्न कम्तीमा पनि <ph name="RECOMMENDED_SPACE" /> ठाउँ खाली राख्न सिफारिस गरिन्छ। ठाउँ खाली गर्न यन्त्रको भण्डारणबाट फाइलहरू मेटाउनुहोस्।</translation> +<translation id="5122384452788334261">तपाईंको यन्त्रको भण्डारणमा खाली ठाउँ कम छ। Plugin VM प्रयोग गर्न कम्तीमा पनि <ph name="RECOMMENDED_SPACE" /> ठाउँ खाली राख्न सिफारिस गरिन्छ। ठाउँ खाली गर्न यन्त्रको भण्डारणबाट फाइलहरू मेटाउनुहोस्।</translation> <translation id="5123433949759960244">बास्केटबल</translation> <translation id="5125751979347152379">अवैध URL।</translation> <translation id="5126611267288187364">परिवर्तनहरू हेर्नुहोस्</translation> @@ -5294,7 +5294,7 @@ <translation id="8118488170956489476">तपाईंको संगठनले तपाईंको <ph name="BEGIN_LINK" />ब्राउजरको व्यवस्थापन गर्छ<ph name="END_LINK" /></translation> <translation id="8118860139461251237">तपाइँका डाउनलोडहरू व्यवस्थापित गर्नुहोस्</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" />, र थप</translation> -<translation id="8120715633374652536">तपाईंको यन्त्रको भण्डारणको खाली ठाउँ कम छ। Plugin VM प्रयोग गर्न कम्तीमा पनि <ph name="MINIMUM_SPACE" /> खाली ठाउँ चाहिन्छ र <ph name="RECOMMENDED_SPACE" /> भन्दा बढी ठाउँ खाली राख्न सिफारिस गरिन्छ। ठाउँ खाली गर्न यन्त्रको भण्डारणबाट फाइलहरू मेटाउनुहोस्।</translation> +<translation id="8120715633374652536">तपाईंको यन्त्रको भण्डारणमा खाली ठाउँ कम छ। Plugin VM प्रयोग गर्न कम्तीमा पनि <ph name="MINIMUM_SPACE" /> खाली ठाउँ चाहिन्छ र <ph name="RECOMMENDED_SPACE" /> भन्दा बढी ठाउँ खाली राख्न सिफारिस गरिन्छ। ठाउँ खाली गर्न यन्त्रको भण्डारणबाट फाइलहरू मेटाउनुहोस्।</translation> <translation id="8123590694679414600"><ph name="TIME" /> मा तपाईंको सिंक पासफ्रेजमार्फत डेटा इन्क्रिप्ट गरियो। यसअन्तर्गत Google Pay का भुक्तानी विधि र ठेगानाहरू समावेश हुँदैनन्।</translation> <translation id="81238879832906896">पहेँलो र सेतो फुल</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index e759ef78..d3d23dc1 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Openen in <ph name="APP" /></translation> <translation id="2120297377148151361">Activiteit en interacties</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> geblokkeerd</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Cookies worden geblokkeerd}=1{Cookies worden geblokkeerd, 1 uitzondering}other{Cookies worden geblokkeerd, {COUNT} uitzonderingen}}</translation> <translation id="2121825465123208577">Formaat aanpassen</translation> <translation id="2122305276694332719">Als er automatisch verbinding wordt gemaakt met een verborgen netwerk, kunnen anderen je apparaat en bepaalde netwerkinstellingen zien. Dit wordt niet aanbevolen.</translation> <translation id="2123766928840368256">Een ander bestand kiezen</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index aed9a6e..8fe1b12 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1866,7 +1866,7 @@ <translation id="3492788708641132712">ସିଙ୍କ କାମ କରୁନାହିଁ। ପୁଣି ସାଇନ୍ ଇନ୍ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="3493486281776271508">ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ଆବଶ୍ୟକ</translation> <translation id="3493881266323043047">ବୈଧତା:</translation> -<translation id="3494155060718700400">ବିପଦଜନକ ୱେବସାଇଟ୍, ଡାଉନଲୋଡ୍ ଏବଂ ଏକ୍ସଟେନ୍ସନଗୁଡ଼ିକ ବିରୁଦ୍ଧରେ ଆପଣଙ୍କୁ ରକ୍ଷା କରେ ନାହିଁ (ସୁପାରିଶ କରାଯାଇନାହିଁ)। Gmail ଏବଂ Search ପରି ଅନ୍ୟ Google ସେବାଗୁଡ଼ିକରେ ସେଫ୍ ବ୍ରାଉଜିଂ ସୁବିଧା ଉପଲବ୍ଧ ଥିଲେ, ଆପଣ ଏବେ ବି ଏହି ସୁରକ୍ଷା ପାଇବେ।</translation> +<translation id="3494155060718700400">ବିପଦଜନକ ୱେବସାଇଟ୍, ଡାଉନଲୋଡ୍ ଏବଂ ଏକ୍ସଟେନ୍ସନଗୁଡ଼ିକରୁ ଆପଣଙ୍କୁ ରକ୍ଷା କରେ ନାହିଁ (ସୁପାରିଶ କରାଯାଇନାହିଁ)। Gmail ଏବଂ Search ପରି ଅନ୍ୟ Google ସେବାଗୁଡ଼ିକରେ ସେଫ୍ ବ୍ରାଉଜିଂ ସୁବିଧା ଉପଲବ୍ଧ ଥିଲେ, ଆପଣ ଏବେ ବି ଏହି ସୁରକ୍ଷା ପାଇବେ।</translation> <translation id="3494769164076977169">ପ୍ରଥମ ଫାଇଲ୍ (ସୁପାରିଶ୍ କରାଯାଇଛି) ପରେ ଯେତେବେଳେ ଏକ ସାଇଟ୍ ସ୍ୱଚାଳିତ ଭାବେ ଫାଇଲ୍ଗୁଡ଼ିକ ଡାଉନ୍ଲୋଡ୍ କରିବାକୁ ଚେଷ୍ଟା କରେ, ତାହା ପଚାରନ୍ତୁ</translation> <translation id="3495660573538963482">Google ଆସିଷ୍ଟାଣ୍ଟ ସେଟିଂସ୍</translation> <translation id="3496213124478423963">ଜୁମ୍ ଆଉଟ୍</translation> @@ -1919,7 +1919,7 @@ <translation id="3564848315152754834">USB ସୁରକ୍ଷା କୀ</translation> <translation id="3566721612727112615">କୌଣସି ସାଇଟ୍ ଯୋଗକରାଯାଇନାହିଁ</translation> <translation id="3569382839528428029">ଆପଣ କ’ଣ ଚାହୁଁଛନ୍ତି ଯେ <ph name="APP_NAME" /> ଆପଣଙ୍କର ସ୍କ୍ରିନ୍ ସେୟାର୍ କରୁ?</translation> -<translation id="3569682580018832495"><ph name="ORIGIN" /> ନିମ୍ନୋକ୍ତ ଫାଇଲ୍ ଏବଂ ଫୋଲ୍ଡରଗୁଡ଼ିକୁ ଦେଖିପାରିବେ</translation> +<translation id="3569682580018832495"><ph name="ORIGIN" /> ନିମ୍ନୋକ୍ତ ଫାଇଲ୍ ଏବଂ ଫୋଲ୍ଡରଗୁଡ଼ିକୁ ଦେଖିପାରିବ</translation> <translation id="3571734092741541777">ସେଟ୍ ଅପ୍</translation> <translation id="3574210789297084292">ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="3574917942258583917">ଯେକୌଣସି ମତେ ଇନ୍କଗ୍ନିଟୋ ମୋଡ୍ରୁ ବାହାରିବେ କି?</translation> @@ -2461,7 +2461,7 @@ <translation id="425573743389990240">ବ୍ୟାଟେରୀର ଡିସ୍ଚାର୍ଜ ହାର, ୱାଟ୍ରେ (ଋଣାତ୍ମକ ମୂଲ୍ୟ ମାନେ ବ୍ୟାଟେରୀ ଚାର୍ଜ ହେଉଛି)</translation> <translation id="4256316378292851214">&ଭିଡିଓ ଭାବେ ସେଭ୍ କରନ୍ତୁ...</translation> <translation id="4258348331913189841">ଫାଇଲ୍ ସିଷ୍ଟମ୍</translation> -<translation id="4260182282978351200"><ph name="FILE_NAME" /> ବିପଦଜନକ ହୋଇଥାଇପାରେ। ସ୍କାନ୍ କରିବା ପାଇଁ Google ଆଡଭାନ୍ସଡ ପ୍ରୋଟେକସନକୁ ପଠାଇବେ କି? ଡାଉନଲୋଡ୍ ବାର୍ କ୍ଷେତ୍ରକୁ ଯିବା ପାଇଁ Shift+F6 ଦବାନ୍ତୁ।</translation> +<translation id="4260182282978351200"><ph name="FILE_NAME" /> ବିପଦଜନକ ହୋଇପାରେ। ସ୍କାନ୍ କରିବା ପାଇଁ Google ଆଡଭାନ୍ସଡ ପ୍ରୋଟେକସନକୁ ପଠାଇବେ କି? ଡାଉନଲୋଡ୍ ବାର୍ କ୍ଷେତ୍ରକୁ ଯିବା ପାଇଁ Shift+F6 ଦବାନ୍ତୁ।</translation> <translation id="4263223596040212967">ଆପଣଙ୍କର କୀବୋର୍ଡ ଲେଆଉଟ୍ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="4263757076580287579">ପ୍ରିଣ୍ଟର୍ ପଞ୍ଜିକରଣ ବାତିଲ୍ ହୋଇଗଲା।</translation> <translation id="426564820080660648">ଅପ୍ଡେଟ୍ଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରିବା ପାଇଁ, ଦୟାକରି ଇଥର୍ନେଟ, ୱାଇ-ଫାଇ କିମ୍ବା ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରନ୍ତୁ।</translation> @@ -5135,7 +5135,7 @@ <translation id="7915471803647590281">ମତାମତ ପଠାଇବା ପୂର୍ବରୁ ଦୟାକରି କ'ଣ ଘଟିଛି ତାହା ଆମକୁ କୁହନ୍ତୁ।</translation> <translation id="7918257978052780342">ପଞ୍ଜିକରଣ କରନ୍ତୁ</translation> <translation id="7919210519031517829"><ph name="DURATION" />ସେ</translation> -<translation id="7920363873148656176"><ph name="ORIGIN" />, <ph name="FILENAME" /> ଦେଖିପାରିବେ</translation> +<translation id="7920363873148656176"><ph name="ORIGIN" />, <ph name="FILENAME" /> ଦେଖିପାରିବ</translation> <translation id="7924358170328001543">ପୋର୍ଟ ଫରୱାର୍ଡିଂ ତ୍ରୁଟି</translation> <translation id="792514962475806987">ଡକ୍ ଥିବା ଜୁମ୍ର ସ୍ତର:</translation> <translation id="7925247922861151263">AAAର ଯାଞ୍ଚ ଫେଲ୍ ହୋଇଗଲା</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index faeeac1..29fe124 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -2465,7 +2465,7 @@ <translation id="425573743389990240">ਵਾਟ ਵਿੱਚ ਬੈਟਰੀ ਡਿਸਚਾਰਜ ਦਰ (ਨੈਗੇਟਿਵ ਵੈਲਯੂ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਬੈਟਰੀ ਚਾਰਜ ਹੋ ਰਹੀ ਹੈ)</translation> <translation id="4256316378292851214">ਦੇ ਤੌਰ 'ਤੇ ਵੀਡੀਓ ਰੱ&ਖਿਅਤ ਕਰੋ...</translation> <translation id="4258348331913189841">ਫਾਈਲ ਸਿਸਟਮ</translation> -<translation id="4260182282978351200"><ph name="FILE_NAME" /> ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ। ਕੀ Google ਉੱਨਤ ਸੁਰੱਖਿਆ ਨੂੰ ਸਕੈਨ ਕਰਨ ਲਈ ਭੇਜਣਾ ਹੈ? ਡਾਊਨਲੋਡ ਬਾਰ ਖੇਤਰ ਵਿੱਚ ਜਾਣ ਲਈ Shift+F6 ਦਬਾਓ।</translation> +<translation id="4260182282978351200"><ph name="FILE_NAME" /> ਖਤਰਨਾਕ ਹੋ ਸਕਦੀ ਹੈ। ਕੀ Google ਉੱਨਤ ਸੁਰੱਖਿਆ ਨੂੰ ਸਕੈਨ ਕਰਨ ਲਈ ਭੇਜਣੀ ਹੈ? ਡਾਊਨਲੋਡ ਬਾਰ ਖੇਤਰ ਵਿੱਚ ਜਾਣ ਲਈ Shift+F6 ਦਬਾਓ।</translation> <translation id="4263223596040212967">ਆਪਣੇ ਕੀ-ਬੋਰਡ ਖਾਕੇ ਦੀ ਜਾਂਚ ਕਰਕੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="4263757076580287579">ਪ੍ਰਿੰਟਰ ਰਜਿਸਟਰੇਸ਼ਨ ਰੱਦ ਕੀਤੀ ਗਈ ਹੈ।</translation> <translation id="426564820080660648">ਅਪਡੇਟਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ, ਕਿਰਪਾ ਕਰਕੇ Ethernet, Wi-Fi ਜਾਂ ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ।</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 629b4ecf..9a59a6f4 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Otwórz w aplikacji <ph name="APP" /></translation> <translation id="2120297377148151361">Aktywność i interakcje</translation> <translation id="2120639962942052471">Zablokowano uprawnienie: <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Pliki cookie są blokowane}=1{Pliki cookie są blokowane, 1 wyjątek}few{Pliki cookie są blokowane, {COUNT} wyjątki}many{Pliki cookie są blokowane, {COUNT} wyjątków}other{Pliki cookie są blokowane, {COUNT} wyjątku}}</translation> <translation id="2121825465123208577">Zmień rozmiar</translation> <translation id="2122305276694332719">Automatyczne łączenie się z ukrytą siecią pozwala innym widzieć Twoje urządzenie wraz z niektórymi ustawieniami sieci. Nie zalecamy korzystania z tej funkcji.</translation> <translation id="2123766928840368256">Wybierz inny plik</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 98faddf..e687255 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Abrir no app <ph name="APP" /></translation> <translation id="2120297377148151361">Atividade e interações</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> bloqueada</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Os cookies foram bloqueados}=1{Os cookies foram bloqueados, com 1 exceção}one{Os cookies foram bloqueados, com {COUNT} exceção}other{Os cookies foram bloqueados, com {COUNT} exceções}}</translation> <translation id="2121825465123208577">Redimensionar</translation> <translation id="2122305276694332719">A conexão automática a uma rede oculta não é recomendada porque permite que outras pessoas vejam seu dispositivo e algumas configurações de rede.</translation> <translation id="2123766928840368256">Escolher outro arquivo</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 333a5c4..62c2423 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Abrir na aplicação <ph name="APP" /></translation> <translation id="2120297377148151361">Atividade e interações</translation> <translation id="2120639962942052471">Bloqueou <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Os cookies estão bloqueados.}=1{Os cookies estão bloqueados, com 1 exceção.}other{Os cookies estão bloqueados, com {COUNT} exceções.}}</translation> <translation id="2121825465123208577">Redimensionar</translation> <translation id="2122305276694332719">A ligação automática a uma rede oculta permite que terceiros vejam o seu dispositivo e algumas definições da rede, pelo que não é recomendada.</translation> <translation id="2123766928840368256">Selecionar um ficheiro diferente</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 234d9e1..c207b6b 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Deschide în <ph name="APP" /></translation> <translation id="2120297377148151361">Activitate și interacțiuni</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> a fost blocată</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Cookie-urile sunt blocate}=1{Cookie-urile sunt blocate, cu o excepție}few{Cookie-urile sunt blocate, cu {COUNT} excepții}other{Cookie-urile sunt blocate, cu {COUNT} de excepții}}</translation> <translation id="2121825465123208577">Redimensionează</translation> <translation id="2122305276694332719">Conectarea automată la o rețea ascunsă permite altora să îți vadă dispozitivul și unele setări pentru rețea, așadar nu este recomandată.</translation> <translation id="2123766928840368256">Alege alt fișier</translation> @@ -1871,7 +1872,7 @@ <translation id="3492788708641132712">Sincronizarea nu funcționează. Încearcă să te conectezi din nou.</translation> <translation id="3493486281776271508">Este necesară o conexiune la internet</translation> <translation id="3493881266323043047">Validitate</translation> -<translation id="3494155060718700400">Nu te protejează împotriva site-urilor, descărcărilor și extensiilor periculoase (nu este recomandat). Te vei bucura în continuare de protecția oferită de Navigarea sigură, dacă este disponibilă, în alte servicii Google, cum ar fi Gmail și Căutarea Google.</translation> +<translation id="3494155060718700400">Nu te protejează împotriva site-urilor, descărcărilor și extensiilor periculoase (nu este recomandat). Te vei bucura în continuare de protecția oferită de Navigarea sigură, dacă este disponibilă, în alte servicii Google, cum ar fi Gmail și Căutarea.</translation> <translation id="3494769164076977169">Notifică-mă dacă un site încearcă să descarce automat fișiere după primul fișier (recomandat)</translation> <translation id="3495660573538963482">Setări Asistent Google</translation> <translation id="3496213124478423963">Micșorează</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 1b004f6..859fb0c 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1869,7 +1869,7 @@ <translation id="3492788708641132712">Ошибка синхронизации. Войдите в аккаунт ещё раз.</translation> <translation id="3493486281776271508">Требуется подключение к Интернету.</translation> <translation id="3493881266323043047">Срок действия</translation> -<translation id="3494155060718700400">Не защищает вас от опасных сайтов, расширений и скачанных файлов (не рекомендуется). Безопасный просмотр по-прежнему будет работать в других сервисах Google, например в Gmail и Поиске.</translation> +<translation id="3494155060718700400">Не защищает вас от сайтов, расширений и скачанных файлов, которые могут представлять опасность (не рекомендуется). Безопасный просмотр по-прежнему будет работать в других сервисах Google, например в Gmail и Поиске.</translation> <translation id="3494769164076977169">Показывать запрос на скачивание дополнительных файлов после скачивания первого (рекомендуется)</translation> <translation id="3495660573538963482">Настройки Google Ассистента</translation> <translation id="3496213124478423963">Уменьшить</translation> @@ -2465,7 +2465,7 @@ <translation id="425573743389990240">Скорость разрядки батареи в ваттах (при зарядке значение отрицательное)</translation> <translation id="4256316378292851214">Сохранить видео как...</translation> <translation id="4258348331913189841">Файловые системы</translation> -<translation id="4260182282978351200">Файл "<ph name="FILE_NAME" />" может представлять опасность. Отправить его в Google для проверки с помощью Дополнительной защиты? Чтобы перейти к панели загрузок, нажмите Shift + F6.</translation> +<translation id="4260182282978351200">Файл "<ph name="FILE_NAME" />" может представлять опасность. Отправить его в Google для проверки с помощью Дополнительной защиты? Чтобы перейти к панели скачанных файлов, нажмите Shift + F6.</translation> <translation id="4263223596040212967">Проверьте раскладку клавиатуры и повторите попытку.</translation> <translation id="4263757076580287579">Регистрация принтера отменена.</translation> <translation id="426564820080660648">Чтобы проверить наличие обновлений, подключитесь через сеть Ethernet или Wi-Fi либо используйте мобильную передачу данных.</translation> @@ -3057,7 +3057,7 @@ <translation id="5117930984404104619">Отслеживание режима работы других расширений, в том числе посещаемых URL</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Недостаточно места на диске. Выберите другой каталог или освободите место на диске.</translation> -<translation id="5122384452788334261">На устройстве осталось мало места. Для использования Plugin VM рекомендуется освободить как минимум <ph name="RECOMMENDED_SPACE" />. Удалите с устройства файлы, которые больше не нужны.</translation> +<translation id="5122384452788334261">На устройстве осталось мало места. Для использования Plugin VM рекомендуется как минимум <ph name="RECOMMENDED_SPACE" /> свободного пространства. Удалите с устройства файлы, которые больше не нужны.</translation> <translation id="5123433949759960244">Баскетбол</translation> <translation id="5125751979347152379">Недопустимый URL.</translation> <translation id="5126611267288187364">Посмотреть изменения</translation> @@ -5298,7 +5298,7 @@ <translation id="8118488170956489476">Этим браузером <ph name="BEGIN_LINK" />управляет<ph name="END_LINK" /> ваша организация.</translation> <translation id="8118860139461251237">Управление скачанными файлами</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />, <ph name="RECENT_PERMISSIONS_CHANGE_1" />, <ph name="RECENT_PERMISSIONS_CHANGE_2" />, а также внесены другие изменения.</translation> -<translation id="8120715633374652536">На устройстве осталось мало места. Чтобы использовать Plugin VM, нужно освободить как минимум <ph name="MINIMUM_SPACE" /> (рекомендуется более <ph name="RECOMMENDED_SPACE" />). Удалите с устройства файлы, которые больше не нужны.</translation> +<translation id="8120715633374652536">На устройстве осталось мало места. Чтобы использовать Plugin VM, нужно как минимум <ph name="MINIMUM_SPACE" /> свободного пространства (рекомендуется более <ph name="RECOMMENDED_SPACE" />). Удалите с устройства файлы, которые больше не нужны.</translation> <translation id="8123590694679414600">Данные зашифрованы с помощью кодовой фразы <ph name="TIME" />. Шифрование не применяется к способам оплаты и адресам из Google Pay.</translation> <translation id="81238879832906896">Цветок (желтый с белым)</translation> <translation id="8124313775439841391">Управляемый ONC</translation> @@ -5673,7 +5673,7 @@ <translation id="8645920082661222035">Предсказывает опасные события и предупреждает вас о них.</translation> <translation id="8647834505253004544">Недопустимый веб-адрес</translation> <translation id="8648252583955599667"><ph name="GET_HELP_LINK" /> или <ph name="RE_SCAN_LINK" /></translation> -<translation id="8648544143274677280">Сайт <ph name="SITE_NAME" /> запрашивает следующие разрешения: <ph name="FIRST_PERMISSION" />, <ph name="SECOND_PERMISSION" /> и не только</translation> +<translation id="8648544143274677280">Сайт <ph name="SITE_NAME" /> запрашивает следующие разрешения: <ph name="FIRST_PERMISSION" />, <ph name="SECOND_PERMISSION" /> и другие</translation> <translation id="8650543407998814195">У вас больше нет доступа к старому профилю, но вы можете его удалить.</translation> <translation id="8651585100578802546">Принудительно обновить страницу</translation> <translation id="8652400352452647993">Ошибка в упакованном расширении</translation> @@ -5895,7 +5895,7 @@ <translation id="8895454554629927345">Список закладок</translation> <translation id="8896022254727357590">PIN-код должен содержать не менее 4 символов.</translation> <translation id="8898786835233784856">Выбрать следующую вкладку</translation> -<translation id="8898822736010347272">Отправляет в Google URL и контент некоторых посещенных страниц, а также ограниченную информацию о системе. Это помогает обнаруживать новые угрозы и защищать всех пользователей Интернета.</translation> +<translation id="8898822736010347272">Отправлять в Google URL и контент некоторых посещенных страниц, а также определенную информацию о системе (это помогает обнаруживать новые угрозы и защищать всех пользователей Интернета)</translation> <translation id="8898840733695078011">Уровень сигнала</translation> <translation id="8899851313684471736">Открыть ссылку в новом &окне</translation> <translation id="8902667442496790482">Открыть настройки озвучивания при нажатии</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 2796354c..2dca4e50 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -823,6 +823,7 @@ <translation id="2119349053129246860"><ph name="APP" /> යෙදුමෙහි විවෘත කරන්න</translation> <translation id="2120297377148151361">ක්රියාකාරකම් සහ අන්තර්ක්රියා</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> අවහිර කළා</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{කුකී අවහිරයි}=1{කුකී අවහිරයි, 1 ව්යතිරේකයක්}one{කුකී අවහිරයි, ව්යතිරේක {COUNT}ක්}other{කුකී අවහිරයි, ව්යතිරේක {COUNT}ක්}}</translation> <translation id="2121825465123208577">ප්රතිප්රමාණ කිරීම</translation> <translation id="2122305276694332719">සැඟවුණු ජාලයකට ස්වයංක්රීයව සම්බන්ධ කිරීම අන් අයට ඔබේ උපාංගය සහ යම් ජාල සැකසීම් බැලීමට ඉඩ සලසන අතර, එය නිර්දේශ නොකෙරේ.</translation> <translation id="2123766928840368256">වෙනත් ගොනුවක් තෝරන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index b21f5cf..51fcd33d 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Odpri v aplikaciji <ph name="APP" /></translation> <translation id="2120297377148151361">Dejavnost in interakcija</translation> <translation id="2120639962942052471">Blokirano je dovoljenje <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Piškotki so blokirani}=1{Piškotki so blokirani, 1 izjema}one{Piškotki so blokirani, {COUNT} izjema}two{Piškotki so blokirani, {COUNT} izjemi}few{Piškotki so blokirani, {COUNT} izjeme}other{Piškotki so blokirani, {COUNT} izjem}}</translation> <translation id="2121825465123208577">Spreminjanje velikosti</translation> <translation id="2122305276694332719">Samodejna povezava s skritim omrežjem omogoča drugim, da vidijo vašo napravo in nekatere nastavitve omrežja, zato tega ne priporočamo.</translation> <translation id="2123766928840368256">Izberi drugo datoteko</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 30595d79..c72bf2f 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -823,6 +823,7 @@ <translation id="2119349053129246860">Otvori u <ph name="APP" /></translation> <translation id="2120297377148151361">Aktivnosti i interakcije</translation> <translation id="2120639962942052471">Funkcija <ph name="PERMISSION" /> je blokirana</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Kolačići su blokirani}=1{Kolačići su blokirani, 1 izuzetak}one{Kolačići su blokirani, {COUNT} izuzetak}few{Kolačići su blokirani, {COUNT} izuzetka}other{Kolačići su blokirani, {COUNT} izuzetaka}}</translation> <translation id="2121825465123208577">Promeni veličinu</translation> <translation id="2122305276694332719">Ako se automatski povežete na skrivenu mrežu, drugi mogu da vide vaš uređaj i neka podešavanja mreže, zbog čega vam to ne preporučujemo.</translation> <translation id="2123766928840368256">Odaberite drugu datoteku</translation> @@ -2108,7 +2109,7 @@ <translation id="3784472333786002075">Kolačići su datoteke koje prave veb-sajtovi. Postoje dva tipa kolačića: Kolačiće prve strane pravi sajt koji posećujete. Sajt je prikazan na traci za adresu. Kolačiće treće strane prave drugi sajtovi. Ti sajtovi su vlasnici delova sadržaja koji vidite na posećenom veb-sajtu, poput oglasa ili slika.</translation> <translation id="3785308913036335955">Prikaži prečicu za aplikacije</translation> <translation id="3785727820640310185">Sačuvane lozinke za ovaj sajt</translation> -<translation id="3788301286821743879">Pokretanje kiosk aplikacija nije uspelo.</translation> +<translation id="3788301286821743879">Pokretanje kiosk aplikacije nije uspelo.</translation> <translation id="3788401245189148511">Mogli bi da:</translation> <translation id="3789841737615482174">Instaliraj</translation> <translation id="379082410132524484">Kartica je istekla</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 614d6df..cab6203 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -823,6 +823,7 @@ <translation id="2119349053129246860">Отвори у <ph name="APP" /></translation> <translation id="2120297377148151361">Активности и интеракције</translation> <translation id="2120639962942052471">Функција <ph name="PERMISSION" /> је блокирана</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Колачићи су блокирани}=1{Колачићи су блокирани, 1 изузетак}one{Колачићи су блокирани, {COUNT} изузетак}few{Колачићи су блокирани, {COUNT} изузетка}other{Колачићи су блокирани, {COUNT} изузетака}}</translation> <translation id="2121825465123208577">Промени величину</translation> <translation id="2122305276694332719">Ако се аутоматски повежете на скривену мрежу, други могу да виде ваш уређај и нека подешавања мреже, због чега вам то не препоручујемо.</translation> <translation id="2123766928840368256">Одаберите другу датотеку</translation> @@ -2108,7 +2109,7 @@ <translation id="3784472333786002075">Колачићи су датотеке које праве веб-сајтови. Постоје два типа колачића: Колачиће прве стране прави сајт који посећујете. Сајт је приказан на траци за адресу. Колачиће треће стране праве други сајтови. Ти сајтови су власници делова садржаја који видите на посећеном веб-сајту, попут огласа или слика.</translation> <translation id="3785308913036335955">Прикажи пречицу за апликације</translation> <translation id="3785727820640310185">Сачуване лозинке за овај сајт</translation> -<translation id="3788301286821743879">Покретање киоск апликација није успело.</translation> +<translation id="3788301286821743879">Покретање киоск апликације није успело.</translation> <translation id="3788401245189148511">Могли би да:</translation> <translation id="3789841737615482174">Инсталирај</translation> <translation id="379082410132524484">Картица је истекла</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index b54694f..92d9ee5 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -823,6 +823,7 @@ <translation id="2119349053129246860">Fungua katika <ph name="APP" /></translation> <translation id="2120297377148151361">Shughuli na ushirikiano</translation> <translation id="2120639962942052471">Umezuia <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Vidakuzi vimezuiwa}=1{Vidakuzi vimezuiwa, ila kimoja}other{Vidakuzi vimezuiwa, ila {COUNT}}}</translation> <translation id="2121825465123208577">Badilisha ukubwa</translation> <translation id="2122305276694332719">Hatua ya kuunganisha kiotomatiki kwenye mtandao uliofichwa huruhusu watu wengine kuona kifaa chako na baadhi ya mipangilio ya mtandao, na hali hii haipendekezwi.</translation> <translation id="2123766928840368256">Chagua faili tofauti</translation> @@ -3054,7 +3055,7 @@ <translation id="5117930984404104619">Ufuatiliaji wa tabia ya viendelezi vingine, pamoja na URL zilizotembelewa</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">Diski yako kuu imejaa. Tafadhali hifadhi kwenye eneo jingine au utafute nafasi zaidi kwenye diski kuu.</translation> -<translation id="5122384452788334261">Nafasi ya hifadhi ya kifaa chako inakaribia kuisha. Tunapendekeza uwe na hifadhi ya angalau <ph name="RECOMMENDED_SPACE" /> ambayo haijatumika ili utumie Plugin VM. Ili uokoe nafasi, futa faili zilizo kwenye hifadhi ya kifaa.</translation> +<translation id="5122384452788334261">Nafasi ya hifadhi ya kifaa chako inakaribia kuisha. Tunapendekeza uwe na hifadhi ya angalau <ph name="RECOMMENDED_SPACE" /> ambayo haijatumika ili utumie Plugin VM. Ili upate nafasi, futa faili zilizo kwenye hifadhi ya kifaa.</translation> <translation id="5123433949759960244">Mpira wa kikapu</translation> <translation id="5125751979347152379">URL hiyo si sahihi.</translation> <translation id="5126611267288187364">Angalia mabadiliko</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 1a71fd43..f96dd5a8 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -190,6 +190,7 @@ <translation id="1243314992276662751">பதிவேற்று</translation> <translation id="1244265436519979884">Linux மீட்டமைத்தல் செயலில் உள்ளது</translation> <translation id="1244303850296295656">நீட்டிப்புப் பிழை</translation> +<translation id="1246158006305844142">நீங்கள் Google கணக்கின் மூலம் உள்நுழைந்துள்ள Chrome OS சாதனங்கள் அனைத்திலும் உங்கள் ஆப்ஸும் அமைப்புகளும் ஒத்திசையும். உலாவி ஒத்திசைவு விருப்பங்களுக்கு, <ph name="LINK_BEGIN" />Chrome அமைப்புகளுக்குச்<ph name="LINK_END" /> செல்லவும்.</translation> <translation id="1246905108078336582">கிளிப்போர்டிலிருந்து பரிந்துரையை அகற்றவா?</translation> <translation id="1249643471736608405">நிறுத்தப்பட்டுள்ளதன் காரணமாக <ph name="PLUGIN_NAME" /> தடைசெய்யப்பட்டுள்ளது.</translation> <translation id="1251366534849411931">திறந்த நெளி அடைப்புக்குறி இல்லை: <ph name="ERROR_LINE" /></translation> @@ -389,6 +390,7 @@ <translation id="1524563461097350801">வேண்டாம்</translation> <translation id="1525740877599838384">இருப்பிடத்தைக் கண்டறிய, வைஃபையை மட்டும் பயன்படுத்து</translation> <translation id="152629053603783244">Linuxஸை மீண்டும் தொடங்கு</translation> +<translation id="1526335046150927198">'டச்பேடைத் துரிதமாக நகர்த்துதல்' அம்சத்தை இயக்கு</translation> <translation id="1526560967942511387">பெயரிடப்படாத ஆவணம்</translation> <translation id="1529891865407786369">மின்சக்தி மூலம்</translation> <translation id="1530838837447122178">மவுஸ் மற்றும் டச்பேட் அமைப்புகளைத் திற</translation> @@ -1293,6 +1295,7 @@ <translation id="2725200716980197196">நெட்வொர்க் இணைப்பு மீட்டெடுக்கப்பட்டது</translation> <translation id="2727633948226935816">மீண்டும் நினைவுபடுத்தாதே</translation> <translation id="2727712005121231835">உண்மை அளவு</translation> +<translation id="2729314457178420145">உலாவிய தரவையும் (<ph name="URL" />) அழி. இது Google.comமில் இருந்து உங்களை வெளியேற்றக்கூடும். <ph name="LEARN_MORE" /></translation> <translation id="2730029791981212295">Linux ஆப்ஸும் கோப்புகளும் காப்புப் பிரதி எடுக்கப்படுகின்றன</translation> <translation id="273093730430620027">இந்தப் பக்கம் உங்கள் கேமராவை அணுகுகிறது.</translation> <translation id="2731392572903530958">மூடப்பட்ட சாளரத்தை மீ&ண்டும் திற</translation> @@ -1674,6 +1677,7 @@ <translation id="3264544094376351444">Sans-Serif எழுத்துரு</translation> <translation id="3264582393905923483">சூழல்</translation> <translation id="3265459715026181080">சாளரத்தை மூடு</translation> +<translation id="3266274118485960573">பாதுகாப்புச் சரிபார்ப்பு இயங்குகிறது.</translation> <translation id="3267726687589094446">பல கோப்புகளைத் தானாக பதிவிறக்க, அனுமதிப்பதைத் தொடர்</translation> <translation id="3268451620468152448">திறந்த தத்தல்கள்</translation> <translation id="3269069891205016797">நீங்கள் வெளியேறியதும், சாதனத்திலிருந்து உங்கள் தகவல் அகற்றப்படும்.</translation> @@ -1777,6 +1781,7 @@ <translation id="3412265149091626468">தேர்வுக்கு செல்</translation> <translation id="3413122095806433232">CA வழங்குநர்கள்: <ph name="LOCATION" /></translation> <translation id="3414952576877147120">அளவு:</translation> +<translation id="3416468988018290825">முழு URLகளை எப்போதும் காட்டு</translation> <translation id="3420501302812554910">அகப் பாதுகாப்பு விசையை ரீசெட் செய்ய வேண்டும்</translation> <translation id="3421387094817716717">நீள்வட்ட வளைவான பொதுக் குறியீடு</translation> <translation id="3422291238483866753">ஒரு தளம் என்னைச் சுற்றியுள்ள இடங்களின் 3D மேப்பை உருவாக்கவோ கேமரா நிலையை டிராக் செய்யவோ விரும்பினால் அனுமதி கேள் (பரிந்துரைக்கப்படுகிறது)</translation> @@ -2131,6 +2136,7 @@ <translation id="3838486795898716504">மேலும் <ph name="PAGE_TITLE" /></translation> <translation id="3838543471119263078">குக்கீகள், பிற தளம் மற்றும் செருகுநிரல் தரவு</translation> <translation id="383891835335927981">எந்தத் தளங்களும் பெரிதாக்கப்படவோ சிறிதாக்கப்படவோ இல்லை</translation> +<translation id="3839509547554145593">'மவுஸைத் துரிதமாக நகர்த்துதல்' அம்சத்தை இயக்கு</translation> <translation id="3839516600093027468"><ph name="HOST" />, கிளிப்போர்டைப் பார்ப்பதை எப்போதும் தடைசெய்</translation> <translation id="3841964634449506551">தவறான கடவுச்சொல்</translation> <translation id="3842552989725514455">Serif எழுத்துரு</translation> @@ -2740,6 +2746,7 @@ <translation id="4699172675775169585">தற்காலிகமாகச் சேமிக்கப்பட்ட படங்கள் மற்றும் கோப்புகள்</translation> <translation id="4699357559218762027">(தானாக துவக்கப்பட்டது)</translation> <translation id="470074695271471509">நிறைவுசெய்ய வெளியேறவா?</translation> +<translation id="4701025263201366865">பெற்றோர் உள்நுழைதல்</translation> <translation id="4707302005824653064">chrome.com இல் நிர்வாகியால் (<ph name="CUSTODIAN_EMAIL" />) பயன்பாடு மற்றும் வரலாற்றை மதிப்பாய்வு செய்ய முடியும்.</translation> <translation id="4707579418881001319">L2TP/IPsec + பயனர் சான்றிதழ்</translation> <translation id="4708794300267213770">உறக்கநிலையிலிருந்து விழிக்கும் போது, லாக் ஸ்கிரீனைக் காட்டு</translation> @@ -3041,6 +3048,7 @@ <translation id="5139112070765735680"><ph name="QUERY_NAME" />, <ph name="DEFAULT_SEARCH_ENGINE_NAME" /> தேடல்</translation> <translation id="5139823398361067371">உங்கள் பாதுகாப்பு விசைக்கான பின்னை உள்ளிடவும். 'பின்' தெரியவில்லை எனில் பாதுகாப்பு விசையை மீட்டமைக்க வேண்டும்.</translation> <translation id="5139955368427980650">&திற</translation> +<translation id="5142793792982256885">டச்பேட் நகர்த்துதல் வேகம்</translation> <translation id="5142961317498132443">அங்கீகாரம்</translation> <translation id="5143374789336132547">முகப்புப் பொத்தானைக் கிளிக் செய்யும் போது காண்பிக்கப்படும் பக்கத்தை, "<ph name="EXTENSION_NAME" />" நீட்டிப்பு மாற்றியுள்ளது.</translation> <translation id="5143712164865402236">முழுத்திரைக்குச் செல்</translation> @@ -3598,6 +3606,7 @@ <translation id="5901630391730855834">மஞ்சள்</translation> <translation id="5906655207909574370">கிட்டத்தட்ட புதுப்பிக்கப்பட்டது! புதுப்பிப்பதை முடிக்க, சாதனத்தை மறுதொடக்கம் செய்யவும்.</translation> <translation id="5906732635754427568">இந்தப் பயன்பாட்டுடன் தொடர்புடைய தரவு, எல்லாச் சாதனங்களிலிருந்தும் அகற்றப்படும்.</translation> +<translation id="5908695239556627796">மவுஸ் நகர்த்துதல் வேகம்</translation> <translation id="5908769186679515905">Flashஐ இயக்குவதிலிருந்து தளங்களைத் தடு</translation> <translation id="5910363049092958439">படத்தை இவ்வாறு சே&மி...</translation> <translation id="5910726859585389579"><ph name="DEVICE_TYPE" /> ஆஃப்லைனில் உள்ளது</translation> @@ -4102,6 +4111,7 @@ <translation id="6586451623538375658">முதன்மை சுட்டிப் பொத்தானை மாற்று</translation> <translation id="6586604979641883411">Linuxஸை மேம்படுத்த குறைந்தபட்சம் <ph name="REQUIRED_SPACE" /> டிஸ்க் சேமிப்பிடம் தேவை. உங்கள் சாதனத்தில் சிறிது இடத்தைக் காலியாக்கிவிட்டு மீண்டும் முயலவும்.</translation> <translation id="6588043302623806746">பாதுகாப்பான DNSஸைப் பயன்படுத்து</translation> +<translation id="659005207229852190">பாதுகாப்புச் சரிபார்ப்பு நிறைவடைந்தது.</translation> <translation id="6590458744723262880">கோப்புறையின் பெயரை மாற்றவும்</translation> <translation id="6592267180249644460">WebRTC பதிவு எடுக்கப்பட்ட நேரம் <ph name="WEBRTC_LOG_CAPTURE_TIME" /></translation> <translation id="6592808042417736307">உங்கள் கைரேகை சேர்க்கப்பட்டது</translation> @@ -5025,6 +5035,7 @@ <ph name="BEGIN_BOLD" />குறிப்பு:<ph name="END_BOLD" /> செயல்முறையின் போது சாதனம் மறுதொடக்கம் செய்யப்படும்.</translation> <translation id="7828731929332799387">இது மூன்றாம் தரப்பினரின் அனைத்துக் குக்கீகளையும் தளத் தரவையும் அழிக்கும். தொடர விரும்புகிறீர்களா?</translation> <translation id="7829298379596169484">ஆடியோ உள்ளீட்டை அணுகுகிறது</translation> +<translation id="7829877209233347340">பள்ளிக் கணக்கைச் சேர்ப்பதற்கான அனுமதி வழங்க பெற்றோரை உள்நுழையச் சொல்லவும்</translation> <translation id="7830594666202422257">Linuxஸுடன் இணைக்கவும்</translation> <translation id="7831491651892296503">நெட்வொர்க்கை உள்ளமைப்பதில் பிழை</translation> <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation> @@ -5347,6 +5358,7 @@ <translation id="8249672078237421304">நான் படிக்கும் மொழியில் இல்லாத பக்கங்களை மொழிபெயர்ப்பதற்கான விருப்பத்தை வழங்கு</translation> <translation id="8251441930213048644">இப்போது ரெஃப்ரெஷ் செய்</translation> <translation id="8251578425305135684">சிறு படம் நீக்கப்பட்டது.</translation> +<translation id="825238165904109940">முழு URLகளை எப்போதும் காட்டு</translation> <translation id="8252569384384439529">பதிவேற்றுகிறது...</translation> <translation id="8253198102038551905">நெட்வொர்க் பண்புகளைப் பெற '+'ஐக் கிளிக் செய்யவும்</translation> <translation id="8254954272268479918">Linuxஸை (பீட்டா) நிறுத்து</translation> @@ -5770,6 +5782,7 @@ <translation id="8808686172382650546">பூனை</translation> <translation id="8808744862003883508">இந்தப் பக்கத்தில் Chromeமில் நிறுவப்பட்டுள்ள நீட்டிப்புகள் அனைத்தையும் பார்க்கலாம்.</translation> <translation id="8809147117840417135">வெளிர் பசும் நீலம்</translation> +<translation id="8812593354822910461">உலாவிய தரவையும் (<ph name="URL" />) அழி. இது உங்களை <ph name="DOMAIN" /> கணக்கில் இருந்து வெளியேற்றும். <ph name="LEARN_MORE" /></translation> <translation id="8813698869395535039"><ph name="USERNAME" /> இல் உள்நுழைய முடியவில்லை</translation> <translation id="8813811964357448561">தாளின் ஒரு பக்கம்</translation> <translation id="8813872945700551674">"<ph name="EXTENSION_NAME" />" நீட்டிப்பிற்கு பெற்றோரிடம் அனுமதி வாங்குங்கள்</translation> @@ -6059,6 +6072,7 @@ <translation id="9203398526606335860">&சுயவிவரமாக்கம் இயக்கப்பட்டது</translation> <translation id="9203904171912129171">சாதனத்தைத் தேர்ந்தெடுக்கவும்</translation> <translation id="9203962528777363226">இந்தச் சாதனத்தில் புதியவர்கள் சேர்க்கப்படுவதை இதன் நிர்வாகி முடக்கியுள்ளார்</translation> +<translation id="9209689095351280025">உங்கள் இணைய நடவடிக்கைகளைக் கண்காணிக்கும் குக்கீகளைத் தளங்களால் பயன்படுத்த முடியாது</translation> <translation id="9211177926627870898">புதுப்பிப்பு தேவை</translation> <translation id="9214520840402538427">அச்சச்சோ! நிறுவல் நேர பண்புக்கூறுகளின் தொடக்க நேரம் முடிந்தது. உங்கள் ஆதரவு பிரதிநிதியைத் தொடர்புகொள்ளவும்.</translation> <translation id="9214695392875603905">கப்கேக்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 175c4a4..c70bb65 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1871,7 +1871,7 @@ <translation id="3492788708641132712">సమకాలీకరణ పని చేయడం లేదు. మళ్లీ సైన్ ఇన్ చేేయడానికి ప్రయత్నించండి.</translation> <translation id="3493486281776271508">ఇంటర్నెట్ కనెక్షన్ అవసరం</translation> <translation id="3493881266323043047">చెల్లుబాటు</translation> -<translation id="3494155060718700400">ప్రమాదకరమైన వెబ్సైట్లు, డౌన్లోడ్లు, ఎక్స్టెన్షన్ల నుండి మిమ్మల్ని రక్షించదు (సిఫార్సు చేయడం లేదు). Gmail, Search వంటి ఇతర Google సర్వీస్లలో, అందుబాటులో ఉన్న చోట, మీరు ఇప్పటికీ సురక్షిత బ్రౌజింగ్ రక్షణను పొందుతారు.</translation> +<translation id="3494155060718700400">ప్రమాదకరమైన వెబ్సైట్లు, డౌన్లోడ్లు, ఎక్స్టెన్షన్ల నుండి మిమ్మల్ని రక్షించదు (సిఫార్సు చేయడం లేదు). Gmail, Search వంటి ఇతర Google సర్వీస్లలో, సురక్షిత బ్రౌజింగ్ అందుబాటులో ఉన్న చోట మీరు ఇప్పటికీ రక్షణను పొందుతారు.</translation> <translation id="3494769164076977169">సైట్ మొదటి ఫైల్ తర్వాత ఆటోమేటిక్గా ఫైల్లను డౌన్లోడ్ చేయడానికి ప్రయత్నించేటప్పుడు అడగాలి (సిఫార్సు చేయబడింది)</translation> <translation id="3495660573538963482">Google సహాయకం సెట్టింగ్లు</translation> <translation id="3496213124478423963">దూరంగా జూమ్ చెయ్యి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 992a3fa..6075ac9 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">เปิดใน<ph name="APP" /></translation> <translation id="2120297377148151361">กิจกรรมและการโต้ตอบ</translation> <translation id="2120639962942052471">บล็อกการเข้าถึง<ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{บล็อกคุกกี้อยู่}=1{บล็อกคุกกี้อยู่ ยกเว้น 1 รายการ}other{บล็อกคุกกี้อยู่ ยกเว้น {COUNT} รายการ}}</translation> <translation id="2121825465123208577">ปรับขนาด</translation> <translation id="2122305276694332719">การเชื่อมต่อเครือข่ายที่ซ่อนอยู่โดยอัตโนมัติจะทำให้คนอื่นๆ เห็นอุปกรณ์ของคุณและการตั้งค่าเครือข่ายบางอย่าง เราไม่แนะนำให้เชื่อมต่อ</translation> <translation id="2123766928840368256">เลือกไฟล์อื่น</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 96a508f7..b01307f 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -826,6 +826,7 @@ <translation id="2119349053129246860">Відкрити в додатку <ph name="APP" /></translation> <translation id="2120297377148151361">Активність і взаємодії</translation> <translation id="2120639962942052471">Заблоковано: <ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Файли cookie блокуються.}=1{Файли cookie блокуються, 1 виняток}one{Файли cookie блокуються, {COUNT} виняток}few{Файли cookie блокуються, {COUNT} винятки}many{Файли cookie блокуються, {COUNT} винятків}other{Файли cookie блокуються, {COUNT} винятку}}</translation> <translation id="2121825465123208577">Змінити розмір</translation> <translation id="2122305276694332719">Автоматичне підключення до прихованої мережі дозволяє іншим користувачам бачити ваш пристрій і певні мережеві налаштування. Не рекомендується.</translation> <translation id="2123766928840368256">Вибрати інший файл</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index a57cab0d..9786c00 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -824,6 +824,7 @@ <translation id="2119349053129246860"><ph name="APP" /> orqali ochish</translation> <translation id="2120297377148151361">Brauzerdagi amallar</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> ruxsati olib tashlandi</translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Cookie fayllari bloklandi}=1{Cookie fayllari bloklandi, 1 ta istisno}other{Cookie fayllari bloklandi, {COUNT} ta istisno}}</translation> <translation id="2121825465123208577">O‘lchamini o‘zgartirish</translation> <translation id="2122305276694332719">Yashirin tarmoqlarga avtomatik ulanish tavsiya etilmaydi, chunki qurilmangiz va tarmoq sozlamalaringiz boshqalarga koʻrinishi mumkin.</translation> <translation id="2123766928840368256">Boshqa faylni tanlang</translation> @@ -2465,7 +2466,7 @@ <translation id="425573743389990240">Batareya quvvatsizlantirish tezligi Vattda (quvvatlanayotganda qiymati teskari ko‘rsatiladi)</translation> <translation id="4256316378292851214">Videoni saqlab &olish...</translation> <translation id="4258348331913189841">Fayl tizimlari</translation> -<translation id="4260182282978351200"><ph name="FILE_NAME" /> fayli xavfli boʻlishi mumkin. Tekshirish uchun Google kengaytirilgan himoya tizimiga yuborilsinmi? Yuklanmalar paneliga qaytish uchun Shift+F6 tugmalarini bosing.</translation> +<translation id="4260182282978351200"><ph name="FILE_NAME" /> fayli xavfli boʻlishi mumkin. Tekshirish uchun Google Kuchaytirilgan himoya xizmatiga yuborilsinmi? Yuklanmalar paneliga qaytish uchun Shift+F6 tugmalarini bosing.</translation> <translation id="4263223596040212967">Klaviatura tartibini tekshiring va qaytadan urining.</translation> <translation id="4263757076580287579">Printerni ro‘yxatdan o‘tkazish bekor qilindi.</translation> <translation id="426564820080660648">Mavjud yangilanishlarni tekshirish uchun Ethernet, Wi-Fi yoki mobil internet orqali ulaning.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index d71709b..8a80a54 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -5898,7 +5898,7 @@ <translation id="8895454554629927345">Danh sách dấu trang</translation> <translation id="8896022254727357590">Mã PIN phải có ít nhất 4 ký tự</translation> <translation id="8898786835233784856">Chọn Tab Tiếp theo</translation> -<translation id="8898822736010347272">Gửi URL của một số trang bạn truy cập, số ít thông tin về hệ thống và một số nội dung trang cho Google, nhằm phát hiện các mối đe dọa mới và bảo vệ mọi người khi dùng web.</translation> +<translation id="8898822736010347272">Gửi URL của một số trang bạn truy cập, thông tin về hệ thống (có giới hạn) và một số nội dung trang cho Google, nhằm phát hiện các mối đe dọa mới và bảo vệ mọi người khi dùng web.</translation> <translation id="8898840733695078011">Cường độ tín hiệu</translation> <translation id="8899851313684471736">Mở liên kết bằng cửa sổ &mới</translation> <translation id="8902667442496790482">Mở mục cài đặt chọn để nói</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index c0cd74c..33290645 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -799,7 +799,7 @@ <translation id="2082187087049518845">为标签页建组</translation> <translation id="2087822576218954668">打印:<ph name="PRINT_NAME" /></translation> <translation id="2088690981887365033">VPN 网络</translation> -<translation id="208928984520943006">要转到主屏幕时,可以从屏幕底部向上滑动。</translation> +<translation id="208928984520943006">从屏幕底部向上滑动即可随时回到主屏幕。</translation> <translation id="2089566709556890888">使用 Google Chrome 进行安全浏览</translation> <translation id="2089795179672254991">当网站想查看复制到剪贴板的文字和图片时询问您(推荐)</translation> <translation id="2090165459409185032">要恢复您的帐号信息,请访问 google.com/accounts/recovery</translation> @@ -1806,7 +1806,7 @@ <translation id="3424969259347320884">请说明此标签页崩溃时您在做什么</translation> <translation id="3427092606871434483">允许(默认)</translation> <translation id="3428419049384081277">您已登录!</translation> -<translation id="3428747202529429621">登录后,可保护您在 Chrome 中免受安全威胁的侵害,并可提高您在其他 Google 应用中的安全性</translation> +<translation id="3428747202529429621">保护您在 Chrome 中免受安全威胁,登录状态下还可让您更安全地使用其他 Google 应用</translation> <translation id="3429275422858276529">为此网页添加书签,以便日后查找</translation> <translation id="3432227430032737297">移除显示的所有 Cookie</translation> <translation id="3432757130254800023">向本地网络上的显示屏发送音频和视频</translation> @@ -1866,7 +1866,7 @@ <translation id="3492788708641132712">无法同步。请尝试重新登录。</translation> <translation id="3493486281776271508">需要互联网连接</translation> <translation id="3493881266323043047">有效期</translation> -<translation id="3494155060718700400">不保护您免受危险网站、下载内容和扩展程序的侵害(不推荐)。您仍能在 Gmail 和 Google 搜索等其他 Google 服务中获得安全浏览保护(若有)。</translation> +<translation id="3494155060718700400">不保护您免受危险网站、下载内容和扩展程序的侵害(不推荐)。在 Gmail 和 Google 搜索等其他 Google 服务中,若安全浏览保护可用,您仍将获得该保护。</translation> <translation id="3494769164076977169">当网站下载第一个文件后要自动下载更多文件时询问您(推荐)</translation> <translation id="3495660573538963482">Google 助理设置</translation> <translation id="3496213124478423963">缩小</translation> @@ -6136,7 +6136,7 @@ <translation id="957960681186851048">此网站试图自动下载多个文件</translation> <translation id="9580706199804957">无法连接到 Google 服务</translation> <translation id="960719561871045870">运营商代码</translation> -<translation id="96080156868846968">正被扫描</translation> +<translation id="96080156868846968">正在扫描</translation> <translation id="960987915827980018">约剩 1 小时</translation> <translation id="962802172452141067">书签文件夹树</translation> <translation id="964057662886721376">某些扩展程序可能会拖慢 Chrome 的运行速度 - 尤其是您原本没打算安装的那些扩展程序。</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 576d517..c8c68d4 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1932,7 +1932,7 @@ <translation id="3578594933904494462">正在分享這個分頁的內容。</translation> <translation id="357886715122934472"><strong><ph name="SENDER" /></strong> 想與您的群組 (<ph name="GROUP_NAME" />) 共用打印機 <strong><ph name="PRINTER_NAME" /></strong>。如果您接受,所有群組成員即可使用這部打印機列印。</translation> <translation id="357889014807611375">按用量收費的 Wi-Fi</translation> -<translation id="3582057310199111521">已在欺詐網站上輸入,並發生資料外洩事件</translation> +<translation id="3582057310199111521">曾在欺詐網站上輸入,並於資料外洩事件中發現</translation> <translation id="3584169441612580296">讀取及變更您電腦中的相片、音樂及其他媒體</translation> <translation id="3586806079541226322">無法開啟此檔案</translation> <translation id="3586931643579894722">隱藏詳情</translation> @@ -3057,7 +3057,7 @@ <translation id="5117930984404104619">監控其他擴充功能的行為 (包括瀏覽過的網址)</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">您的硬碟已滿。請儲存至其他位置或在硬碟上騰出更多空間。</translation> -<translation id="5122384452788334261">裝置的儲存空間即將用完。使用 Plugin VM 至少需要 <ph name="RECOMMENDED_SPACE" /> 的可用空間。如要釋出空間,請刪除裝置儲存空間內的檔案。</translation> +<translation id="5122384452788334261">裝置的儲存空間即將用完。Plugin VM 需要至少 <ph name="RECOMMENDED_SPACE" /> 的可用空間。如要釋出空間,請刪除裝置儲存空間內的檔案。</translation> <translation id="5123433949759960244">籃球</translation> <translation id="5125751979347152379">網址無效。</translation> <translation id="5126611267288187364">查看變更</translation> @@ -5298,7 +5298,7 @@ <translation id="8118488170956489476">您的<ph name="BEGIN_LINK" />瀏覽器由您的組織管理<ph name="END_LINK" /></translation> <translation id="8118860139461251237">管理下載內容</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />、<ph name="RECENT_PERMISSIONS_CHANGE_1" />、<ph name="RECENT_PERMISSIONS_CHANGE_2" />等權限</translation> -<translation id="8120715633374652536">裝置的儲存空間即將用完。使用 Plugin VM 至少需要 <ph name="MINIMUM_SPACE" /> 的可用空間,並建議保留 <ph name="RECOMMENDED_SPACE" /> 的可用空間。如要釋出空間,請刪除裝置儲存空間內的檔案。</translation> +<translation id="8120715633374652536">裝置的儲存空間即將用完。Plugin VM 需要至少 <ph name="MINIMUM_SPACE" /> 的可用空間,因此建議保留 <ph name="RECOMMENDED_SPACE" /> 以上的可用空間。如要釋出空間,請刪除裝置儲存空間內的檔案。</translation> <translation id="8123590694679414600">系統已於 <ph name="TIME" />使用您的同步密碼短語加密資料。Google Pay 的付款方法和地址不會包括在內。</translation> <translation id="81238879832906896">黃色和白色的花</translation> <translation id="8124313775439841391">管理 ONC</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index f820a72c..f86acd8 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -991,7 +991,7 @@ <translation id="2326931316514688470">重新載入應用程式(&R)</translation> <translation id="2327492829706409234">啟用應用程式</translation> <translation id="2329597144923131178">登入後,即可從您使用的任何裝置取得自己的書籤、歷史記錄、密碼和其他設定。</translation> -<translation id="2330607597130465898">沒有任何防護</translation> +<translation id="2330607597130465898">無防護</translation> <translation id="2332131598580221120">前往商店查看</translation> <translation id="2332192922827071008">開啟偏好設定</translation> <translation id="2332742915001411729">重設為預設值</translation> @@ -1809,7 +1809,7 @@ <translation id="3424969259347320884">說明分頁當掉時你正在執行的動作</translation> <translation id="3427092606871434483">允許 (預設)</translation> <translation id="3428419049384081277">你已登入帳戶!</translation> -<translation id="3428747202529429621">可在你保持登入的狀態下,保護 Chrome 的資料安全,可能也會用來提升其他 Google 應用程式的安全性</translation> +<translation id="3428747202529429621">在已登入帳戶的狀態下,能確保你持續享有安全無虞的 Chrome 使用體驗,也有助於提升其他 Google 應用程式的安全機制</translation> <translation id="3429275422858276529">將這個網頁加入書籤,方便日後查看</translation> <translation id="3432227430032737297">將顯示的項目全部移除</translation> <translation id="3432757130254800023">傳送要在區域網路顯示的影音內容</translation> @@ -1860,6 +1860,7 @@ <translation id="3479552764303398839">現在不要</translation> <translation id="3479685872808224578">偵測不到列印伺服器。請檢查位址是否正確,然後再試一次。</translation> <translation id="3481268647794498892">將於 <ph name="COUNTDOWN_SECONDS" /> 秒後在 <ph name="ALTERNATIVE_BROWSER_NAME" /> 中開啟</translation> +<translation id="3482719661246593752"><ph name="ORIGIN" /> 可以檢視下列檔案</translation> <translation id="3484273680291419129">正在移除有害軟體...</translation> <translation id="3484869148456018791">取得新憑證</translation> <translation id="3487007233252413104">匿名函式</translation> @@ -1869,7 +1870,7 @@ <translation id="3492788708641132712">同步功能無法正常運作,請嘗試重新登入。</translation> <translation id="3493486281776271508">需要網際網路連線</translation> <translation id="3493881266323043047">有效性</translation> -<translation id="3494155060718700400">無法防範不安全的網站、下載內容和擴充功能 (不建議)。你仍會在 Gmail 和 Google 搜尋等其他 Google 服務中取得安全瀏覽防護 (如適用)。</translation> +<translation id="3494155060718700400">無法防範不安全的網站、下載內容和擴充功能 (不建議)。在 Gmail 和 Google 搜尋等其他 Google 服務中,你仍可獲得安全瀏覽的防護 (如適用)。</translation> <translation id="3494769164076977169">在網站已下載第一個檔案,並且嘗試自動下載更多檔案時先通知你 (建議使用)</translation> <translation id="3495660573538963482">Google 助理設定</translation> <translation id="3496213124478423963">縮小</translation> @@ -1922,6 +1923,7 @@ <translation id="3564848315152754834">USB 安全金鑰</translation> <translation id="3566721612727112615">未新增任何網站</translation> <translation id="3569382839528428029">你想讓 <ph name="APP_NAME" /> 共用你的畫面嗎?</translation> +<translation id="3569682580018832495"><ph name="ORIGIN" /> 可以檢視下列檔案和資料夾</translation> <translation id="3571734092741541777">設定</translation> <translation id="3574210789297084292">登入</translation> <translation id="3574917942258583917">確定要結束無痕模式嗎?</translation> @@ -1931,6 +1933,7 @@ <translation id="3578594933904494462">正在分享這個分頁的內容。</translation> <translation id="357886715122934472"><strong><ph name="SENDER" /></strong> 想要與你的群組 (<ph name="GROUP_NAME" />) 共用印表機 <strong><ph name="PRINTER_NAME" /></strong>。你接受之後,所有群組成員即可使用這台印表機進行列印工作。</translation> <translation id="357889014807611375">計量付費的 Wi-Fi</translation> +<translation id="3582057310199111521">曾在詐騙網站上輸入,並發生資料侵害事件</translation> <translation id="3584169441612580296">讀取及變更你電腦中的相片、音樂及其他媒體</translation> <translation id="3586806079541226322">無法開啟這個檔案</translation> <translation id="3586931643579894722">隱藏詳細資訊</translation> @@ -2107,7 +2110,7 @@ <translation id="3784472333786002075">Cookie 是網站所建立的檔案,可分為兩種類型:第一方 Cookie 由你造訪過的網站所建立,也就是網址列所顯示的網站。第三方 Cookie 由其他網站所建立。這類網站通常是在你造訪的網站上提供部分內容 (例如廣告或圖片) 的其他網站。</translation> <translation id="3785308913036335955">顯示應用程式捷徑</translation> <translation id="3785727820640310185">已儲存這個網站的密碼</translation> -<translation id="3788301286821743879">系統無法啟動 Kiosk 應用程式。</translation> +<translation id="3788301286821743879">無法啟動資訊站應用程式。</translation> <translation id="3788401245189148511">要求下列權限:</translation> <translation id="3789841737615482174">安裝</translation> <translation id="379082410132524484">你的卡片已過期</translation> @@ -3054,6 +3057,7 @@ <translation id="5117930984404104619">監控其他擴充功能的行為 (包括造訪過的網址)。</translation> <translation id="5119173345047096771">Mozilla Firefox</translation> <translation id="5121130586824819730">你的硬碟已滿。請選擇其他儲存位置,或清出足夠的硬碟空間。</translation> +<translation id="5122384452788334261">你的裝置儲存空間不足。如要使用 Plugin VM,建議你至少保留 <ph name="RECOMMENDED_SPACE" /> 的可用空間。如要釋出空間,請刪除裝置儲存空間中的檔案。</translation> <translation id="5123433949759960244">籃球</translation> <translation id="5125751979347152379">網址無效。</translation> <translation id="5126611267288187364">查看變更</translation> @@ -4935,7 +4939,7 @@ <translation id="7690294790491645610">確認新密碼</translation> <translation id="7690378713476594306">從清單中選擇</translation> <translation id="7690853182226561458">新增資料夾(&F)...</translation> -<translation id="7691073721729883399">系統無法掛接 Kiosk 應用程式的 Cryptohome。</translation> +<translation id="7691073721729883399">系統無法掛接資訊站應用程式的 Cryptohome。</translation> <translation id="7691077781194517083">無法重設這個安全金鑰。錯誤代碼:<ph name="ERROR_CODE" />。</translation> <translation id="7696063401938172191">在你的「<ph name="PHONE_NAME" />」上:</translation> <translation id="7698408911093959127">{COUNT,plural, =1{書籤清單中有 1 個項目}other{書籤清單中有 # 個項目}}</translation> @@ -5133,6 +5137,7 @@ <translation id="7915471803647590281">請將發生的狀況告訴我們,然後再提供意見。</translation> <translation id="7918257978052780342">註冊</translation> <translation id="7919210519031517829"><ph name="DURATION" /> 秒</translation> +<translation id="7920363873148656176"><ph name="ORIGIN" /> 可以檢視「<ph name="FILENAME" />」</translation> <translation id="7924358170328001543">轉送通訊埠時發生錯誤</translation> <translation id="792514962475806987">停駐縮放比例:</translation> <translation id="7925247922861151263">AAA 檢查失敗</translation> @@ -5293,6 +5298,7 @@ <translation id="8118488170956489476">你的<ph name="BEGIN_LINK" />瀏覽器是由貴機構所管理<ph name="END_LINK" /></translation> <translation id="8118860139461251237">管理下載內容</translation> <translation id="811942868379260654"><ph name="RECENT_PERMISSIONS_CHANGE_SENTENCE_START" />、<ph name="RECENT_PERMISSIONS_CHANGE_1" />、<ph name="RECENT_PERMISSIONS_CHANGE_2" />等等</translation> +<translation id="8120715633374652536">你的裝置儲存空間不足。使用 Plugin VM 至少需要 <ph name="MINIMUM_SPACE" /> 的可用空間 (建議保留 <ph name="RECOMMENDED_SPACE" /> 以上的可用空間)。如要釋出空間,請刪除裝置儲存空間中的檔案。</translation> <translation id="8123590694679414600">系統已採用你在 <ph name="TIME" />設定的同步通關密語針對資料進行加密處理。加密的資料不包括 Google Pay 的付款方式和地址。</translation> <translation id="81238879832906896">黃色和白色花朵</translation> <translation id="8124313775439841391">管理化 ONC</translation> @@ -5889,7 +5895,7 @@ <translation id="8895454554629927345">書籤清單</translation> <translation id="8896022254727357590">PIN 碼至少要有 4 個字元</translation> <translation id="8898786835233784856">選取下一個分頁</translation> -<translation id="8898822736010347272">將部分已造訪網頁的網址、特定的系統資訊和部分網頁內容傳送至 Google,協助發現新威脅並為所有網路使用者提供防護。</translation> +<translation id="8898822736010347272">將部分已造訪網頁的網址、特定的系統資訊和部分網頁內容傳送至 Google,以協助發現新威脅並保障所有網路使用者的安全。</translation> <translation id="8898840733695078011">訊號強度</translation> <translation id="8899851313684471736">在新視窗中開啟連結(&W)</translation> <translation id="8902667442496790482">開啟隨選朗讀設定</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index f9cfcc0..2ee63c0 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -824,6 +824,7 @@ <translation id="2119349053129246860">Vula ku-<ph name="APP" /></translation> <translation id="2120297377148151361">Umsebenzi nokuhlanganyela</translation> <translation id="2120639962942052471">Kuvinjelwe i-<ph name="PERMISSION" /></translation> +<translation id="2121055421682309734">{COUNT,plural, =0{Amakhukhi avinjelwe}=1{Amakhukhi avinjelwe, 1 okuhlukile}one{Amakhukhi avinjelwe, {COUNT} okuhlukile}other{Amakhukhi avinjelwe, {COUNT} okuhlukile}}</translation> <translation id="2121825465123208577">Shintsha usayizi</translation> <translation id="2122305276694332719">Ukuxhumeka ngokuzenzakalela kunethiwekhi efihliwe kuvumela abanye ukuthi babone idivayisi yakho nezinye izilungiselelo zenethiwekhi futhi akunconyiwe.</translation> <translation id="2123766928840368256">Khetha ifayela elihlukile</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb index 11fd1a9..430bce2 100644 --- a/chrome/app/resources/google_chrome_strings_af.xtb +++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome het nie opgedateer nie; iets het skeefgeloop. <ph name="BEGIN_LINK" />Stel Chrome-opdateringprobleme en mislukte opdaterings reg.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Netwerkaanmelding – Chrome</translation> <translation id="3037838751736561277">Google Chrome is in agtergrondmodus.</translation> +<translation id="3059710691562604940">Veiligblaai is afgeskakel. Chrome beveel aan dat jy dit aanskakel.</translation> <translation id="3065168410429928842">Chrome-oortjie</translation> <translation id="3080151273017101988">Hou aan om agtergrondprogramme te laat loop wanneer Google Chrome toe is</translation> <translation id="3089968997497233615">Daar is 'n nuwe, veiliger weergawe van Google Chrome beskikbaar.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb index 41003e0..c87ff76 100644 --- a/chrome/app/resources/google_chrome_strings_as.xtb +++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome আপডে'ট হোৱা নাই, কিবা ভুল হৈছে। <ph name="BEGIN_LINK" />Chromeৰ আপডে'ট সম্পর্কীয় সমস্যাবোৰ আৰু বিফল হোৱা আপডে'টসমূহ সমাধান কৰক।<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - নেটৱর্কত ছাইন ইন - Chrome</translation> <translation id="3037838751736561277">Google Chrome নেপথ্যৰ ম’ডত আছে।</translation> +<translation id="3059710691562604940">সুৰক্ষিত ব্ৰাউজিং অফ আছে। Chromeএ ইয়াক অন কৰাটো চুপাৰিছ কৰে।</translation> <translation id="3065168410429928842">Chrome টেব</translation> <translation id="3080151273017101988">Google Chrome বন্ধ কৰাৰ পিছতো নেপথ্যত এপ্সমূহ চলি থাকিবলৈ দিয়ক</translation> <translation id="3089968997497233615">Google Chromeৰ এটি নতুন, অধিক সুৰক্ষিত সংস্কৰণ উপলব্ধ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index 5943d053..f2cbf44 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -71,6 +71,7 @@ <translation id="2929907241665500097">Chrome не се актуализира, защото нещо се обърка. <ph name="BEGIN_LINK" />Отстранете проблеми с актуализирането на Chrome и неуспешни актуализации<ph name="END_LINK" />.</translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Вход в мрежата – Chrome</translation> <translation id="3037838751736561277">Google Chrome работи на заден план.</translation> +<translation id="3059710691562604940">Функцията „Безопасно сърфиране“ е изключена. Chrome препоръчва да я включите.</translation> <translation id="3065168410429928842">Раздел в Chrome</translation> <translation id="3080151273017101988">Изпълняване на приложения на заден план при затворен браузър Google Chrome</translation> <translation id="3089968997497233615">Налице е нова, по-сигурна версия на Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index 80caff5..04aaaf0d 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Ažuriranje Chromea nije uspjelo. Nešto nije uredu. <ph name="BEGIN_LINK" />Ispravite probleme s ažuriranjem Chromea i neuspjela ažuriranja.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – prijava na mrežu – Chrome</translation> <translation id="3037838751736561277">Google Chrome radi u pozadinskom načinu rada.</translation> +<translation id="3059710691562604940">Sigurno pregledanje je isključeno. Chrome preporučuje da ga uključite.</translation> <translation id="3065168410429928842">Chromeova kartica</translation> <translation id="3080151273017101988">Ostavi aplikacije da rade u pozadini kada se Google Chrome zatvori</translation> <translation id="3089968997497233615">Dostupna je nova, sigurnija verzija Google Chromea.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 10297f0..653319f 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -69,6 +69,7 @@ <translation id="2929907241665500097">No s'ha actualitzat Chrome. S'ha produït un error. <ph name="BEGIN_LINK" />Soluciona els problemes i errors d'actualització de Chrome<ph name="END_LINK" />.</translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Inici de sessió a la xarxa - Chrome</translation> <translation id="3037838751736561277">Google Chrome està en mode de segon pla.</translation> +<translation id="3059710691562604940">Navegació segura està desactivada. Chrome recomana activar-la.</translation> <translation id="3065168410429928842">Pestanya de Chrome</translation> <translation id="3080151273017101988">Continua executant aplicacions de segon pla en tancar Google Chrome</translation> <translation id="3089968997497233615">Hi ha disponible una nova versió més segura de Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 8b1233f7..8123cb0 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -70,6 +70,7 @@ <translation id="2929907241665500097">Chrome blev ikke opdateret, da der opstod en fejl. <ph name="BEGIN_LINK" />Løs problemer med opdatering af Chrome og mislykkede opdateringer.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Login på netværk – Chrome</translation> <translation id="3037838751736561277">Google Chrome kører i baggrunden.</translation> +<translation id="3059710691562604940">Beskyttet browsing er deaktiveret. Chrome anbefaler, at du aktiverer funktionen.</translation> <translation id="3065168410429928842">Fanen Chrome</translation> <translation id="3080151273017101988">Fortsæt med at køre baggrundsapps, når Google Chrome er lukket</translation> <translation id="3089968997497233615">Der findes en ny, sikker version af Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index fe1cfb36..1a453902 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -72,6 +72,7 @@ <translation id="2929907241665500097">Δεν έγινε ενημέρωση του Chrome, παρουσιάστηκε κάποιο σφάλμα. <ph name="BEGIN_LINK" />Επιδιορθώστε τα προβλήματα ενημέρωσης και αποτυχημένων ενημερώσεων του Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Σύνδεση δικτύου - Chrome</translation> <translation id="3037838751736561277">Το Google Chrome εκτελείται στο παρασκήνιο.</translation> +<translation id="3059710691562604940">Η Ασφαλής περιήγηση είναι απενεργοποιημένη. Το Chrome συνιστά να την ενεργοποιήσετε.</translation> <translation id="3065168410429928842">Καρτέλα Chrome</translation> <translation id="3080151273017101988">Να συνεχίζεται η εκτέλεση εφαρμογών παρασκηνίου όταν το Google Chrome είναι κλειστό</translation> <translation id="3089968997497233615">Υπάρχει μια νέα, ασφαλέστερη έκδοση του Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index b767c06..ece1c248 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome didn't update. Something went wrong. <ph name="BEGIN_LINK" />Fix Chrome update problems and failed updates.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Network sign-in – Chrome</translation> <translation id="3037838751736561277">Google Chrome is in background mode.</translation> +<translation id="3059710691562604940">Safe Browsing is off. Chrome recommends turning it on.</translation> <translation id="3065168410429928842">Chrome Tab</translation> <translation id="3080151273017101988">Continue running background apps when Google Chrome is closed</translation> <translation id="3089968997497233615">There's a new, safer version of Google Chrome available.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index 8a4e0a6..2e9f2be 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -70,6 +70,7 @@ <translation id="2929907241665500097">Chrome se nije ažurirao zbog pogreške. <ph name="BEGIN_LINK" />Riješite probleme s ažuriranjem i neuspjela ažuriranja Chromea.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Prijava na mrežu – Chrome</translation> <translation id="3037838751736561277">Google Chrome radi u pozadini.</translation> +<translation id="3059710691562604940">Sigurno pregledavanje je isključeno. Chrome preporučuje da ga uključite.</translation> <translation id="3065168410429928842">Chromeova kartica</translation> <translation id="3080151273017101988">Nastavi prikazivati pozadinske aplikacije po zatvaranju preglednika Google Chrome</translation> <translation id="3089968997497233615">Dostupna je nova, sigurnija verzija preglednika Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index 9ad6cbc..46ee987 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -69,6 +69,7 @@ <translation id="2929907241665500097">Ismeretlen hiba történt, ezért a Chrome nem frissült. <ph name="BEGIN_LINK" />A Chrome frissítési problémáinak megoldása.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Hálózati bejelentkezés – Chrome</translation> <translation id="3037838751736561277">A Google Chrome háttérmódban van.</translation> +<translation id="3059710691562604940">A Biztonságos Böngészés ki van kapcsolva. A Chrome a szolgáltatás bekapcsolását javasolja.</translation> <translation id="3065168410429928842">Chrome-lap</translation> <translation id="3080151273017101988">A háttéralkalmazások továbbfuttatása, ha a Google Chrome-ot bezárják</translation> <translation id="3089968997497233615">Elérhető a Google Chrome új, biztonságosabb verziója.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb index 1dc50be..dc12d1f9 100644 --- a/chrome/app/resources/google_chrome_strings_hy.xtb +++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -72,6 +72,7 @@ <translation id="2929907241665500097">Անհայտ սխալի պատճառով չհաջողվեց թարմացնել Chrome-ը։ <ph name="BEGIN_LINK" />Շտկել Chrome-ի թարմացման հետ կապված խնդիրները<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" />– Ցանցի մուտք – Chrome</translation> <translation id="3037838751736561277">Google Chrome-ն աշխատում է ֆոնային ռեժիմում:</translation> +<translation id="3059710691562604940">Անվտանգ դիտարկումն անջատված է։ Chrome-ը խորհուրդ է տալիս միացնել այն։</translation> <translation id="3065168410429928842">Chrome-ի ներդիր</translation> <translation id="3080151273017101988">Google Chrome-ը փակելուց հետո շարունակել հավելվածների աշխատանքը հետնաշերտում</translation> <translation id="3089968997497233615">Մատչելի է Google Chrome-ի նոր, ավելի ապահով տարբերակը:</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb index 8e13608..3524cd481 100644 --- a/chrome/app/resources/google_chrome_strings_is.xtb +++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome uppfærðist ekki, eitthvað fór úrskeiðis. <ph name="BEGIN_LINK" />Lagaðu uppfærsluvandamál Chrome og uppfærslur sem mistókust.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – innskráning á net – Chrome</translation> <translation id="3037838751736561277">Google Chrome er í bakgrunnsstillingu.</translation> +<translation id="3059710691562604940">Slökkt er á öruggri vefskoðun. Chrome mælir með því að kveikt sé á henni.</translation> <translation id="3065168410429928842">Chrome flipi</translation> <translation id="3080151273017101988">Halda áfram að keyra forrit í bakgrunni þegar Google Chrome er lokað</translation> <translation id="3089968997497233615">Ný og öruggari útgáfa af Google Chrome er í boði.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index 855e4dd9..f355cba5 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -69,6 +69,7 @@ <translation id="2929907241665500097">Si è verificato un errore: Chrome non si è aggiornato. <ph name="BEGIN_LINK" />Risolvi i problemi di aggiornamento e gli aggiornamenti non riusciti di Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Accesso rete - Chrome</translation> <translation id="3037838751736561277">Google Chrome è in modalità background.</translation> +<translation id="3059710691562604940">Navigazione sicura è disattivata. Chrome consiglia di attivarla.</translation> <translation id="3065168410429928842">Scheda Chrome</translation> <translation id="3080151273017101988">Continua a eseguire applicazioni in background dopo la chiusura di Google Chrome</translation> <translation id="3089968997497233615">È disponibile una nuova versione più sicura di Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index 69938c8..e32469f 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -70,6 +70,7 @@ <translation id="2929907241665500097">Chrome לא התעדכן, משהו השתבש. <ph name="BEGIN_LINK" />לטיפול בבעיות בעדכון של Chrome ובעדכונים שנכשלו<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – כניסה לרשת – Chrome</translation> <translation id="3037838751736561277">Google Chrome נמצא במצב רקע.</translation> +<translation id="3059710691562604940">הגלישה הבטוחה כבויה. ההמלצה של Chrome היא להפעיל אותה.</translation> <translation id="3065168410429928842">כרטיסייה של Chrome</translation> <translation id="3080151273017101988">המשך הפעלת אפליקציות ברקע כאשר Google Chrome סגור</translation> <translation id="3089968997497233615">גרסה חדשה ובטוחה יותר של Google Chrome זמינה כעת</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb index 111f32e..0fde3d4 100644 --- a/chrome/app/resources/google_chrome_strings_ka.xtb +++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -73,6 +73,7 @@ <translation id="2929907241665500097">Chrome-ის განახლება ვერ მოხერხდა შეფერხების გამო. <ph name="BEGIN_LINK" />შეასწორეთ Chrome-ის განახლებასთან დაკავშირებული პრობლემები და განუხორციელებელი განახლებები.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> — ქსელში შესვლა — Chrome</translation> <translation id="3037838751736561277">Google Chrome ფონურ რეჟიმშია.</translation> +<translation id="3059710691562604940">Safe Browsing გამორთულია. Chrome გირჩევთ მის ჩართვას.</translation> <translation id="3065168410429928842">Chrome-ის ჩანართი</translation> <translation id="3080151273017101988">გაგრძელება გაშვებული ფონური პროგრამებით Google Chrome-ის დახურვისას</translation> <translation id="3089968997497233615">ხელმისაწვდომია Google Chrome-ის უფრო ახალი და უსაფრთხო ვერსია.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 4aa6c2b..1e559f6c 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome ບໍ່ອັບເດດ, ມີບາງຢ່າງຜິດພາດ. <ph name="BEGIN_LINK" />ແກ້ໄຂບັນຫາການອັບເດດ Chrome ແລະ ການອັບເດດທີ່ບໍ່ສຳເລັດ.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - ການເຂົ້າສູ່ລະບົບເຄືອຂ່າຍ - Chrome</translation> <translation id="3037838751736561277">Google Chrome ຢູ່ໃນໂໝດພື້ນຫຼັງ.</translation> +<translation id="3059710691562604940">Safe Browsing ປິດຢູ່. Chrome ແນະນຳໃຫ້ເປີດມັນ.</translation> <translation id="3065168410429928842">ແຖບ Chrome</translation> <translation id="3080151273017101988">ສືບຕໍ່ແລ່ນແອັບພື້ນຫຼັງ ເມື່ອ Google Chrome ປິດ</translation> <translation id="3089968997497233615">ມີ Google Chrome ລຸ້ນໃໝ່ປອດໄພກ່ວາຢູ່.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index 3a220d3..851e85fc 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Nepavyko atnaujinti „Chrome“, įvyko klaida. <ph name="BEGIN_LINK" />Pašalinkite „Chrome“ naujinimo problemas ir naujinių klaidas.<ph name="END_LINK" /></translation> <translation id="2969728957078202736">„<ph name="PAGE_TITLE" />“ – prisijungimas prie tinklo – „Chrome“</translation> <translation id="3037838751736561277">„Google Chrome“ veikia fono režimu.</translation> +<translation id="3059710691562604940">Saugaus naršymo funkcija išjungta. „Chrome“ rekomenduoja ją įjungti.</translation> <translation id="3065168410429928842">„Chrome“ skirtukas</translation> <translation id="3080151273017101988">Uždarius „Google Chrome“ toliau leisti fono programas</translation> <translation id="3089968997497233615">Galima nauja, saugesnė „Google Chrome“ versija.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index 2d54be4..b47a1ae 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome не се ажурираше, нешто тргна наопаку. <ph name="BEGIN_LINK" />Поправете ги проблемите со ажурирањето на Chrome и со неуспешните ажурирања.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Мрежно најавување - Chrome</translation> <translation id="3037838751736561277">Google Chrome е во заднински режим.</translation> +<translation id="3059710691562604940">„Безбедното прелистување“ е исклучено. Chrome препорачува да го вклучите.</translation> <translation id="3065168410429928842">Картичка на Chrome</translation> <translation id="3080151273017101988">Продолжи со извршување апликации во заднина кога е затворен Google Chrome</translation> <translation id="3089968997497233615">Достапна е нова, побезбедна верзија на Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index d59bdaf4..9d5dd9b4 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -70,6 +70,7 @@ <translation id="2929907241665500097">Chrome tidak dikemas kini, kesilapan telah berlaku. <ph name="BEGIN_LINK" />Selesaikan masalah kemas kini dan kegagalan kemas kini Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Log Masuk Rangkaian - Chrome</translation> <translation id="3037838751736561277">Google Chrome dalam mod latar belakang.</translation> +<translation id="3059710691562604940">Penyemakan Imbas Selamat dimatikan. Chrome mengesyorkan agar ciri ini dihidupkan.</translation> <translation id="3065168410429928842">Tab Chrome</translation> <translation id="3080151273017101988">Terus menjalankan apl latar belakang apabila Google Chrome ditutup</translation> <translation id="3089968997497233615">Terdapat versi Google Chrome baharu yang lebih selamat tersedia.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index 19a50ba..eaa9a80 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome အပ်ဒိတ်လုပ်၍ မရပါ၊ တစ်ခုခု မှားသွားသည်။ <ph name="BEGIN_LINK" />Chrome အပ်ဒိတ်ပြဿနာများနှင့် လုပ်၍မရသော အပ်ဒိတ်များကို ပြင်ဆင်ပါ။<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - ကွန်ရက် လက်မှတ်ထိုးဝင်ခြင်း - Chrome</translation> <translation id="3037838751736561277">Google Chrome သည် နောက်ခံ မုဒ်ထဲမျာ ရှိနေသည်။</translation> +<translation id="3059710691562604940">'လုံခြုံစွာ ကြည့်ရှုခြင်း' ပိတ်ထားသည်။ ၎င်းကိုဖွင့်ရန် Chrome က အကြံပြုပါသည်။</translation> <translation id="3065168410429928842">Chrome တဘ်</translation> <translation id="3080151273017101988">Google Chrome ကို ပိတ်လိုက်ချိန်မှာ နောက်ခံအက်ပ်များကို ဆက်ဖွင့် ထားရန်</translation> <translation id="3089968997497233615">ပိုသစ်သော၊ ပိုလုံခြုံသော Google Chrome ရနိုင်ပါသည်။</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index 3e6636c..0fb2d71 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -73,6 +73,7 @@ <translation id="2929907241665500097">Chrome is niet geüpdatet. Er is een fout opgetreden. <ph name="BEGIN_LINK" />Updateproblemen en mislukte updates voor Chrome verhelpen<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Inloggen bij netwerk - Chrome</translation> <translation id="3037838751736561277">Google Chrome bevindt zich in de achtergrondmodus.</translation> +<translation id="3059710691562604940">Safe Browsing is uitgeschakeld. Chrome raadt je aan deze functie in te schakelen.</translation> <translation id="3065168410429928842">Chrome-tabblad</translation> <translation id="3080151273017101988">Achtergrondapps blijven uitvoeren wanneer Google Chrome is gesloten</translation> <translation id="3089968997497233615">Er is een nieuwere, veiligere versie van Google Chrome beschikbaar.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index 4e5f76b5..8122775d 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -69,6 +69,7 @@ <translation id="2929907241665500097">Coś poszło nie tak i nie udało się zaktualizować Chrome. <ph name="BEGIN_LINK" />Napraw nieudane aktualizacje Chrome i rozwiąż inne problemy z aktualizacjami<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – logowanie do sieci – Chrome</translation> <translation id="3037838751736561277">Google Chrome jest w trybie działania w tle</translation> +<translation id="3059710691562604940">Bezpieczne przeglądanie jest wyłączone. Chrome zaleca jego włączenie.</translation> <translation id="3065168410429928842">Karta Chrome</translation> <translation id="3080151273017101988">Kontynuuj działanie aplikacji w tle po zamknięciu przeglądarki Google Chrome</translation> <translation id="3089968997497233615">Dostępna jest nowa, bezpieczniejsza wersja przeglądarki Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb index 8bb74e7..e0dd2cf 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -69,6 +69,7 @@ <translation id="2929907241665500097">A atualização do Chrome não foi concluída. Algo deu errado. <ph name="BEGIN_LINK" />Corrija as atualizações com falhas e os problemas de atualização do Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Login na rede - Chrome</translation> <translation id="3037838751736561277">O Google Chrome está em modo de segundo plano.</translation> +<translation id="3059710691562604940">O "Navegação segura" está desativado. O Chrome recomenda ativá-lo.</translation> <translation id="3065168410429928842">Guia do Chrome</translation> <translation id="3080151273017101988">Executar aplicativos em segundo plano quando o Google Chrome estiver fechado</translation> <translation id="3089968997497233615">Há uma versão nova e mais segura do Google Chrome disponível.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index 0ba776b..176b11f1 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -70,6 +70,7 @@ <translation id="2929907241665500097">O Chrome não foi atualizado. Ocorreu um erro. <ph name="BEGIN_LINK" />Corrija problemas de atualização do Chrome e falhas nas atualizações<ph name="END_LINK" />.</translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Início de sessão na rede – Chrome</translation> <translation id="3037838751736561277">O Google Chrome está no modo em segundo plano.</translation> +<translation id="3059710691562604940">A Navegação segura está desativada. O Chrome recomenda que a ative.</translation> <translation id="3065168410429928842">Separador do Chrome</translation> <translation id="3080151273017101988">Continuar a executar aplicações em segundo plano quando o Google Chrome está fechado</translation> <translation id="3089968997497233615">Está disponível uma versão nova e mais segura do Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 9d557fa..5653f8c 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -70,6 +70,7 @@ <translation id="2929907241665500097">Chrome nu s-a actualizat. A apărut o eroare. <ph name="BEGIN_LINK" />Remediază problemele de actualizare și actualizările nereușite în Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – conectare la rețea – Chrome</translation> <translation id="3037838751736561277">Google Chrome este în modul fundal.</translation> +<translation id="3059710691562604940">Navigarea sigură este dezactivată. Chrome îți recomandă să o activezi.</translation> <translation id="3065168410429928842">Fila Chrome</translation> <translation id="3080151273017101988">Rulează în continuare aplicații în fundal când Google Chrome este închis</translation> <translation id="3089968997497233615">Google Chrome este disponibil într-o versiune nouă și mai sigură.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb index 29dd279..fa8dfa1 100644 --- a/chrome/app/resources/google_chrome_strings_si.xtb +++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome යාවත්කාලීන නොවිය, යම් දෙයක් වැරදිණි. <ph name="BEGIN_LINK" />Chrome යාවත්කාලීන ගැටලු සහ අසමත් වූ යාවත්කාලීන නිරාකරණ කරන්න.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - ජාල පුරනය - Chrome</translation> <translation id="3037838751736561277">Google Chrome පසුබිම් ප්රකාරය තුළ ඇත.</translation> +<translation id="3059710691562604940">සුරක්ෂිත පිරික්සුම ක්රියාවිරහිතයි. එය ක්රියාත්මක කිරීමට Chrome නිර්දේශ කරයි.</translation> <translation id="3065168410429928842">Chrome පටිත්ත</translation> <translation id="3080151273017101988">Google Chrome වසා ඇති විට පසුබිම් යෙදුම් ධාවනය අඛණ්ඩව කරන්න</translation> <translation id="3089968997497233615">Google Chrome හි නව, වඩා ආරක්ෂිත සංස්කරණයක් පවතී.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index 37d38da..31641f03 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome se ni posodobil, prišlo je do napake. <ph name="BEGIN_LINK" />Odpravite težave s posodobitvijo Chroma in neuspelimi posodobitvami Chroma.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Prijava v omrežje – Chrome</translation> <translation id="3037838751736561277">Google Chrome se izvaja v ozadju.</translation> +<translation id="3059710691562604940">Varno brskanje je izklopljeno. Chrome priporoča, da ga vklopite.</translation> <translation id="3065168410429928842">Zavihek v Chromu</translation> <translation id="3080151273017101988">Nadaljuj izvajanje programov v ozadju, ko je Google Chrome zaprt</translation> <translation id="3089968997497233615">Na voljo je nova, varnejša različica Google Chroma.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb index 1de2632..c6f12a3 100644 --- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb +++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome se nije ažurirao. Došlo je do greške. <ph name="BEGIN_LINK" />Otklonite probleme sa ažuriranjem Chrome-a i neuspela ažuriranja.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – prijavljivanje na mrežu – Chrome</translation> <translation id="3037838751736561277">Google Chrome je u pozadinskom režimu.</translation> +<translation id="3059710691562604940">Bezbedno pregledanje je isključeno. Chrome preporučuje da ga uključite.</translation> <translation id="3065168410429928842">Kartica Chrome</translation> <translation id="3080151273017101988">Nastavi sa pokretanjem aplikacija u pozadini kada se Google Chrome zatvori</translation> <translation id="3089968997497233615">Dostupna je nova, bezbednija verzija Google Chrome pregledača.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index 87bc742..5d56ee3c 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">Chrome се није ажурирао. Дошло је до грешке. <ph name="BEGIN_LINK" />Отклоните проблеме са ажурирањем Chrome-а и неуспела ажурирања.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – пријављивање на мрежу – Chrome</translation> <translation id="3037838751736561277">Google Chrome је у позадинском режиму.</translation> +<translation id="3059710691562604940">Безбедно прегледање је искључено. Chrome препоручује да га укључите.</translation> <translation id="3065168410429928842">Картица Chrome</translation> <translation id="3080151273017101988">Настави са покретањем апликација у позадини када се Google Chrome затвори</translation> <translation id="3089968997497233615">Доступна је нова, безбеднија верзија Google Chrome прегледача.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 5f5dc38..c17b83c 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -73,6 +73,7 @@ <translation id="2929907241665500097">Chrome haijasasishwa, hitilafu fulani imetokea. <ph name="BEGIN_LINK" />Rekebisha matatizo ya sasisho la Chrome na masasisho ambayo hayakuwekwa.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Kuingia katika Akaunti ya Mtandao - Chrome</translation> <translation id="3037838751736561277">Google Chrome iko katika hali ya chini chini.</translation> +<translation id="3059710691562604940">Kipengele cha Kuvinjari Salama kimezimwa. Chrome inapendekeza ukiwashe.</translation> <translation id="3065168410429928842">Kichupo cha Chrome</translation> <translation id="3080151273017101988">Endelea kuendesha programu zinazofanya kazi chini chini wakati Google Chrome imefungwa</translation> <translation id="3089968997497233615">Kuna toleo jipya na salama la Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index 5872c20..8d69ccba 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -69,6 +69,7 @@ <translation id="2929907241665500097">Chrome ไม่ได้อัปเดตเนื่องจากเกิดข้อผิดพลาด <ph name="BEGIN_LINK" />โปรดแก้ปัญหาการอัปเดต Chrome และการอัปเดตที่ไม่สำเร็จ<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - หน้าลงชื่อเข้าใช้ของเครือข่าย - Chrome</translation> <translation id="3037838751736561277">Google Chrome กำลังอยู่ในโหมดทำงานในพื้นหลัง</translation> +<translation id="3059710691562604940">Google Safe Browsing ปิดอยู่ Chrome ขอแนะนำให้เปิด</translation> <translation id="3065168410429928842">แท็บ Chrome</translation> <translation id="3080151273017101988">เรียกใช้แอปพลิเคชันเบื้องหลังต่อไปเมื่อ Google Chrome ถูกปิดลง</translation> <translation id="3089968997497233615">Google Chrome มีรุ่นใหม่ที่ปลอดภัยกว่าให้ใช้งานแล้ว</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index b0877b0..3869e45 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -70,6 +70,7 @@ <translation id="2929907241665500097">Не вдалось оновити веб-переглядач Chrome. <ph name="BEGIN_LINK" />Вирішіть проблеми з оновленням Chrome.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> – Вхід у мережу – Chrome</translation> <translation id="3037838751736561277">Google Chrome у фоновому режимі.</translation> +<translation id="3059710691562604940">Безпечний перегляд вимкнено. Chrome радить увімкнути його.</translation> <translation id="3065168410429928842">Chrome</translation> <translation id="3080151273017101988">Продовжувати роботу фонових програм, коли Google Chrome закрито</translation> <translation id="3089968997497233615">Доступна нова, безпечніша версія Google Chrome.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb index 1d4b05d..ed6de15 100644 --- a/chrome/app/resources/google_chrome_strings_uz.xtb +++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -71,6 +71,7 @@ <translation id="2929907241665500097">Notanish xatolik tufayli Chrome yangilanmadi. <ph name="BEGIN_LINK" />Chromedagi yangilanish muammolari va xatoliklarni tuzatish.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Tarmoqqa kirish - Chrome</translation> <translation id="3037838751736561277">Google Chrome orqa fon rejimida ishlamoqda.</translation> +<translation id="3059710691562604940">Saytlarni xavfsiz kezish yoniq emas. Chrome uni yoqishingizni tavsiya qiladi.</translation> <translation id="3065168410429928842">Chrome sahifasi</translation> <translation id="3080151273017101988">Google Chrome yopilishida orqa fon rejimida ishlayotgan ilovalar to‘xtatilmasin</translation> <translation id="3089968997497233615">Google Chrome brauzerining yangi, yanada xavfsiz versiyasi chiqdi.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index 63c980b..cb160fc 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -74,6 +74,7 @@ <translation id="2929907241665500097">I-Chrome ayibuyekezekanga, kunokuthile okungahambanga kahle. <ph name="BEGIN_LINK" />Lungisa izinkinga zokubuyekaza kwe-Chrome nezibuyekezo ezihlulekile.<ph name="END_LINK" /></translation> <translation id="2969728957078202736"><ph name="PAGE_TITLE" /> - Inethiwekhi Yokungena ngemvume - i-Chrome</translation> <translation id="3037838751736561277">I-Google Chrome ikumodi yangemuva.</translation> +<translation id="3059710691562604940">Ukuphequlula okuphephile kuvaliwe. I-Chrome incoma ukuba kuvulwe.</translation> <translation id="3065168410429928842">Ithebhu le-Chrome</translation> <translation id="3080151273017101988">Qhubeka nokusebenzisa izinhlelo zokusebenza zangemuva ngenkathi i-Google Chrome ivaliwe</translation> <translation id="3089968997497233615">Kukhona inguqulo entsha, evikelekile ye-Google Chrome etholakalayo.</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index e293cf63..011016a2 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -4910,6 +4910,11 @@ {"context-menu-copy-image", flag_descriptions::kContextMenuCopyImageName, flag_descriptions::kContextMenuCopyImageDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kContextMenuCopyImage)}, + {"enable-clipboard-provider-image-suggestions", + flag_descriptions::kEnableClipboardProviderImageSuggestionsName, + flag_descriptions::kEnableClipboardProviderImageSuggestionsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kEnableClipboardProviderImageSuggestions)}, #endif // defined(OS_ANDROID) {"impulse-scroll-animations",
diff --git a/chrome/browser/android/feed/v2/feed_service_factory.cc b/chrome/browser/android/feed/v2/feed_service_factory.cc index feb7bdc..5de72258 100644 --- a/chrome/browser/android/feed/v2/feed_service_factory.cc +++ b/chrome/browser/android/feed/v2/feed_service_factory.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/profiles/profile_key.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/common/channel_info.h" +#include "chrome/common/chrome_version.h" #include "components/feed/core/proto/v2/store.pb.h" #include "components/feed/core/v2/public/feed_service.h" #include "components/feed/core/v2/refresh_task_scheduler.h" @@ -84,6 +85,10 @@ base::FilePath feed_dir(profile->GetPath().Append(kFeedv2Folder)); + feed::ChromeInfo chrome_info; + chrome_info.version = base::Version({CHROME_VERSION}); + chrome_info.channel = chrome::GetChannel(); + return new FeedService( std::make_unique<FeedServiceDelegateImpl>(), std::unique_ptr<RefreshTaskScheduler>(), // TODO(harringtond): implement @@ -94,7 +99,7 @@ feed_dir.AppendASCII("streamdb"), background_task_runner), identity_manager, storage_partition->GetURLLoaderFactoryForBrowserProcess(), - background_task_runner, api_key); + background_task_runner, api_key, chrome_info); } content::BrowserContext* FeedServiceFactory::GetBrowserContextToUse(
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc index 3c4b39b3..6c18f7de 100644 --- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc +++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -68,6 +68,7 @@ using base::android::JavaParamRef; using base::android::JavaRef; using base::android::ScopedJavaLocalRef; +using base::android::ToJavaByteArray; using base::android::ToJavaIntArray; using bookmarks::BookmarkModel; using metrics::OmniboxEventProto; @@ -84,7 +85,8 @@ void RecordClipboardMetrics(AutocompleteMatchType::Type match_type) { if (match_type != AutocompleteMatchType::CLIPBOARD_URL && - match_type != AutocompleteMatchType::CLIPBOARD_TEXT) { + match_type != AutocompleteMatchType::CLIPBOARD_TEXT && + match_type != AutocompleteMatchType::CLIPBOARD_IMAGE) { return; } @@ -98,6 +100,9 @@ } else if (match_type == AutocompleteMatchType::CLIPBOARD_TEXT) { UMA_HISTOGRAM_LONG_TIMES_100( "MobileOmnibox.PressedClipboardSuggestionAge.TEXT", age); + } else if (match_type == AutocompleteMatchType::CLIPBOARD_IMAGE) { + UMA_HISTOGRAM_LONG_TIMES_100( + "MobileOmnibox.PressedClipboardSuggestionAge.IMAGE", age); } } @@ -528,6 +533,8 @@ ConvertUTF8ToJavaString(env, match.destination_url.spec()); ScopedJavaLocalRef<jstring> image_url; ScopedJavaLocalRef<jstring> image_dominant_color; + ScopedJavaLocalRef<jstring> post_content_type; + std::string post_content; if (!match.image_url.is_empty()) { image_url = ConvertUTF8ToJavaString(env, match.image_url.spec()); @@ -538,6 +545,16 @@ ConvertUTF8ToJavaString(env, match.image_dominant_color); } + if (match.post_content.get()) { + if (!match.post_content.get()->first.empty()) { + post_content_type = + ConvertUTF8ToJavaString(env, match.post_content.get()->first); + } + if (!match.post_content.get()->second.empty()) { + post_content = match.post_content.get()->second; + } + } + BookmarkModel* bookmark_model = BookmarkModelFactory::GetForBrowserContext(profile_); return Java_AutocompleteController_buildOmniboxSuggestion( @@ -549,7 +566,8 @@ ToJavaIntArray(env, description_class_styles), janswer, fill_into_edit, destination_url, image_url, image_dominant_color, bookmark_model && bookmark_model->IsBookmarked(match.destination_url), - match.SupportsDeletion()); + match.SupportsDeletion(), post_content_type, + ToJavaByteArray(env, post_content)); } ScopedJavaLocalRef<jobject>
diff --git a/chrome/browser/android/vr/arcore_device/ar_image_transport.cc b/chrome/browser/android/vr/arcore_device/ar_image_transport.cc index e49a3c8..40a0b92 100644 --- a/chrome/browser/android/vr/arcore_device/ar_image_transport.cc +++ b/chrome/browser/android/vr/arcore_device/ar_image_transport.cc
@@ -67,12 +67,9 @@ glGenFramebuffersEXT(1, &camera_fbo_); - // TODO(https://crbug.com/1067795): frames are arriving out of order when - // using shared buffers. - // - // This should equal base::AndroidHardwareBufferCompat::IsSupportAvailable(), - // but force use of the Mailbox-to-Surface copy path until the bug is fixed. - shared_buffer_draw_ = false; + // When available (Android O and up), use AHardwareBuffer-based shared + // images for frame transport. + shared_buffer_draw_ = base::AndroidHardwareBufferCompat::IsSupportAvailable(); if (shared_buffer_draw_) { DVLOG(2) << __func__ << ": UseSharedBuffer()=true"; @@ -239,6 +236,13 @@ CopyTextureToFramebuffer(camera_texture_id_arcore_, frame_size, uv_transform); } +void ArImageTransport::ServerWaitForGpuFence( + std::unique_ptr<gfx::GpuFence> gpu_fence) { + std::unique_ptr<gl::GLFence> local_fence = + gl::GLFence::CreateFromGpuFence(*gpu_fence); + local_fence->ServerWait(); +} + void ArImageTransport::CopyDrawnImageToFramebuffer( vr::WebXrPresentationState* webxr, const gfx::Size& frame_size,
diff --git a/chrome/browser/android/vr/arcore_device/ar_image_transport.h b/chrome/browser/android/vr/arcore_device/ar_image_transport.h index 752cda6..2311cb63 100644 --- a/chrome/browser/android/vr/arcore_device/ar_image_transport.h +++ b/chrome/browser/android/vr/arcore_device/ar_image_transport.h
@@ -80,6 +80,7 @@ bool UseSharedBuffer() { return shared_buffer_draw_; } void SetFrameAvailableCallback(XrFrameCallback on_frame_available); + void ServerWaitForGpuFence(std::unique_ptr<gfx::GpuFence> gpu_fence); private: std::unique_ptr<vr::WebXrSharedBuffer> CreateBuffer();
diff --git a/chrome/browser/android/vr/arcore_device/arcore_gl.cc b/chrome/browser/android/vr/arcore_device/arcore_gl.cc index 898a5dc1..16afaa2 100644 --- a/chrome/browser/android/vr/arcore_device/arcore_gl.cc +++ b/chrome/browser/android/vr/arcore_device/arcore_gl.cc
@@ -667,6 +667,8 @@ TRACE_EVENT1("gpu", __func__, "frame", frame_index); DVLOG(3) << __func__ << ": frame=" << frame_index; + ar_image_transport_->ServerWaitForGpuFence(std::move(gpu_fence)); + DCHECK(webxr_->HaveProcessingFrame()); DCHECK(ar_image_transport_->UseSharedBuffer()); webxr_->GetProcessingFrame()->time_copied = base::TimeTicks::Now();
diff --git a/chrome/browser/chromeos/arc/session/arc_session_manager.cc b/chrome/browser/chromeos/arc/session/arc_session_manager.cc index 2b068293d..b404f95 100644 --- a/chrome/browser/chromeos/arc/session/arc_session_manager.cc +++ b/chrome/browser/chromeos/arc/session/arc_session_manager.cc
@@ -516,7 +516,9 @@ auto* prefs = profile_->GetPrefs(); const std::string user_id_hash( chromeos::ProfileHelper::GetUserIdHashFromProfile(profile_)); - arc_session_runner_->SetUserInfo(user_id_hash, + const cryptohome::Identification cryptohome_id( + multi_user_util::GetAccountIdFromProfile(profile_)); + arc_session_runner_->SetUserInfo(cryptohome_id, user_id_hash, GetOrCreateSerialNumber(prefs)); // Create the support host at initialization. Note that, practically, @@ -534,9 +536,7 @@ support_host_ = std::make_unique<ArcSupportHost>(profile_); support_host_->SetErrorDelegate(this); } - data_remover_ = std::make_unique<ArcDataRemover>( - prefs, cryptohome::Identification( - multi_user_util::GetAccountIdFromProfile(profile_))); + data_remover_ = std::make_unique<ArcDataRemover>(prefs, cryptohome_id); data_remover_->set_user_id_hash_for_profile(user_id_hash); if (g_enable_check_android_management_in_tests.value_or(g_ui_enabled))
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc index c8fcef3..be77695 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.cc +++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -2689,6 +2689,11 @@ } } +void CrostiniManager::OnStartLxdProgress( + const vm_tools::cicerone::StartLxdProgressSignal& signal) { + // TODO(crbug/1064512): Implement. +} + void CrostiniManager::OnUninstallPackageOwningFile( CrostiniResultCallback callback, base::Optional<vm_tools::cicerone::UninstallPackageOwningFileResponse>
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h index 6a6cf7b..338fbe3 100644 --- a/chrome/browser/chromeos/crostini/crostini_manager.h +++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -542,6 +542,8 @@ void OnUpgradeContainerProgress( const vm_tools::cicerone::UpgradeContainerProgressSignal& signal) override; + void OnStartLxdProgress( + const vm_tools::cicerone::StartLxdProgressSignal& signal) override; // chromeos::PowerManagerClient::Observer overrides: void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
diff --git a/chrome/browser/chromeos/crostini/crostini_pref_names.cc b/chrome/browser/chromeos/crostini/crostini_pref_names.cc index 77f7326..d543985d 100644 --- a/chrome/browser/chromeos/crostini/crostini_pref_names.cc +++ b/chrome/browser/chromeos/crostini/crostini_pref_names.cc
@@ -82,6 +82,11 @@ const char kCrostiniMicSharingAtLastLaunch[] = "crostini.mic_sharing_at_last_launch"; +// An integer preference indicating the allowance policy for ADB sideloading, +// with 0 meaning disallowed and 1 meaning allowed +const char kCrostiniArcAdbSideloadingUserPref[] = + "crostini.arc_adb_sideloading.user_pref"; + void RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterBooleanPref(kCrostiniEnabled, false); registry->RegisterBooleanPref(kCrostiniMicSharing, false); @@ -123,6 +128,10 @@ registry->RegisterDictionaryPref( kCrostiniTerminalSettings, base::DictionaryValue(), user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + + // TODO(https://crbug.com/1067577, janagrill): Replace hardcoded 0 with a + // constant + registry->RegisterIntegerPref(kCrostiniArcAdbSideloadingUserPref, 0); } } // namespace prefs
diff --git a/chrome/browser/chromeos/crostini/crostini_pref_names.h b/chrome/browser/chromeos/crostini/crostini_pref_names.h index 197f6a3c..1971ef1 100644 --- a/chrome/browser/chromeos/crostini/crostini_pref_names.h +++ b/chrome/browser/chromeos/crostini/crostini_pref_names.h
@@ -25,6 +25,7 @@ extern const char kUserCrostiniRootAccessAllowedByPolicy[]; extern const char kCrostiniAnsiblePlaybookFilePath[]; extern const char kCrostiniDefaultContainerConfigured[]; +extern const char kCrostiniArcAdbSideloadingUserPref[]; extern const char kReportCrostiniUsageEnabled[]; extern const char kCrostiniLastLaunchTerminaComponentVersion[];
diff --git a/chrome/browser/chromeos/login/eula_browsertest.cc b/chrome/browser/chromeos/login/eula_browsertest.cc index a750627..923ecc05 100644 --- a/chrome/browser/chromeos/login/eula_browsertest.cc +++ b/chrome/browser/chromeos/login/eula_browsertest.cc
@@ -56,8 +56,9 @@ constexpr char kFakeOnlineEulaPath[] = "/intl/en-US/chrome/eula_text.html"; constexpr char kFakeOnlineEula[] = "No obligations at all"; #if BUILDFLAG(GOOGLE_CHROME_BRANDING) -// See IDS_ABOUT_TERMS_OF_SERVICE for the complete text. -constexpr char kOfflineEULAWarning[] = "Chrome OS Terms"; +// See IDS_TERMS_HTML for the complete text. +constexpr char kOfflineEULAWarning[] = + "Google Chrome and Chrome OS Additional Terms of Service"; #else // Placeholder text in terms_chromium.html. constexpr char kOfflineEULAWarning[] =
diff --git a/chrome/browser/chromeos/login/screens/sync_consent_browsertest.cc b/chrome/browser/chromeos/login/screens/sync_consent_browsertest.cc index 919bae2..02b11f0 100644 --- a/chrome/browser/chromeos/login/screens/sync_consent_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/sync_consent_browsertest.cc
@@ -97,6 +97,29 @@ void SetUpOnMainThread() override { OobeBaseTest::SetUpOnMainThread(); branded_build_override_ = WizardController::ForceBrandedBuildForTesting(); + if (features::IsSplitSettingsSyncEnabled()) { + expected_consent_ids_ = { + IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE, + IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_NAME, + IDS_LOGIN_SYNC_CONSENT_SCREEN_OS_SYNC_DESCRIPTION, + IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_NAME, + IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_DESCRIPTION, + IDS_LOGIN_SYNC_CONSENT_SCREEN_REVIEW_BROWSER_SYNC_OPTIONS, + IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_NAME, + IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION, + IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE, + }; + } else { + expected_consent_ids_ = { + IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE, + IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_NAME, + IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_DESCRIPTION, + IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_NAME, + IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION, + IDS_LOGIN_SYNC_CONSENT_SCREEN_REVIEW_SYNC_OPTIONS_LATER, + IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE, + }; + } } void TearDownOnMainThread() override { @@ -158,8 +181,13 @@ screen->OnStateChanged(nullptr); test::OobeJS().CreateVisibilityWaiter(true, {"sync-consent-impl"})->Wait(); - test::OobeJS().ExpectVisiblePath( - {"sync-consent-impl", "syncConsentOverviewDialog"}); + if (features::IsSplitSettingsSyncEnabled()) { + test::OobeJS().ExpectVisiblePath( + {"sync-consent-impl", "splitSettingsSyncConsentDialog"}); + } else { + test::OobeJS().ExpectVisiblePath( + {"sync-consent-impl", "syncConsentOverviewDialog"}); + } test::OobeJS().TapOnPath( {"sync-consent-impl", "settingsSaveAndContinueButton"}); consent_recorded_waiter.Wait(); @@ -174,7 +202,7 @@ consent_recorded_waiter.consent_description_strings_); EXPECT_EQ(expected_consent_confirmation_string, consent_recorded_waiter.consent_confirmation_string_); - EXPECT_EQ(expected_consent_ids, + EXPECT_EQ(expected_consent_ids_, consent_recorded_waiter.consent_description_ids_); EXPECT_EQ(expected_consent_confirmation_id, consent_recorded_waiter.consent_confirmation_id_); @@ -182,23 +210,14 @@ std::vector<std::string> GetLocalizedExpectedConsentStrings() const { std::vector<std::string> result; - for (const int& id : expected_consent_ids) { + for (const int& id : expected_consent_ids_) { result.push_back(GetLocalizedConsentString(id)); } return result; } - const std::vector<int> expected_consent_ids = { - IDS_LOGIN_SYNC_CONSENT_SCREEN_TITLE, - IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_NAME, - IDS_LOGIN_SYNC_CONSENT_SCREEN_CHROME_SYNC_DESCRIPTION, - IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_NAME, - IDS_LOGIN_SYNC_CONSENT_SCREEN_PERSONALIZE_GOOGLE_SERVICES_DESCRIPTION, - IDS_LOGIN_SYNC_CONSENT_SCREEN_REVIEW_SYNC_OPTIONS_LATER, - IDS_LOGIN_SYNC_CONSENT_SCREEN_ACCEPT_AND_CONTINUE, - }; - std::unique_ptr<base::AutoReset<bool>> branded_build_override_; + std::vector<int> expected_consent_ids_; FakeGaiaMixin fake_gaia_{&mixin_host_, embedded_test_server()}; private: @@ -209,15 +228,35 @@ EXPECT_EQ(g_browser_process->GetApplicationLocale(), "en-US"); LoginToSyncConsentScreen(); // For En-US we hardcode strings here to catch string issues too. - const std::vector<std::string> expected_consent_strings( - {"You're signed in!", "Chrome sync", - "Your bookmarks, history, passwords, and other settings will be synced " - "to your Google Account so you can use them on all your devices.", - "Personalize Google services", - "Google may use your browsing history to personalize Search, ads, and " - "other Google services. You can change this anytime at " - "myaccount.google.com/activitycontrols/search", - "Review sync options following setup", "Accept and continue"}); + std::vector<std::string> expected_consent_strings; + if (features::IsSplitSettingsSyncEnabled()) { + expected_consent_strings = { + "You're signed in!", + "Settings sync", + "Your apps, settings, and other customizations will sync across all " + "Chrome OS devices signed in with your Google Account.", + "Chrome sync", + "Your bookmarks, history, passwords, and other settings will be synced " + "to your Google Account so you can use them on all your devices.", + "Review browser sync options following setup", + "Personalize Google services", + "Google may use your browsing history to personalize Search, ads, and " + "other Google services. You can change this anytime at " + "myaccount.google.com/activitycontrols/search", + "Accept and continue"}; + } else { + expected_consent_strings = { + "You're signed in!", + "Chrome sync", + "Your bookmarks, history, passwords, and other settings will be synced " + "to your Google Account so you can use them on all your devices.", + "Personalize Google services", + "Google may use your browsing history to personalize Search, ads, and " + "other Google services. You can change this anytime at " + "myaccount.google.com/activitycontrols/search", + "Review sync options following setup", + "Accept and continue"}; + } const std::string expected_consent_confirmation_string = "Accept and continue"; SyncConsentRecorderTestImpl(expected_consent_strings,
diff --git a/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc b/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc index 470e165..babbab7 100644 --- a/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/ui/user_adding_screen_browsertest.cc
@@ -287,7 +287,13 @@ StartupUtils::MarkOobeCompleted(); } -IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, ScreenVisibility) { +// crbug.com/1067461: Flakes on ASAN and MSAN +#if defined(ADDRESS_SANITIZER) || defined(MEMORY_SANITIZER) +#define MAYBE_ScreenVisibility DISABLED_ScreenVisibility +#else +#define MAYBE_ScreenVisibility ScreenVisibility +#endif +IN_PROC_BROWSER_TEST_F(UserAddingScreenTest, MAYBE_ScreenVisibility) { LoginUser(test_users_[0]); UserAddingScreen::Get()->Start();
diff --git a/chrome/browser/extensions/api/commands/command_service.cc b/chrome/browser/extensions/api/commands/command_service.cc index fbb6db742..f60cea2 100644 --- a/chrome/browser/extensions/api/commands/command_service.cc +++ b/chrome/browser/extensions/api/commands/command_service.cc
@@ -136,7 +136,7 @@ Command* command, bool* active) const { return GetExtensionActionCommand(extension_id, type, command, active, - Command::Type::kBrowserAction); + ActionInfo::TYPE_BROWSER); } bool CommandService::GetPageActionCommand(const std::string& extension_id, @@ -144,7 +144,7 @@ Command* command, bool* active) const { return GetExtensionActionCommand(extension_id, type, command, active, - Command::Type::kPageAction); + ActionInfo::TYPE_PAGE); } bool CommandService::GetNamedCommands(const std::string& extension_id, @@ -778,7 +778,7 @@ QueryType query_type, Command* command, bool* active, - Command::Type action_type) const { + ActionInfo::Type action_type) const { const ExtensionSet& extensions = ExtensionRegistry::Get(profile_)->enabled_extensions(); const Extension* extension = extensions.GetByID(extension_id); @@ -789,13 +789,14 @@ const Command* requested_command = NULL; switch (action_type) { - case Command::Type::kBrowserAction: + case ActionInfo::TYPE_BROWSER: requested_command = CommandsInfo::GetBrowserActionCommand(extension); break; - case Command::Type::kPageAction: + case ActionInfo::TYPE_PAGE: requested_command = CommandsInfo::GetPageActionCommand(extension); break; - case Command::Type::kNamed: + case ActionInfo::TYPE_ACTION: + // TODO(devlin): Add support for the "action" key. NOTREACHED(); return false; }
diff --git a/chrome/browser/extensions/api/commands/command_service.h b/chrome/browser/extensions/api/commands/command_service.h index 0c7f057..9ffcfb4 100644 --- a/chrome/browser/extensions/api/commands/command_service.h +++ b/chrome/browser/extensions/api/commands/command_service.h
@@ -10,6 +10,7 @@ #include "base/macros.h" #include "base/observer_list.h" #include "base/scoped_observer.h" +#include "chrome/common/extensions/api/extension_action/action_info.h" #include "chrome/common/extensions/command.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "extensions/browser/extension_registry.h" @@ -245,7 +246,7 @@ QueryType query_type, Command* command, bool* active, - Command::Type type) const; + ActionInfo::Type type) const; // A weak pointer to the profile we are associated with. Not owned by us. Profile* profile_;
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc index dd54c871..f94d2177 100644 --- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc +++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc
@@ -253,7 +253,7 @@ base::RecordAction(base::UserMetricsAction("OpenLanguageOptionsDialog")); chrome::ShowSettingsSubPageForProfile(ProfileManager::GetActiveUserProfile(), - chrome::kLanguagesSubPage); + chrome::kOsLanguagesDetailsSubPage); return true; } @@ -300,6 +300,15 @@ return keyboard_client->SetAreaToRemainOnScreen(bounds); } +bool ChromeVirtualKeyboardDelegate::SetWindowBoundsInScreen( + const gfx::Rect& bounds_in_screen) { + auto* keyboard_client = ChromeKeyboardControllerClient::Get(); + if (!keyboard_client->is_keyboard_enabled()) + return false; + + return keyboard_client->SetWindowBoundsInScreen(bounds_in_screen); +} + bool ChromeVirtualKeyboardDelegate::SetDraggableArea( const api::virtual_keyboard_private::Bounds& rect) { auto* keyboard_client = ChromeKeyboardControllerClient::Get();
diff --git a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h index e77399cc..bf0f37f 100644 --- a/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h +++ b/chrome/browser/extensions/api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h
@@ -53,6 +53,7 @@ bool SetOccludedBounds(const std::vector<gfx::Rect>& bounds) override; bool SetHitTestBounds(const std::vector<gfx::Rect>& bounds) override; bool SetAreaToRemainOnScreen(const gfx::Rect& bounds) override; + bool SetWindowBoundsInScreen(const gfx::Rect& bounds_in_screen) override; api::virtual_keyboard::FeatureRestrictions RestrictFeatures( const api::virtual_keyboard::RestrictFeatures::Params& params) override;
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc index e9b0a80..fc8560b 100644 --- a/chrome/browser/extensions/content_script_apitest.cc +++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -326,36 +326,6 @@ EXPECT_TRUE(CheckStyleInjection(browser(), url, false)); } -// crbug.com/120762 -IN_PROC_BROWSER_TEST_F( - ExtensionApiTest, - DISABLED_ContentScriptStylesInjectedIntoExistingRenderers) { - ASSERT_TRUE(StartEmbeddedTestServer()); - - content::WindowedNotificationObserver signal( - extensions::NOTIFICATION_USER_SCRIPTS_UPDATED, - content::Source<Profile>(browser()->profile())); - - // Start with a renderer already open at a URL. - GURL url(embedded_test_server()->GetURL("/extensions/test_file.html")); - ui_test_utils::NavigateToURL(browser(), url); - - LoadExtension( - test_data_dir_.AppendASCII("content_scripts/existing_renderers")); - - signal.Wait(); - - // And check that its styles were affected by the styles that just got loaded. - bool styles_injected; - ASSERT_TRUE(content::ExecuteScriptAndExtractBool( - browser()->tab_strip_model()->GetActiveWebContents(), - "window.domAutomationController.send(" - " document.defaultView.getComputedStyle(document.body, null)." - " getPropertyValue('background-color') == 'rgb(255, 0, 0)')", - &styles_injected)); - ASSERT_TRUE(styles_injected); -} - IN_PROC_BROWSER_TEST_F(ContentScriptApiTest, ContentScriptCSSLocalization) { ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(RunExtensionTest("content_scripts/css_l10n")) << message_;
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc index 9f8e183..9bbdc71 100644 --- a/chrome/browser/extensions/service_worker_apitest.cc +++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -1754,7 +1754,7 @@ }); });)"; -constexpr char kTabsOnUpdatedScript[] = +constexpr char kTabsOnUpdatedSplitScript[] = R"(var inIncognitoContext = chrome.extension.inIncognitoContext; var incognitoStr = inIncognitoContext ? 'incognito' : 'regular'; @@ -1770,6 +1770,27 @@ chrome.test.sendMessage(JSON.stringify(urls)); });)"; +constexpr char kTabsOnUpdatedSpanningScript[] = + R"(var inIncognitoContext = chrome.extension.inIncognitoContext; + var incognitoStr = + inIncognitoContext ? 'incognito' : 'regular'; + var urls = []; + var expectedCount = 0; + + chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { + if (changeInfo.status === 'complete') { + urls.push(tab.url); + if (urls.length == expectedCount) { + chrome.test.sendMessage(JSON.stringify(urls)); + } + } + }); + + chrome.test.sendMessage('Script started ' + incognitoStr, + function(expected) { + expectedCount = expected; + });)"; + } // anonymous namespace IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, TabsQuerySplit) { @@ -1855,7 +1876,7 @@ TestExtensionDir test_dir; test_dir.WriteManifest(base::StringPrintf(kIncognitoManifest, "split")); - test_dir.WriteFile(FILE_PATH_LITERAL("worker.js"), kTabsOnUpdatedScript); + test_dir.WriteFile(FILE_PATH_LITERAL("worker.js"), kTabsOnUpdatedSplitScript); const Extension* extension = LoadExtensionIncognito(test_dir.UnpackedPath()); ASSERT_TRUE(extension); @@ -1886,9 +1907,13 @@ } } -// Disabled due to flakiness: https://crbug.com/1003244. IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, - DISABLED_TabsOnUpdatedSpanning) { + TabsOnUpdatedSpanning) { + // The spanning test differs from the Split test because it lets the + // renderer send the URLs once the expected number of onUpdated + // events have completed. This solves flakiness in the previous + // implementation, where the browser pulled the URLs from the + // renderer. ExtensionTestMessageListener ready_listener("Script started regular", true); // Open an incognito window. @@ -1898,7 +1923,8 @@ TestExtensionDir test_dir; test_dir.WriteManifest(base::StringPrintf(kIncognitoManifest, "spanning")); - test_dir.WriteFile(FILE_PATH_LITERAL("worker.js"), kTabsOnUpdatedScript); + test_dir.WriteFile(FILE_PATH_LITERAL("worker.js"), + kTabsOnUpdatedSpanningScript); const Extension* extension = LoadExtensionIncognito(test_dir.UnpackedPath()); ASSERT_TRUE(extension); @@ -1906,14 +1932,16 @@ // Wait for the extension's service worker to be ready. ASSERT_TRUE(ready_listener.WaitUntilSatisfied()); + // Let the JavaScript side know the number of expected URLs. + ready_listener.Reply(2); + + // This listener will catch the URLs coming back. + ExtensionTestMessageListener tabs_listener(false); + // Load a new tab in both browsers. ui_test_utils::NavigateToURL(browser(), GURL("chrome:version")); ui_test_utils::NavigateToURL(browser_incognito, GURL("chrome:about")); - ExtensionTestMessageListener tabs_listener(false); - // The extension waits for the reply to the "ready" sendMessage call - // and replies with the URLs of the tabs. - ready_listener.Reply(""); EXPECT_TRUE(tabs_listener.WaitUntilSatisfied()); EXPECT_EQ(R"(["chrome://version/","chrome://about/"])", tabs_listener.message());
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index b6dc123e..0832798 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -593,7 +593,7 @@ { "name": "cookies-without-same-site-must-be-secure", "owners": [ "chlily", "morlovich" ], - "expiry_milestone": 83 + "expiry_milestone": 88 }, { "name": "corner-shortcuts", @@ -1196,8 +1196,8 @@ }, { "name": "enable-clipboard-provider-image-suggestions", - "owners": [ "rkgibson" ], - "expiry_milestone": 86 + "owners": [ "rkgibson", "gangwu", "chrome-omnibox-team@google.com"], + "expiry_milestone": 90 }, { "name": "enable-clipboard-provider-text-suggestions", @@ -3500,7 +3500,7 @@ { "name": "same-site-by-default-cookies", "owners": [ "chlily", "morlovich" ], - "expiry_milestone": 83 + "expiry_milestone": 88 }, { "name": "scalable-app-list",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index d1db6d58..bd02ee2 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -64,6 +64,11 @@ "Allows synchronous XHR requests during page dismissal when the page is " "being navigated away or closed by the user."; +const char kEnableClipboardProviderImageSuggestionsName[] = + "Omnibox clipboard image search suggestions"; +const char kEnableClipboardProviderImageSuggestionsDescription[] = + "Enables image search suggestions in the Omnibox."; + const char kEnableFtpName[] = "Enable support for FTP URLs"; const char kEnableFtpDescription[] = "When enabled, the browser will handle navigations to ftp:// URLs by "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 4cd528b..44ac8c98f 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -72,6 +72,9 @@ extern const char kAllowSyncXHRInPageDismissalName[]; extern const char kAllowSyncXHRInPageDismissalDescription[]; +extern const char kEnableClipboardProviderImageSuggestionsName[]; +extern const char kEnableClipboardProviderImageSuggestionsDescription[]; + extern const char kEnableFtpName[]; extern const char kEnableFtpDescription[];
diff --git a/chrome/browser/media/feeds/media_feeds_browsertest.cc b/chrome/browser/media/feeds/media_feeds_browsertest.cc index b7c9ee52..a38f302 100644 --- a/chrome/browser/media/feeds/media_feeds_browsertest.cc +++ b/chrome/browser/media/feeds/media_feeds_browsertest.cc
@@ -36,6 +36,7 @@ struct TestData { std::string head_html; bool discovered; + bool https = true; }; } // namespace @@ -43,7 +44,8 @@ class MediaFeedsBrowserTest : public InProcessBrowserTest, public ::testing::WithParamInterface<TestData> { public: - MediaFeedsBrowserTest() = default; + MediaFeedsBrowserTest() + : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {} ~MediaFeedsBrowserTest() override = default; void SetUp() override { @@ -55,9 +57,15 @@ void SetUpOnMainThread() override { host_resolver()->AddRule("*", "127.0.0.1"); + // The HTTPS server serves the test page using HTTPS. + https_server_.SetSSLConfig(net::EmbeddedTestServer::CERT_OK); + https_server_.RegisterRequestHandler(base::BindRepeating( + &MediaFeedsBrowserTest::HandleRequest, base::Unretained(this))); + ASSERT_TRUE(https_server_.Start()); + + // The embedded test server will serve the test page using HTTP. embedded_test_server()->RegisterRequestHandler(base::BindRepeating( &MediaFeedsBrowserTest::HandleRequest, base::Unretained(this))); - ASSERT_TRUE(embedded_test_server()->Start()); InProcessBrowserTest::SetUpOnMainThread(); @@ -87,6 +95,10 @@ browser()->profile()); } + net::EmbeddedTestServer* GetServer() { + return GetParam().https ? &https_server_ : embedded_test_server(); + } + private: std::unique_ptr<net::test_server::HttpResponse> HandleRequest( const net::test_server::HttpRequest& request) { @@ -99,6 +111,8 @@ return response; } + net::EmbeddedTestServer https_server_; + base::test::ScopedFeatureList scoped_feature_list_; }; @@ -108,6 +122,8 @@ ::testing::Values( TestData{"<link rel=feed type=\"application/ld+json\" href=\"/test\"/>", true}, + TestData{"<link rel=feed type=\"application/ld+json\" href=\"/test\"/>", + false, false}, TestData{"", false}, TestData{"<link rel=feed type=\"application/ld+json\" " "href=\"/test\"/><link rel=feed " @@ -130,7 +146,7 @@ static_cast<MediaFeedsContentsObserver*>( MediaFeedsContentsObserver::FromWebContents(GetWebContents())); - GURL test_url(embedded_test_server()->GetURL(kMediaFeedsTestURL)); + GURL test_url(GetServer()->GetURL(kMediaFeedsTestURL)); // The contents observer will call this closure when it has checked for a // media feed. @@ -150,7 +166,7 @@ std::set<GURL> expected_urls; if (GetParam().discovered) - expected_urls.insert(embedded_test_server()->GetURL("/test")); + expected_urls.insert(GetServer()->GetURL("/test")); EXPECT_EQ(expected_urls, GetDiscoveredFeedURLs()); }
diff --git a/chrome/browser/media/feeds/media_feeds_contents_observer.cc b/chrome/browser/media/feeds/media_feeds_contents_observer.cc index aee74b2..b60528b 100644 --- a/chrome/browser/media/feeds/media_feeds_contents_observer.cc +++ b/chrome/browser/media/feeds/media_feeds_contents_observer.cc
@@ -35,6 +35,13 @@ if (render_frame_host->GetParent() || !GetService()) return; + // We should only discover Media Feeds on secure origins. + if (!validated_url.SchemeIsCryptographic()) { + if (test_closure_) + std::move(test_closure_).Run(); + return; + } + render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface( &render_frame_); @@ -61,6 +68,7 @@ return; } + CHECK(url->SchemeIsCryptographic()); service->DiscoverMediaFeed(*url); }
diff --git a/chrome/browser/media/history/media_history_store.cc b/chrome/browser/media/history/media_history_store.cc index a8e4cc4..8584c52 100644 --- a/chrome/browser/media/history/media_history_store.cc +++ b/chrome/browser/media/history/media_history_store.cc
@@ -899,6 +899,8 @@ } void MediaHistoryStore::DiscoverMediaFeed(const GURL& url) { + CHECK(url.SchemeIsCryptographic()); + db_->db_task_runner_->PostTask( FROM_HERE, base::BindOnce(&MediaHistoryStoreInternal::DiscoverMediaFeed, db_, url));
diff --git a/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc index 82230c5..a0f8413 100644 --- a/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc +++ b/chrome/browser/page_load_metrics/integration_tests/total_input_delay_browsertest.cc
@@ -39,7 +39,7 @@ TestUkmRecorder::GetEntryMetric(kv->second.get(), metric_name); EXPECT_NE(metric_value, nullptr); double delta = *metric_value - expected_value; - EXPECT_LE(delta * delta, 0.25 * num_input_events * num_input_events); + EXPECT_LE(delta * delta, num_input_events * num_input_events); } }; @@ -60,9 +60,7 @@ PageLoad::kInteractiveTiming_TotalAdjustedInputDelayName, int64_t(0), 0); } -// Disable the test due to flaky crbug.com/1067320 -IN_PROC_BROWSER_TEST_F(TotalInputDelayIntegrationTest, - DISABLED_MultipleInputEvents) { +IN_PROC_BROWSER_TEST_F(TotalInputDelayIntegrationTest, MultipleInputEvents) { LoadHTML(R"HTML( <p>Sample website</p> )HTML");
diff --git a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc index 8fa152f2..0fe8e65 100644 --- a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc +++ b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.cc
@@ -583,6 +583,8 @@ .layout_shift_score_before_input_or_scroll)) .Record(ukm::UkmRecorder::Get()); + // TODO(crbug.com/1064483): We should move UMA recording to components/ + UMA_HISTOGRAM_COUNTS_100( "PageLoad.LayoutInstability.CumulativeShiftScore", LayoutShiftUmaValue( @@ -592,6 +594,15 @@ "PageLoad.LayoutInstability.CumulativeShiftScore.MainFrame", LayoutShiftUmaValue( GetDelegate().GetMainFrameRenderData().layout_shift_score)); + + // Note: This depends on PageLoadMetrics internally processing loading + // behavior before timing metrics if they come in the same IPC update. + if (font_preload_started_before_rendering_observed_) { + UMA_HISTOGRAM_COUNTS_100( + "PageLoad.Clients.FontPreload.LayoutInstability.CumulativeShiftScore", + LayoutShiftUmaValue( + GetDelegate().GetPageRenderData().layout_shift_score)); + } } void UkmPageLoadMetricsObserver::RecordInputTimingMetrics() { @@ -756,3 +767,12 @@ builder.SetFirstURLIsDefaultSearchEngine(start_url_is_default_search_); builder.Record(ukm::UkmRecorder::Get()); } + +void UkmPageLoadMetricsObserver::OnLoadingBehaviorObserved( + content::RenderFrameHost* rfh, + int behavior_flag) { + if (behavior_flag & blink::LoadingBehaviorFlag:: + kLoadingBehaviorFontPreloadStartedBeforeRendering) { + font_preload_started_before_rendering_observed_ = true; + } +}
diff --git a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.h b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.h index 116560f..cbf0457 100644 --- a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.h +++ b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer.h
@@ -88,6 +88,9 @@ content::RenderFrameHost* subframe_rfh, const page_load_metrics::mojom::CpuTiming& timing) override; + void OnLoadingBehaviorObserved(content::RenderFrameHost* rfh, + int behavior_flags) override; + // Whether the current page load is an Offline Preview. Must be called from // OnCommit. Virtual for testing. virtual bool IsOfflinePreview(content::WebContents* web_contents) const; @@ -208,6 +211,8 @@ // Unique across the lifetime of the browser process. int main_document_sequence_number_ = -1; + bool font_preload_started_before_rendering_observed_ = false; + // The connection info for the committed URL. base::Optional<net::HttpResponseInfo::ConnectionInfo> connection_info_;
diff --git a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc index 0f7e13e..f7dc07c 100644 --- a/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/ukm_page_load_metrics_observer_unittest.cc
@@ -1366,6 +1366,39 @@ EXPECT_THAT(tester()->histogram_tester().GetAllSamples( "PageLoad.LayoutInstability.CumulativeShiftScore"), testing::ElementsAre(base::Bucket(25, 1))); + + tester()->histogram_tester().ExpectTotalCount( + "PageLoad.Clients.FontPreload.LayoutInstability." + "CumulativeShiftScore", + 0); +} + +TEST_F(UkmPageLoadMetricsObserverTest, + UpdateAfterHide_RecordsLayoutInstabilityWithFontPreload) { + NavigateAndCommit(GURL(kTestUrl1)); + + page_load_metrics::mojom::FrameMetadata metadata; + metadata.behavior_flags |= blink::LoadingBehaviorFlag:: + kLoadingBehaviorFontPreloadStartedBeforeRendering; + tester()->SimulateMetadataUpdate(metadata, web_contents()->GetMainFrame()); + + page_load_metrics::mojom::FrameRenderDataUpdate render_data(1.0, 1.0); + tester()->SimulateRenderDataUpdate(render_data); + + // Simulate hiding the tab (the report should include shifts after hide). + web_contents()->WasHidden(); + + render_data.layout_shift_delta = 1.5; + render_data.layout_shift_delta_before_input_or_scroll = 0.0; + tester()->SimulateRenderDataUpdate(render_data); + + // Simulate closing the tab. + DeleteContents(); + + EXPECT_THAT(tester()->histogram_tester().GetAllSamples( + "PageLoad.Clients.FontPreload.LayoutInstability." + "CumulativeShiftScore"), + testing::ElementsAre(base::Bucket(25, 1))); } TEST_F(UkmPageLoadMetricsObserverTest, MHTMLNotTracked) {
diff --git a/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc b/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc index 8bf3e32..ef095ee 100644 --- a/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc +++ b/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc
@@ -45,6 +45,19 @@ reinterpret_cast<PaintPreviewCompositorClientImpl*>(client.release())); } +bool IsBoundAndConnected(PaintPreviewCompositorClientImpl* compositor) { + base::RunLoop loop; + bool out; + compositor->IsBoundAndConnected(base::BindOnce( + [](base::OnceClosure quit, bool* out, bool success) { + *out = success; + std::move(quit).Run(); + }, + loop.QuitClosure(), base::Unretained(&out))); + loop.Run(); + return out; +} + } // namespace class PaintPreviewCompositorBrowserTest : public InProcessBrowserTest { @@ -110,7 +123,7 @@ EXPECT_TRUE(compositor_service->HasActiveClients()); EXPECT_TRUE(base::Contains(compositor_service->ActiveClientsForTesting(), compositor->Token())); - EXPECT_TRUE(compositor->IsBoundAndConnected()); + EXPECT_TRUE(IsBoundAndConnected(compositor.get())); compositor.reset(); EXPECT_FALSE(compositor_service->HasActiveClients()); @@ -133,7 +146,8 @@ EXPECT_EQ(1U, compositor_service->ActiveClientsForTesting().size()); EXPECT_TRUE(base::Contains(compositor_service->ActiveClientsForTesting(), compositor_0->Token())); - EXPECT_TRUE(compositor_0->IsBoundAndConnected()); + + EXPECT_TRUE(IsBoundAndConnected(compositor_0.get())); base::RunLoop loop_1; auto compositor_1 = ToCompositorClientImpl( @@ -143,7 +157,7 @@ EXPECT_EQ(2U, compositor_service->ActiveClientsForTesting().size()); EXPECT_TRUE(base::Contains(compositor_service->ActiveClientsForTesting(), compositor_1->Token())); - EXPECT_TRUE(compositor_1->IsBoundAndConnected()); + EXPECT_TRUE(IsBoundAndConnected(compositor_1.get())); EXPECT_NE(compositor_0->Token(), compositor_1->Token()); compositor_0.reset(); @@ -173,7 +187,7 @@ EXPECT_TRUE(compositor_service->HasActiveClients()); EXPECT_TRUE(base::Contains(compositor_service->ActiveClientsForTesting(), compositor->Token())); - EXPECT_TRUE(compositor->IsBoundAndConnected()); + EXPECT_TRUE(IsBoundAndConnected(compositor.get())); base::RunLoop disconnect_loop; compositor->SetDisconnectHandler(disconnect_loop.QuitClosure()); @@ -181,7 +195,7 @@ // Kill before releasing active compositors. compositor_service.reset(); disconnect_loop.Run(); - EXPECT_FALSE(compositor->IsBoundAndConnected()); + EXPECT_FALSE(IsBoundAndConnected(compositor.get())); } } // namespace paint_preview
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index b3fb8cf..3843321 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -948,6 +948,9 @@ { key::kReportCrostiniUsageEnabled, crostini::prefs::kReportCrostiniUsageEnabled, base::Value::Type::BOOLEAN }, + { key::kCrostiniArcAdbSideloadingAllowed, + crostini::prefs::kCrostiniArcAdbSideloadingUserPref, + base::Value::Type::INTEGER }, { key::kNTLMShareAuthenticationEnabled, prefs::kNTLMShareAuthenticationEnabled, base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js index f8db0140..a300e369 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -34,6 +34,9 @@ /** @private {boolean} */ CommandHandler.incognito_ = !!chrome.runtime.getManifest()['incognito']; +/** @private {boolean} */ +CommandHandler.languageLoggingEnabled_ = false; + /** * Handles toggling sticky mode when encountering editables. * @private {!SmartStickyMode} @@ -1059,6 +1062,29 @@ .send(); } return false; + case 'logLanguageInformationForCurrentNode': { + if (!CommandHandler.languageLoggingEnabled_) { + return false; + } + + const node = ChromeVoxState.instance.currentRange.start.node; + const outString = ` + Language information for node + Name: ${node.name} + Detected language: ${node.detectedLanguage || 'None'} + Author language: ${node.language || 'None'} + `; + new Output() + .withString(outString) + .withQueueMode(QueueMode.CATEGORY_FLUSH) + .go(); + const annotation = node.languageAnnotationForStringAttribute('name'); + const logString = outString.concat(`Language spans: + ${JSON.stringify(annotation)}`); + console.error(logString); + LogStore.getInstance().writeTextLog(logString, LogStore.LogType.TEXT); + } + return false; default: return true; } @@ -1430,6 +1456,27 @@ }); } }); + + chrome.commandLinePrivate.hasSwitch( + 'enable-experimental-accessibility-chromevox-language-switching', + (enabled) => { + if (enabled) { + CommandHandler.languageLoggingEnabled_ = true; + } + }); + chrome.commandLinePrivate.hasSwitch( + 'enable-experimental-accessibility-language-detection', (enabled) => { + if (enabled) { + CommandHandler.languageLoggingEnabled_ = true; + } + }); + chrome.commandLinePrivate.hasSwitch( + 'enable-experimental-accessibility-language-detection-dynamic', + (enabled) => { + if (enabled) { + CommandHandler.languageLoggingEnabled_ = true; + } + }); }; }); // goog.scope
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keymaps/default_keymap.json b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keymaps/default_keymap.json index 93f04e49..ba30d10b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keymaps/default_keymap.json +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keymaps/default_keymap.json
@@ -1065,6 +1065,15 @@ "keyCode": [65, 79] } } + }, + { + "command": "logLanguageInformationForCurrentNode", + "sequence": { + "cvoxModifier": true, + "keys": { + "keyCode": [80, 76] + } + } } ] }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js index beca680..a73c77f0 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js
@@ -170,6 +170,7 @@ BRAILLE_RULE: 'brailleRule', EARCON: 'earcon', EVENT: 'event', + TEXT: 'text', TREE: 'tree', };
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb index a3d18ce..ae65acc8 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ta.xtb
@@ -463,6 +463,7 @@ <translation id="4763480195061959176">வீடியோ</translation> <translation id="4764692524839457597">இயல்பு</translation> <translation id="4772771694153161212">அடிக்கோடு இல்லை</translation> +<translation id="4784215347943747396">வெறும் ஒன்றிரண்டு சுவிட்ச்களைக் கொண்டே சாதனத்தை நிர்வகியுங்கள்</translation> <translation id="4786285211967466855">முந்தைய 1ம் நிலை தலைப்பு எதுவும் இல்லை</translation> <translation id="4787577491510559358">தற்போதைய உருப்படியின் வடிவமைப்பைத் தெரிவிக்கும்</translation> <translation id="479989351350248267">தேடல்</translation>
diff --git a/chrome/browser/resources/new_tab_page/BUILD.gn b/chrome/browser/resources/new_tab_page/BUILD.gn index d7bb922..6d38bbc 100644 --- a/chrome/browser/resources/new_tab_page/BUILD.gn +++ b/chrome/browser/resources/new_tab_page/BUILD.gn
@@ -129,6 +129,7 @@ js_library("logo") { deps = [ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/cr_elements/cr_button:cr_button.m", ] }
diff --git a/chrome/browser/resources/new_tab_page/logo.html b/chrome/browser/resources/new_tab_page/logo.html index 184e9dc..981b763a 100644 --- a/chrome/browser/resources/new_tab_page/logo.html +++ b/chrome/browser/resources/new_tab_page/logo.html
@@ -26,6 +26,7 @@ cursor: pointer; display: grid; height: 230px; + position: relative; width: 500px; } @@ -45,6 +46,21 @@ width: 100%; } + #shareButton { + border: none; + height: 26px; + min-width: 26px; + opacity: 0.8; + outline: initial; + padding: 2px; + position: absolute; + width: 26px; + } + + #shareButton:hover { + opacity: 1; + } + #iframe { height: var(--height, 200px); margin-bottom: 30px; @@ -70,6 +86,17 @@ <ntp-untrusted-iframe id="animation" path="[[animationUrl_]]" hidden="[[!showAnimation_]]"> </ntp-untrusted-iframe> + <!-- TODO(crbug.com/1039910): Set focus ring that works for both dark and + light doodles. + TODO(crbug.com/1039910): Open share dialog on click. --> + <cr-button id="shareButton" title="$i18n{shareDoodle}" + style="background-color: [[rgbOrUnset_(doodle_.content.imageDoodle.shareButton.backgroundColor)]]; + left: [[doodle_.content.imageDoodle.shareButton.x]]px; + top: [[doodle_.content.imageDoodle.shareButton.y]]px;"> + <img id="shareButtonImage" + src="[[doodle_.content.imageDoodle.shareButton.iconUrl.url]]"> + </img> + </cr-button> </div> <ntp-untrusted-iframe id="iframe" path="[[iframeUrl_]]" hidden="[[!iframeUrl_]]"
diff --git a/chrome/browser/resources/new_tab_page/logo.js b/chrome/browser/resources/new_tab_page/logo.js index 037028a..386911e8 100644 --- a/chrome/browser/resources/new_tab_page/logo.js +++ b/chrome/browser/resources/new_tab_page/logo.js
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js'; import './untrusted_iframe.js'; @@ -10,6 +11,7 @@ import {EventTracker} from 'chrome://resources/js/event_tracker.m.js'; import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {BrowserProxy} from './browser_proxy.js'; +import {skColorToRgb} from './utils.js'; // Shows the Google logo or a doodle if available. class LogoElement extends PolymerElement { @@ -203,6 +205,15 @@ valueOrUnset_(value) { return value || 'unset'; } + + /** + * @param {skia.mojom.SkColor} skColor + * @return {string} + * @private + */ + rgbOrUnset_(skColor) { + return skColor ? skColorToRgb(skColor) : 'unset'; + } } customElements.define(LogoElement.is, LogoElement);
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html index 7909076..d5ee6804 100644 --- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html +++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.html
@@ -23,7 +23,7 @@ </settings-languages> <!-- Top-level settings section. --> - <settings-animated-pages id="pages" section="languages" + <settings-animated-pages id="pages" section="osLanguages" focus-config="[[focusConfig_]]"> <div route-path="default"> <cr-link-row @@ -37,7 +37,7 @@ </div> <!-- "Language and input" sub-page. --> - <template is="dom-if" route-path="/languages/details"> + <template is="dom-if" route-path="/osLanguages/details"> <settings-subpage associated-control="[[$$('#languagesSubpageTrigger')]]" page-title="$i18n{osLanguagesPageTitle}"> @@ -51,7 +51,7 @@ </template> <!-- "Manage input methods" sub-sub-page. --> - <template is="dom-if" route-path="/languages/inputMethods"> + <template is="dom-if" route-path="/osLanguages/inputMethods"> <!-- TODO(crbug.com/950007): Associate control with the sub-subpage trigger button from os-settings-language-page's shadow dom. --> <settings-subpage
diff --git a/chrome/browser/resources/settings/chromeos/os_route.js b/chrome/browser/resources/settings/chromeos/os_route.js index c12926ca..ebe9d68 100644 --- a/chrome/browser/resources/settings/chromeos/os_route.js +++ b/chrome/browser/resources/settings/chromeos/os_route.js
@@ -101,8 +101,8 @@ // Languages and input r.OS_LANGUAGES = r.ADVANCED.createSection('/osLanguages', 'osLanguages'); - r.OS_LANGUAGES_DETAILs = r.OS_LANGUAGES.createChild('/osLanguages/details'); - r.OS_LANGUAGES_INPUT_METHODs = + r.OS_LANGUAGES_DETAILS = r.OS_LANGUAGES.createChild('/osLanguages/details'); + r.OS_LANGUAGES_INPUT_METHODS = r.OS_LANGUAGES.createChild('/osLanguages/inputMethods'); r.OS_PRINTING = r.ADVANCED.createSection('/osPrinting', 'osPrinting');
diff --git a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html index 7ef30fd..ada43bae 100644 --- a/chrome/browser/resources/settings/safety_check_page/safety_check_page.html +++ b/chrome/browser/resources/settings/safety_check_page/safety_check_page.html
@@ -129,8 +129,8 @@ <div class="separator"></div> <cr-button id="safetyCheckPasswordsButton" class="action-button" on-click="onPasswordsButtonClick_" no-search - aria-label="[[passwordsButtonString_]]"> - [[passwordsButtonString_]] + aria-label="$i18n{safetyCheckExtensionsButton}"> + $i18n{safetyCheckExtensionsButton} </cr-button> </template> </div>
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index b58a6d1..279ee815 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -79,6 +79,7 @@ #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "services/network/public/cpp/features.h" +#include "third_party/blink/public/common/user_agent/user_agent_metadata.h" #include "ui/base/page_transition_types.h" #include "ui/base/ui_base_features.h" #include "ui/gfx/color_palette.h" @@ -1488,9 +1489,13 @@ // Create a tab with an overridden user agent. ui_test_utils::NavigateToURL(browser(), url1_); ASSERT_EQ(0, browser()->tab_strip_model()->active_index()); - // TODO(https://crbug.com/1061917): cover UA client hints override. + blink::UserAgentOverride ua_override; + ua_override.ua_string_override = "override"; + ua_override.ua_metadata_override.emplace(); + ua_override.ua_metadata_override->brand = "Overrider"; + ua_override.ua_metadata_override->major_version = "0"; browser()->tab_strip_model()->GetWebContentsAt(0)->SetUserAgentOverride( - blink::UserAgentOverride::UserAgentOnly("override"), false); + ua_override, false); // Create a tab without an overridden user agent. ui_test_utils::NavigateToURLWithDisposition( @@ -1505,14 +1510,18 @@ ASSERT_EQ(1, new_browser->tab_strip_model()->active_index()); // Confirm that the user agent overrides are properly set. - EXPECT_EQ("override", new_browser->tab_strip_model() - ->GetWebContentsAt(0) - ->GetUserAgentOverride() - .ua_string_override); - EXPECT_EQ("", new_browser->tab_strip_model() - ->GetWebContentsAt(1) - ->GetUserAgentOverride() - .ua_string_override); + blink::UserAgentOverride over0 = new_browser->tab_strip_model() + ->GetWebContentsAt(0) + ->GetUserAgentOverride(); + EXPECT_EQ("override", over0.ua_string_override); + ASSERT_TRUE(over0.ua_metadata_override.has_value()); + EXPECT_TRUE(over0.ua_metadata_override == ua_override.ua_metadata_override); + + blink::UserAgentOverride over1 = new_browser->tab_strip_model() + ->GetWebContentsAt(1) + ->GetUserAgentOverride(); + EXPECT_EQ(std::string(), over1.ua_string_override); + EXPECT_FALSE(over1.ua_metadata_override.has_value()); } // Regression test for crbug.com/125958. When restoring a pinned selected tab in
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc index 765a1bb..769f62b0 100644 --- a/chrome/browser/sessions/session_service.cc +++ b/chrome/browser/sessions/session_service.cc
@@ -489,7 +489,7 @@ void SessionService::SetTabUserAgentOverride( const SessionID& window_id, const SessionID& tab_id, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { if (!ShouldTrackChangesToWindow(window_id)) return; @@ -699,13 +699,17 @@ sessions::CreateSetTabExtensionAppIDCommand(session_id, app_id)); } - // TODO(https://crbug.com/1061917: handle ua_metadata_override as well. - const std::string& ua_override = - tab->GetUserAgentOverride().ua_string_override; - if (!ua_override.empty()) { + const blink::UserAgentOverride& ua_override = tab->GetUserAgentOverride(); + + if (!ua_override.ua_string_override.empty()) { + sessions::SerializedUserAgentOverride serialized_ua_override; + serialized_ua_override.ua_string_override = ua_override.ua_string_override; + serialized_ua_override.opaque_ua_metadata_override = + blink::UserAgentMetadata::Marshal(ua_override.ua_metadata_override); + command_storage_manager_->AppendRebuildCommand( sessions::CreateSetTabUserAgentOverrideCommand(session_id, - ua_override)); + serialized_ua_override)); } for (int i = min_index; i < max_index; ++i) {
diff --git a/chrome/browser/sessions/session_service.h b/chrome/browser/sessions/session_service.h index f42eeb7..df24dcf9 100644 --- a/chrome/browser/sessions/session_service.h +++ b/chrome/browser/sessions/session_service.h
@@ -208,7 +208,8 @@ // sessions::SessionTabHelperDelegate: void SetTabUserAgentOverride(const SessionID& window_id, const SessionID& tab_id, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& + user_agent_override) override; void SetSelectedNavigationIndex(const SessionID& window_id, const SessionID& tab_id, int index) override;
diff --git a/chrome/browser/sessions/session_service_test_helper.cc b/chrome/browser/sessions/session_service_test_helper.cc index 25f2222..d09dab2 100644 --- a/chrome/browser/sessions/session_service_test_helper.cc +++ b/chrome/browser/sessions/session_service_test_helper.cc
@@ -43,7 +43,7 @@ void SessionServiceTestHelper::SetTabUserAgentOverride( const SessionID& window_id, const SessionID& tab_id, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { service()->SetTabUserAgentOverride(window_id, tab_id, user_agent_override); }
diff --git a/chrome/browser/sessions/session_service_test_helper.h b/chrome/browser/sessions/session_service_test_helper.h index 9df1908..a5211ad 100644 --- a/chrome/browser/sessions/session_service_test_helper.h +++ b/chrome/browser/sessions/session_service_test_helper.h
@@ -24,6 +24,7 @@ namespace sessions { class SerializedNavigationEntry; +struct SerializedUserAgentOverride; struct SessionTab; struct SessionWindow; } @@ -45,9 +46,10 @@ const SessionID& tab_id, const std::string& extension_app_id); - void SetTabUserAgentOverride(const SessionID& window_id, - const SessionID& tab_id, - const std::string& user_agent_override); + void SetTabUserAgentOverride( + const SessionID& window_id, + const SessionID& tab_id, + const sessions::SerializedUserAgentOverride& user_agent_override); void SetForceBrowserNotAliveWithNoWindows( bool force_browser_not_alive_with_no_windows);
diff --git a/chrome/browser/sessions/session_service_unittest.cc b/chrome/browser/sessions/session_service_unittest.cc index a50c9bd..cb362005 100644 --- a/chrome/browser/sessions/session_service_unittest.cc +++ b/chrome/browser/sessions/session_service_unittest.cc
@@ -47,6 +47,7 @@ #include "content/public/common/page_state.h" #include "content/public/test/web_contents_tester.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/user_agent/user_agent_metadata.h" #include "third_party/skia/include/core/SkColor.h" using content::NavigationEntry; @@ -817,6 +818,12 @@ std::string user_agent_override = "Mozilla/5.0 (X11; Linux x86_64) " "AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 " "Safari/535.19"; + blink::UserAgentMetadata client_hints_override; + client_hints_override.brand = "Chrome"; + client_hints_override.full_version = "18.0.1025.45"; + client_hints_override.major_version = "18"; + client_hints_override.platform = "Linux"; + client_hints_override.architecture = "x86_64"; SerializedNavigationEntry nav1 = ContentTestHelper::CreateNavigation("http://google.com", "abc"); @@ -824,7 +831,11 @@ helper_.PrepareTabInWindow(window_id, tab_id, 0, true); UpdateNavigation(window_id, tab_id, nav1, true); - helper_.SetTabUserAgentOverride(window_id, tab_id, user_agent_override); + sessions::SerializedUserAgentOverride serialized_override; + serialized_override.ua_string_override = user_agent_override; + serialized_override.opaque_ua_metadata_override = + blink::UserAgentMetadata::Marshal(client_hints_override); + helper_.SetTabUserAgentOverride(window_id, tab_id, serialized_override); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; ReadWindows(&windows, NULL); @@ -833,7 +844,10 @@ sessions::SessionTab* tab = windows[0]->tabs[0].get(); helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab); helper_.AssertNavigationEquals(nav1, tab->navigations[0]); - EXPECT_TRUE(user_agent_override == tab->user_agent_override); + EXPECT_TRUE(user_agent_override == + tab->user_agent_override.ua_string_override); + EXPECT_TRUE(blink::UserAgentMetadata::Marshal(client_hints_override) == + tab->user_agent_override.opaque_ua_metadata_override); } // Makes sure a tab closed by a user gesture is not restored.
diff --git a/chrome/browser/sessions/tab_restore_service_unittest.cc b/chrome/browser/sessions/tab_restore_service_unittest.cc index 3cb8893..c2b7281c 100644 --- a/chrome/browser/sessions/tab_restore_service_unittest.cc +++ b/chrome/browser/sessions/tab_restore_service_unittest.cc
@@ -45,6 +45,7 @@ #include "content/public/test/test_utils.h" #include "content/public/test/web_contents_tester.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/user_agent/user_agent_metadata.h" typedef sessions::TabRestoreService::Entry Entry; typedef sessions::TabRestoreService::Tab Tab; @@ -76,12 +77,19 @@ : url1_("http://1"), url2_("http://2"), url3_("http://3"), - user_agent_override_( + user_agent_override_(blink::UserAgentOverride::UserAgentOnly( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.19" - " (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19"), + " (KHTML, like Gecko) Chrome/18.0.1025.45 Safari/535.19")), time_factory_(NULL), window_id_(SessionID::FromSerializedValue(1)), - tab_id_(SessionID::FromSerializedValue(2)) {} + tab_id_(SessionID::FromSerializedValue(2)) { + user_agent_override_.ua_metadata_override.emplace(); + user_agent_override_.ua_metadata_override->brand = "Chrome"; + user_agent_override_.ua_metadata_override->full_version = "18.0.1025.45"; + user_agent_override_.ua_metadata_override->major_version = "18"; + user_agent_override_.ua_metadata_override->platform = "Linux"; + user_agent_override_.ua_metadata_override->architecture = "x86_64"; + } ~TabRestoreServiceImplTest() override {} @@ -190,7 +198,7 @@ GURL url1_; GURL url2_; GURL url3_; - std::string user_agent_override_; + blink::UserAgentOverride user_agent_override_; std::unique_ptr<sessions::LiveTab> live_tab_; std::unique_ptr<sessions::TabRestoreServiceImpl> service_; TabRestoreTimeFactory* time_factory_; @@ -217,7 +225,10 @@ EXPECT_TRUE(url1_ == tab->navigations[0].virtual_url()); EXPECT_TRUE(url2_ == tab->navigations[1].virtual_url()); EXPECT_TRUE(url3_ == tab->navigations[2].virtual_url()); - EXPECT_EQ("", tab->user_agent_override); + EXPECT_EQ("", tab->user_agent_override.ua_string_override); + EXPECT_TRUE(!blink::UserAgentMetadata::Demarshal( + tab->user_agent_override.opaque_ua_metadata_override) + .has_value()); EXPECT_EQ(2, tab->current_navigation_index); EXPECT_EQ( time_factory_->TimeNow().ToDeltaSinceWindowsEpoch().InMicroseconds(), @@ -226,9 +237,7 @@ NavigateToIndex(1); // And check again, but set the user agent override this time. - // TODO(https://crbug.com/1061917): cover UA client hints override. - web_contents()->SetUserAgentOverride( - blink::UserAgentOverride::UserAgentOnly(user_agent_override_), false); + web_contents()->SetUserAgentOverride(user_agent_override_, false); service_->CreateHistoricalTab(live_tab(), -1); // There should be two entries now. @@ -243,7 +252,12 @@ EXPECT_EQ(url1_, tab->navigations[0].virtual_url()); EXPECT_EQ(url2_, tab->navigations[1].virtual_url()); EXPECT_EQ(url3_, tab->navigations[2].virtual_url()); - EXPECT_EQ(user_agent_override_, tab->user_agent_override); + EXPECT_EQ(user_agent_override_.ua_string_override, + tab->user_agent_override.ua_string_override); + base::Optional<blink::UserAgentMetadata> client_hints_override = + blink::UserAgentMetadata::Demarshal( + tab->user_agent_override.opaque_ua_metadata_override); + EXPECT_EQ(user_agent_override_.ua_metadata_override, client_hints_override); EXPECT_EQ(1, tab->current_navigation_index); EXPECT_EQ( time_factory_->TimeNow().ToDeltaSinceWindowsEpoch().InMicroseconds(),
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 75247e9d..9c2f071b 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3140,6 +3140,8 @@ "views/omnibox/omnibox_popup_contents_view.h", "views/omnibox/omnibox_result_view.cc", "views/omnibox/omnibox_result_view.h", + "views/omnibox/omnibox_row_view.cc", + "views/omnibox/omnibox_row_view.h", "views/omnibox/omnibox_tab_switch_button.cc", "views/omnibox/omnibox_tab_switch_button.h", "views/omnibox/omnibox_text_view.cc",
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 2292d00..6107407 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">ফাইল পুনৰ ডাইনল'ড কৰিবনে?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{#টা অডিঅ' ফাইল}one{#টা অডিঅ' ফাইল}other{#টা অডিঅ' ফাইল}}</translation> <translation id="2687403674020088961">সকলো কুকি অৱৰোধ কৰক (চুপাৰিছ কৰা নহয়)</translation> -<translation id="2689830683995595741">Chrome ব্যৱহাৰ কৰি আপুনি <ph name="BEGIN_LINK1" />Google সেৱাৰ চৰ্তাৱলী<ph name="END_LINK1" /> আৰু <ph name="BEGIN_LINK2" />Google Chrome আৰু Chrome OSৰ সেৱাৰ অতিৰিক্ত চৰ্তাৱলী<ph name="END_LINK2" />ত সন্মতি দিয়ে। <ph name="BEGIN_LINK3" />Family Linkৰ জৰিয়তে পৰিচালনা কৰা Google একাউণ্টৰ বাবে গোপনীয়তাৰ জাননী<ph name="END_LINK3" />টোও প্ৰযোজ্য হয়।</translation> +<translation id="2689830683995595741">Chrome ব্যৱহাৰ কৰি আপুনি <ph name="BEGIN_LINK1" />Google সেৱাৰ চৰ্তাৱলী<ph name="END_LINK1" /> আৰু <ph name="BEGIN_LINK2" />Google Chrome আৰু Chrome OSৰ সেৱাৰ অতিৰিক্ত চৰ্তাৱলী<ph name="END_LINK2" />ত সন্মতি দিয়ে। <ph name="BEGIN_LINK3" />Family Linkৰ জৰিয়তে পৰিচালনা কৰা Google একাউণ্টৰ বাবে গোপনীয়তাৰ জাননী<ph name="END_LINK3" />ও প্ৰযোজ্য হয়।</translation> <translation id="2707726405694321444">পৃষ্ঠাটো ৰিফ্ৰেশ্ব কৰক</translation> <translation id="2709516037105925701">স্বয়ংপূৰ্তি</translation> <translation id="2717722538473713889">ইমেইল ঠিকনাবোৰ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index cbe77e4..5d60519 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">আবার ফাইল ডাউনলোড করবেন?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{#টি অডিও ফাইল}one{#টি অডিও ফাইল}other{#টি অডিও ফাইল}}</translation> <translation id="2687403674020088961">সব কুকি ব্লক করুন (সাজেস্ট করা হচ্ছে না)</translation> -<translation id="2689830683995595741">Chrome ব্যবহার করার মাধ্যমে, আপনি <ph name="BEGIN_LINK1" />Google-এর পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিতে সম্মত হয়েছেন। তাছাড়া, এর সাথে <ph name="BEGIN_LINK3" />Family Link-এর মাধ্যমে ম্যানেজ করা Google অ্যাকাউন্টের গোপনীয়তা বিজ্ঞপ্তিও<ph name="END_LINK3" /> প্রযোজ্য হবে।</translation> +<translation id="2689830683995595741">Chrome ব্যবহার করার মাধ্যমে, আপনি <ph name="BEGIN_LINK1" />Google পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিচ্ছেন। তাছাড়া, এর সাথে <ph name="BEGIN_LINK3" />Family Link-এর মাধ্যমে ম্যানেজ করা Google অ্যাকাউন্টের গোপনীয়তা বিজ্ঞপ্তি<ph name="END_LINK3" />ও প্রযোজ্য হবে।</translation> <translation id="2707726405694321444">পৃষ্ঠা রিফ্রেশ করুন</translation> <translation id="2709516037105925701">স্বয়ংপূরণ</translation> <translation id="2717722538473713889">ইমেল আইডি</translation> @@ -374,7 +374,7 @@ <translation id="3749259744154402564">কাজ করে না</translation> <translation id="3771001275138982843">আপডেট ডাউনলোড করা যায়নি</translation> <translation id="3771033907050503522">ছদ্মবেশী ট্যাবগুলি</translation> -<translation id="3771694256347217732">Google-এর পরিষেবার শর্তাবলী</translation> +<translation id="3771694256347217732">Google পরিষেবার শর্তাবলী</translation> <translation id="3773755127849930740">যুক্ত করার মঞ্জুরি দিতে <ph name="BEGIN_LINK" />ব্লুটুথ চালু করুন<ph name="END_LINK" /></translation> <translation id="3775705724665058594">আপনার ডিভাইসে পাঠান</translation> <translation id="3778956594442850293">হোম স্ক্রিনে যোগ করা হয়েছে</translation> @@ -404,7 +404,7 @@ আপনার পাসফ্রেজ আছে এমন কেউই শুধু আপনার এনক্রিপ্ট করা ডেটা পড়তে পারবেন। পাসফ্রেজ Google-এ পাঠানো হয় না বা Google তা সংরক্ষণ করে না। পাসফ্রেজ ভুলে গেলে বা এই সেটিং পরিবর্তন করতে চাইলে, আপনাকে সিঙ্ক রিসেট করতে হবে। <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation> <translation id="3967822245660637423">ডাউনলোড সম্পূর্ণ</translation> -<translation id="3974987681202239636">Chrome-এ <ph name="APP_NAME" /> খোলা যাবে। চালিয়ে যাওয়ার জন্য, আপনি <ph name="BEGIN_LINK1" />Google-এর পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিতে সম্মত হয়েছেন। তাছাড়া, এর সাথে <ph name="BEGIN_LINK3" />Family Link-এর মাধ্যমে ম্যানেজ করা Google অ্যাকাউন্টের গোপনীয়তা বিজ্ঞপ্তিও<ph name="END_LINK3" /> প্রযোজ্য হবে।</translation> +<translation id="3974987681202239636"><ph name="APP_NAME" /> Chrome-এ খুলবে। চালিয়ে যাওয়ার মাধ্যমে, আপনি <ph name="BEGIN_LINK1" />Google-এর পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিচ্ছেন। তাছাড়া, এর সাথে <ph name="BEGIN_LINK3" />Family Link-এর মাধ্যমে ম্যানেজ করা Google অ্যাকাউন্টের গোপনীয়তা বিজ্ঞপ্তিও<ph name="END_LINK3" /> প্রযোজ্য হবে।</translation> <translation id="397583555483684758">সিঙ্ক কাজ করা বন্ধ করে দিয়েছে</translation> <translation id="3976396876660209797">এই শর্টকাটটি সরিয়ে নতুন করে তৈরি করুন</translation> <translation id="3985215325736559418">আপনি কি আবার <ph name="FILE_NAME" /> ডাউনলোড করতে চান?</translation> @@ -652,7 +652,7 @@ <translation id="5763514718066511291">এই অ্যাপের ইউআরএল কপি করতে ট্যাপ করুন</translation> <translation id="5765780083710877561">বর্ণনা:</translation> <translation id="5793665092639000975"><ph name="SPACE_AVAILABLE" /> এর <ph name="SPACE_USED" /> ব্যবহার করা হচ্ছে</translation> -<translation id="5795872532621730126">সার্চ এবং ব্রাউজ করুন</translation> +<translation id="5795872532621730126">সার্চ এবং ব্রাউজ করা</translation> <translation id="5797070761912323120">সার্চ, বিজ্ঞাপন এবং অন্যান্য Google পরিষেবাকে আপনার মতো করে সাজিয়ে নিতে Google আপনার ইতিহাস ব্যবহার করতে পারে</translation> <translation id="5804241973901381774">অনুমতিগুলি</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# ঘণ্টা আগে}one{# ঘণ্টা আগে}other{# ঘণ্টা আগে}}</translation> @@ -715,7 +715,7 @@ <translation id="6255999984061454636">কন্টেন্টের প্রস্তাবনা</translation> <translation id="6270391203985052864">সাইট আপনাকে বিজ্ঞপ্তি পাঠানোর আগে অনুমতি চাইতে পারে</translation> <translation id="6277522088822131679">পৃষ্ঠাটি প্রিন্ট করার সময় একটি সমস্যা হয়েছিল৷ দয়া করে আবার চেষ্টা করুন৷</translation> -<translation id="6292420053234093573">Chrome ব্যবহার করার মাধ্যমে, আপনি <ph name="BEGIN_LINK1" />Google-এর পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিতে সম্মত হয়েছেন।</translation> +<translation id="6292420053234093573">Chrome ব্যবহার করার মাধ্যমে, আপনি <ph name="BEGIN_LINK1" />Google পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিচ্ছেন।</translation> <translation id="6295158916970320988">সমস্ত সাইট</translation> <translation id="629730747756840877">অ্যাকাউন্ট</translation> <translation id="6297765934698848803">যে সংস্থাটি আপনার ডিভাইস ম্যানেজ করে সেটি আপনার ক্যামেরা বন্ধ করে দিয়েছে।</translation> @@ -730,7 +730,7 @@ <translation id="6364438453358674297">ইতিহাস থেকে প্রস্তাবনা সরাবেন?</translation> <translation id="6369229450655021117">এখান থেকে আপনি ওয়েবে সার্চ করতে, বন্ধুদের সাথে শেয়ার করতে এবং খোলা পৃষ্ঠাগুলি দেখতে পারেন</translation> <translation id="6378173571450987352">বিবরণ: ব্যবহার করা ডেটার পরিমাণ অনুযায়ী সাজানো হয়েছে</translation> -<translation id="6379829913050047669">Chrome-এ <ph name="APP_NAME" /> খোলা যাবে। চালিয়ে যাওয়ার জন্য, আপনি <ph name="BEGIN_LINK1" />Google-এর পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিতে সম্মত হয়েছেন।</translation> +<translation id="6379829913050047669"><ph name="APP_NAME" /> Chrome-এ খুলবে। চালিয়ে যাওয়ার মাধ্যমে, আপনি <ph name="BEGIN_LINK1" />Google পরিষেবার শর্তাবলী<ph name="END_LINK1" /> এবং <ph name="BEGIN_LINK2" />Google Chrome ও Chrome OS-এর পরিষেবার অতিরিক্ত শর্তাবলী<ph name="END_LINK2" /> মেনে নিচ্ছেন।</translation> <translation id="6381421346744604172">ওয়েবসাইট কালো করুন</translation> <translation id="6388207532828177975">পরিষ্কার এবং রিসেট করুন</translation> <translation id="6395288395575013217">লিঙ্ক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 1a9f054..aa1799c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -103,7 +103,7 @@ <translation id="1782483593938241562">Datum završetka <ph name="DATE" /></translation> <translation id="1791662854739702043">Instalirano</translation> <translation id="1792959175193046959">Promijenite zadanu lokaciju za preuzimanje bilo kada</translation> -<translation id="1795251344124198516">Dodatni Uslovi korištenja usluge za Chrome i Chrome OS</translation> +<translation id="1795251344124198516">Dodatni Uslovi korištenja usluge za Chrome i Chrome OS</translation> <translation id="1807246157184219062">Svijetli</translation> <translation id="1810845389119482123">Početno postavljanje sinhronizacije nije završeno</translation> <translation id="1821253160463689938">Kolačići se koriste kako bi se zapamtile vaše postavke čak i ako ne posjećujete te stranice</translation> @@ -233,7 +233,7 @@ <translation id="2650751991977523696">Preuzeti fajl ponovo?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# audio fajl}one{# audio fajl}few{# audio fajla}other{# audio fajlova}}</translation> <translation id="2687403674020088961">Blokiraj sve kolačiće (nije preporučeno)</translation> -<translation id="2689830683995595741">Korištenjem Chromea pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />. Također se primjenjuje <ph name="BEGIN_LINK3" />Obavještenje o privatnosti za Google račune kojima se upravlja putem Family Linka<ph name="END_LINK3" />.</translation> +<translation id="2689830683995595741">Korištenjem Chromea pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />. Također se primjenjuje <ph name="BEGIN_LINK3" />Obavještenje o privatnosti za Google račune kojima se upravlja putem Family Linka<ph name="END_LINK3" />.</translation> <translation id="2707726405694321444">Osvježavanje stranice</translation> <translation id="2709516037105925701">Automatsko popunjavanje</translation> <translation id="2717722538473713889">Adrese e-pošte</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome će učitati vašu stranicu kada bude spreman}one{Chrome će učitati vaše stranice kada bude spreman}few{Chrome će učitati vaše stranice kada bude spreman}other{Chrome će učitati vaše stranice kada bude spreman}}</translation> <translation id="3963007978381181125">Šifrovanje pristupnim izrazom ne uključuje načine plaćanja i adrese iz Google Paya. Samo neko ko ima vaš pristupni izraz može čitati šifrirane podatke. Pristupni izraz se ne šalje Googleu niti se na njemu pohranjuje. Ako zaboravite svoj pristupni izraz ili želite izmijeniti ovu postavku, trebat ćete poništiti sinhronizaciju. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Preuzimanje je završeno</translation> -<translation id="3974987681202239636"><ph name="APP_NAME" /> će se otvoriti u Chromeu. Ako nastavite, pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />. Također se primjenjuje <ph name="BEGIN_LINK3" />Obavještenje o privatnosti za Google račune kojima se upravlja putem Family Linka<ph name="END_LINK3" />.</translation> +<translation id="3974987681202239636"><ph name="APP_NAME" /> će se otvoriti u Chromeu. Ako nastavite, pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />. Također se primjenjuje <ph name="BEGIN_LINK3" />Obavještenje o privatnosti za Google račune kojima se upravlja putem Family Linka<ph name="END_LINK3" />.</translation> <translation id="397583555483684758">Sinhronizacija je prekinuta</translation> <translation id="3976396876660209797">Uklonite i ponovo napravite ovu prečicu</translation> <translation id="3985215325736559418">Želite li ponovo preuzeti fajl <ph name="FILE_NAME" />?</translation> @@ -713,7 +713,7 @@ <translation id="6255999984061454636">Prijedlozi sadržaja</translation> <translation id="6270391203985052864">Web lokacije mogu tražiti da šalju obavještenja</translation> <translation id="6277522088822131679">Došlo je do problema sa štampanjem stranice. Pokušajte ponovo.</translation> -<translation id="6292420053234093573">Korištenjem Chromea pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="6292420053234093573">Korištenjem Chromea pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />.</translation> <translation id="6295158916970320988">Sve web-lokacije</translation> <translation id="629730747756840877">Račun</translation> <translation id="6297765934698848803">Organizacija koja upravlja vašim uređajem je isključila kameru.</translation> @@ -728,7 +728,7 @@ <translation id="6364438453358674297">Ukloniti prijedloge iz historije?</translation> <translation id="6369229450655021117">Odavde možete pretraživati web, dijeliti s prijateljima i vidjeti otvorene stranice</translation> <translation id="6378173571450987352">Detalji: Poredano po količini iskorištenih podataka</translation> -<translation id="6379829913050047669"><ph name="APP_NAME" /> će se otvoriti u Chromeu. Ako nastavite, pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="6379829913050047669"><ph name="APP_NAME" /> će se otvoriti u Chromeu. Ako nastavite, pristajete na <ph name="BEGIN_LINK1" />Googleove Uslove korištenja usluge<ph name="END_LINK1" /> i <ph name="BEGIN_LINK2" />dodatne Uslove korištenja usluge za Google Chrome i Chrome OS<ph name="END_LINK2" />.</translation> <translation id="6381421346744604172">Zatamnjivanje web lokacija</translation> <translation id="6388207532828177975">Obriši i vrati na zadano</translation> <translation id="6395288395575013217">LINK</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index dade31c3..6f247fe 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome stránku načte, až bude připraven}few{Chrome stránky načte, až bude připraven}many{Chrome stránky načte, až bude připraven}other{Chrome stránky načte, až bude připraven}}</translation> <translation id="3963007978381181125">Šifrování pomocí heslové fráze se nevztahuje na platební metody a adresy ze služby Google Pay. Vaše šifrovaná data mohou číst pouze uživatelé, kteří mají vaši heslovou frázi. Heslová fráze se neodesílá do Googlu a není na Googlu uložena. Pokud ji zapomenete nebo toto nastavení budete chtít změnit, bude nutné synchronizaci resetovat. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Stahování bylo dokončeno</translation> -<translation id="3974987681202239636">Aplikace <ph name="APP_NAME" /> se otevře v Chromu. Pokračováním vyjádřujete souhlas se <ph name="BEGIN_LINK1" />smluvními podmínkami společnosti Google<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />dodatečnými smluvními podmínkami prohlížeče Chrome a systému Chrome OS<ph name="END_LINK2" />. Platí také <ph name="BEGIN_LINK3" />upozornění ve věci ochrany soukromí pro účty Google spravované prostřednictvím služby Family<ph name="END_LINK3" />.</translation> +<translation id="3974987681202239636">Aplikace <ph name="APP_NAME" /> se otevře v Chromu. Pokračováním vyjadřujete souhlas se <ph name="BEGIN_LINK1" />smluvními podmínkami společnosti Google<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />dodatečnými smluvními podmínkami prohlížeče Chrome a systému Chrome OS<ph name="END_LINK2" />. Platí také <ph name="BEGIN_LINK3" />upozornění ve věci ochrany soukromí pro účty Google spravované prostřednictvím služby Family<ph name="END_LINK3" />.</translation> <translation id="397583555483684758">Synchronizace přestala fungovat</translation> <translation id="3976396876660209797">Odstraňte tuto zkratku a znovu ji vytvořte</translation> <translation id="3985215325736559418">Opravdu soubor <ph name="FILE_NAME" /> chcete stáhnout znovu?</translation> @@ -728,7 +728,7 @@ <translation id="6364438453358674297">Odstranit návrh z historie?</translation> <translation id="6369229450655021117">Odsud můžete vyhledávat na webu, sdílet obsah s přáteli a zobrazovat otevřené stránky.</translation> <translation id="6378173571450987352">Podrobnosti: Seřazeno podle množství využitých dat</translation> -<translation id="6379829913050047669">Aplikace <ph name="APP_NAME" /> se otevře v Chromu. Pokračováním vyjádřujete souhlas se <ph name="BEGIN_LINK1" />smluvními podmínkami společnosti Google<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />dodatečnými smluvními podmínkami prohlížeče Chrome a systému Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="6379829913050047669">Aplikace <ph name="APP_NAME" /> se otevře v Chromu. Pokračováním vyjadřujete souhlas se <ph name="BEGIN_LINK1" />smluvními podmínkami společnosti Google<ph name="END_LINK1" /> a <ph name="BEGIN_LINK2" />dodatečnými smluvními podmínkami prohlížeče Chrome a systému Chrome OS<ph name="END_LINK2" />.</translation> <translation id="6381421346744604172">Ztmavit webové stránky</translation> <translation id="6388207532828177975">Vymazat a resetovat</translation> <translation id="6395288395575013217">ODKAZ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index f25b7a7..803757b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">¿Deseas volver a descargar el archivo?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# archivo de audio}other{# archivos de audio}}</translation> <translation id="2687403674020088961">Bloquear todas las cookies (opción no recomendada)</translation> -<translation id="2689830683995595741">Si usas Chrome, aceptas las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Google Chrome y el Sistema operativo Chrome<ph name="END_LINK2" />. También se aplica el <ph name="BEGIN_LINK3" />Aviso de Privacidad para las cuentas de Google administradas con Family Link<ph name="END_LINK3" />.</translation> +<translation id="2689830683995595741">Si usas Chrome, aceptas las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Google Chrome y el Sistema operativo Chrome<ph name="END_LINK2" />. También se aplica el <ph name="BEGIN_LINK3" />Aviso de Privacidad para las Cuentas de Google administradas con Family Link<ph name="END_LINK3" />.</translation> <translation id="2707726405694321444">Actualizar página</translation> <translation id="2709516037105925701">Autocompletar</translation> <translation id="2717722538473713889">Direcciones de correo electrónico</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome cargará la página cuando esté lista}other{Chrome cargará las páginas cuando estén listas}}</translation> <translation id="3963007978381181125">La encriptación de la frase de contraseña no incluye formas de pago ni direcciones de Google Pay. Solo las personas que tengan tu frase de contraseña pueden leer los datos encriptados. Google no envía ni almacena la frase de contraseña. Si la olvidas o quieres cambiar esta configuración, deberás restablecer la sincronización. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Descarga completa</translation> -<translation id="3974987681202239636">Se abrirá <ph name="APP_NAME" /> en Chrome. Si continúas, aceptas las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Google Chrome y el Sistema operativo Chrome<ph name="END_LINK2" />. También se aplica el <ph name="BEGIN_LINK3" />Aviso de Privacidad para las cuentas de Google administradas con Family Link<ph name="END_LINK3" />.</translation> +<translation id="3974987681202239636">Se abrirá <ph name="APP_NAME" /> en Chrome. Si continúas, aceptas las <ph name="BEGIN_LINK1" />Condiciones del Servicio de Google<ph name="END_LINK1" /> y las <ph name="BEGIN_LINK2" />Condiciones del Servicio Adicionales de Google Chrome y el Sistema operativo Chrome<ph name="END_LINK2" />. También se aplica el <ph name="BEGIN_LINK3" />Aviso de Privacidad para las Cuentas de Google administradas con Family Link<ph name="END_LINK3" />.</translation> <translation id="397583555483684758">La sincronización dejó de funcionar</translation> <translation id="3976396876660209797">Quita y vuelve a crear este acceso directo</translation> <translation id="3985215325736559418">¿No quieres descargar <ph name="FILE_NAME" /> de nuevo?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index e3f0612..b26a285f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">फ़ाइल दोबारा डाउनलोड करें?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ऑडियो फ़ाइल}one{# ऑडियो फ़ाइलें}other{# ऑडियो फ़ाइलें}}</translation> <translation id="2687403674020088961">सभी कुकी ब्लॉक करें (हम ऐसा करने का सुझाव नहीं देते)</translation> -<translation id="2689830683995595741">Chrome इस्तेमाल करने का मतलब है कि आप <ph name="BEGIN_LINK1" />Google की सेवा की शर्तों<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />Google Chrome और Chrome OS की सेवा की अतिरिक्त शर्तों<ph name="END_LINK2" /> से सहमत हैं. साथ ही, <ph name="BEGIN_LINK3" />Family Link से प्रबंधित होने वाले Google खातों के लिए निजता सूचना<ph name="END_LINK3" /> से भी आप सहमत हैं.</translation> +<translation id="2689830683995595741">Chrome इस्तेमाल करने का मतलब है कि आप <ph name="BEGIN_LINK1" />Google की सेवा की शर्तों<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />Google Chrome और Chrome OS की सेवा की अतिरिक्त शर्तों<ph name="END_LINK2" /> से सहमत हैं. साथ ही, आप <ph name="BEGIN_LINK3" />Family Link से प्रबंधित होने वाले Google खातों के लिए निजता सूचना<ph name="END_LINK3" /> से भी सहमत हैं.</translation> <translation id="2707726405694321444">पेज रीफ्रेश करें</translation> <translation id="2709516037105925701">ऑटोमैटिक भरना</translation> <translation id="2717722538473713889">ईमेल पते</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{तैयार होने पर Chrome आपका पेज लोड करेगा}one{तैयार होने पर Chrome आपके पेज लोड करेगा}other{तैयार होने पर Chrome आपके पेज लोड करेगा}}</translation> <translation id="3963007978381181125">लंबा पासवर्ड सुरक्षित करने के तरीके में Google Pay से भुगतान करने की विधि और पते शामिल नहीं हैं. सिर्फ़ वह इंसान आपका सुरक्षित किया हुआ डेटा पढ़ सकता है जिसके पास आपका लंबा पासवर्ड है. Google की ओर से लंबा पासवर्ड भेजा या संग्रहित नहीं किया जाता है. अगर आप अपना लंबा पासवर्ड भूल जाते हैं या इस सेटिंग को बदलना चाहते हैं, तो आपको सिंक रीसेट करना होगा. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="3967822245660637423">डाउनलोड पूरा हुआ</translation> -<translation id="3974987681202239636"><ph name="APP_NAME" />, Chrome में खुलेगा. जारी रखने का मतलब है कि आप <ph name="BEGIN_LINK1" />Google की सेवा की शर्तों<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />Google Chrome और Chrome OS की सेवा की अतिरिक्त शर्तों<ph name="END_LINK2" /> से सहमत हैं. साथ ही, <ph name="BEGIN_LINK3" />Family Link से प्रबंधित होने वाले Google खातों के लिए निजता सूचना<ph name="END_LINK3" /> से भी आप सहमत हैं.</translation> +<translation id="3974987681202239636"><ph name="APP_NAME" />, Chrome में खुलेगा. जारी रखने का मतलब है कि आप <ph name="BEGIN_LINK1" />Google की सेवा की शर्तों<ph name="END_LINK1" /> और <ph name="BEGIN_LINK2" />Google Chrome और Chrome OS की सेवा की अतिरिक्त शर्तों<ph name="END_LINK2" /> से सहमत हैं. साथ ही, आप <ph name="BEGIN_LINK3" />Family Link से प्रबंधित होने वाले Google खातों के लिए निजता सूचना<ph name="END_LINK3" /> से भी सहमत हैं.</translation> <translation id="397583555483684758">समन्वयन ने काम करना बंद कर दिया है</translation> <translation id="3976396876660209797">इस शॉर्टकट को निकालें और इसे फिर से बनाएं</translation> <translation id="3985215325736559418">क्या आप <ph name="FILE_NAME" /> को फिर से डाउनलोड करना चाहते हैं?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index 860238ab..7eb5101 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -374,7 +374,7 @@ <translation id="3749259744154402564">Nije podržano</translation> <translation id="3771001275138982843">Preuzimanje ažuriranja nije uspjelo</translation> <translation id="3771033907050503522">Anonimne kartice</translation> -<translation id="3771694256347217732">Googleove uvjete pružanja usluge</translation> +<translation id="3771694256347217732">Googleovi uvjeti pružanja usluge</translation> <translation id="3773755127849930740"><ph name="BEGIN_LINK" />Uključite Bluetooth<ph name="END_LINK" /> da biste omogućili uparivanje</translation> <translation id="3775705724665058594">Pošaljite na svoje uređaje</translation> <translation id="3778956594442850293">Dodano na početni zaslon</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index ae4941d..3a51b99 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">Scaricare nuovamente il file?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# file audio}other{# file audio}}</translation> <translation id="2687403674020088961">Blocca tutti i cookie (non consigliato)</translation> -<translation id="2689830683995595741">Utilizzando Chrome, accetti i <ph name="BEGIN_LINK1" />Termini di servizio di Google<ph name="END_LINK1" /> e i <ph name="BEGIN_LINK2" />Termini di servizio aggiuntivi di Google Chrome e Chrome OS<ph name="END_LINK2" />. Si applicano inoltre le <ph name="BEGIN_LINK3" />Norme sulla privacy per gli Account Google gestiti tramite Family Link<ph name="END_LINK3" />.</translation> +<translation id="2689830683995595741">Utilizzando Chrome, accetti i <ph name="BEGIN_LINK1" />Termini di servizio di Google<ph name="END_LINK1" /> e i <ph name="BEGIN_LINK2" />Termini di servizio aggiuntivi di Google Chrome e Chrome OS<ph name="END_LINK2" />. Si applica inoltre l'<ph name="BEGIN_LINK3" />Informativa sulla privacy per gli Account Google gestiti tramite Family Link<ph name="END_LINK3" />.</translation> <translation id="2707726405694321444">Aggiorna la pagina</translation> <translation id="2709516037105925701">Compilazione automatica</translation> <translation id="2717722538473713889">Indirizzi email</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome caricherà la tua pagina quando sarà pronta}other{Chrome caricherà le tue pagine quando saranno pronte}}</translation> <translation id="3963007978381181125">La crittografia della passphrase non include metodi di pagamento e indirizzi di Google Pay. Soltanto chi conosce la tua passphrase può leggere i tuoi dati criptati. La passphrase non viene inviata a Google né memorizzata. Se dimentichi la passphrase o vuoi modificare questa impostazione, dovrai reimpostare la sincronizzazione. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Download completato</translation> -<translation id="3974987681202239636"><ph name="APP_NAME" /> si aprirà in Chrome. Se continui, accetti i <ph name="BEGIN_LINK1" />Termini di servizio di Google<ph name="END_LINK1" /> e i <ph name="BEGIN_LINK2" />Termini di servizio aggiuntivi di Google Chrome e Chrome OS<ph name="END_LINK2" />.Si applicano inoltre le <ph name="BEGIN_LINK3" />Norme sulla privacy per gli Account Google gestiti tramite Family Link<ph name="END_LINK3" />.</translation> +<translation id="3974987681202239636"><ph name="APP_NAME" /> si aprirà in Chrome. Se continui, accetti i <ph name="BEGIN_LINK1" />Termini di servizio di Google<ph name="END_LINK1" /> e i <ph name="BEGIN_LINK2" />Termini di servizio aggiuntivi di Google Chrome e Chrome OS<ph name="END_LINK2" />.Si applica inoltre l'<ph name="BEGIN_LINK3" />Informativa sulla privacy per gli Account Google gestiti tramite Family Link<ph name="END_LINK3" />.</translation> <translation id="397583555483684758">La sincronizzazione si è interrotta</translation> <translation id="3976396876660209797">Rimuovi e ricrea la scorciatoia</translation> <translation id="3985215325736559418">Scaricare di nuovo <ph name="FILE_NAME" />?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index 7acf61a..92acf3b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">האם להוריד את הקובץ שוב?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{קובץ אודיו אחד (#)}two{# קובצי אודיו}many{# קובצי אודיו}other{# קובצי אודיו}}</translation> <translation id="2687403674020088961">חסימה של כל קובצי ה-cookie (לא מומלץ)</translation> -<translation id="2689830683995595741">השימוש ב-Chrome מהווה הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />. על השימוש חלה גם <ph name="BEGIN_LINK3" />הודעת הפרטיות לגבי חשבונות Google המנוהלים באמצעות Family Link<ph name="END_LINK3" />.</translation> +<translation id="2689830683995595741">השימוש ב-Chrome מבטא הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />. על השימוש חלה גם <ph name="BEGIN_LINK3" />הודעת הפרטיות לגבי חשבונות Google המנוהלים באמצעות Family Link<ph name="END_LINK3" />.</translation> <translation id="2707726405694321444">רענן את הדף</translation> <translation id="2709516037105925701">מילוי אוטומטי</translation> <translation id="2717722538473713889">כתובות אימייל</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome יטען את הדף כשיהיה מוכן}two{Chrome יטען את הדפים כשיהיו מוכנים}many{Chrome יטען את הדפים כשיהיו מוכנים}other{Chrome יטען את הדפים כשיהיו מוכנים}}</translation> <translation id="3963007978381181125">הצפנה באמצעות ביטוי סיסמה לא כוללת אמצעי תשלום וכתובות מ-Google Pay. רק מי שיודע את ביטוי הסיסמה שלך יכול לקרוא את הנתונים המוצפנים. ביטוי הסיסמה לא נשלח אל Google והיא אינה מאחסנת אותו. אם שוכחים את ביטוי הסיסמה או רוצים לשנות את ההגדרה הזו, צריך לאפס את הסנכרון. <ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /></translation> <translation id="3967822245660637423">ההורדה הושלמה</translation> -<translation id="3974987681202239636">האפליקציה <ph name="APP_NAME" /> תיפתח ב-Chrome. המשך הפעולה מהווה הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />. על פעולה זו חלה גם <ph name="BEGIN_LINK3" />הודעת הפרטיות לגבי חשבונות Google המנוהלים באמצעות Family Link<ph name="END_LINK3" />.</translation> +<translation id="3974987681202239636">האפליקציה <ph name="APP_NAME" /> תיפתח ב-Chrome. המשך הפעולה מבטא הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />. על פעולה זו חלה גם <ph name="BEGIN_LINK3" />הודעת הפרטיות לגבי חשבונות Google המנוהלים באמצעות Family Link<ph name="END_LINK3" />.</translation> <translation id="397583555483684758">הסנכרון הפסיק לפעול</translation> <translation id="3976396876660209797">הסרה ויצירה מחדש של מקש הקיצור הזה</translation> <translation id="3985215325736559418">האם להוריד שוב את <ph name="FILE_NAME" />?</translation> @@ -713,7 +713,7 @@ <translation id="6255999984061454636">הצעות לתוכן</translation> <translation id="6270391203985052864">אתרים יכולים לבקש לשלוח התראות</translation> <translation id="6277522088822131679">אירעה בעיה בעת הדפסת הדף. נסה שוב.</translation> -<translation id="6292420053234093573">השימוש ב-Chrome מהווה הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="6292420053234093573">השימוש ב-Chrome מבטא הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />.</translation> <translation id="6295158916970320988">כל האתרים</translation> <translation id="629730747756840877">חשבון</translation> <translation id="6297765934698848803">המצלמה הושבתה במכשיר, בהתאם להגדרות שנקבעו על ידי הארגון שמנהל את המכשיר.</translation> @@ -728,7 +728,7 @@ <translation id="6364438453358674297">האם להסיר את ההצעה מההיסטוריה?</translation> <translation id="6369229450655021117">מכאן אפשר לחפש באינטרנט, לשתף עם חברים ולראות דפים פתוחים</translation> <translation id="6378173571450987352">פרטים: מיון לפי נפח הנתונים שנצרכו</translation> -<translation id="6379829913050047669">האפליקציה <ph name="APP_NAME" /> תיפתח ב-Chrome. המשך הפעולה מהווה הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />.</translation> +<translation id="6379829913050047669">האפליקציה <ph name="APP_NAME" /> תיפתח ב-Chrome. המשך הפעולה מבטא הסכמה ל<ph name="BEGIN_LINK1" />תנאים ולהגבלות של Google<ph name="END_LINK1" /> ול<ph name="BEGIN_LINK2" />תנאים ולהגבלות הנוספים של Google Chrome ו-Chrome OS<ph name="END_LINK2" />.</translation> <translation id="6381421346744604172">תצוגה כהה יותר של אתרים</translation> <translation id="6388207532828177975">ניקוי ואיפוס</translation> <translation id="6395288395575013217">קישור</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 28aa7db..d758cac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">ഫയൽ വീണ്ടും ഡൗൺലോഡ് ചെയ്യണോ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ഓഡിയോ ഫയൽ}other{# ഓഡിയോ ഫയലുകള്}}</translation> <translation id="2687403674020088961">എല്ലാ കുക്കികളും ബ്ലോക്ക് ചെയ്യുക (ശുപാർശ ചെയ്യുന്നില്ല)</translation> -<translation id="2689830683995595741">Chrome ഉപയോഗിക്കുന്നതിലൂടെ, നിങ്ങൾ <ph name="BEGIN_LINK1" />Google സേവന നിബന്ധനകളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />Google Chrome, Chrome OS അധിക സേവന നിബന്ധനകളും<ph name="END_LINK2" /> അംഗീകരിക്കുന്നു. <ph name="BEGIN_LINK3" />Family Link ഉപയോഗിച്ച് മാനേജ് ചെയ്യപ്പെടുന്ന Google അക്കൗണ്ടുകൾക്കുള്ള സ്വകാര്യതാ കുറിപ്പും<ph name="END_LINK3" /> ബാധകമാണ്.</translation> +<translation id="2689830683995595741">Chrome ഉപയോഗിക്കുന്നതിലൂടെ, നിങ്ങൾ <ph name="BEGIN_LINK1" />Google സേവന നിബന്ധനകളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />Google Chrome, Chrome OS അധിക സേവന നിബന്ധനകളും<ph name="END_LINK2" /> അംഗീകരിക്കുന്നു. <ph name="BEGIN_LINK3" />Family Link ഉപയോഗിച്ച് മാനേജ് ചെയ്യുന്ന Google അക്കൗണ്ടുകൾക്കുള്ള സ്വകാര്യതാ കുറിപ്പും<ph name="END_LINK3" /> ബാധകമാണ്.</translation> <translation id="2707726405694321444">പേജ് പുതുക്കുക</translation> <translation id="2709516037105925701">സ്വയമേവ പൂരിപ്പിക്കൽ</translation> <translation id="2717722538473713889">ഇമെയിൽ വിലാസങ്ങൾ</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{നിങ്ങളുടെ പേജ് തയ്യാറാകുമ്പോൾ Chrome ലോഡ് ചെയ്യും}other{നിങ്ങളുടെ പേജുകൾ തയ്യാറാകുമ്പോൾ Chrome ലോഡ് ചെയ്യും}}</translation> <translation id="3963007978381181125">പാസ്ഫ്രെയ്സ് എൻക്രിപ്ഷനിൽ, Google Pay-ൽ നിന്നുള്ള പേയ്മെന്റ് രീതികളും വിലാസങ്ങളും ഉൾപ്പെടുന്നില്ല. നിങ്ങളുടെ പാസ്ഫ്രെയ്സുള്ള വ്യക്തിക്ക് മാത്രമേ എൻക്രിപ്റ്റ് ചെയ്ത ഡാറ്റ വായിക്കാനാവൂ. പാസ്ഫ്രെയ്സ് Google-ലേക്ക് അയയ്ക്കുകയോ സംഭരിക്കുകയോ ചെയ്യുന്നില്ല. പാസ്ഫ്രെയ്സ് മറന്നുപോവുകയോ ഈ ക്രമീകരണം മാറ്റുകയോ ചെയ്യണമെങ്കിൽ, സമന്വയം പുനഃക്രമീകരിക്കേണ്ടി വരും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="3967822245660637423">ഡൗൺലോഡ് പൂർത്തിയായി</translation> -<translation id="3974987681202239636"><ph name="APP_NAME" />, Chrome-ൽ തുറക്കും. തുടരുന്നതിലൂടെ, നിങ്ങൾ <ph name="BEGIN_LINK1" />Google സേവന നിബന്ധനകളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />Google Chrome, Chrome OS അധിക സേവന നിബന്ധനകളും<ph name="END_LINK2" /> അംഗീകരിക്കുന്നു. <ph name="BEGIN_LINK3" />Family Link ഉപയോഗിച്ച് മാനേജ് ചെയ്യപ്പെടുന്ന Google അക്കൗണ്ടുകൾക്കുള്ള സ്വകാര്യതാ കുറിപ്പും<ph name="END_LINK3" /> ബാധകമാണ്.</translation> +<translation id="3974987681202239636"><ph name="APP_NAME" />, Chrome-ൽ തുറക്കും. തുടരുന്നതിലൂടെ, നിങ്ങൾ <ph name="BEGIN_LINK1" />Google സേവന നിബന്ധനകളും<ph name="END_LINK1" /> <ph name="BEGIN_LINK2" />Google Chrome, Chrome OS അധിക സേവന നിബന്ധനകളും<ph name="END_LINK2" /> അംഗീകരിക്കുന്നു. <ph name="BEGIN_LINK3" />Family Link ഉപയോഗിച്ച് മാനേജ് ചെയ്യുന്ന Google അക്കൗണ്ടുകൾക്കുള്ള സ്വകാര്യതാ കുറിപ്പും<ph name="END_LINK3" /> ബാധകമാണ്.</translation> <translation id="397583555483684758">'സമന്വയം' പ്രവർത്തനം നിർത്തി</translation> <translation id="3976396876660209797">ഈ കുറുക്കുവഴി നീക്കംചെയ്ത് പുനസൃഷ്ടിക്കുക</translation> <translation id="3985215325736559418">നിങ്ങൾക്ക് വീണ്ടും <ph name="FILE_NAME" /> ഡൗൺലോഡ് ചെയ്യണോ?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 42020e01..f747f5f6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">ਕੀ ਫ਼ਾਈਲ ਦੁਬਾਰਾ ਡਾਊਨਲੋਡ ਕਰਨੀ ਹੈ?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# ਆਡੀਓ ਫ਼ਾਈਲ}one{# ਆਡੀਓ ਫ਼ਾਈਲ}other{# ਆਡੀਓ ਫ਼ਾਈਲਾਂ}}</translation> <translation id="2687403674020088961">ਸਾਰੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਬਲਾਕ ਕਰੋ (ਇਸਦੀ ਸਿਫ਼ਾਰਸ਼ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ)</translation> -<translation id="2689830683995595741">Chrome ਨੂੰ ਵਰਤ ਕੇ, ਤੁਸੀਂ <ph name="BEGIN_LINK1" />Google ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK1" /> ਅਤੇ <ph name="BEGIN_LINK2" />Google Chrome ਅਤੇ Chrome OS ਦੇ ਵਧੀਕ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK2" /> ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ। <ph name="BEGIN_LINK3" />Family Link ਨਾਲ ਪ੍ਰਤੀਬੰਧਿਤ ਕੀਤੇ ਗਏ Google ਖਾਤਿਆਂ ਲਈ ਪਰਦੇਦਾਰੀ ਨੋਟਿਸ<ph name="END_LINK3" /> ਵੀ ਲਾਗੂ ਹੁੰਦਾ ਹੈ।</translation> +<translation id="2689830683995595741">Chrome ਨੂੰ ਵਰਤ ਕੇ, ਤੁਸੀਂ <ph name="BEGIN_LINK1" />Google ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK1" /> ਅਤੇ <ph name="BEGIN_LINK2" />Google Chrome ਅਤੇ Chrome OS ਦੇ ਵਧੀਕ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK2" /> ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ। <ph name="BEGIN_LINK3" />Family Link ਨਾਲ ਪ੍ਰਤੀਬੰਧਿਤ ਕੀਤੇ ਜਾਂਦੇ Google ਖਾਤਿਆਂ ਲਈ ਪਰਦੇਦਾਰੀ ਨੋਟਿਸ<ph name="END_LINK3" /> ਵੀ ਲਾਗੂ ਹੁੰਦਾ ਹੈ।</translation> <translation id="2707726405694321444">ਪੰਨੇ ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="2709516037105925701">ਆਟੋਫਿਲ</translation> <translation id="2717722538473713889">ਈਮੇਲ ਪਤੇ</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{ਤਿਆਰ ਹੋਣ 'ਤੇ Chrome ਤੁਹਾਡੇ ਪੰਨੇ ਨੂੰ ਲੋਡ ਕਰੇਗਾ}one{ਤਿਆਰ ਹੋਣ 'ਤੇ Chrome ਤੁਹਾਡੇ ਪੰਨੇ ਨੂੰ ਲੋਡ ਕਰੇਗਾ}other{ਤਿਆਰ ਹੋਣ 'ਤੇ Chrome ਤੁਹਾਡੇ ਪੰਨਿਆਂ ਨੂੰ ਲੋਡ ਕਰੇਗਾ}}</translation> <translation id="3963007978381181125">ਪਾਸਫਰੇਜ਼ ਇਨਕ੍ਰਿਪਸ਼ਨ ਵਿੱਚ Google Pay ਦੀਆਂ ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਅਤੇ ਪਤੇ ਸ਼ਾਮਲ ਨਹੀਂ ਹਨ। ਤੁਹਾਡੇ ਇਨਕ੍ਰਿਪਟਡ ਡਾਟੇ ਨੂੰ ਸਿਰਫ਼ ਓਹੀ ਵਿਅਕਤੀ ਪੜ੍ਹ ਸਕਦਾ ਹੈ ਜਿਸ ਕੋਲ ਤੁਹਾਡਾ ਪਾਸਫਰੇਜ਼ ਹੁੰਦਾ ਹੈ। ਪਾਸਫਰੇਜ਼ Google ਨੂੰ ਭੇਜਿਆ ਜਾਂ ਉਸ ਵੱਲੋਂ ਸਟੋਰ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਆਪਣਾ ਪਾਸਫਰੇਜ਼ ਭੁੱਲ ਜਾਂਦੇ ਹੋ ਜਾਂ ਇਸ ਸੈਟਿੰਗ ਨੂੰ ਬਦਲਣਾ ਚਾਹੁੰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਸਮਕਾਲੀਕਰਨ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਦੀ ਲੋੜ ਪਵੇਗੀ। <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="3967822245660637423">ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ</translation> -<translation id="3974987681202239636"><ph name="APP_NAME" /> ਨੂੰ Chrome ਵਿੱਚ ਖੋਲ੍ਹਿਆ ਜਾਵੇਗਾ। ਜਾਰੀ ਰੱਖ ਕੇ, ਤੁਸੀਂ <ph name="BEGIN_LINK1" />Google ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK1" /> ਅਤੇ <ph name="BEGIN_LINK2" />Google Chrome ਅਤੇ Chrome OS ਦੇ ਵਧੀਕ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK2" /> ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ। <ph name="BEGIN_LINK3" />Family Link ਨਾਲ ਪ੍ਰਤੀਬੰਧਿਤ ਕੀਤੇ ਗਏ Google ਖਾਤਿਆਂ ਲਈ ਪਰਦੇਦਾਰੀ ਨੋਟਿਸ<ph name="END_LINK3" /> ਵੀ ਲਾਗੂ ਹੁੰਦਾ ਹੈ।</translation> +<translation id="3974987681202239636"><ph name="APP_NAME" /> ਨੂੰ Chrome ਵਿੱਚ ਖੋਲ੍ਹਿਆ ਜਾਵੇਗਾ। ਜਾਰੀ ਰੱਖ ਕੇ, ਤੁਸੀਂ <ph name="BEGIN_LINK1" />Google ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK1" /> ਅਤੇ <ph name="BEGIN_LINK2" />Google Chrome ਅਤੇ Chrome OS ਦੇ ਵਧੀਕ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK2" /> ਨਾਲ ਸਹਿਮਤ ਹੁੰਦੇ ਹੋ। <ph name="BEGIN_LINK3" />Family Link ਨਾਲ ਪ੍ਰਤੀਬੰਧਿਤ ਕੀਤੇ ਜਾਂਦੇ Google ਖਾਤਿਆਂ ਲਈ ਪਰਦੇਦਾਰੀ ਨੋਟਿਸ<ph name="END_LINK3" /> ਵੀ ਲਾਗੂ ਹੁੰਦਾ ਹੈ।</translation> <translation id="397583555483684758">ਸਮਕਾਲੀਕਰਨ ਨੇ ਕੰਮ ਕਰਨਾ ਬੰਦ ਕਰ ਦਿੱਤਾ ਹੈ</translation> <translation id="3976396876660209797">ਇਸ ਸ਼ਾਰਟਕੱਟ ਨੂੰ ਹਟਾ ਕੇ ਮੁੜ-ਬਣਾਓ</translation> <translation id="3985215325736559418">ਕੀ ਤੁਸੀਂ <ph name="FILE_NAME" /> ਨੂੰ ਦੁਬਾਰਾ ਡਾਊਨਲੋਡ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index 73f6552..c57c42b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">Želite znova prenesti datoteko?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# zvočna datoteka}one{# zvočna datoteka}two{# zvočni datoteki}few{# zvočne datoteke}other{# zvočnih datotek}}</translation> <translation id="2687403674020088961">Blokiranje vseh piškotkov (ni priporočljivo)</translation> -<translation id="2689830683995595741">Če uporabljate Chrome, se strinjate z <ph name="BEGIN_LINK1" />Googlovimi pogoji storitve<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />dodatnimi pogoji storitve za Google Chrome in Chrome OS<ph name="END_LINK2" />. Za vas velja tudi <ph name="BEGIN_LINK3" />pravilnik o zasebnosti za račune Google, upravljane z aplikacijo Family Link<ph name="END_LINK3" />.</translation> +<translation id="2689830683995595741">Če uporabljate Chrome, se strinjate z <ph name="BEGIN_LINK1" />Googlovimi pogoji storitve<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />dodatnimi pogoji storitve za Google Chrome in Chrome OS<ph name="END_LINK2" />. Za vas velja tudi <ph name="BEGIN_LINK3" />pravilnik o zasebnosti za račune Google, upravljane s Family Linkom<ph name="END_LINK3" />.</translation> <translation id="2707726405694321444">Osveži stran</translation> <translation id="2709516037105925701">Samodejno izpolnjevanje</translation> <translation id="2717722538473713889">E-poštni naslovi</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome bo naložil stran, ko bo pripravljen}one{Chrome bo naložil strani, ko bo pripravljen}two{Chrome bo naložil strani, ko bo pripravljen}few{Chrome bo naložil strani, ko bo pripravljen}other{Chrome bo naložil strani, ko bo pripravljen}}</translation> <translation id="3963007978381181125">Šifriranje gesla ne vključuje plačilnih sredstev in naslovov iz Googla Pay. Vaše šifrirane podatke lahko bere samo oseba z vašim geslom. Geslo ni poslano Googlu in ni shranjeno v Googlu. Če ga pozabite ali želite spremeniti to nastavitev, boste morali sinhronizacijo ponastaviti. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> <translation id="3967822245660637423">Prenos končan</translation> -<translation id="3974987681202239636">Aplikacija <ph name="APP_NAME" /> se bo odprla v Chromu. Če nadaljujete, se strinjate z <ph name="BEGIN_LINK1" />Googlovimi pogoji storitve<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />dodatnimi pogoji storitve za Google Chrome in Chrome OS<ph name="END_LINK2" />. Za vas velja tudi <ph name="BEGIN_LINK3" />pravilnik o zasebnosti za račune Google, upravljane z aplikacijo Family Link<ph name="END_LINK3" />.</translation> +<translation id="3974987681202239636">Aplikacija <ph name="APP_NAME" /> se bo odprla v Chromu. Če nadaljujete, se strinjate z <ph name="BEGIN_LINK1" />Googlovimi pogoji storitve<ph name="END_LINK1" /> in <ph name="BEGIN_LINK2" />dodatnimi pogoji storitve za Google Chrome in Chrome OS<ph name="END_LINK2" />. Za vas velja tudi <ph name="BEGIN_LINK3" />pravilnik o zasebnosti za račune Google, upravljane s Family Linkom<ph name="END_LINK3" />.</translation> <translation id="397583555483684758">Sinhronizacija je prenehala delovati</translation> <translation id="3976396876660209797">Odstranite in znova ustvarite to bližnjico</translation> <translation id="3985215325736559418">Ali želite znova prenesti datoteko <ph name="FILE_NAME" />?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index fd368b57..3b2232a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -374,7 +374,7 @@ <translation id="3749259744154402564">غیر تعاون یافتہ</translation> <translation id="3771001275138982843">اپ ڈیٹ ڈاؤن لوڈ نہیں ہو سکا</translation> <translation id="3771033907050503522">پوشیدگی ٹیبز</translation> -<translation id="3771694256347217732">Google سروس کی شرائط</translation> +<translation id="3771694256347217732">Google کی سروس کی شرائط</translation> <translation id="3773755127849930740">جوڑا بنانے کی اجازت دینے کیلئے <ph name="BEGIN_LINK" />بلوٹوتھ کو آن کریں<ph name="END_LINK" /></translation> <translation id="3775705724665058594">اپنے آلات پر بھیجیں</translation> <translation id="3778956594442850293">ہوم اسکرین میں شامل ہو گئی</translation> @@ -401,7 +401,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{آپ کا صفحہ تیار ہونے پر Chrome اسے لوڈ کرے گا}other{آپ کے صفحات تیار ہونے پر Chrome انہیں لوڈ کرے گا}}</translation> <translation id="3963007978381181125">پاس فریز کی مرموز کاری میں Google Pay سے ادائيگی کے طریقے اور پتے شامل نہیں ہوتے ہیں۔ آپ کے پاس فریز کا حامل شخص ہی آپ کے مرموز کردہ ڈیٹا کو پڑھ سکتا ہے۔ پاس فریز Google کو نہیں بھیجا جاتا ہے اور نہ ہی Google اسے اسٹور کرتا ہے۔ اگر آپ اپنا پاس فریز بھول جاتے ہیں یا اس ترتیب کو تبدیل کرنا چاہتے ہیں تو آپ کو مطابقت پذیری کو دوبارہ ترتیب دینے کی ضرورت ہوگی۔ <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="3967822245660637423">ڈاؤن لوڈ مکمل ہوگیا ہے</translation> -<translation id="3974987681202239636"><ph name="APP_NAME" /> Chrome میں کھلے گا۔ جاری رکھ کر آپ، <ph name="BEGIN_LINK1" />Google کی سروس کی شرائط<ph name="END_LINK1" />، اور <ph name="BEGIN_LINK2" />Google Chrome اور Chrome OS کی اضافی سروس کی شرائط سے اتفاق کرتے ہیں<ph name="END_LINK2" />۔ <ph name="BEGIN_LINK3" />Google اکاؤنٹس کے لیے Family Link سے نظم کردہ رازداری کا نوٹس<ph name="END_LINK3" /> بھی لاگو ہوتا ہے۔</translation> +<translation id="3974987681202239636"><ph name="APP_NAME" /> Chrome میں کھلے گی۔ جاری رکھ کر آپ، <ph name="BEGIN_LINK1" />Google کی سروس کی شرائط<ph name="END_LINK1" />، اور <ph name="BEGIN_LINK2" />Google Chrome اور Chrome OS کی اضافی سروس کی شرائط سے اتفاق کرتے ہیں<ph name="END_LINK2" />۔ <ph name="BEGIN_LINK3" />Google اکاؤنٹس کے لیے Family Link سے نظم کردہ رازداری کا نوٹس<ph name="END_LINK3" /> بھی لاگو ہوتا ہے۔</translation> <translation id="397583555483684758">مطابقت پذیری نے کام کرنا بند کر دیا ہے</translation> <translation id="3976396876660209797">ہٹا کر یہ شارٹ کٹ تخلیق کریں</translation> <translation id="3985215325736559418">کیا آپ <ph name="FILE_NAME" /> کو دوبارہ ڈاؤن لوڈ کرنا چاہتے ہیں؟</translation> @@ -727,7 +727,7 @@ <translation id="6364438453358674297">سرگزشت سے تجویز ہٹائیں؟</translation> <translation id="6369229450655021117">یہاں سے، آپ ویب پر تلاش کر سکتے ہیں، دوستوں کے ساتھ اشتراک کر سکتے ہيں اور کھلے صفحات دیکھ سکتے ہیں</translation> <translation id="6378173571450987352">تفصیلات: استعمال کردہ ڈیٹا کی مقدار کے لحاظ سے ترتیب دیا گیا</translation> -<translation id="6379829913050047669"><ph name="APP_NAME" /> Chrome میں کھلے گا۔ جاری رکھ کر آپ، <ph name="BEGIN_LINK1" />Google کی سروس کی شرائط<ph name="END_LINK1" />، اور <ph name="BEGIN_LINK2" />Google Chrome اور Chrome OS کی اضافی سروس کی شرائط سے اتفاق کرتے ہیں<ph name="END_LINK2" />۔</translation> +<translation id="6379829913050047669"><ph name="APP_NAME" /> Chrome میں کھلے گی۔ جاری رکھ کر آپ، <ph name="BEGIN_LINK1" />Google کی سروس کی شرائط<ph name="END_LINK1" />، اور <ph name="BEGIN_LINK2" />Google Chrome اور Chrome OS کی اضافی سروس کی شرائط سے اتفاق کرتے ہیں<ph name="END_LINK2" />۔</translation> <translation id="6381421346744604172">ویب سائٹس کو تاریک کریں</translation> <translation id="6388207532828177975">صاف کریں اور ری سیٹ کریں</translation> <translation id="6395288395575013217">لنک</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index f6d22db..9e2b263f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -650,7 +650,7 @@ <translation id="5763514718066511291">Nhấn để sao chép URL cho ứng dụng này</translation> <translation id="5765780083710877561">Mô tả:</translation> <translation id="5793665092639000975">Đang dùng: <ph name="SPACE_USED" />/<ph name="SPACE_AVAILABLE" /></translation> -<translation id="5795872532621730126">Tìm kiếm và duyệt qua</translation> +<translation id="5795872532621730126">Tìm kiếm và duyệt xem</translation> <translation id="5797070761912323120">Google có thể sử dụng lịch sử của bạn để điều chỉnh tính năng Tìm kiếm, quảng cáo và các dịch vụ khác của Google cho phù hợp với bạn</translation> <translation id="5804241973901381774">Quyền</translation> <translation id="5809361687334836369">{HOURS,plural, =1{# giờ trước}other{# giờ trước}}</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 27982b5..2b76a01 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -233,7 +233,7 @@ <translation id="2650751991977523696">要重新下載檔案嗎?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 個音訊檔案}other{# 個音訊檔案}}</translation> <translation id="2687403674020088961">封鎖所有 Cookie (不建議)</translation> -<translation id="2689830683995595741">使用 Chrome 即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。同時亦適用於《<ph name="BEGIN_LINK3" />透過 Family Link 管理的 Google 帳戶私隱聲明<ph name="END_LINK3" />》。</translation> +<translation id="2689830683995595741">使用 Chrome 即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。須同時受《<ph name="BEGIN_LINK3" />透過 Family Link 管理的 Google 帳戶私隱聲明<ph name="END_LINK3" />》約束。</translation> <translation id="2707726405694321444">重新整理網頁</translation> <translation id="2709516037105925701">自動填入</translation> <translation id="2717722538473713889">電郵地址</translation> @@ -402,7 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome 準備就緒後將載入您的網頁}other{Chrome 準備就緒後將載入您的網頁}}</translation> <translation id="3963007978381181125">密碼短語加密的資料不包括 Google Pay 的付款方法和地址。只有知道您密碼短語的使用者,才能讀取已加密的資料。系統不會將密碼短語傳送給 Google,Google 也不會儲存您的密碼短語。如果您忘記自己的密碼短語,或希望變更這項設定,則必須重設同步功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="3967822245660637423">下載完成</translation> -<translation id="3974987681202239636">「<ph name="APP_NAME" />」將在 Chrome 中開啟。繼續即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。同時亦適用於《<ph name="BEGIN_LINK3" />透過 Family Link 管理的 Google 帳戶私隱聲明<ph name="END_LINK3" />》。</translation> +<translation id="3974987681202239636">「<ph name="APP_NAME" />」將在 Chrome 中開啟。繼續即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。須同時受《<ph name="BEGIN_LINK3" />透過 Family Link 管理的 Google 帳戶私隱聲明<ph name="END_LINK3" />》約束。</translation> <translation id="397583555483684758">同步處理功能已停止運作</translation> <translation id="3976396876660209797">移除並重新建立此捷徑</translation> <translation id="3985215325736559418">您要再次下載 <ph name="FILE_NAME" /> 嗎?</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 08a72da..1d54dbb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -103,6 +103,7 @@ <translation id="1782483593938241562">結束日期:<ph name="DATE" /></translation> <translation id="1791662854739702043">安裝位置</translation> <translation id="1792959175193046959">你隨時可以變更預設的下載位置</translation> +<translation id="1795251344124198516">Chrome 和 Chrome 作業系統的《附加服務條款》</translation> <translation id="1807246157184219062">淺色</translation> <translation id="1810845389119482123">尚未完成初始同步處理設定</translation> <translation id="1821253160463689938">使用 Cookie 記住你的偏好設定 (即使你沒有造訪這些網頁)</translation> @@ -232,6 +233,7 @@ <translation id="2650751991977523696">要再次下載檔案嗎?</translation> <translation id="2651091186440431324">{FILE_COUNT,plural, =1{# 個音訊檔案}other{# 個音訊檔案}}</translation> <translation id="2687403674020088961">封鎖所有 Cookie (不建議)</translation> +<translation id="2689830683995595741">使用 Chrome 即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。您也必須遵守《<ph name="BEGIN_LINK3" />透過 Family Link 管理的 Google 帳戶所適用的隱私權聲明<ph name="END_LINK3" />》。</translation> <translation id="2707726405694321444">重新整理頁面</translation> <translation id="2709516037105925701">自動填入</translation> <translation id="2717722538473713889">電子郵件地址</translation> @@ -372,6 +374,7 @@ <translation id="3749259744154402564">不支援</translation> <translation id="3771001275138982843">無法下載更新</translation> <translation id="3771033907050503522">無痕式分頁</translation> +<translation id="3771694256347217732">Google 服務條款</translation> <translation id="3773755127849930740">如要允許配對,請<ph name="BEGIN_LINK" />開啟藍牙功能<ph name="END_LINK" /></translation> <translation id="3775705724665058594">傳送至你的裝置</translation> <translation id="3778956594442850293">已新增至主畫面</translation> @@ -399,6 +402,7 @@ <translation id="396192773038029076">{NUM_IN_PROGRESS,plural, =1{Chrome 準備就緒後將載入你的網頁}other{Chrome 準備就緒後將載入你的網頁}}</translation> <translation id="3963007978381181125">通關密語加密保護的資料不包括 Google Pay 的付款方式和地址。只有知道你通關密語的人,才能讀取加密保護的資料。系統不會將通關密語傳送給 Google,Google 也不會儲存通關密語。如果你忘記自己的通關密語,或是想變更這項設定,則必須重設同步功能。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> <translation id="3967822245660637423">下載完成</translation> +<translation id="3974987681202239636">「<ph name="APP_NAME" />」將在 Chrome 中開啟。選擇繼續即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。您也必須遵守《<ph name="BEGIN_LINK3" />透過 Family Link 管理的 Google 帳戶所適用的隱私權聲明<ph name="END_LINK3" />》。</translation> <translation id="397583555483684758">同步處理功能已停止運作</translation> <translation id="3976396876660209797">移除這個捷徑後再重新建立</translation> <translation id="3985215325736559418">你要再次下載 <ph name="FILE_NAME" /> 嗎?</translation> @@ -709,6 +713,7 @@ <translation id="6255999984061454636">內容建議</translation> <translation id="6270391203985052864">網站可以要求傳送通知給你</translation> <translation id="6277522088822131679">列印網頁時發生問題,請再試一次。</translation> +<translation id="6292420053234093573">使用 Chrome 即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。</translation> <translation id="6295158916970320988">所有網站</translation> <translation id="629730747756840877">帳戶</translation> <translation id="6297765934698848803">管理這部裝置的機構已關閉攝影機。</translation> @@ -723,6 +728,7 @@ <translation id="6364438453358674297">從歷史記錄中移除建議項目?</translation> <translation id="6369229450655021117">在這裡,你可以搜尋網路、與好友分享內容及查看開啟的網頁</translation> <translation id="6378173571450987352">詳細資料:依使用資料量排序</translation> +<translation id="6379829913050047669">「<ph name="APP_NAME" />」將在 Chrome 中開啟。選擇繼續即表示您同意《<ph name="BEGIN_LINK1" />Google 服務條款<ph name="END_LINK1" />》以及 <ph name="BEGIN_LINK2" />Google Chrome 和 Chrome 作業系統的《附加服務條款》<ph name="END_LINK2" />。</translation> <translation id="6381421346744604172">調暗網站顏色</translation> <translation id="6388207532828177975">清除並重設</translation> <translation id="6395288395575013217">連結</translation>
diff --git a/chrome/browser/ui/android/tab_model/android_live_tab_context.cc b/chrome/browser/ui/android/tab_model/android_live_tab_context.cc index 21008539..261bf75 100644 --- a/chrome/browser/ui/android/tab_model/android_live_tab_context.cc +++ b/chrome/browser/ui/android/tab_model/android_live_tab_context.cc
@@ -116,7 +116,7 @@ bool pin, bool from_last_session, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { Profile* profile = tab_model_->GetProfile(); // Prepare navigation history. @@ -146,7 +146,7 @@ bool from_last_session, const std::string& extension_app_id, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { NOTIMPLEMENTED(); return nullptr; }
diff --git a/chrome/browser/ui/android/tab_model/android_live_tab_context.h b/chrome/browser/ui/android/tab_model/android_live_tab_context.h index ffbc4af..39db86e 100644 --- a/chrome/browser/ui/android/tab_model/android_live_tab_context.h +++ b/chrome/browser/ui/android/tab_model/android_live_tab_context.h
@@ -56,7 +56,8 @@ bool pin, bool from_last_session, const sessions::PlatformSpecificTabData* storage_namespace, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& user_agent_override) + override; sessions::LiveTab* ReplaceRestoredTab( const std::vector<sessions::SerializedNavigationEntry>& navigations, base::Optional<tab_groups::TabGroupId> group, @@ -64,7 +65,8 @@ bool from_last_session, const std::string& extension_app_id, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& user_agent_override) + override; void CloseTab() override; static LiveTabContext* FindContextForWebContents(
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc index 76ef63c..c0b0bee 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.cc
@@ -228,6 +228,11 @@ keyboard_controller_->SetDraggableArea(bounds); } +bool ChromeKeyboardControllerClient::SetWindowBoundsInScreen( + const gfx::Rect& bounds_in_screen) { + return keyboard_controller_->SetWindowBoundsInScreen(bounds_in_screen); +} + bool ChromeKeyboardControllerClient::IsKeyboardOverscrollEnabled() { DCHECK(cached_keyboard_config_); if (cached_keyboard_config_->overscroll_behavior !=
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h index 67e33030..b13b8c0 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client.h
@@ -117,6 +117,7 @@ void SetHitTestBounds(const std::vector<gfx::Rect>& bounds); bool SetAreaToRemainOnScreen(const gfx::Rect& bounds); void SetDraggableArea(const gfx::Rect& bounds); + bool SetWindowBoundsInScreen(const gfx::Rect& bounds_in_screen); // Returns true if overscroll is enabled by the config or command line. bool IsKeyboardOverscrollEnabled();
diff --git a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc index 7b073f1..6d0052aa 100644 --- a/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc +++ b/chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.cc
@@ -59,6 +59,9 @@ bool SetAreaToRemainOnScreen(const gfx::Rect& bounds) override { return false; } + bool SetWindowBoundsInScreen(const gfx::Rect& bounds) override { + return false; + } void AddObserver(ash::KeyboardControllerObserver* observer) override { observers_.AddObserver(observer); }
diff --git a/chrome/browser/ui/ash/system_tray_client.cc b/chrome/browser/ui/ash/system_tray_client.cc index d497c306..27fceeb 100644 --- a/chrome/browser/ui/ash/system_tray_client.cc +++ b/chrome/browser/ui/ash/system_tray_client.cc
@@ -244,7 +244,7 @@ void SystemTrayClient::ShowIMESettings() { base::RecordAction(base::UserMetricsAction("OpenLanguageOptionsDialog")); - ShowSettingsSubPageForActiveUser(chrome::kLanguagesSubPage); + ShowSettingsSubPageForActiveUser(chrome::kOsLanguagesDetailsSubPage); } void SystemTrayClient::ShowConnectedDevicesSettings() {
diff --git a/chrome/browser/ui/browser_live_tab_context.cc b/chrome/browser/ui/browser_live_tab_context.cc index 1a157cb..79a881c 100644 --- a/chrome/browser/ui/browser_live_tab_context.cc +++ b/chrome/browser/ui/browser_live_tab_context.cc
@@ -136,7 +136,7 @@ bool pin, bool from_last_session, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { SessionStorageNamespace* storage_namespace = tab_platform_data ? static_cast<const sessions::ContentPlatformSpecificTabData*>( @@ -192,7 +192,7 @@ bool from_last_session, const std::string& extension_app_id, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { SessionStorageNamespace* storage_namespace = tab_platform_data ? static_cast<const sessions::ContentPlatformSpecificTabData*>(
diff --git a/chrome/browser/ui/browser_live_tab_context.h b/chrome/browser/ui/browser_live_tab_context.h index 68322c8..6f02b146 100644 --- a/chrome/browser/ui/browser_live_tab_context.h +++ b/chrome/browser/ui/browser_live_tab_context.h
@@ -64,7 +64,8 @@ bool pin, bool from_last_session, const sessions::PlatformSpecificTabData* storage_namespace, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& user_agent_override) + override; sessions::LiveTab* ReplaceRestoredTab( const std::vector<sessions::SerializedNavigationEntry>& navigations, base::Optional<tab_groups::TabGroupId> group, @@ -72,7 +73,8 @@ bool from_last_session, const std::string& extension_app_id, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& user_agent_override) + override; void CloseTab() override; // see Browser::Create
diff --git a/chrome/browser/ui/browser_tabrestore.cc b/chrome/browser/ui/browser_tabrestore.cc index 2c2be4df..ac136ee7 100644 --- a/chrome/browser/ui/browser_tabrestore.cc +++ b/chrome/browser/ui/browser_tabrestore.cc
@@ -25,6 +25,7 @@ #include "content/public/browser/restore_type.h" #include "content/public/browser/session_storage_namespace.h" #include "content/public/browser/web_contents.h" +#include "third_party/blink/public/common/user_agent/user_agent_metadata.h" #include "ui/gfx/geometry/size.h" using content::NavigationEntry; @@ -53,7 +54,7 @@ bool from_last_session, base::TimeTicks last_active_time, content::SessionStorageNamespace* session_storage_namespace, - const std::string& user_agent_override, + const sessions::SerializedUserAgentOverride& user_agent_override, bool initially_hidden, bool from_session_restore) { GURL restore_url = navigations.at(selected_navigation).virtual_url(); @@ -82,9 +83,12 @@ std::vector<std::unique_ptr<NavigationEntry>> entries = ContentSerializedNavigationBuilder::ToNavigationEntries( navigations, browser->profile()); - // TODO(https://crbug.com/1061917): handle UA client hints override. - web_contents->SetUserAgentOverride( - blink::UserAgentOverride::UserAgentOnly(user_agent_override), false); + + blink::UserAgentOverride ua_override; + ua_override.ua_string_override = user_agent_override.ua_string_override; + ua_override.ua_metadata_override = blink::UserAgentMetadata::Demarshal( + user_agent_override.opaque_ua_metadata_override); + web_contents->SetUserAgentOverride(ua_override, false); web_contents->GetController().Restore( selected_navigation, GetRestoreType(browser, from_last_session), &entries); @@ -133,7 +137,7 @@ bool from_last_session, base::TimeTicks last_active_time, content::SessionStorageNamespace* session_storage_namespace, - const std::string& user_agent_override, + const sessions::SerializedUserAgentOverride& user_agent_override, bool from_session_restore) { const bool initially_hidden = !select || browser->window()->IsMinimized(); std::unique_ptr<WebContents> web_contents = CreateRestoredTab( @@ -206,7 +210,7 @@ bool from_last_session, const std::string& extension_app_id, content::SessionStorageNamespace* session_storage_namespace, - const std::string& user_agent_override, + const sessions::SerializedUserAgentOverride& user_agent_override, bool from_session_restore) { std::unique_ptr<WebContents> web_contents = CreateRestoredTab( browser, navigations, selected_navigation, extension_app_id,
diff --git a/chrome/browser/ui/browser_tabrestore.h b/chrome/browser/ui/browser_tabrestore.h index 597c9e8..6f7ea65 100644 --- a/chrome/browser/ui/browser_tabrestore.h +++ b/chrome/browser/ui/browser_tabrestore.h
@@ -20,6 +20,7 @@ namespace sessions { class SerializedNavigationEntry; +struct SerializedUserAgentOverride; } namespace chrome { @@ -51,7 +52,7 @@ bool from_last_session, base::TimeTicks last_active_time, content::SessionStorageNamespace* storage_namespace, - const std::string& user_agent_override, + const sessions::SerializedUserAgentOverride& user_agent_override, bool from_session_restore); // Replaces the state of the currently selected tab with the session @@ -64,7 +65,7 @@ bool from_last_session, const std::string& extension_app_id, content::SessionStorageNamespace* session_storage_namespace, - const std::string& user_agent_override, + const sessions::SerializedUserAgentOverride& user_agent_override, bool from_session_restore); } // namespace chrome
diff --git a/chrome/browser/ui/browser_tabrestore_browsertest.cc b/chrome/browser/ui/browser_tabrestore_browsertest.cc index f2d86a12..af052b3 100644 --- a/chrome/browser/ui/browser_tabrestore_browsertest.cc +++ b/chrome/browser/ui/browser_tabrestore_browsertest.cc
@@ -137,7 +137,8 @@ /* select=*/true, /* pin=*/false, /* from_last_session=*/true, /* last_active_time=*/base::TimeTicks::Now(), /* storage_namespace=*/nullptr, - /* user_agent_override=*/std::string(), /* from_session_restore=*/true); + /* user_agent_override=*/sessions::SerializedUserAgentOverride(), + /* from_session_restore=*/true); EXPECT_TRUE(web_contents->GetController().GetPendingEntry()); } @@ -158,7 +159,8 @@ /* select=*/false, /* pin=*/false, /* from_last_session=*/true, /* last_active_time=*/base::TimeTicks::Now(), /* storage_namespace=*/nullptr, - /* user_agent_override=*/std::string(), /* from_session_restore=*/true); + /* user_agent_override=*/sessions::SerializedUserAgentOverride(), + /* from_session_restore=*/true); EXPECT_FALSE(web_contents->GetController().GetPendingEntry()); }
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc index 41ca2bb..ea575404 100644 --- a/chrome/browser/ui/extensions/extension_action_view_controller.cc +++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc
@@ -198,18 +198,10 @@ if (!ExtensionIsValid()) return nullptr; - extensions::ExtensionContextMenuModel::ButtonVisibility visibility = - extensions::ExtensionContextMenuModel::VISIBLE; - - // The extension visibility always refers to the corresponding action on the - // main bar. ToolbarActionViewController* const action = extensions_container_->GetActionForId(GetId()); - if (extensions_container_->GetPoppedOutAction() == action) { - visibility = extensions::ExtensionContextMenuModel::TRANSITIVELY_VISIBLE; - } else if (!extensions_container_->IsActionVisibleOnToolbar(action)) { - visibility = extensions::ExtensionContextMenuModel::OVERFLOWED; - } + extensions::ExtensionContextMenuModel::ButtonVisibility visibility = + extensions_container_->GetActionVisibility(action); // Reconstruct the menu every time because the menu's contents are dynamic. context_menu_model_ = std::make_unique<extensions::ExtensionContextMenuModel>(
diff --git a/chrome/browser/ui/extensions/extensions_container.h b/chrome/browser/ui/extensions/extensions_container.h index 8d80d9f..63aaa0c 100644 --- a/chrome/browser/ui/extensions/extensions_container.h +++ b/chrome/browser/ui/extensions/extensions_container.h
@@ -8,6 +8,7 @@ #include <string> #include "base/callback_forward.h" +#include "chrome/browser/extensions/extension_context_menu_model.h" class ToolbarActionViewController; class ToolbarActionsBarBubbleDelegate; @@ -36,6 +37,10 @@ virtual bool IsActionVisibleOnToolbar( const ToolbarActionViewController* action) const = 0; + // Returns the action's toolbar button visibility. + virtual extensions::ExtensionContextMenuModel::ButtonVisibility + GetActionVisibility(const ToolbarActionViewController* action) const = 0; + // Undoes the current "pop out"; i.e., moves the popped out action back into // overflow. virtual void UndoPopOut() = 0;
diff --git a/chrome/browser/ui/login/login_handler_browsertest.cc b/chrome/browser/ui/login/login_handler_browsertest.cc index 2834be95..34968e3 100644 --- a/chrome/browser/ui/login/login_handler_browsertest.cc +++ b/chrome/browser/ui/login/login_handler_browsertest.cc
@@ -1995,6 +1995,41 @@ EXPECT_EQ(expected_title, auth_supplied_title_watcher.WaitAndGetTitle()); } +// Tests that the repost dialog is not shown when credentials are entered for a +// POST navigation. Regression test for https://crbug.com/1062317. +IN_PROC_BROWSER_TEST_P(LoginPromptBrowserTest, NoRepostDialogAfterCredentials) { + ASSERT_TRUE(embedded_test_server()->Start()); + + content::WebContents* contents = + browser()->tab_strip_model()->GetActiveWebContents(); + NavigationController* controller = &contents->GetController(); + LoginPromptBrowserTestObserver observer; + observer.Register(content::Source<NavigationController>(controller)); + WindowedAuthNeededObserver auth_needed_waiter(controller); + + // Navigate to a blank page and inject a form to trigger a POST navigation + // that requests credentials. + ui_test_utils::NavigateToURL( + browser(), embedded_test_server()->GetURL("/login/form.html")); + ASSERT_TRUE( + content::ExecJs(contents, "document.getElementById('submit').click()")); + + auth_needed_waiter.Wait(); + ASSERT_EQ(1u, observer.handlers().size()); + + // Enter credentials and test that the page loads. If the repost dialog is + // shown, the test will hang while waiting for input. + WindowedAuthSuppliedObserver auth_supplied_waiter(controller); + LoginHandler* handler = *observer.handlers().begin(); + SetAuthFor(handler); + auth_supplied_waiter.Wait(); + + base::string16 expected_title = ExpectedTitleFromAuth( + base::ASCIIToUTF16("basicuser"), base::ASCIIToUTF16("secret")); + content::TitleWatcher auth_supplied_title_watcher(contents, expected_title); + EXPECT_EQ(expected_title, auth_supplied_title_watcher.WaitAndGetTitle()); +} + // Tests that when HTTP Auth committed interstitials are enabled, showing a // login prompt in a new window opened from window.open() does not // crash. Regression test for https://crbug.com/1005096.
diff --git a/chrome/browser/ui/login/login_tab_helper.cc b/chrome/browser/ui/login/login_tab_helper.cc index b1e7c04..f587c3a 100644 --- a/chrome/browser/ui/login/login_tab_helper.cc +++ b/chrome/browser/ui/login/login_tab_helper.cc
@@ -192,7 +192,8 @@ } void LoginTabHelper::Reload() { - web_contents()->GetController().Reload(content::ReloadType::NORMAL, true); + web_contents()->GetController().Reload(content::ReloadType::NORMAL, + false /* check_for_repost */); } WEB_CONTENTS_USER_DATA_KEY_IMPL(LoginTabHelper)
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index 840e84fb..68ff8a30 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -14,6 +14,7 @@ #include "build/build_config.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/buildflags.h" #include "chrome/browser/captive_portal/captive_portal_service_factory.h" #include "chrome/browser/client_hints/client_hints.h" #include "chrome/browser/complex_tasks/task_tab_helper.h" @@ -161,6 +162,10 @@ #include "extensions/browser/view_type_utils.h" #endif +#if BUILDFLAG(ENABLE_KALEIDOSCOPE) +#include "chrome/browser/media/kaleidoscope/internal/kaleidoscope_tab_helper.h" +#endif // BUILDFLAG(ENABLE_KALEIDOSCOPE) + #if BUILDFLAG(ENABLE_OFFLINE_PAGES) #include "chrome/browser/offline_pages/android/auto_fetch_page_load_watcher.h" #include "chrome/browser/offline_pages/offline_page_tab_helper.h" @@ -413,6 +418,11 @@ web_app::WebAppMetrics::Get(profile); #endif +#if BUILDFLAG(ENABLE_KALEIDOSCOPE) + if (base::FeatureList::IsEnabled(media::kKaleidoscope)) + KaleidoscopeTabHelper::CreateForWebContents(web_contents); +#endif // BUILDFLAG(ENABLE_KALEIDOSCOPE) + #if BUILDFLAG(ENABLE_OFFLINE_PAGES) offline_pages::OfflinePageTabHelper::CreateForWebContents(web_contents); offline_pages::RecentTabHelper::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar.cc b/chrome/browser/ui/toolbar/toolbar_actions_bar.cc index 0a16f05..9ced818 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar.cc +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar.cc
@@ -494,6 +494,20 @@ return false; } +extensions::ExtensionContextMenuModel::ButtonVisibility +ToolbarActionsBar::GetActionVisibility( + const ToolbarActionViewController* action) const { + extensions::ExtensionContextMenuModel::ButtonVisibility visibility = + extensions::ExtensionContextMenuModel::VISIBLE; + + if (GetPoppedOutAction() == action) { + visibility = extensions::ExtensionContextMenuModel::TRANSITIVELY_VISIBLE; + } else if (!IsActionVisibleOnToolbar(action)) { + visibility = extensions::ExtensionContextMenuModel::OVERFLOWED; + } + return visibility; +} + void ToolbarActionsBar::PopOutAction(ToolbarActionViewController* controller, bool is_sticky, const base::Closure& closure) {
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_bar.h b/chrome/browser/ui/toolbar/toolbar_actions_bar.h index bdc4f1c..027e0e95 100644 --- a/chrome/browser/ui/toolbar/toolbar_actions_bar.h +++ b/chrome/browser/ui/toolbar/toolbar_actions_bar.h
@@ -234,6 +234,8 @@ ToolbarActionViewController* GetPoppedOutAction() const override; bool IsActionVisibleOnToolbar( const ToolbarActionViewController* action) const override; + extensions::ExtensionContextMenuModel::ButtonVisibility GetActionVisibility( + const ToolbarActionViewController* action) const override; void UndoPopOut() override; void SetPopupOwner(ToolbarActionViewController* popup_owner) override; void HideActivePopup() override;
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc index 67c5163..5d24528 100644 --- a/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view_browsertest.cc
@@ -39,6 +39,7 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/views/bubble/bubble_frame_view.h" #include "ui/views/controls/scroll_view.h" +#include "ui/views/test/widget_test.h" #include "ui/views/view.h" #include "ui/views/widget/widget.h" @@ -47,6 +48,16 @@ using extensions::PermissionMessages; using extensions::PermissionSet; +namespace { + +void CloseAndWait(views::Widget* widget) { + views::test::WidgetDestroyedWaiter waiter(widget); + widget->Close(); + waiter.Wait(); +} + +} // namespace + class ExtensionInstallDialogViewTestBase : public extensions::ExtensionBrowserTest { protected: @@ -176,15 +187,6 @@ DISALLOW_COPY_AND_ASSIGN(ExtensionInstallDialogViewTest); }; -// Verifies that the delegate is notified when the user selects to accept or -// cancel the install. -// -// Crashes flakily on Mac. See http://crbug.com/851167 -#if defined(OS_MACOSX) -#define MAYBE_NotifyDelegate DISABLED_NotifyDelegate -#else -#define MAYBE_NotifyDelegate NotifyDelegate -#endif IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogViewTest, NotifyDelegate) { { // User presses install. @@ -205,7 +207,7 @@ // cancel. ExtensionInstallPromptTestHelper helper; views::DialogDelegateView* delegate_view = CreateAndShowPrompt(&helper); - delegate_view->GetWidget()->Close(); + CloseAndWait(delegate_view->GetWidget()); // TODO(devlin): Should this be ABORTED? EXPECT_EQ(ExtensionInstallPrompt::Result::USER_CANCELED, helper.result()); } @@ -232,7 +234,7 @@ // Ensure default button (cancel) has focus. EXPECT_TRUE(delegate_view->GetInitiallyFocusedView()->HasFocus()); - delegate_view->Close(); + CloseAndWait(delegate_view->GetWidget()); } class ExtensionInstallDialogViewInteractiveBrowserTest @@ -483,8 +485,7 @@ EXPECT_EQ(ax::mojom::Role::kIgnored, node_data.role); } - modal_dialog->Close(); - base::RunLoop().RunUntilIdle(); + CloseAndWait(modal_dialog); } IN_PROC_BROWSER_TEST_F(ExtensionInstallDialogRatingsSectionTest, @@ -535,5 +536,5 @@ EXPECT_TRUE(extra_view); EXPECT_EQ("Checkbox", std::string(extra_view->GetClassName())); - delegate_view->Close(); + CloseAndWait(delegate_view->GetWidget()); }
diff --git a/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc b/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc index d15a4fc..93a1d062 100644 --- a/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc +++ b/chrome/browser/ui/views/extensions/extensions_menu_view_browsertest.cc
@@ -6,6 +6,7 @@ #include <algorithm> +#include "base/strings/utf_string_conversions.h" #include "base/task/post_task.h" #include "build/build_config.h" #include "chrome/browser/extensions/chrome_test_extension_loader.h" @@ -534,6 +535,95 @@ } IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, + PinnedExtensionShowsCorrectContextMenuPinOption) { + LoadTestExtension("extensions/simple_with_popup"); + + ClickExtensionsMenuButton(); + ExtensionsToolbarContainer* const extensions_container = + GetExtensionsToolbarContainer(); + + // Pin extension from menu. + ASSERT_TRUE(VerifyUi()); + ASSERT_EQ(1u, GetExtensionsMenuItemViews().size()); + ui::MouseEvent click_pressed_event(ui::ET_MOUSE_PRESSED, gfx::Point(), + gfx::Point(), base::TimeTicks(), + ui::EF_LEFT_MOUSE_BUTTON, 0); + ui::MouseEvent click_released_event(ui::ET_MOUSE_RELEASED, gfx::Point(), + gfx::Point(), base::TimeTicks(), + ui::EF_LEFT_MOUSE_BUTTON, 0); + GetExtensionsMenuItemViews() + .front() + ->pin_button_for_testing() + ->OnMousePressed(click_pressed_event); + GetExtensionsMenuItemViews() + .front() + ->pin_button_for_testing() + ->OnMouseReleased(click_released_event); + + // Wait for any pending animations to finish so that correct pinned + // extensions and dialogs are actually showing. + views::test::WaitForAnimatingLayoutManager(GetExtensionsToolbarContainer()); + + // Verify extension is pinned but not stored as the popped out action. + auto visible_icons = GetVisibleToolbarActionViews(); + visible_icons = GetVisibleToolbarActionViews(); + ASSERT_EQ(1u, visible_icons.size()); + EXPECT_EQ(nullptr, extensions_container->GetPoppedOutAction()); + + // Trigger the pinned extension. + ToolbarActionView* pinned_extension = + extensions_container->GetViewForId(extensions()[0]->id()); + pinned_extension->OnMouseEvent(&click_pressed_event); + pinned_extension->OnMouseEvent(&click_released_event); + + // Wait for any pending animations to finish so that correct pinned + // extensions and dialogs are actually showing. + views::test::WaitForAnimatingLayoutManager(GetExtensionsToolbarContainer()); + + EXPECT_NE(nullptr, extensions_container->GetPoppedOutAction()); + + // Verify the context menu option is to unpin the extension. + ui::SimpleMenuModel* context_menu = static_cast<ui::SimpleMenuModel*>( + extensions_container->GetActionForId(extensions()[0]->id()) + ->GetContextMenu()); + int visibility_index = context_menu->GetIndexOfCommandId( + extensions::ExtensionContextMenuModel::TOGGLE_VISIBILITY); + ASSERT_GE(visibility_index, 0); + base::string16 visibility_label = context_menu->GetLabelAt(visibility_index); + EXPECT_EQ(base::UTF16ToUTF8(visibility_label), "Unpin"); +} + +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, + UnpinnedExtensionShowsCorrectContextMenuPinOption) { + LoadTestExtension("extensions/simple_with_popup"); + + ClickExtensionsMenuButton(); + ExtensionsToolbarContainer* const extensions_container = + GetExtensionsToolbarContainer(); + + TriggerSingleExtensionButton(); + + // Wait for any pending animations to finish so that correct pinned + // extensions and dialogs are actually showing. + views::test::WaitForAnimatingLayoutManager(GetExtensionsToolbarContainer()); + + // Verify extension is visible and tbere is a popped out action. + auto visible_icons = GetVisibleToolbarActionViews(); + ASSERT_EQ(1u, visible_icons.size()); + EXPECT_NE(nullptr, extensions_container->GetPoppedOutAction()); + + // Verify the context menu option is to unpin the extension. + ui::SimpleMenuModel* context_menu = static_cast<ui::SimpleMenuModel*>( + extensions_container->GetActionForId(extensions()[0]->id()) + ->GetContextMenu()); + int visibility_index = context_menu->GetIndexOfCommandId( + extensions::ExtensionContextMenuModel::TOGGLE_VISIBILITY); + ASSERT_GE(visibility_index, 0); + base::string16 visibility_label = context_menu->GetLabelAt(visibility_index); + EXPECT_EQ(base::UTF16ToUTF8(visibility_label), "Pin"); +} + +IN_PROC_BROWSER_TEST_F(ExtensionsMenuViewBrowserTest, ManageExtensionsOpensExtensionsPage) { // Ensure the menu is visible by adding an extension. LoadTestExtension("extensions/trigger_actions/browser_action");
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc index 80b2a8a9..db35b62 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/extensions/extensions_toolbar_container.h" #include "base/numerics/ranges.h" +#include "build/build_config.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h" @@ -240,6 +241,11 @@ // Only update the extension's toolbar visibility if the context menu is being // shown from an extension visible in the toolbar. if (!ExtensionsMenuView::IsShowing()) { +#if defined(OS_MACOSX) + // TODO(crbug/1065584): Remove hiding active popup here once this bug is + // fixed. + HideActivePopup(); +#endif extension_with_open_context_menu_id_ = extension->GetId(); UpdateIconVisibility(extension_with_open_context_menu_id_.value()); } @@ -264,6 +270,21 @@ model_->IsActionPinned(extension_id); } +extensions::ExtensionContextMenuModel::ButtonVisibility +ExtensionsToolbarContainer::GetActionVisibility( + const ToolbarActionViewController* action) const { + extensions::ExtensionContextMenuModel::ButtonVisibility visibility = + extensions::ExtensionContextMenuModel::VISIBLE; + + if (ShouldForceVisibility(action->GetId()) && + !model_->IsActionPinned(action->GetId())) { + visibility = extensions::ExtensionContextMenuModel::TRANSITIVELY_VISIBLE; + } else if (!IsActionVisibleOnToolbar(action)) { + visibility = extensions::ExtensionContextMenuModel::OVERFLOWED; + } + return visibility; +} + void ExtensionsToolbarContainer::UndoPopOut() { DCHECK(popped_out_action_); ToolbarActionViewController* const popped_out_action = popped_out_action_;
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h index c7d9bf3..ee74107 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.h +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.h
@@ -102,6 +102,8 @@ void OnContextMenuClosed(ToolbarActionViewController* extension) override; bool IsActionVisibleOnToolbar( const ToolbarActionViewController* action) const override; + extensions::ExtensionContextMenuModel::ButtonVisibility GetActionVisibility( + const ToolbarActionViewController* action) const override; void UndoPopOut() override; void SetPopupOwner(ToolbarActionViewController* popup_owner) override; void HideActivePopup() override;
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.cc index 3b7fae1..9405bc8 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.cc +++ b/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.cc
@@ -11,10 +11,12 @@ #include "base/strings/string16.h" #include "base/task/post_task.h" #include "base/time/time.h" +#include "base/timer/timer.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/hover_button.h" #include "chrome/browser/ui/views/media_router/cast_dialog_helper.h" #include "chrome/common/url_constants.h" @@ -26,81 +28,79 @@ #include "ui/base/page_transition_types.h" #include "ui/gfx/color_palette.h" #include "ui/gfx/paint_vector_icon.h" -#include "ui/native_theme/native_theme.h" #include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/button/image_button_factory.h" #include "ui/views/controls/image_view.h" #include "ui/views/controls/throbber.h" #include "ui/views/layout/box_layout.h" +#include "ui/views/view_class_properties.h" #include "url/gurl.h" +namespace { + +auto CreateHelpIcon(views::ButtonListener* listener) { + auto help_icon = views::CreateVectorImageButtonWithNativeTheme( + listener, vector_icons::kHelpOutlineIcon); + help_icon->SetInstallFocusRingOnFocus(true); + help_icon->SetFocusForPlatform(); + help_icon->SetBorder( + views::CreateEmptyBorder(media_router::kPrimaryIconBorder)); + help_icon->SetAccessibleName( + l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_NO_DEVICES_FOUND_BUTTON)); + help_icon->SetInkDropMode(views::InkDropHostView::InkDropMode::OFF); + return help_icon; +} + +} // namespace + namespace media_router { +constexpr base::TimeDelta CastDialogNoSinksView::kSearchWaitTime; + CastDialogNoSinksView::CastDialogNoSinksView(Profile* profile) : profile_(profile) { - SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical)); - looking_for_sinks_view_ = CreateLookingForSinksView(); - AddChildView(looking_for_sinks_view_); + // Use horizontal button padding to ensure consistent spacing with the + // CastDialogView and its sink views that are implemented as Buttons. + const int horizontal_padding = ChromeLayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_BUTTON_HORIZONTAL_PADDING); - base::PostDelayedTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&CastDialogNoSinksView::ShowHelpIconView, - weak_factory_.GetWeakPtr()), - base::TimeDelta::FromSeconds(3)); + // Maintain required padding between the throbber / icon and the label. + const int icon_label_spacing = ChromeLayoutProvider::Get()->GetDistanceMetric( + views::DISTANCE_RELATED_LABEL_HORIZONTAL); + + auto* layout_manager = SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal, + gfx::Insets(0, horizontal_padding), icon_label_spacing)); + layout_manager->set_cross_axis_alignment( + views::BoxLayout::CrossAxisAlignment::kCenter); + + icon_ = AddChildView(CreateThrobber()); + label_ = AddChildView(std::make_unique<views::Label>( + l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_STATUS_LOOKING_FOR_DEVICES))); + + timer_.Start(FROM_HERE, kSearchWaitTime, + base::BindOnce(&CastDialogNoSinksView::SetHelpIconView, + base::Unretained(this))); } CastDialogNoSinksView::~CastDialogNoSinksView() = default; void CastDialogNoSinksView::ButtonPressed(views::Button* sender, const ui::Event& event) { - // This is called when |help_icon_| is clicked. - ShowHelpCenterArticle(); -} - -void CastDialogNoSinksView::ShowHelpIconView() { - delete looking_for_sinks_view_; - looking_for_sinks_view_ = nullptr; - help_icon_view_ = CreateHelpIconView(); - AddChildView(help_icon_view_); - Layout(); -} - -void CastDialogNoSinksView::ShowHelpCenterArticle() { - const GURL url = GURL(chrome::kCastNoDestinationFoundURL); - NavigateParams params(profile_, url, ui::PAGE_TRANSITION_LINK); + // Opens the help center article for troubleshooting sinks not found in a + // new tab. Called when |help_icon| is clicked. + NavigateParams params(profile_, GURL(chrome::kCastNoDestinationFoundURL), + ui::PAGE_TRANSITION_LINK); Navigate(¶ms); } -views::View* CastDialogNoSinksView::CreateLookingForSinksView() { - base::string16 title = - l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_STATUS_LOOKING_FOR_DEVICES); - HoverButton* view = new HoverButton( - /* button_listener */ nullptr, CreateThrobber(), title, base::string16()); - view->SetEnabled(false); - return view; -} +void CastDialogNoSinksView::SetHelpIconView() { + // Replace the throbber with the help icon. + RemoveChildViewT(icon_); + icon_ = AddChildViewAt(CreateHelpIcon(this), 0); -views::View* CastDialogNoSinksView::CreateHelpIconView() { - base::string16 title = - l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_STATUS_NO_DEVICES_FOUND); - auto help_icon = std::make_unique<views::ImageButton>(this); - views::ImageButton* help_icon_ptr = help_icon.get(); - const SkColor icon_color = help_icon->GetNativeTheme()->GetSystemColor( - ui::NativeTheme::kColorId_DefaultIconColor); - help_icon->SetInstallFocusRingOnFocus(true); - help_icon->SetImage(views::Button::STATE_NORMAL, - gfx::CreateVectorIcon(::vector_icons::kHelpOutlineIcon, - kPrimaryIconSize, icon_color)); - help_icon->SetFocusForPlatform(); - help_icon->SetBorder(views::CreateEmptyBorder(kPrimaryIconBorder)); - help_icon->SetAccessibleName( - l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_NO_DEVICES_FOUND_BUTTON)); - HoverButton* view = - new HoverButton(/* button_listener */ nullptr, std::move(help_icon), - title, base::string16()); - view->SetEnabled(false); - // HoverButton disables event handling by its icons, so enable it again. - help_icon_ptr->set_can_process_events_within_subtree(true); - return view; + label_->SetText( + l10n_util::GetStringUTF16(IDS_MEDIA_ROUTER_STATUS_NO_DEVICES_FOUND)); } } // namespace media_router
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.h b/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.h index ca6a7e36..4a518c2f 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.h +++ b/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view.h
@@ -6,8 +6,8 @@ #define CHROME_BROWSER_UI_VIEWS_MEDIA_ROUTER_CAST_DIALOG_NO_SINKS_VIEW_H_ #include "base/macros.h" -#include "base/memory/weak_ptr.h" #include "ui/views/controls/button/button.h" +#include "ui/views/controls/label.h" #include "ui/views/view.h" class Profile; @@ -19,39 +19,28 @@ // after that it shows an icon that links to a help center article. class CastDialogNoSinksView : public views::View, public views::ButtonListener { public: + static constexpr base::TimeDelta kSearchWaitTime = + base::TimeDelta::FromSeconds(3); + explicit CastDialogNoSinksView(Profile* profile); ~CastDialogNoSinksView() override; // views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override; - // Called by tests. - views::View* looking_for_sinks_view_for_test() { - return looking_for_sinks_view_; + const base::OneShotTimer& timer_for_testing() const { return timer_; } + const views::View* icon_for_testing() const { return icon_; } + const base::string16& label_text_for_testing() const { + return label_->GetText(); } - views::View* help_icon_view_for_test() { return help_icon_view_; } private: - // Hides |looking_for_sinks_view_| and shows |help_icon_view_|. - void ShowHelpIconView(); - - // Opens the help center article for troubleshooting sinks not found in a - // new tab. - void ShowHelpCenterArticle(); - - views::View* CreateLookingForSinksView(); - views::View* CreateHelpIconView(); - - // View temporarily shown that indicates sink discovery is ongoing. - views::View* looking_for_sinks_view_ = nullptr; - - // View indicating no sinks were found and containing an icon that links to - // a help center article. - views::View* help_icon_view_ = nullptr; + void SetHelpIconView(); Profile* const profile_; - - base::WeakPtrFactory<CastDialogNoSinksView> weak_factory_{this}; + base::OneShotTimer timer_; + views::View* icon_ = nullptr; + views::Label* label_ = nullptr; DISALLOW_COPY_AND_ASSIGN(CastDialogNoSinksView); };
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view_unittest.cc b/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view_unittest.cc index db647aa..695ccc6e 100644 --- a/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view_unittest.cc +++ b/chrome/browser/ui/views/media_router/cast_dialog_no_sinks_view_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "base/run_loop.h" -#include "base/time/time.h" #include "chrome/test/views/chrome_test_views_delegate.h" #include "chrome/test/views/chrome_views_test_base.h" #include "content/public/test/browser_task_environment.h" @@ -26,11 +25,14 @@ } protected: - views::View* looking_for_sinks_view() { - return no_sinks_view_->looking_for_sinks_view_for_test(); + bool running() const { + return no_sinks_view_->timer_for_testing().IsRunning(); } - views::View* help_icon_view() { - return no_sinks_view_->help_icon_view_for_test(); + const views::View* get_icon() const { + return no_sinks_view_->icon_for_testing(); + } + const base::string16& get_label_text() const { + return no_sinks_view_->label_text_for_testing(); } private: @@ -40,14 +42,20 @@ }; TEST_F(CastDialogNoSinksViewTest, SwitchViews) { - // Initially, only the throbber view should be shown. - EXPECT_TRUE(looking_for_sinks_view()->GetVisible()); - EXPECT_FALSE(help_icon_view()); + // Initially the search timer should be running and the icon and label should + // indicate we are searching for sinks. Icon should never be null. + EXPECT_TRUE(running()); + const auto* initial_icon = get_icon(); + auto initial_title = get_label_text(); + EXPECT_NE(initial_icon, nullptr); - task_environment()->FastForwardBy(base::TimeDelta::FromSeconds(3)); - // After three seconds, only the help icon view should be shown. - EXPECT_FALSE(looking_for_sinks_view()); - EXPECT_TRUE(help_icon_view()->GetVisible()); + // After |kSearchWaitTime| the search timer should have stopped and the icon + // and label should have changed to indicate no sinks were found. + task_environment()->FastForwardBy( + media_router::CastDialogNoSinksView::kSearchWaitTime); + EXPECT_FALSE(running()); + EXPECT_NE(initial_icon, get_icon()); + EXPECT_NE(initial_title, get_label_text()); } } // namespace media_router
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_view_browsertest.cc b/chrome/browser/ui/views/media_router/cast_dialog_view_browsertest.cc new file mode 100644 index 0000000..bb229bc --- /dev/null +++ b/chrome/browser/ui/views/media_router/cast_dialog_view_browsertest.cc
@@ -0,0 +1,126 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/media_router/cast_dialog_view.h" + +#include "chrome/browser/ui/media_router/cast_dialog_controller.h" +#include "chrome/browser/ui/media_router/cast_dialog_model.h" +#include "chrome/browser/ui/media_router/ui_media_sink.h" +#include "chrome/browser/ui/test/test_browser_dialog.h" +#include "chrome/browser/ui/views/frame/browser_view.h" + +namespace { + +media_router::UIMediaSink CreateAvailableSink() { + media_router::UIMediaSink sink; + sink.id = "sink_available"; + sink.friendly_name = base::UTF8ToUTF16("TestAvailableSink"); + sink.state = media_router::UIMediaSinkState::AVAILABLE; + sink.cast_modes = {media_router::TAB_MIRROR, media_router::DESKTOP_MIRROR}; + return sink; +} + +media_router::UIMediaSink CreateConnectedSink() { + media_router::UIMediaSink sink; + sink.id = "sink_connected"; + sink.friendly_name = base::UTF8ToUTF16("TestConnectedSink"); + sink.state = media_router::UIMediaSinkState::CONNECTED; + sink.cast_modes = {media_router::TAB_MIRROR, media_router::DESKTOP_MIRROR}; + sink.route = media_router::MediaRoute( + "route_id", media_router::MediaSource("https://example.com"), sink.id, "", + true, true); + return sink; +} + +media_router::UIMediaSink CreateUnavailableSink() { + media_router::UIMediaSink sink; + sink.id = "sink_unavailable"; + sink.friendly_name = base::UTF8ToUTF16("TestUnavailableSink"); + sink.state = media_router::UIMediaSinkState::UNAVAILABLE; + sink.cast_modes = {media_router::TAB_MIRROR, media_router::DESKTOP_MIRROR}; + return sink; +} + +media_router::CastDialogModel CreateModelWithSinks( + std::vector<media_router::UIMediaSink> sinks) { + media_router::CastDialogModel model; + model.set_dialog_header(base::UTF8ToUTF16("Dialog header")); + model.set_media_sinks(std::move(sinks)); + return model; +} + +class MockCastDialogController : public media_router::CastDialogController { + public: + void AddObserver(Observer* observer) override {} + void RemoveObserver(Observer* observer) override {} + void StartCasting(const media_router::MediaSink::Id& sink_id, + media_router::MediaCastMode cast_mode) override {} + void StopCasting(const media_router::MediaRoute::Id& route_id) override {} + void ChooseLocalFile( + base::OnceCallback<void(const ui::SelectedFileInfo*)> callback) override { + } + void ClearIssue(const media_router::Issue::Id& issue_id) override {} +}; + +} // namespace + +class CastDialogViewBrowserTest : public DialogBrowserTest { + public: + CastDialogViewBrowserTest() + : controller_(std::make_unique<MockCastDialogController>()) {} + + CastDialogViewBrowserTest(const CastDialogViewBrowserTest&) = delete; + CastDialogViewBrowserTest& operator=(const CastDialogViewBrowserTest&) = + delete; + + // DialogBrowserTest: + void PreShow() override { + media_router::CastDialogView::ShowDialogCenteredForBrowserWindow( + controller_.get(), browser(), base::Time::Now(), + media_router::MediaRouterDialogOpenOrigin::TOOLBAR); + } + + void ShowUi(const std::string& name) override { + media_router::CastDialogModel model; + if (name == "Available") { + model = CreateModelWithSinks({CreateAvailableSink()}); + } else if (name == "Connected") { + model = CreateModelWithSinks({CreateConnectedSink()}); + } else if (name == "Unavailable") { + model = CreateModelWithSinks({CreateUnavailableSink()}); + } else if (name == "Mixed") { + model = CreateModelWithSinks({ + CreateAvailableSink(), + CreateConnectedSink(), + CreateUnavailableSink(), + }); + } + media_router::CastDialogView* dialog = + media_router::CastDialogView::GetInstance(); + dialog->OnModelUpdated(model); + } + + private: + std::unique_ptr<MockCastDialogController> controller_; +}; + +IN_PROC_BROWSER_TEST_F(CastDialogViewBrowserTest, InvokeUi_Available) { + ShowAndVerifyUi(); +} + +IN_PROC_BROWSER_TEST_F(CastDialogViewBrowserTest, InvokeUi_Connected) { + ShowAndVerifyUi(); +} + +IN_PROC_BROWSER_TEST_F(CastDialogViewBrowserTest, InvokeUi_Unavailable) { + ShowAndVerifyUi(); +} + +IN_PROC_BROWSER_TEST_F(CastDialogViewBrowserTest, InvokeUi_Mixed) { + ShowAndVerifyUi(); +} + +IN_PROC_BROWSER_TEST_F(CastDialogViewBrowserTest, InvokeUi_NoSinks) { + ShowAndVerifyUi(); +}
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc index 177d39db..1f0ba0e 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -14,6 +14,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "chrome/browser/ui/views/omnibox/omnibox_result_view.h" +#include "chrome/browser/ui/views/omnibox/omnibox_row_view.h" #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" #include "chrome/browser/ui/views/omnibox/rounded_omnibox_results_frame.h" #include "chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.h" @@ -207,7 +208,7 @@ if (i >= children().size()) return nullptr; - return static_cast<OmniboxResultView*>(children()[i]); + return static_cast<OmniboxRowView*>(children()[i])->result_view(); } bool OmniboxPopupContentsView::InExplicitExperimentalKeywordMode() { @@ -298,24 +299,43 @@ location_bar_view_->profile())); } } else { + base::Optional<int> previous_row_group_id = base::nullopt; for (size_t i = 0; i < result_size; ++i) { // Create child views lazily. Since especially the first result view may // be expensive to create due to loading font data, this saves time and - // memory during browser startup. + // memory during browser startup. https://crbug.com/1021323 if (children().size() == i) { - AddChildView(std::make_unique<OmniboxResultView>(this, i)); + AddChildView(std::make_unique<OmniboxRowView>( + std::make_unique<OmniboxResultView>(this, i))); } - OmniboxResultView* view = result_view_at(i); + OmniboxRowView* const row_view = + static_cast<OmniboxRowView*>(children()[i]); + row_view->SetVisible(true); + + // Show the header if it's distinct from the previous match's header. const AutocompleteMatch& match = GetMatchAtIndex(i); - view->SetMatch(match); - view->SetVisible(true); + if (match.suggestion_group_id.has_value() && + match.suggestion_group_id != previous_row_group_id) { + row_view->ShowHeader(match.suggestion_group_id, + model_->result().GetHeaderForGroupId( + match.suggestion_group_id.value())); + } else { + row_view->HideHeader(); + } + previous_row_group_id = match.suggestion_group_id; + + OmniboxResultView* const result_view = row_view->result_view(); + result_view->SetMatch(match); + const SkBitmap* bitmap = model_->RichSuggestionBitmapAt(i); - if (bitmap) - view->SetRichSuggestionImage( + if (bitmap) { + result_view->SetRichSuggestionImage( gfx::ImageSkia::CreateFrom1xBitmap(*bitmap)); + } } + // If we have more views than matches, hide the surplus ones. for (auto i = children().begin() + result_size; i != children().end(); ++i) (*i)->SetVisible(false); }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_row_view.cc b/chrome/browser/ui/views/omnibox/omnibox_row_view.cc new file mode 100644 index 0000000..13f6fbdf --- /dev/null +++ b/chrome/browser/ui/views/omnibox/omnibox_row_view.cc
@@ -0,0 +1,51 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/omnibox/omnibox_row_view.h" + +#include "chrome/browser/ui/views/omnibox/omnibox_result_view.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/box_layout.h" + +class OmniboxRowView::HeaderView : public views::Label { + public: + HeaderView() { + SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal)); + + header_text_ = AddChildView(std::make_unique<views::Label>()); + } + + void SetHeaderText(const base::string16& header_text) { + header_text_->SetText(header_text); + } + + private: + // The Label containing the header text. This is never nullptr. + views::Label* header_text_; +}; + +OmniboxRowView::OmniboxRowView(std::unique_ptr<OmniboxResultView> result_view) { + DCHECK(result_view); + + SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kVertical)); + + result_view_ = AddChildView(std::move(result_view)); +} + +void OmniboxRowView::ShowHeader(base::Optional<int> suggestion_group_id, + const base::string16& header_text) { + // Create the header (at index 0) if it doesn't exist. + if (header_view_ == nullptr) + header_view_ = AddChildViewAt(std::make_unique<HeaderView>(), 0); + + header_view_->SetHeaderText(header_text); + header_view_->SetVisible(true); +} + +void OmniboxRowView::HideHeader() { + if (header_view_) + header_view_->SetVisible(false); +}
diff --git a/chrome/browser/ui/views/omnibox/omnibox_row_view.h b/chrome/browser/ui/views/omnibox/omnibox_row_view.h new file mode 100644 index 0000000..c597cdc --- /dev/null +++ b/chrome/browser/ui/views/omnibox/omnibox_row_view.h
@@ -0,0 +1,47 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_ROW_VIEW_H_ +#define CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_ROW_VIEW_H_ + +#include "base/optional.h" +#include "base/strings/string16.h" +#include "ui/views/view.h" + +class OmniboxResultView; + +// The View that's a direct child of the OmniboxPopupContentsView, one per row. +// This, in turn, has a child OmniboxResultView and an optional header that is +// painted right above it. The header is not a child of OmniboxResultView +// because it's logically not part of the result view: +// - Hovering the header doesn't highlight the result view. +// - Clicking the header doesn't navigate to the match. +// - It's the header for multiple matches, it's just painted above this row. +class OmniboxRowView : public views::View { + public: + explicit OmniboxRowView(std::unique_ptr<OmniboxResultView> result_view); + + // Sets the header that appears above this row. Also shows the header. + void ShowHeader(base::Optional<int> suggestion_group_id, + const base::string16& header_text); + + // Hides the header. + void HideHeader(); + + // The result view associated with this row. + OmniboxResultView* result_view() const { return result_view_; } + + private: + class HeaderView; + + // Non-owning pointer to the header view for this row. This is initially + // nullptr, and lazily created when a header is first set for this row. + // Lazily creating these speeds up browser startup: https://crbug.com/1021323 + HeaderView* header_view_ = nullptr; + + // Non-owning pointer to the result view for this row. This is never nullptr. + OmniboxResultView* result_view_; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_ROW_VIEW_H_
diff --git a/chrome/browser/ui/webui/about_ui.cc b/chrome/browser/ui/webui/about_ui.cc index 3b115ec1..8973b19 100644 --- a/chrome/browser/ui/webui/about_ui.cc +++ b/chrome/browser/ui/webui/about_ui.cc
@@ -227,11 +227,8 @@ this), base::BindOnce(&ChromeOSTermsHandler::ResponseOnUIThread, this)); } else { - // Load local ChromeOS terms from the file. - base::ThreadPool::PostTaskAndReply( - FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE}, - base::BindOnce(&ChromeOSTermsHandler::LoadEulaFileAsync, this), - base::BindOnce(&ChromeOSTermsHandler::ResponseOnUIThread, this)); + NOTREACHED(); + ResponseOnUIThread(); } } @@ -253,23 +250,6 @@ } } - void LoadEulaFileAsync() { - base::ScopedBlockingCall scoped_blocking_call( - FROM_HERE, base::BlockingType::MAY_BLOCK); - - std::string file_path = - base::StringPrintf(chrome::kEULAPathFormat, locale_.c_str()); - if (!base::ReadFileToString(base::FilePath(file_path), &contents_)) { - // No EULA for given language - try en-US as default. - file_path = base::StringPrintf(chrome::kEULAPathFormat, "en-US"); - if (!base::ReadFileToString(base::FilePath(file_path), &contents_)) { - // File with EULA not found, ResponseOnUIThread will load EULA from - // resources if contents_ is empty. - contents_.clear(); - } - } - } - void LoadArcPrivacyPolicyFileAsync() { base::ScopedBlockingCall scoped_blocking_call( FROM_HERE, base::BlockingType::MAY_BLOCK); @@ -651,11 +631,12 @@ #if !defined(OS_ANDROID) } else if (source_name_ == chrome::kChromeUITermsHost) { #if defined(OS_CHROMEOS) - ChromeOSTermsHandler::Start(path, std::move(callback)); - return; -#else - response = l10n_util::GetStringUTF8(IDS_TERMS_HTML); + if (!path.empty()) { + ChromeOSTermsHandler::Start(path, std::move(callback)); + return; + } #endif + response = l10n_util::GetStringUTF8(IDS_TERMS_HTML); #endif }
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom index 99651f71..d665c9a 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
@@ -111,6 +111,17 @@ ThemeInfo info; }; +// Specifies look of the doodle share button. +struct DoodleShareButton { + // Position in pixels relative to the doodle's upper left corner. + int32 x; + int32 y; + // Button background color. + skia.mojom.SkColor background_color; + // Data URL of icon shown on the button. + url.mojom.Url icon_url; +}; + // The contents of simple and animated doodles. struct ImageDoodleContent { // Doodle image encoded as data URL. @@ -119,6 +130,8 @@ url.mojom.Url on_click_url; // URL pointing to animated content (e.g. gif). Only set for animated doodles. url.mojom.Url? animation_url; + // Specification of the share button. + DoodleShareButton share_button; }; // The contents of a doodle.
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc index ab8be90..3cdf9627 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -424,6 +424,14 @@ std::move(callback).Run(nullptr); return; } + SkColor doodle_share_button_background_color; + if (logo->metadata.share_button_bg.size() != 7 || + logo->metadata.share_button_bg[0] != '#' || + !base::HexStringToUInt(logo->metadata.share_button_bg.substr(1), + &doodle_share_button_background_color)) { + std::move(callback).Run(nullptr); + return; + } auto image_doodle_content = new_tab_page::mojom::ImageDoodleContent::New(); std::string base64; base::Base64Encode(logo->encoded_image->data(), &base64); @@ -433,6 +441,14 @@ if (logo->metadata.type == search_provider_logos::LogoType::ANIMATED) { image_doodle_content->animation_url = logo->metadata.animated_url; } + image_doodle_content->share_button = + new_tab_page::mojom::DoodleShareButton::New(); + image_doodle_content->share_button->x = logo->metadata.share_button_x; + image_doodle_content->share_button->y = logo->metadata.share_button_y; + image_doodle_content->share_button->icon_url = GURL(base::StringPrintf( + "data:image/png;base64,%s", logo->metadata.share_button_icon.c_str())); + image_doodle_content->share_button->background_color = + SkColorSetA(doodle_share_button_background_color, 255); doodle->content = new_tab_page::mojom::DoodleContent::NewImageDoodle( std::move(image_doodle_content)); } else if (logo->metadata.type ==
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc index 0b16fb76..775ab1e 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -113,6 +113,9 @@ // Search box. {"searchBoxHint", IDS_GOOGLE_SEARCH_BOX_EMPTY_HINT_MD}, + + // Logo/doodle. + {"shareDoodle", IDS_NTP_DOODLE_SHARE_LABEL}, }; AddLocalizedStringsBulk(source, kStrings);
diff --git a/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.cc b/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.cc index 60592cf..337bcde 100644 --- a/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.cc +++ b/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.cc
@@ -8,7 +8,8 @@ namespace upboarding { -TileServiceImpl::TileServiceImpl(image_fetcher::ImageFetcher* image_fetcher) {} +TileServiceImpl::TileServiceImpl(std::unique_ptr<ImageLoader> image_loader) + : image_loader_(std::move(image_loader)) {} TileServiceImpl::~TileServiceImpl() = default;
diff --git a/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.h b/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.h index c08d64f75..c6fa89f9 100644 --- a/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.h +++ b/chrome/browser/upboarding/query_tiles/internal/tile_service_impl.h
@@ -5,15 +5,17 @@ #ifndef CHROME_BROWSER_UPBOARDING_QUERY_TILES_INTERNAL_TILE_SERVICE_IMPL_H_ #define CHROME_BROWSER_UPBOARDING_QUERY_TILES_INTERNAL_TILE_SERVICE_IMPL_H_ +#include <memory> + #include "base/memory/weak_ptr.h" +#include "chrome/browser/upboarding/query_tiles/internal/image_loader.h" #include "chrome/browser/upboarding/query_tiles/tile_service.h" -#include "components/image_fetcher/core/image_fetcher.h" namespace upboarding { class TileServiceImpl : public TileService { public: - explicit TileServiceImpl(image_fetcher::ImageFetcher* image_fetcher); + explicit TileServiceImpl(std::unique_ptr<ImageLoader> image_loader); ~TileServiceImpl() override; // Disallow copy/assign. @@ -26,6 +28,9 @@ void GetVisuals(const std::string& tile_id, VisualsCallback callback) override; + // Used to load tile images. + std::unique_ptr<ImageLoader> image_loader_; + base::WeakPtrFactory<TileServiceImpl> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/upboarding/query_tiles/tile_service_factory_helper.cc b/chrome/browser/upboarding/query_tiles/tile_service_factory_helper.cc index 28841576..db074b8 100644 --- a/chrome/browser/upboarding/query_tiles/tile_service_factory_helper.cc +++ b/chrome/browser/upboarding/query_tiles/tile_service_factory_helper.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/upboarding/query_tiles/tile_service_factory_helper.h" +#include "chrome/browser/upboarding/query_tiles/internal/cached_image_loader.h" #include "chrome/browser/upboarding/query_tiles/internal/tile_service_impl.h" #include "components/keyed_service/core/keyed_service.h" @@ -11,7 +12,8 @@ std::unique_ptr<TileService> CreateTileService( image_fetcher::ImageFetcher* image_fetcher) { - return std::make_unique<TileServiceImpl>(image_fetcher); + auto image_loader = std::make_unique<CachedImageLoader>(image_fetcher); + return std::make_unique<TileServiceImpl>(std::move(image_loader)); } } // namespace upboarding
diff --git a/chrome/browser/web_applications/chrome_pwa_launcher/launcher_update.cc b/chrome/browser/web_applications/chrome_pwa_launcher/launcher_update.cc index a9024a41..7002aeea 100644 --- a/chrome/browser/web_applications/chrome_pwa_launcher/launcher_update.cc +++ b/chrome/browser/web_applications/chrome_pwa_launcher/launcher_update.cc
@@ -43,16 +43,20 @@ // to or copy of |latest_version_path| at |launcher_path|. Makes a best-effort // attempt to delete |old_path|. Aside from the best-effort deletion, all // changes are rolled back if any step fails. -bool ReplaceLauncherWithLatestVersion(const base::FilePath& launcher_path, +void ReplaceLauncherWithLatestVersion(const base::FilePath& launcher_path, const base::FilePath& latest_version_path, const base::FilePath& old_path) { - if (!base::PathExists(latest_version_path)) - return false; + if (!base::PathExists(latest_version_path)) { + // TODO(jessemckenna): emit failure metric to UMA. + return; + } // Create a temporary backup directory for use while moving in-use files. base::ScopedTempDir temp_dir; - if (!temp_dir.CreateUniqueTempDirUnderPath(launcher_path.DirName())) - return false; + if (!temp_dir.CreateUniqueTempDirUnderPath(launcher_path.DirName())) { + // TODO(jessemckenna): emit failure metric to UMA. + return; + } // Move |launcher_path| to |old_path|. std::unique_ptr<WorkItemList> change_list(WorkItem::CreateWorkItemList()); @@ -76,9 +80,8 @@ if (!change_list->Do()) { change_list->Rollback(); - return false; + // TODO(jessemckenna): emit failure metric to UMA. } - return true; } // Deletes |old_path| and any variations on it (e.g., |old_path| (1), |old_path| @@ -123,9 +126,7 @@ // Make a hardlink or copy of |latest_version_path|, and replace the current // launcher with it. - const bool did_update = - ReplaceLauncherWithLatestVersion(path, latest_version_path, old_path); - DCHECK(did_update); + ReplaceLauncherWithLatestVersion(path, latest_version_path, old_path); } }
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 2b74861..7adf66b 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -179,7 +179,7 @@ // OS_CHROMEOS, but this flag must be defined for all platforms since // it is required for SystemWebApp tests. const base::Feature kTerminalSystemApp{"TerminalSystemApp", - base::FEATURE_ENABLED_BY_DEFAULT}; + base::FEATURE_DISABLED_BY_DEFAULT}; // Use the Terminal System App legacy settings page. const base::Feature kTerminalSystemAppLegacySettings{
diff --git a/chrome/common/extensions/command.cc b/chrome/common/extensions/command.cc index aba488f..3a8dea7 100644 --- a/chrome/common/extensions/command.cc +++ b/chrome/common/extensions/command.cc
@@ -39,16 +39,9 @@ static const int kMaxTokenSize = 3; #endif // OS_CHROMEOS -Command::Type GetCommandType(const std::string& command_name) { - if (command_name == values::kPageActionCommandEvent) - return Command::Type::kPageAction; - if (command_name == values::kBrowserActionCommandEvent) - return Command::Type::kBrowserAction; - return Command::Type::kNamed; -} - bool IsNamedCommand(const std::string& command_name) { - return GetCommandType(command_name) == Command::Type::kNamed; + return command_name != values::kPageActionCommandEvent && + command_name != values::kBrowserActionCommandEvent; } bool DoesRequireModifier(const std::string& accelerator) { @@ -273,19 +266,16 @@ } // namespace -Command::Command() : global_(false), type_(Type::kNamed) {} +Command::Command() : global_(false) {} Command::Command(const std::string& command_name, const base::string16& description, const std::string& accelerator, bool global) - : command_name_(command_name), - description_(description), - global_(global), - type_(GetCommandType(command_name)) { + : command_name_(command_name), description_(description), global_(global) { base::string16 error; accelerator_ = ParseImpl(accelerator, CommandPlatform(), 0, - type_ == Type::kNamed, &error); + IsNamedCommand(command_name), &error); } Command::Command(const Command& other) = default; @@ -533,7 +523,6 @@ command_name_ = command_name; description_ = description; global_ = global; - type_ = GetCommandType(command_name); } } return true;
diff --git a/chrome/common/extensions/command.h b/chrome/common/extensions/command.h index 11a86fb..a4b9a57 100644 --- a/chrome/common/extensions/command.h +++ b/chrome/common/extensions/command.h
@@ -19,12 +19,6 @@ class Command { public: - enum class Type { - kBrowserAction, - kPageAction, - kNamed, - }; - Command(); Command(const std::string& command_name, const base::string16& description, @@ -61,7 +55,6 @@ const ui::Accelerator& accelerator() const { return accelerator_; } const base::string16& description() const { return description_; } bool global() const { return global_; } - Type type() const { return type_; } // Setter: void set_accelerator(const ui::Accelerator& accelerator) { @@ -76,7 +69,6 @@ ui::Accelerator accelerator_; base::string16 description_; bool global_; - Type type_; }; // A mapping of command name (std::string) to a command object.
diff --git a/chrome/common/extensions/command_unittest.cc b/chrome/common/extensions/command_unittest.cc index adc1807..2dfce26 100644 --- a/chrome/common/extensions/command_unittest.cc +++ b/chrome/common/extensions/command_unittest.cc
@@ -9,7 +9,6 @@ #include <memory> #include <utility> -#include "base/optional.h" #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -28,7 +27,6 @@ const char* command_name; const char* key; const char* description; - base::Optional<Command::Type> type; }; // Checks the |suggested_key| value parses into a command when specified as a @@ -91,8 +89,6 @@ base::UTF16ToASCII(command.description()).c_str()); EXPECT_STREQ(data.command_name, command.command_name().c_str()); EXPECT_EQ(data.accelerator, command.accelerator()); - ASSERT_TRUE(data.type) << "Parsed commands must specify an expected type"; - EXPECT_EQ(*data.type, command.type()); } } } @@ -153,67 +149,43 @@ {false, shift_f, "command", "Shift+F", "description"}, {false, shift_f, "command", "F+Shift", "description"}, // Basic tests. - {true, none, "command", "", "description", Command::Type::kNamed}, - {true, ctrl_f, "command", "Ctrl+F", "description", Command::Type::kNamed}, - {true, alt_f, "command", "Alt+F", "description", Command::Type::kNamed}, - {true, ctrl_shift_f, "command", "Ctrl+Shift+F", "description", - Command::Type::kNamed}, - {true, alt_shift_f, "command", "Alt+Shift+F", "description", - Command::Type::kNamed}, - {true, ctrl_1, "command", "Ctrl+1", "description", Command::Type::kNamed}, + {true, none, "command", "", "description"}, + {true, ctrl_f, "command", "Ctrl+F", "description"}, + {true, alt_f, "command", "Alt+F", "description"}, + {true, ctrl_shift_f, "command", "Ctrl+Shift+F", "description"}, + {true, alt_shift_f, "command", "Alt+Shift+F", "description"}, + {true, ctrl_1, "command", "Ctrl+1", "description"}, // Shortcut token order tests. - {true, ctrl_f, "command", "F+Ctrl", "description", Command::Type::kNamed}, - {true, alt_f, "command", "F+Alt", "description", Command::Type::kNamed}, - {true, ctrl_shift_f, "command", "F+Ctrl+Shift", "description", - Command::Type::kNamed}, - {true, ctrl_shift_f, "command", "F+Shift+Ctrl", "description", - Command::Type::kNamed}, - {true, alt_shift_f, "command", "F+Alt+Shift", "description", - Command::Type::kNamed}, - {true, alt_shift_f, "command", "F+Shift+Alt", "description", - Command::Type::kNamed}, + {true, ctrl_f, "command", "F+Ctrl", "description"}, + {true, alt_f, "command", "F+Alt", "description"}, + {true, ctrl_shift_f, "command", "F+Ctrl+Shift", "description"}, + {true, ctrl_shift_f, "command", "F+Shift+Ctrl", "description"}, + {true, alt_shift_f, "command", "F+Alt+Shift", "description"}, + {true, alt_shift_f, "command", "F+Shift+Alt", "description"}, // Case insensitivity is not OK. {false, ctrl_f, "command", "Ctrl+f", "description"}, {false, ctrl_f, "command", "cTrL+F", "description"}, // Skipping description is OK for browser- and pageActions. - {true, ctrl_f, "_execute_browser_action", "Ctrl+F", "", - Command::Type::kBrowserAction}, - {true, ctrl_f, "_execute_page_action", "Ctrl+F", "", - Command::Type::kPageAction}, + {true, ctrl_f, "_execute_browser_action", "Ctrl+F", ""}, + {true, ctrl_f, "_execute_page_action", "Ctrl+F", ""}, // Home, End, Arrow keys, etc. - {true, ctrl_comma, "_execute_browser_action", "Ctrl+Comma", "", - Command::Type::kBrowserAction}, - {true, ctrl_dot, "_execute_browser_action", "Ctrl+Period", "", - Command::Type::kBrowserAction}, - {true, ctrl_left, "_execute_browser_action", "Ctrl+Left", "", - Command::Type::kBrowserAction}, - {true, ctrl_right, "_execute_browser_action", "Ctrl+Right", "", - Command::Type::kBrowserAction}, - {true, ctrl_up, "_execute_browser_action", "Ctrl+Up", "", - Command::Type::kBrowserAction}, - {true, ctrl_down, "_execute_browser_action", "Ctrl+Down", "", - Command::Type::kBrowserAction}, - {true, ctrl_ins, "_execute_browser_action", "Ctrl+Insert", "", - Command::Type::kBrowserAction}, - {true, ctrl_del, "_execute_browser_action", "Ctrl+Delete", "", - Command::Type::kBrowserAction}, - {true, ctrl_home, "_execute_browser_action", "Ctrl+Home", "", - Command::Type::kBrowserAction}, - {true, ctrl_end, "_execute_browser_action", "Ctrl+End", "", - Command::Type::kBrowserAction}, - {true, ctrl_pgup, "_execute_browser_action", "Ctrl+PageUp", "", - Command::Type::kBrowserAction}, - {true, ctrl_pgdwn, "_execute_browser_action", "Ctrl+PageDown", "", - Command::Type::kBrowserAction}, + {true, ctrl_comma, "_execute_browser_action", "Ctrl+Comma", ""}, + {true, ctrl_dot, "_execute_browser_action", "Ctrl+Period", ""}, + {true, ctrl_left, "_execute_browser_action", "Ctrl+Left", ""}, + {true, ctrl_right, "_execute_browser_action", "Ctrl+Right", ""}, + {true, ctrl_up, "_execute_browser_action", "Ctrl+Up", ""}, + {true, ctrl_down, "_execute_browser_action", "Ctrl+Down", ""}, + {true, ctrl_ins, "_execute_browser_action", "Ctrl+Insert", ""}, + {true, ctrl_del, "_execute_browser_action", "Ctrl+Delete", ""}, + {true, ctrl_home, "_execute_browser_action", "Ctrl+Home", ""}, + {true, ctrl_end, "_execute_browser_action", "Ctrl+End", ""}, + {true, ctrl_pgup, "_execute_browser_action", "Ctrl+PageUp", ""}, + {true, ctrl_pgdwn, "_execute_browser_action", "Ctrl+PageDown", ""}, // Media keys. - {true, next_track, "command", "MediaNextTrack", "description", - Command::Type::kNamed}, - {true, play_pause, "command", "MediaPlayPause", "description", - Command::Type::kNamed}, - {true, prev_track, "command", "MediaPrevTrack", "description", - Command::Type::kNamed}, - {true, stop, "command", "MediaStop", "description", - Command::Type::kNamed}, + {true, next_track, "command", "MediaNextTrack", "description"}, + {true, play_pause, "command", "MediaPlayPause", "description"}, + {true, prev_track, "command", "MediaPrevTrack", "description"}, + {true, stop, "command", "MediaStop", "description"}, {false, none, "_execute_browser_action", "MediaNextTrack", ""}, {false, none, "_execute_page_action", "MediaPrevTrack", ""}, {false, none, "command", "Ctrl+Shift+MediaPrevTrack", "description"}, @@ -319,10 +291,8 @@ ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN); ConstCommandsTestData kChromeOsTests[] = { - {true, search_shift_z, "command", "Search+Shift+Z", "description", - Command::Type::kNamed}, - {true, search_a, "command", "Search+A", "description", - Command::Type::kNamed}, + {true, search_shift_z, "command", "Search+Shift+Z", "description"}, + {true, search_a, "command", "Search+A", "description"}, // Command is not valid on Chrome OS. {false, search_shift_z, "command", "Command+Shift+Z", "description"}, };
diff --git a/chrome/common/url_constants.cc b/chrome/common/url_constants.cc index 462c2e1e..b8311c3 100644 --- a/chrome/common/url_constants.cc +++ b/chrome/common/url_constants.cc
@@ -343,8 +343,6 @@ const char kEasyUnlockLearnMoreUrl[] = "https://support.google.com/chromebook/?p=smart_lock"; -const char kEULAPathFormat[] = "/usr/share/chromeos-assets/eula/%s/eula.html"; - const char kArcTermsPathFormat[] = "arc_tos/%s/terms.html"; const char kArcPrivacyPolicyPathFormat[] = "arc_tos/%s/privacy_policy.pdf";
diff --git a/chrome/common/url_constants.h b/chrome/common/url_constants.h index 5deb728..935cc39 100644 --- a/chrome/common/url_constants.h +++ b/chrome/common/url_constants.h
@@ -294,9 +294,6 @@ // The URL for the "Learn more" link the the Easy Unlock settings. extern const char kEasyUnlockLearnMoreUrl[]; -// The path to the offline Chrome OS EULA. -extern const char kEULAPathFormat[]; - // The URL for EOL notification extern const char kEolNotificationURL[];
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 2d2fe709..5a0890a 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1949,6 +1949,7 @@ "../browser/ui/views/location_bar/location_bar_view_browsertest.cc", "../browser/ui/views/location_bar/location_icon_view_browsertest.cc", "../browser/ui/views/location_bar/zoom_bubble_view_browsertest.cc", + "../browser/ui/views/media_router/cast_dialog_view_browsertest.cc", "../browser/ui/views/media_router/media_router_dialog_controller_views_browsertest.cc", "../browser/ui/views/media_router/media_router_ui_browsertest.cc", "../browser/ui/views/media_router/presentation_receiver_window_view_browsertest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java index db1710e..189c9ba4f 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/OmniboxTestUtils.java
@@ -78,7 +78,7 @@ List<MatchClassification> classifications = new ArrayList<>(); classifications.add(new MatchClassification(0, MatchClassificationStyle.NONE)); mSuggestions.add(new OmniboxSuggestion(type, false, 0, 0, text, classifications, null, - classifications, null, "", url, null, null, false, false)); + classifications, null, "", url, null, null, false, false, null, null)); return this; }
diff --git a/chrome/test/chromedriver/README.txt b/chrome/test/chromedriver/README.md similarity index 61% rename from chrome/test/chromedriver/README.txt rename to chrome/test/chromedriver/README.md index bf02132..224171e 100644 --- a/chrome/test/chromedriver/README.txt +++ b/chrome/test/chromedriver/README.md
@@ -1,22 +1,32 @@ +# ChromeDriver + This file contains high-level info about how ChromeDriver works and how to -contribute. +contribute. If you are looking for information on how to use ChromeDriver, +please see the [ChromeDriver user site](https://chromedriver.chromium.org/). -ChromeDriver is an implementation of the WebDriver standard -(https://w3c.github.io/webdriver/), which allows users to automate testing of -their website across browsers. +ChromeDriver is an implementation of the +[WebDriver standard](https://w3c.github.io/webdriver/), +which allows users to automate testing of their website across browsers. -See the user site at https://sites.google.com/a/chromium.org/chromedriver/ +## Getting Started -=====Getting started===== -Build ChromeDriver by building the 'chromedriver' target. This will -create an executable binary in the build folder named -'chromedriver[.exe]'. +Build ChromeDriver by building the `chromedriver` target, e.g., + +``` +ninja -C out/Default chromedriver +``` + +This will create an executable binary in the build folder named +`chromedriver[.exe]`. Once built, ChromeDriver can be used with various third-party libraries that support WebDriver protocol, including language bindings provided by Selenium. For testing purposes, ChromeDriver can be used interactively with python. +The following code uses our own testing API, not the commonly used Python +binding provided by Selenium. +```python $ export PYTHONPATH=<THIS_DIR>/server:<THIS_DIR>/client $ python >>> import server @@ -26,22 +36,27 @@ >>> driver.Load('http://www.google.com') >>> driver.Quit() >>> cd_server.Kill() +``` -ChromeDriver will use the system installed Chrome by default. +By default, ChromeDriver will look in its own directory for Chrome to use. +If Chrome is not found there, it will use the system installed Chrome. To use ChromeDriver with Chrome on Android pass the Android package name in the chromeOptions.androidPackage capability when creating the driver. The path to adb_commands.py and the adb tool from the Android SDK must be set in PATH. For more detailed instructions see the user site. -=====Architecture===== +## Architecture + ChromeDriver is shipped separately from Chrome. It controls Chrome out of -process through DevTools. ChromeDriver is a standalone server which +process through [DevTools](https://chromedevtools.github.io/devtools-protocol/). +ChromeDriver is a standalone server which communicates with the WebDriver client via the WebDriver wire protocol, which is essentially synchronous JSON commands over HTTP. WebDriver clients are available in many languages, and many are available from the open source -selenium/webdriver project: http://code.google.com/p/selenium. ChromeDriver -uses the webserver from net/server. +[Selenium WebDriver project](https://www.selenium.dev/). +ChromeDriver uses the webserver from +[net/server](https://source.chromium.org/chromium/chromium/src/+/master:net/server/). ChromeDriver has a main thread, called the command thread, an IO thread, and a thread per session. The webserver receives a request on the IO thread, @@ -52,56 +67,68 @@ command is finished, it will invoke a callback, which will eventually make its way back to the IO thread as a HTTP response for the server to send. -=====Code structure (relative to this file)===== -1) . +## Code structure (relative to this file) + +* [(this directory)](.): Implements chromedriver commands. -2) chrome/ +* [chrome/](chrome/): A basic interface for controlling Chrome. Should not depend on or reference WebDriver-related code or concepts. -3) js/ +* [js/](js/): Javascript helper scripts. -4) net/ +* [net/](net/): Code to deal with network communication, such as connection to DevTools. -5) client/ +* [client/](client/): Code for a python client. -6) server/ +* [server/](server/): Code for the chromedriver server. A python wrapper to the chromedriver server. -7) extension/ +* [extension/](extension/): An extension used for automating the desktop browser. -8) test/ +* [test/](test/): Integration tests. -9) third_party/ -Third party libraries used by chromedriver. +## Testing -=====Testing===== There are several test suites for verifying ChromeDriver's correctness: -* chromedriver_unittests +### chromedriver_unittests + This is the unittest target, which runs on the commit queue on win/mac/linux. Tests should take a few milliseconds and be very stable. -* python integration tests (test/run_py_tests.py) +``` +ninja -C out/Default chromedriver_unittests +out/Default/chromedriver_unittests +``` + +### python integration tests (`test/run_py_tests.py`) + These tests are maintained by the ChromeDriver team, and are intended to verify that ChromeDriver works correctly with Chrome. Run test/run_py_tests.py --help for more info. These are run on the commit queue on win/mac/linux. -* WebDriver Java acceptance tests (test/run_java_tests.py) +``` +ninja -C out/Default chrome chromedriver +<THIS_DIR>/test/run_py_tests.py --chromedriver=out/Default/chromedriver +``` + +### WebDriver Java acceptance tests (`test/run_java_tests.py`) + These are integration tests from the WebDriver open source project which can be run via test/run_java_tests.py. They are not currently run on any bots, but will be included in the commit queue in the future. Run with --help for more info. -=====Contributing===== +## Contributing + Find an open issue and submit a patch for review by an individual listed in -the OWNERS file in this directory. Issues are tracked in chromedriver's issue -tracker: - https://bugs.chromium.org/p/chromedriver/issues/list +the `OWNERS` file in this directory. Issues are tracked in +[ChromeDriver issue tracker](https://crbug.com/chromedriver).
diff --git a/chrome/test/data/extensions/api_test/content_scripts/existing_renderers/content_styles.css b/chrome/test/data/extensions/api_test/content_scripts/existing_renderers/content_styles.css deleted file mode 100644 index 67ce83e..0000000 --- a/chrome/test/data/extensions/api_test/content_scripts/existing_renderers/content_styles.css +++ /dev/null
@@ -1,3 +0,0 @@ -body { - background: red; -}
diff --git a/chrome/test/data/extensions/api_test/content_scripts/existing_renderers/manifest.json b/chrome/test/data/extensions/api_test/content_scripts/existing_renderers/manifest.json deleted file mode 100644 index 3556fa8..0000000 --- a/chrome/test/data/extensions/api_test/content_scripts/existing_renderers/manifest.json +++ /dev/null
@@ -1,10 +0,0 @@ -{ - "name": "Existing Renderers", - "version": "1.0", - "manifest_version": 2, - "description": "Tests that styles specified by content scripts are injected and applied into existing renderers.", - "content_scripts": [ { - "css": [ "content_styles.css" ], - "matches": [ "<all_urls>" ] - }] -}
diff --git a/chrome/test/data/login/form.html b/chrome/test/data/login/form.html new file mode 100644 index 0000000..bb7a094 --- /dev/null +++ b/chrome/test/data/login/form.html
@@ -0,0 +1,7 @@ +<html> +<head> +</head> +<body> + <form method="POST" action="/auth-basic"><input type="submit" id="submit"/></form> +</body> +</html>
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 97704f6d..4de54928 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -5617,6 +5617,20 @@ } }, + "CrostiniArcAdbSideloadingAllowed": { + "os": ["chromeos"], + "policy_pref_mapping_test": [ + { + "policies": { "CrostiniArcAdbSideloadingAllowed": 0 }, + "prefs": { "crostini.arc_adb_sideloading.user_pref": {} } + }, + { + "policies": { "CrostiniArcAdbSideloadingAllowed": 1 }, + "prefs": { "crostini.arc_adb_sideloading.user_pref": {} } + } + ] + }, + "DeviceSamlLoginAuthenticationType": {}, "DeviceScheduledUpdateCheck": {
diff --git a/chrome/test/data/webui/chromeos/print_management/print_management_browsertest.js b/chrome/test/data/webui/chromeos/print_management/print_management_browsertest.js index cb05161c..c4d5d56 100644 --- a/chrome/test/data/webui/chromeos/print_management/print_management_browsertest.js +++ b/chrome/test/data/webui/chromeos/print_management/print_management_browsertest.js
@@ -24,6 +24,8 @@ extraLibraries: [ '//third_party/mocha/mocha.js', '//chrome/test/data/webui/mocha_adapter.js', + '//ui/webui/resources/js/assert.js', + '//ui/webui/resources/js/promise_resolver.js', ], featureList: {
diff --git a/chrome/test/data/webui/chromeos/print_management/print_management_test.js b/chrome/test/data/webui/chromeos/print_management/print_management_test.js index 10f97d1d..130d75a9 100644 --- a/chrome/test/data/webui/chromeos/print_management/print_management_test.js +++ b/chrome/test/data/webui/chromeos/print_management/print_management_test.js
@@ -6,10 +6,143 @@ import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js'; import 'chrome://print-management/print_management.js'; +import {setMetadataProviderForTesting} from 'chrome://print-management/mojo_interface_provider.js'; + +const CompletionStatus = { + FAILED: 0, + CANCELED: 1, + PRINTED: 2, +}; + +/** + * Converts a JS string to mojo_base::mojom::String16 object. + * @param {string} str + * @return {!object} + */ +function strToMojoString16(str) { + let arr = []; + for (var i = 0; i < str.length; i++) { + arr[i] = str.charCodeAt(i); + } + return {data: arr}; +} + +/** + * Converts a JS time (milliseconds since UNIX epoch) to mojom::time + * (microseconds since WINDOWS epoch). + * @param {Date} jsDate + * @return {number} + */ +function convertToMojoTime(jsDate) { + const windowsEpoch = new Date(Date.UTC(1601, 0, 1, 0, 0, 0)); + const jsEpoch = new Date(Date.UTC(1970, 0, 1, 0, 0, 0)); + return ((jsEpoch - windowsEpoch) * 1000) + (jsDate.getTime() * 1000); +} + +/** + * @param{string} id + * @param{string} title + * @param{number} completionStatus + * @param{Date} jsDate + * @param{string} printerName + * @return {!Object} + */ +function createJobEntry(id, title, completionStatus, jsDate, printerName) { + let jobEntry = {}; + jobEntry.id = id; + jobEntry.title = strToMojoString16(title); + jobEntry.completionStatus = completionStatus; + jobEntry.creationTime = {internalValue: convertToMojoTime(jsDate)}; + jobEntry.printerName = strToMojoString16(printerName); + jobEntry.printerUri = {url: '192.168.1.1'}; + jobEntry.numberOfPages = 1; + + return jobEntry; +} + +class FakePrintingMetadataProvider { + constructor() { + /** @private {!Map<string, !PromiseResolver>} */ + this.resolverMap_ = new Map(); + + /** @type {!Array<chromeos.printing.printingManager.mojom.PrintJobInfo>} */ + this.printJobs_ = []; + + this.resetForTest(); + } + + resetForTest() { + this.printJobs_ = []; + this.resolverMap_.set('getPrintJobs', new PromiseResolver()); + } + + /** + * @param {string} methodName + * @return {!PromiseResolver} + * @private + */ + getResolver_(methodName) { + let method = this.resolverMap_.get(methodName); + assert(!!method, `Method '${methodName}' not found.`); + return method; + } + + /** + * @param {string} methodName + * @protected + */ + methodCalled(methodName) { + this.getResolver_(methodName).resolve(); + } + + /** + * @param {string} methodName + * @return {!Promise} + */ + whenCalled(methodName) { + return this.getResolver_(methodName).promise.then(() => { + // Support sequential calls to whenCalled by replacing the promise. + this.resolverMap_.set(methodName, new PromiseResolver()); + }); + } + + /** + * @param {chromeos.printing.printingManager.mojom.PrintJobInfo} job + */ + addPrintJob(job) { + this.printJobs_ = this.printJobs_.concat(job); + } + + // printingMetadataProvider methods + + /** + * @return {!Promise<{printJobs: + * !Array<chromeos.printing.printingManager.mojom.PrintJobInfo>}>} + */ + getPrintJobs() { + return new Promise(resolve => { + this.methodCalled('getPrintJobs'); + resolve({printJobs: this.printJobs_ || []}); + }); + } +} + suite('PrintManagementTest', () => { /** @type {?PrintManagementElement} */ let page = null; + /** + * @type { + * ?chromeos.printing.printingManager.mojom.PrintingMetadataProviderRemote + * } + */ + let mojoApi_; + + suiteSetup(() => { + mojoApi_ = new FakePrintingMetadataProvider(); + setMetadataProviderForTesting(mojoApi_); + }); + setup(function() { PolymerTest.clearBody(); page = document.createElement('print-management'); @@ -26,4 +159,79 @@ // capabilities to test. assertEquals('Print Management', page.$$('#header').textContent); }); -}); \ No newline at end of file +}); + +suite('PrintJobEntryTest', () => { + /** @type {?HTMLElement} */ + let jobEntryTestElement = null; + + /** + * @type { + * ?chromeos.printing.printingManager.mojom.PrintingMetadataProviderRemote + * } + */ + let mojoApi_; + + suiteSetup(() => { + mojoApi_ = new FakePrintingMetadataProvider(); + setMetadataProviderForTesting(mojoApi_); + }); + + setup(() => { + jobEntryTestElement = document.createElement('print-job-entry'); + assertTrue(!!jobEntryTestElement); + document.body.appendChild(jobEntryTestElement); + }); + + teardown(() => { + jobEntryTestElement.remove(); + jobEntryTestElement = null; + }); + + /** + * @param {!HTMLElement} element + * @param {number} newStatus + * @param {string} expectedStatus + */ + function updateAndVerifyCompletionStatus(element, newStatus, expectedStatus) { + element.set('jobEntry.completionStatus', newStatus); + assertEquals( + expectedStatus, element.$$('#completionStatus').textContent.trim()); + } + + test('initializeJobEntry', () => { + const expectedTitle = 'title'; + const expectedStatus = CompletionStatus.PRINTED; + const expectedPrinterName = 'printer name'; + const expectedCreationTime = new Date(); + + jobEntryTestElement.jobEntry = createJobEntry( + /*id=*/ '1', expectedTitle, expectedStatus, expectedCreationTime, + expectedPrinterName); + + // Assert the title, printer name, creation time, and status are displayed + // correctly. + assertEquals( + expectedTitle, jobEntryTestElement.$$('#jobTitle').textContent.trim()); + assertEquals( + expectedPrinterName, + jobEntryTestElement.$$('#printerName').textContent.trim()); + assertEquals( + 'Printed', + jobEntryTestElement.$$('#completionStatus').textContent.trim()); + + // Change date and assert it shows the correct date (Jan 31, 2020); + jobEntryTestElement.set('jobEntry.creationTime', { + internalValue: convertToMojoTime(new Date(Date.UTC(2020, 1, 1, 0, 0, 0))) + }); + assertEquals( + 'Jan 31, 2020', + jobEntryTestElement.$$('#creationTime').textContent.trim()); + + // Change the completion status and verify it shows the correct status. + updateAndVerifyCompletionStatus( + jobEntryTestElement, CompletionStatus.FAILED, 'Failed'); + updateAndVerifyCompletionStatus( + jobEntryTestElement, CompletionStatus.CANCELED, 'Canceled'); + }); +});
diff --git a/chrome/test/data/webui/media/media_feeds_webui_browsertest.js b/chrome/test/data/webui/media/media_feeds_webui_browsertest.js index 8148514e..01425a8f 100644 --- a/chrome/test/data/webui/media/media_feeds_webui_browsertest.js +++ b/chrome/test/data/webui/media/media_feeds_webui_browsertest.js
@@ -6,7 +6,7 @@ * @fileoverview Test suite for the Media Feeds WebUI. */ -const EXAMPLE_URL_1 = 'http://example.com/feed.json'; +const EXAMPLE_URL_1 = 'https://example.com/feed.json'; GEN('#include "base/run_loop.h"'); GEN('#include "chrome/browser/media/history/media_history_keyed_service.h"');
diff --git a/chrome/test/data/webui/new_tab_page/logo_test.js b/chrome/test/data/webui/new_tab_page/logo_test.js index 08251bb..88e03726 100644 --- a/chrome/test/data/webui/new_tab_page/logo_test.js +++ b/chrome/test/data/webui/new_tab_page/logo_test.js
@@ -34,14 +34,30 @@ test('setting simple doodle shows image', async () => { // Act. - const logo = await createLogo( - {content: {imageDoodle: {imageUrl: {url: 'data:foo'}}}}); + const logo = await createLogo({ + content: { + imageDoodle: { + imageUrl: {url: 'data:foo'}, + shareButton: { + backgroundColor: {value: 0xFFFF0000}, + x: 11, + y: 12, + iconUrl: {url: 'data:bar'}, + }, + } + } + }); // Assert. assertNotStyle(logo.$.doodle, 'display', 'none'); assertStyle(logo.$.logo, 'display', 'none'); assertEquals(logo.$.image.src, 'data:foo'); assertNotStyle(logo.$.image, 'display', 'none'); + assertNotStyle(logo.$.shareButton, 'display', 'none'); + assertStyle(logo.$.shareButton, 'background-color', 'rgb(255, 0, 0)'); + assertStyle(logo.$.shareButton, 'left', '11px'); + assertStyle(logo.$.shareButton, 'top', '12px'); + assertEquals(logo.$.shareButtonImage.src, 'data:bar'); assertStyle(logo.$.animation, 'display', 'none'); assertStyle(logo.$.iframe, 'display', 'none'); });
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index 4b93537d7..cbf7cc9 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn
@@ -206,6 +206,7 @@ "//gpu", "//ipc", "//media", + "//media/mojo/services", "//net", "//services/media_session/public/mojom", "//services/network/public/mojom", @@ -301,10 +302,6 @@ deps += [ "//ui/ozone" ] } - if (enable_mojo_media) { - deps += [ "//media/mojo/services" ] - } - if (enable_external_mojo_services) { deps += [ "//chromecast/external_mojo/broker_service" ] }
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastContentWindowAndroid.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastContentWindowAndroid.java index 0dfd82b..6b9c618c 100644 --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastContentWindowAndroid.java +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastContentWindowAndroid.java
@@ -133,21 +133,24 @@ } @Override - public boolean consumeGesture(int gestureType) { + public void consumeGesture(int gestureType, + CastWebContentsComponent.GestureHandledCallback handledGestureCallback) { if (DEBUG) Log.d(TAG, "consumeGesture type=" + gestureType); if (mNativeCastContentWindowAndroid != 0) { - return CastContentWindowAndroidJni.get().consumeGesture( - mNativeCastContentWindowAndroid, CastContentWindowAndroid.this, gestureType); + CastContentWindowAndroidJni.get().consumeGesture(mNativeCastContentWindowAndroid, + CastContentWindowAndroid.this, gestureType, handledGestureCallback); + return; } - return false; + handledGestureCallback.invoke(false); } @NativeMethods interface Natives { void onActivityStopped( long nativeCastContentWindowAndroid, CastContentWindowAndroid caller); - boolean consumeGesture(long nativeCastContentWindowAndroid, CastContentWindowAndroid caller, - int gestureType); + void consumeGesture(long nativeCastContentWindowAndroid, CastContentWindowAndroid caller, + int gestureType, + CastWebContentsComponent.GestureHandledCallback handledGestureCallback); void onVisibilityChange(long nativeCastContentWindowAndroid, CastContentWindowAndroid caller, int visibilityType); String getId(long nativeCastContentWindowAndroid, CastContentWindowAndroid caller);
diff --git a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java index 5033ca2..bb2e028 100644 --- a/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java +++ b/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/CastWebContentsComponent.java
@@ -33,11 +33,18 @@ public interface OnComponentClosedHandler { void onComponentClosed(); } /** + * Callback interface invoked to indicate whether a gesture has been handled. + */ + public interface GestureHandledCallback { + void invoke(boolean handled); + } + + /** * Callback interface for when UI events occur. */ public interface SurfaceEventHandler { void onVisibilityChange(int visibilityType); - boolean consumeGesture(int gestureType); + void consumeGesture(int gestureType, GestureHandledCallback handledGestureCallback); } /** @@ -226,15 +233,17 @@ + "; gesture=" + gestureType); } if (mSurfaceEventHandler != null) { - if (mSurfaceEventHandler.consumeGesture(gestureType)) { - if (DEBUG) Log.d(TAG, "send gesture consumed instance=" + mSessionId); - sendIntentSync(CastWebContentsIntentUtils.gestureConsumed( - mSessionId, gestureType, true)); - } else { - if (DEBUG) Log.d(TAG, "send gesture NOT consumed instance=" + mSessionId); - sendIntentSync(CastWebContentsIntentUtils.gestureConsumed( - mSessionId, gestureType, false)); - } + mSurfaceEventHandler.consumeGesture(gestureType, (handled) -> { + if (handled) { + if (DEBUG) Log.d(TAG, "send gesture consumed instance=" + mSessionId); + sendIntentSync(CastWebContentsIntentUtils.gestureConsumed( + mSessionId, gestureType, true)); + } else { + if (DEBUG) Log.d(TAG, "send gesture NOT consumed instance=" + mSessionId); + sendIntentSync(CastWebContentsIntentUtils.gestureConsumed( + mSessionId, gestureType, false)); + } + }); } else { sendIntentSync( CastWebContentsIntentUtils.gestureConsumed(mSessionId, gestureType, false));
diff --git a/chromecast/browser/android/cast_content_window_android.cc b/chromecast/browser/android/cast_content_window_android.cc index ec75afc..3fc6253 100644 --- a/chromecast/browser/android/cast_content_window_android.cc +++ b/chromecast/browser/android/cast_content_window_android.cc
@@ -38,6 +38,35 @@ constexpr char kContextInteractionId[] = "interactionId"; constexpr char kContextConversationId[] = "conversationId"; +// Wraps the JNI gesture consumption handled callback for invocation from C++. +class GestureConsumedCallbackWrapper { + public: + GestureConsumedCallbackWrapper( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& callback) + : env_(env), callback_(callback) { + class_ = base::android::ScopedJavaLocalRef<jclass>( + base::android::GetClass(env_, + "org.chromium.chromecast.shell." + "CastWebComponent.GestureHandledCallback")); + callback_method_id_ = + base::android::MethodID::Get<base::android::MethodID::TYPE_INSTANCE>( + env_, class_.obj(), "invoke", "(Z;)V"); + } + + void Invoke(bool handled) { + env_->CallObjectMethod(callback_.obj(), callback_method_id_, &handled); + } + + private: + JNIEnv* env_; + const base::android::JavaParamRef<jobject>& callback_; + base::android::ScopedJavaLocalRef<jclass> class_; + jmethodID callback_method_id_; + + DISALLOW_COPY_AND_ASSIGN(GestureConsumedCallbackWrapper); +}; + } // namespace CastContentWindowAndroid::CastContentWindowAndroid( @@ -132,14 +161,20 @@ Java_CastContentWindowAndroid_requestMoveOut(env, java_window_); } -bool CastContentWindowAndroid::ConsumeGesture( +void CastContentWindowAndroid::ConsumeGesture( JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller, - int gesture_type) { + int gesture_type, + const base::android::JavaParamRef<jobject>& callback) { + GestureConsumedCallbackWrapper wrapper(env, callback); if (delegate_) { - return delegate_->ConsumeGesture(static_cast<GestureType>(gesture_type)); + delegate_->ConsumeGesture( + static_cast<GestureType>(gesture_type), + base::BindOnce(&GestureConsumedCallbackWrapper::Invoke, + base::Unretained(&wrapper))); + return; } - return false; + wrapper.Invoke(false); } void CastContentWindowAndroid::OnVisibilityChange(
diff --git a/chromecast/browser/android/cast_content_window_android.h b/chromecast/browser/android/cast_content_window_android.h index 57e9558..dcc3318 100644 --- a/chromecast/browser/android/cast_content_window_android.h +++ b/chromecast/browser/android/cast_content_window_android.h
@@ -42,9 +42,11 @@ // Called through JNI. void OnActivityStopped(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller); - bool ConsumeGesture(JNIEnv* env, - const base::android::JavaParamRef<jobject>& jcaller, - int gesture_type); + void ConsumeGesture( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jcaller, + int gesture_type, + const base::android::JavaParamRef<jobject>& handled_callback); void OnVisibilityChange(JNIEnv* env, const base::android::JavaParamRef<jobject>& jcaller, int visibility_type);
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java index bb21b17b..c7b9218 100644 --- a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java +++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsComponentTest.java
@@ -220,14 +220,13 @@ public void testOnGestureCallback() { CastWebContentsComponent.SurfaceEventHandler callback = Mockito.mock(CastWebContentsComponent.SurfaceEventHandler.class); - CastWebContentsComponent component = new CastWebContentsComponent(SESSION_ID, null, callback, false, false, false, true); component.start(mStartParams); CastWebContentsComponent.onGesture(SESSION_ID, 1); component.stop(mActivity); - verify(callback).consumeGesture(1); + verify(callback).consumeGesture(eq(1), any()); } @Test
diff --git a/chromecast/browser/cast_content_gesture_handler.cc b/chromecast/browser/cast_content_gesture_handler.cc index a6390bf..3b5df8a 100644 --- a/chromecast/browser/cast_content_gesture_handler.cc +++ b/chromecast/browser/cast_content_gesture_handler.cc
@@ -96,7 +96,7 @@ delegate_->CancelGesture(GestureType::GO_BACK, touch_location); return; } - delegate_->ConsumeGesture(gesture_type); + delegate_->ConsumeGesture(gesture_type, base::DoNothing()); DVLOG(1) << "gesture complete, elapsed time: " << current_swipe_time_.Elapsed().InMilliseconds() << "ms"; break; @@ -108,7 +108,7 @@ if (!delegate_ || !delegate_->CanHandleGesture(GestureType::TAP_DOWN)) { return; } - delegate_->ConsumeGesture(GestureType::TAP_DOWN); + delegate_->ConsumeGesture(GestureType::TAP_DOWN, base::DoNothing()); } void CastContentGestureHandler::HandleTapGesture( @@ -116,7 +116,7 @@ if (!delegate_ || !delegate_->CanHandleGesture(GestureType::TAP)) { return; } - delegate_->ConsumeGesture(GestureType::TAP); + delegate_->ConsumeGesture(GestureType::TAP, base::DoNothing()); } } // namespace chromecast
diff --git a/chromecast/browser/cast_content_gesture_handler_test.cc b/chromecast/browser/cast_content_gesture_handler_test.cc index 271deaf..e6ebeb2 100644 --- a/chromecast/browser/cast_content_gesture_handler_test.cc +++ b/chromecast/browser/cast_content_gesture_handler_test.cc
@@ -4,6 +4,7 @@ #include "chromecast/browser/cast_content_gesture_handler.h" +#include "base/callback_helpers.h" #include "base/memory/weak_ptr.h" #include "chromecast/base/chromecast_switches.h" #include "content/public/test/browser_test.h" @@ -38,6 +39,12 @@ constexpr gfx::Point kOngoingRightGesturePoint1(400, 50); constexpr gfx::Point kRightGestureEndPoint(200, 60); +ACTION_TEMPLATE(InvokeCallbackArgument, + HAS_1_TEMPLATE_PARAMS(int, k), + AND_1_VALUE_PARAMS(p0)) { + std::move(std::get<k>(args)).Run(p0); +} + } // namespace class MockCastContentWindowDelegate @@ -47,37 +54,48 @@ ~MockCastContentWindowDelegate() override = default; MOCK_METHOD1(CanHandleGesture, bool(GestureType gesture_type)); - MOCK_METHOD1(ConsumeGesture, bool(GestureType gesture_type)); + MOCK_METHOD2(ConsumeGesture, + void(GestureType gesture_type, + base::RepeatingCallback<void(bool)> handled_callback)); MOCK_METHOD2(CancelGesture, void(GestureType gesture_type, const gfx::Point& touch_location)); MOCK_METHOD2(GestureProgress, void(GestureType gesture_type, const gfx::Point& touch_location)); + + void ConsumeGesture(GestureType gesture_type, + GestureHandledCallback handled_callback) override { + ConsumeGesture(gesture_type, base::AdaptCallbackForRepeating( + std::move(handled_callback))); + } + std::string GetId() override { return "mockContentWindowDelegate"; } }; class CastContentGestureHandlerTest : public testing::Test { public: - CastContentGestureHandlerTest() : dispatcher_(delegate_.AsWeakPtr(), true) {} + CastContentGestureHandlerTest() + : delegate_(new testing::StrictMock<MockCastContentWindowDelegate>), + dispatcher_(delegate_->AsWeakPtr(), true) {} protected: - MockCastContentWindowDelegate delegate_; + std::unique_ptr<testing::StrictMock<MockCastContentWindowDelegate>> delegate_; CastContentGestureHandler dispatcher_; }; // Verify the simple case of a left swipe with the right horizontal leads to // back. TEST_F(CastContentGestureHandlerTest, VerifySimpleBackSuccess) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(true)); - EXPECT_CALL(delegate_, GestureProgress(Eq(GestureType::GO_BACK), - Eq(kOngoingBackGesturePoint1))); - EXPECT_CALL(delegate_, ConsumeGesture(Eq(GestureType::GO_BACK))) - .WillRepeatedly(Return(true)); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::GO_BACK), + Eq(kOngoingBackGesturePoint1))); + EXPECT_CALL(*delegate_, ConsumeGesture(Eq(GestureType::GO_BACK), _)) + .WillRepeatedly(InvokeCallbackArgument<1>(true)); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::LEFT); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, CastSideSwipeOrigin::LEFT, kLeftSidePoint); @@ -91,15 +109,15 @@ // Verify that if the finger is not lifted, that's not a back gesture. TEST_F(CastContentGestureHandlerTest, VerifyNoDispatchOnNoLift) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(true)); - EXPECT_CALL(delegate_, ConsumeGesture(Eq(GestureType::GO_BACK))).Times(0); - EXPECT_CALL(delegate_, GestureProgress(Eq(GestureType::GO_BACK), - Eq(kValidBackGestureEndPoint))); - EXPECT_CALL(delegate_, + EXPECT_CALL(*delegate_, ConsumeGesture(Eq(GestureType::GO_BACK), _)).Times(0); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::GO_BACK), + Eq(kValidBackGestureEndPoint))); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::GO_BACK), Eq(kPastTheEndPoint1))); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::LEFT); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, @@ -114,17 +132,17 @@ // Verify that multiple 'continue' events still only lead to one back // invocation. TEST_F(CastContentGestureHandlerTest, VerifyOnlySingleDispatch) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(true)); - EXPECT_CALL(delegate_, GestureProgress(Eq(GestureType::GO_BACK), - Eq(kValidBackGestureEndPoint))); - EXPECT_CALL(delegate_, + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::GO_BACK), + Eq(kValidBackGestureEndPoint))); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::GO_BACK), Eq(kPastTheEndPoint1))); - EXPECT_CALL(delegate_, ConsumeGesture(Eq(GestureType::GO_BACK))) - .WillRepeatedly(Return(true)); + EXPECT_CALL(*delegate_, ConsumeGesture(Eq(GestureType::GO_BACK), _)) + .WillRepeatedly(InvokeCallbackArgument<1>(true)); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::LEFT); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, CastSideSwipeOrigin::LEFT, kLeftSidePoint); @@ -140,10 +158,10 @@ // Verify that if the delegate says it doesn't handle back that we won't try to // ask them to consume it. TEST_F(CastContentGestureHandlerTest, VerifyDelegateDoesNotConsumeUnwanted) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(false)); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::LEFT); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, @@ -157,7 +175,7 @@ // Verify that a not-left gesture doesn't lead to a swipe. TEST_F(CastContentGestureHandlerTest, VerifyNotLeftSwipeIsNotBack) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::TOP); @@ -171,15 +189,15 @@ // Verify that if the gesture doesn't go far enough horizontally that we will // not consider it a swipe. TEST_F(CastContentGestureHandlerTest, VerifyNotFarEnoughRightIsNotBack) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(true)); - EXPECT_CALL(delegate_, GestureProgress(Eq(GestureType::GO_BACK), - Eq(kOngoingBackGesturePoint1))); - EXPECT_CALL(delegate_, CancelGesture(Eq(GestureType::GO_BACK), - Eq(kOngoingBackGesturePoint2))); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::GO_BACK), + Eq(kOngoingBackGesturePoint1))); + EXPECT_CALL(*delegate_, CancelGesture(Eq(GestureType::GO_BACK), + Eq(kOngoingBackGesturePoint2))); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::LEFT); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, CastSideSwipeOrigin::LEFT, kLeftSidePoint); @@ -194,15 +212,15 @@ // Verify that if the gesture ends before going far enough, that's also not a // swipe. TEST_F(CastContentGestureHandlerTest, VerifyNotFarEnoughRightAndEndIsNotBack) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(true)); - EXPECT_CALL(delegate_, GestureProgress(Eq(GestureType::GO_BACK), - Eq(kOngoingBackGesturePoint1))); - EXPECT_CALL(delegate_, CancelGesture(Eq(GestureType::GO_BACK), - Eq(kOngoingBackGesturePoint2))); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::GO_BACK), + Eq(kOngoingBackGesturePoint1))); + EXPECT_CALL(*delegate_, CancelGesture(Eq(GestureType::GO_BACK), + Eq(kOngoingBackGesturePoint2))); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::LEFT); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, CastSideSwipeOrigin::LEFT, kLeftSidePoint); @@ -216,15 +234,15 @@ // Verify simple top-down drag. TEST_F(CastContentGestureHandlerTest, VerifySimpleTopSuccess) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(true)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, GestureProgress(Eq(GestureType::TOP_DRAG), - Eq(kOngoingTopGesturePoint1))); - EXPECT_CALL(delegate_, ConsumeGesture(Eq(GestureType::TOP_DRAG))) - .WillRepeatedly(Return(true)); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::TOP_DRAG), + Eq(kOngoingTopGesturePoint1))); + EXPECT_CALL(*delegate_, ConsumeGesture(Eq(GestureType::TOP_DRAG), _)) + .WillRepeatedly(InvokeCallbackArgument<1>(true)); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::TOP); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, CastSideSwipeOrigin::TOP, kTopSidePoint); @@ -237,17 +255,17 @@ // Verify simple right-to-left drag. TEST_F(CastContentGestureHandlerTest, VerifySimpleRightSuccess) { - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::RIGHT_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::RIGHT_DRAG))) .WillRepeatedly(Return(true)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::GO_BACK))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) + EXPECT_CALL(*delegate_, CanHandleGesture(Eq(GestureType::TOP_DRAG))) .WillRepeatedly(Return(false)); - EXPECT_CALL(delegate_, GestureProgress(Eq(GestureType::RIGHT_DRAG), - Eq(kOngoingRightGesturePoint1))); - EXPECT_CALL(delegate_, ConsumeGesture(Eq(GestureType::RIGHT_DRAG))) - .WillRepeatedly(Return(true)); + EXPECT_CALL(*delegate_, GestureProgress(Eq(GestureType::RIGHT_DRAG), + Eq(kOngoingRightGesturePoint1))); + EXPECT_CALL(*delegate_, ConsumeGesture(Eq(GestureType::RIGHT_DRAG), _)) + .WillRepeatedly(InvokeCallbackArgument<1>(true)); dispatcher_.CanHandleSwipe(CastSideSwipeOrigin::RIGHT); dispatcher_.HandleSideSwipe(CastSideSwipeEvent::BEGIN, CastSideSwipeOrigin::RIGHT, kRightSidePoint);
diff --git a/chromecast/browser/cast_content_window.h b/chromecast/browser/cast_content_window.h index c060606..7b4c072 100644 --- a/chromecast/browser/cast_content_window.h +++ b/chromecast/browser/cast_content_window.h
@@ -8,6 +8,7 @@ #include <memory> #include <string> +#include "base/callback_forward.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/observer_list.h" @@ -100,6 +101,8 @@ // Notify window destruction. virtual void OnWindowDestroyed() {} + using GestureHandledCallback = base::OnceCallback<void(bool)>; + // Check to see if the gesture can be handled by the delegate. This is // called prior to ConsumeGesture(). virtual bool CanHandleGesture(GestureType gesture_type) = 0; @@ -113,9 +116,10 @@ virtual void CancelGesture(GestureType gesture_type, const gfx::Point& touch_location) {} - // Consume and handle a completed UI gesture. Returns whether the gesture - // was handled or not. - virtual bool ConsumeGesture(GestureType gesture_type) = 0; + // Consume and handle a completed UI gesture. Invokes the callback with a + // boolean indicating whether the gesture was handled or not. + virtual void ConsumeGesture(GestureType gesture_type, + GestureHandledCallback handled_callback) = 0; // Notify visibility change for this window. virtual void OnVisibilityChange(VisibilityType visibility_type) {}
diff --git a/chromecast/browser/cast_web_contents.h b/chromecast/browser/cast_web_contents.h index 0c969286..8981bb2 100644 --- a/chromecast/browser/cast_web_contents.h +++ b/chromecast/browser/cast_web_contents.h
@@ -391,6 +391,10 @@ virtual void AddObserver(Observer* observer) = 0; virtual void RemoveObserver(Observer* observer) = 0; + // Enable or disable devtools remote debugging for this WebContents and any + // inner WebContents that are spawned from it. + virtual void SetEnabledForRemoteDebugging(bool enabled) = 0; + // Used to expose CastWebContents's |binder_registry_| to Delegate. // Delegate should register its mojo interface binders via this function // when it is ready.
diff --git a/chromecast/browser/cast_web_contents_impl.cc b/chromecast/browser/cast_web_contents_impl.cc index 978ffe9..9fe00be 100644 --- a/chromecast/browser/cast_web_contents_impl.cc +++ b/chromecast/browser/cast_web_contents_impl.cc
@@ -454,6 +454,24 @@ observer_list_.RemoveObserver(observer); } +void CastWebContentsImpl::SetEnabledForRemoteDebugging(bool enabled) { + DCHECK(remote_debugging_server_); + + if (enabled && !enabled_for_dev_) { + LOG(INFO) << "Enabling dev console for CastWebContentsImpl"; + remote_debugging_server_->EnableWebContentsForDebugging(web_contents_); + } else if (!enabled && enabled_for_dev_) { + LOG(INFO) << "Disabling dev console for CastWebContentsImpl"; + remote_debugging_server_->DisableWebContentsForDebugging(web_contents_); + } + enabled_for_dev_ = enabled; + + // Propagate setting change to inner contents. + for (auto& inner : inner_contents_) { + inner->SetEnabledForRemoteDebugging(enabled); + } +} + service_manager::BinderRegistry* CastWebContentsImpl::binder_registry() { return &binder_registry_; }
diff --git a/chromecast/browser/cast_web_contents_impl.h b/chromecast/browser/cast_web_contents_impl.h index e5864b7..6bf0c95 100644 --- a/chromecast/browser/cast_web_contents_impl.h +++ b/chromecast/browser/cast_web_contents_impl.h
@@ -87,6 +87,7 @@ base::OnceCallback<void(base::Value)> callback) override; void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; + void SetEnabledForRemoteDebugging(bool enabled) override; bool is_websql_enabled() override; bool is_mixer_audio_enabled() override; bool can_bind_interfaces() override; @@ -170,7 +171,7 @@ base::WeakPtr<Delegate> delegate_; PageState page_state_; PageState last_state_; - const bool enabled_for_dev_; + bool enabled_for_dev_; content::mojom::RendererType renderer_type_; const bool handle_inner_contents_; BackgroundColor view_background_color_;
diff --git a/chromecast/browser/service/cast_service_simple.cc b/chromecast/browser/service/cast_service_simple.cc index a961d1a..c436bf3 100644 --- a/chromecast/browser/service/cast_service_simple.cc +++ b/chromecast/browser/service/cast_service_simple.cc
@@ -93,8 +93,10 @@ return false; } -bool CastServiceSimple::ConsumeGesture(GestureType gesture_type) { - return false; +void CastServiceSimple::ConsumeGesture( + GestureType gesture_type, + GestureHandledCallback handled_callback) { + std::move(handled_callback).Run(false); } void CastServiceSimple::OnVisibilityChange(VisibilityType visibility_type) {}
diff --git a/chromecast/browser/service/cast_service_simple.h b/chromecast/browser/service/cast_service_simple.h index 461a2707..4179c56 100644 --- a/chromecast/browser/service/cast_service_simple.h +++ b/chromecast/browser/service/cast_service_simple.h
@@ -39,7 +39,8 @@ // CastContentWindow::Delegate implementation: void OnWindowDestroyed() override; bool CanHandleGesture(GestureType gesture_type) override; - bool ConsumeGesture(GestureType gesture_type) override; + void ConsumeGesture(GestureType gesture_type, + GestureHandledCallback handled_callback) override; void OnVisibilityChange(VisibilityType visibility_type) override; std::string GetId() override;
diff --git a/chromecast/browser/test/cast_browser_test.cc b/chromecast/browser/test/cast_browser_test.cc index f23a344..cee7f9de 100644 --- a/chromecast/browser/test/cast_browser_test.cc +++ b/chromecast/browser/test/cast_browser_test.cc
@@ -94,8 +94,9 @@ return false; } -bool CastBrowserTest::ConsumeGesture(GestureType gesture_type) { - return false; +void CastBrowserTest::ConsumeGesture(GestureType gesture_type, + GestureHandledCallback handled_callback) { + std::move(handled_callback).Run(false); } std::string CastBrowserTest::GetId() {
diff --git a/chromecast/browser/test/cast_browser_test.h b/chromecast/browser/test/cast_browser_test.h index 9e12f9ca..9c606bff 100644 --- a/chromecast/browser/test/cast_browser_test.h +++ b/chromecast/browser/test/cast_browser_test.h
@@ -51,7 +51,8 @@ void OnWindowDestroyed() override; void OnVisibilityChange(VisibilityType visibility_type) override; bool CanHandleGesture(GestureType gesture_type) override; - bool ConsumeGesture(GestureType gesture_type) override; + void ConsumeGesture(GestureType gesture_type, + GestureHandledCallback handled_callback) override; std::string GetId() override; std::unique_ptr<CastWebViewFactory> web_view_factory_;
diff --git a/chromecast/browser/webview/web_content_controller.cc b/chromecast/browser/webview/web_content_controller.cc index 58a82e1..69c787e 100644 --- a/chromecast/browser/webview/web_content_controller.cc +++ b/chromecast/browser/webview/web_content_controller.cc
@@ -9,6 +9,7 @@ #include "base/json/json_writer.h" #include "base/strings/utf_string_conversions.h" #include "chromecast/base/version.h" +#include "chromecast/browser/cast_web_contents.h" #include "chromecast/browser/webview/proto/webview.pb.h" #include "chromecast/browser/webview/webview_navigation_throttle.h" #include "content/public/browser/browser_context.h" @@ -122,14 +123,6 @@ HandleClearCache(); break; - case webview::WebviewRequest::kUpdateSettings: - if (request.has_update_settings()) { - HandleUpdateSettings(request.update_settings()); - } else { - client_->OnError("update_settings() not supplied"); - } - break; - case webview::WebviewRequest::kGetTitle: HandleGetTitle(request.id()); break; @@ -398,28 +391,6 @@ client_->EnqueueSend(std::move(response)); } -void WebContentController::HandleUpdateSettings( - const webview::UpdateSettingsRequest& request) { - content::WebContents* contents = GetWebContents(); - content::WebPreferences prefs = - contents->GetRenderViewHost()->GetWebkitPreferences(); - prefs.javascript_enabled = request.javascript_enabled(); - contents->GetRenderViewHost()->UpdateWebkitPreferences(prefs); - - has_navigation_delegate_ = request.has_navigation_delegate(); - - // Given that cast_shell enables devtools unconditionally there isn't - // anything that needs to be done for |request.debugging_enabled()|. Though, - // as a note, remote debugging is always on. - - if (request.has_user_agent() && - request.user_agent().type_case() == webview::UserAgent::kValue) { - contents->SetUserAgentOverride( - blink::UserAgentOverride::UserAgentOnly(request.user_agent().value()), - true); - } -} - void WebContentController::HandleSetAutoMediaPlaybackPolicy( const webview::SetAutoMediaPlaybackPolicyRequest& request) { content::WebContents* contents = GetWebContents();
diff --git a/chromecast/browser/webview/web_content_controller.h b/chromecast/browser/webview/web_content_controller.h index 7a41ebbe..ffe485eb 100644 --- a/chromecast/browser/webview/web_content_controller.h +++ b/chromecast/browser/webview/web_content_controller.h
@@ -97,7 +97,6 @@ void HandleCanGoForward(int64_t id); void HandleClearCache(); void HandleGetTitle(int64_t id); - void HandleUpdateSettings(const webview::UpdateSettingsRequest& request); void HandleSetAutoMediaPlaybackPolicy( const webview::SetAutoMediaPlaybackPolicyRequest& request); void HandleResize(const gfx::Size& size);
diff --git a/chromecast/browser/webview/webview_controller.cc b/chromecast/browser/webview/webview_controller.cc index 7fe90d3..65da1fe7 100644 --- a/chromecast/browser/webview/webview_controller.cc +++ b/chromecast/browser/webview/webview_controller.cc
@@ -47,7 +47,7 @@ WebviewController::WebviewController(content::BrowserContext* browser_context, Client* client, bool enabled_for_dev) - : WebContentController(client) { + : WebContentController(client), enabled_for_dev_(enabled_for_dev) { content::WebContents::CreateParams create_params(browser_context, nullptr); contents_ = content::WebContents::Create(create_params); contents_->SetUserData(kWebviewResponseUserDataKey, @@ -118,12 +118,41 @@ } break; + case webview::WebviewRequest::kUpdateSettings: + if (request.has_update_settings()) { + HandleUpdateSettings(request.update_settings()); + } else { + client_->OnError("update_settings() not supplied"); + } + break; + default: WebContentController::ProcessRequest(request); break; } } +void WebviewController::HandleUpdateSettings( + const webview::UpdateSettingsRequest& request) { + content::WebContents* contents = GetWebContents(); + content::WebPreferences prefs = + contents->GetRenderViewHost()->GetWebkitPreferences(); + prefs.javascript_enabled = request.javascript_enabled(); + contents->GetRenderViewHost()->UpdateWebkitPreferences(prefs); + + has_navigation_delegate_ = request.has_navigation_delegate(); + + CastWebContents::FromWebContents(contents)->SetEnabledForRemoteDebugging( + request.debugging_enabled() || enabled_for_dev_); + + if (request.has_user_agent() && + request.user_agent().type_case() == webview::UserAgent::kValue) { + contents->SetUserAgentOverride( + blink::UserAgentOverride::UserAgentOnly(request.user_agent().value()), + true); + } +} + void WebviewController::DidFirstVisuallyNonEmptyPaint() { if (client_) { std::unique_ptr<webview::WebviewResponse> response =
diff --git a/chromecast/browser/webview/webview_controller.h b/chromecast/browser/webview/webview_controller.h index 62e1bd41..4f60dd7f 100644 --- a/chromecast/browser/webview/webview_controller.h +++ b/chromecast/browser/webview/webview_controller.h
@@ -65,6 +65,8 @@ content::WebContents* GetWebContents() override; private: + void HandleUpdateSettings(const webview::UpdateSettingsRequest& request); + webview::AsyncPageEvent_State current_state(); // CastWebContents::Delegate @@ -78,6 +80,7 @@ // content::WebContentsObserver void DidFirstVisuallyNonEmptyPaint() override; + const bool enabled_for_dev_; std::unique_ptr<content::WebContents> contents_; std::unique_ptr<CastWebContents> cast_web_contents_; bool stopped_ = false;
diff --git a/chromecast/renderer/cast_content_renderer_client.cc b/chromecast/renderer/cast_content_renderer_client.cc index 9a8b128b..e00d8f3 100644 --- a/chromecast/renderer/cast_content_renderer_client.cc +++ b/chromecast/renderer/cast_content_renderer_client.cc
@@ -297,6 +297,13 @@ bool CastContentRendererClient::IsSupportedVideoType( const ::media::VideoType& type) { // TODO(servolk): make use of eotf. + + // TODO(1066567): Check attached screen for support of type.hdr_metadata_type. + if (type.hdr_metadata_type != ::media::HdrMetadataType::kNone) { + NOTIMPLEMENTED() << "HdrMetadataType support signaling not implemented."; + return false; + } + #if defined(OS_ANDROID) return supported_profiles_->IsSupportedVideoConfig( media::ToCastVideoCodec(type.codec, type.profile),
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index ab111cb..f3f88411 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn
@@ -273,6 +273,10 @@ # crbug.com/1056163 "hwsec.LoginGuest", + + # crbug.com/1059426 + "ui.ChromeCrashNotLoggedInDirect.breakpad", + "ui.ChromeCrashLoggedInDirect.breakpad", ] }
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index 2540c02..94cb0ec9 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -301,6 +301,21 @@ <message name="IDS_REQUEST_PIN_DIALOG_ERROR_ATTEMPTS" desc="The text displayed in the certificate provider PIN request dialog when the previous login attempt was unsuccessful but there are more attempts remaining. Includes the reason for the previous failure."> <ph name="ERROR_MESSAGE">$1<ex>Invalid PIN.</ex></ph> <ph name="ATTEMPTS_LEFT">$2<ex>3</ex></ph> attempts left </message> + + <!-- Print Management App --> + <!-- TODO(crbug/1067465): Update with finalized copies of the strings --> + <message name="IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_FAILED" desc="Displayed text status if the print job failed." translateable="false"> + Failed + </message> + <message name="IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_CANCELED" desc="Displayed text status if the print job was canceled." translateable="false"> + Canceled + </message> + <message name="IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_PRINTED" desc="Displayed text status if the print job was printed succesfully." translateable="false"> + Printed + </message> + <message name="IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_UNKNOWN_ERROR" desc="Displayed text status if the print job had an unknown error." translateable="false"> + Unknown Error + </message> </messages> </release> </grit>
diff --git a/chromeos/components/print_management/BUILD.gn b/chromeos/components/print_management/BUILD.gn index 8d9ee0cc..dd294b8 100644 --- a/chromeos/components/print_management/BUILD.gn +++ b/chromeos/components/print_management/BUILD.gn
@@ -18,7 +18,9 @@ "//chromeos/components/print_management/mojom", "//chromeos/constants", "//chromeos/resources:print_management_resources", + "//chromeos/strings/", "//content/public/browser", + "//ui/base", "//ui/resources", "//ui/webui", ]
diff --git a/chromeos/components/print_management/DEPS b/chromeos/components/print_management/DEPS index d02ca20..c4682a0 100644 --- a/chromeos/components/print_management/DEPS +++ b/chromeos/components/print_management/DEPS
@@ -1,7 +1,9 @@ include_rules = [ "-chrome", "+chromeos/grit/chromeos_print_management_resources.h", + "+chromeos/strings/grit/chromeos_strings.h", "+content/public/browser", + "+ui/base", "+ui/resources", "+ui/webui", ] \ No newline at end of file
diff --git a/chromeos/components/print_management/print_management_ui.cc b/chromeos/components/print_management/print_management_ui.cc index 92d7bc5..00e04aa 100644 --- a/chromeos/components/print_management/print_management_ui.cc +++ b/chromeos/components/print_management/print_management_ui.cc
@@ -8,14 +8,34 @@ #include "chromeos/components/print_management/mojom/printing_manager.mojom.h" #include "chromeos/components/print_management/url_constants.h" #include "chromeos/grit/chromeos_print_management_resources.h" +#include "chromeos/strings/grit/chromeos_strings.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" +#include "ui/base/webui/web_ui_util.h" #include "ui/resources/grit/webui_resources.h" namespace chromeos { namespace printing { namespace printing_manager { +namespace { +void AddPrintManagementStrings(content::WebUIDataSource* html_source) { + static constexpr webui::LocalizedString kLocalizedStrings[] = { + {"completionStatusFailed", IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_FAILED}, + {"completionStatusCanceled", + IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_CANCELED}, + {"completionStatusPrinted", + IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_PRINTED}, + {"completionStatusUnknownError", + IDS_PRINT_MANAGEMENT_COMPLETION_STATUS_UNKNOWN_ERROR}, + }; + + for (const auto& str : kLocalizedStrings) { + html_source->AddLocalizedString(str.name, str.id); + } + html_source->UseStringsJs(); +} +} // namespace PrintManagementUI::PrintManagementUI( content::WebUI* web_ui, @@ -37,8 +57,14 @@ html_source->AddResourcePath("pwa.html", IDR_PRINT_MANAGEMENT_PWA_HTML); html_source->AddResourcePath("manifest.json", IDR_PRINT_MANAGEMENT_MANIFEST); html_source->AddResourcePath("app_icon_192.png", IDR_PRINT_MANAGEMENT_ICON); + html_source->AddResourcePath("print_job_entry.html", + IDR_PRINT_MANAGEMENT_PRINT_JOB_ENTRY_HTML); + html_source->AddResourcePath("print_job_entry.js", + IDR_PRINT_MANAGEMENT_PRINT_JOB_ENTRY_JS); html_source->SetDefaultResource(IDR_PRINT_MANAGEMENT_INDEX_HTML); + AddPrintManagementStrings(html_source.get()); + content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(), html_source.release()); }
diff --git a/chromeos/components/print_management/resources/BUILD.gn b/chromeos/components/print_management/resources/BUILD.gn index 647dfcc50..4961fe15 100644 --- a/chromeos/components/print_management/resources/BUILD.gn +++ b/chromeos/components/print_management/resources/BUILD.gn
@@ -11,13 +11,23 @@ is_polymer3 = true deps = [ ":mojo_interface_provider", + ":print_job_entry", ":print_management", ] } +js_library("print_job_entry") { + deps = [ + "//chromeos/components/print_management/mojom:mojom_js_library_for_compile", + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:load_time_data.m", + ] +} + js_library("print_management") { deps = [ ":mojo_interface_provider", + ":print_job_entry", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] } @@ -35,6 +45,12 @@ html_type = "v3-ready" } +polymer_modulizer("print_job_entry") { + js_file = "print_job_entry.js" + html_file = "print_job_entry.html" + html_type = "v3-ready" +} + polymer_modulizer("scanning_ui") { js_file = "scanning_ui.js" html_file = "scanning_ui.html" @@ -43,6 +59,7 @@ group("polymer3_elements") { public_deps = [ + ":print_job_entry_module", ":print_management_module", ":scanning_ui_module", ]
diff --git a/chromeos/components/print_management/resources/index.html b/chromeos/components/print_management/resources/index.html index d80d250..98f92f4 100644 --- a/chromeos/components/print_management/resources/index.html +++ b/chromeos/components/print_management/resources/index.html
@@ -11,6 +11,7 @@ <print-management></print-management> <script type="module" src="print_management.js"></script> + <script type="module" src="mojo_interface_provider.js"></script> <!-- Below mojo script required to run browser tests --> <script src="chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js"> </script>
diff --git a/chromeos/components/print_management/resources/print_job_entry.html b/chromeos/components/print_management/resources/print_job_entry.html new file mode 100644 index 0000000..6181a59 --- /dev/null +++ b/chromeos/components/print_management/resources/print_job_entry.html
@@ -0,0 +1,41 @@ +<style> + .list-item { + align-items: center; + display: flex; + min-height: var(--settings-row-min-height); + padding: 0; + } + + .long-text { + overflow: hidden; + padding-left: 20px; + text-overflow: ellipsis; + white-space: nowrap; + } + + .short-text { + padding-left: 10px; + width: 90px; + } + + #jobTitle { + width: 250px; + } + + #printerName { + width: 150px; + } +</style> +<div class="list-item" + aria-labeledby="jobTitle printerName creationTime completionStatus"> + <div id="jobTitle" class="long-text" aria-hidden="true">[[jobTitle_]]</div> + <div id="printerName" class="long-text" aria-hidden="true"> + [[printerName_]] + </div> + <div id="creationTime" class="short-text" aria-hidden="true"> + [[creationTime_]] + </div> + <div id="completionStatus" class="short-text" aria-hidden="true"> + [[completionStatus_]] + </div> +</div>
diff --git a/chromeos/components/print_management/resources/print_job_entry.js b/chromeos/components/print_management/resources/print_job_entry.js new file mode 100644 index 0000000..df56e10 --- /dev/null +++ b/chromeos/components/print_management/resources/print_job_entry.js
@@ -0,0 +1,141 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js'; +import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js'; +import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js'; +import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js'; +import './printing_manager.mojom-lite.js'; + +import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {assertNotReached} from 'chrome://resources/js/assert.m.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; +import './strings.js'; + + +/** + * Converts a mojo time to a JS time. + * @param {!mojoBase.mojom.Time} mojoTime + * @return {!Date} + */ +function convertMojoTimeToJS(mojoTime) { + // The JS Date() is based off of the number of milliseconds since the + // UNIX epoch (1970-01-01 00::00:00 UTC), while |internalValue| of the + // base::Time (represented in mojom.Time) represents the number of + // microseconds since the Windows FILETIME epoch (1601-01-01 00:00:00 UTC). + // This computes the final JS time by computing the epoch delta and the + // conversion from microseconds to milliseconds. + const windowsEpoch = Date.UTC(1601, 0, 1, 0, 0, 0, 0); + const unixEpoch = Date.UTC(1970, 0, 1, 0, 0, 0, 0); + // |epochDeltaInMs| equals to base::Time::kTimeTToMicrosecondsOffset. + const epochDeltaInMs = unixEpoch - windowsEpoch; + const timeInMs = Number(mojoTime.internalValue) / 1000; + + return new Date(timeInMs - epochDeltaInMs); +}; + +/** + * Returns true if |date| is today, false otherwise. + * @param {!Date} date + * @return {boolean} + */ +function isToday(date) { + const today_date = new Date(); + return date.getDate() === today_date.getDate() && + date.getMonth() === today_date.getMonth() && + date.getFullYear() === today_date.getFullYear(); +}; + +/** + * @fileoverview + * 'print-job-entry' is contains a single print job entry and is used as a list + * item. + */ +Polymer({ + is: 'print-job-entry', + + _template: html`{__html_template__}`, + + properties: { + /** @type {!chromeos.printing.printingManager.mojom.PrintJobInfo} */ + jobEntry: Object, + + /** @private */ + jobTitle_: { + type: String, + computed: 'decodeString16_(jobEntry.title)', + }, + + /** @private */ + printerName_: { + type: String, + computed: 'decodeString16_(jobEntry.printerName)', + }, + + /** @private */ + creationTime_: { + type: String, + computed: 'computeDate_(jobEntry.creationTime)' + }, + + /** @private */ + completionStatus_: { + type: String, + computed: 'convertStatusToString_(jobEntry.completionStatus)', + }, + }, + + /** + * Converts utf16 to a readable string. + * @param {!mojoBase.mojom.String16} arr + * @return {string} + * @private + */ + decodeString16_(arr) { + return arr.data.map(ch => String.fromCodePoint(ch)).join(''); + }, + + /** + * Converts mojo time to JS time. Returns "Today" if |mojoTime| is at the + * current day. + * @param {!mojoBase.mojom.Time} mojoTime + * @return {string} + * @private + */ + computeDate_(mojoTime) { + const jsDate = convertMojoTimeToJS(mojoTime); + // Date() is constructed with the current time in UTC. If the Date() matches + // |jsDate|'s date, display the 12hour time of the current date. + if (isToday(jsDate)) { + return jsDate.toLocaleTimeString(/*locales=*/undefined, + {hour12: true, hour: 'numeric', minute: 'numeric'}); + } + // Remove the day of the week from the date. + return jsDate.toLocaleDateString(/*locales=*/undefined, + {month: 'short', day: 'numeric', year: 'numeric'}); + }, + + /** + * Returns the corresponding completion status from |mojoCompletionStatus|. + * @param {number} mojoCompletionStatus + * @return {string} + * @private + */ + convertStatusToString_(mojoCompletionStatus) { + switch (mojoCompletionStatus) { + case chromeos.printing.printingManager.mojom.PrintJobCompletionStatus + .kFailed: + return loadTimeData.getString('completionStatusFailed'); + case chromeos.printing.printingManager.mojom.PrintJobCompletionStatus + .kCanceled: + return loadTimeData.getString('completionStatusCanceled'); + case chromeos.printing.printingManager.mojom.PrintJobCompletionStatus + .kPrinted: + return loadTimeData.getString('completionStatusPrinted'); + default: + assertNotReached(); + return loadTimeData.getString('completionStatusUnknownError'); + } + }, +});
diff --git a/chromeos/components/print_management/resources/print_management.html b/chromeos/components/print_management/resources/print_management.html index 743263b..c3a5790c 100644 --- a/chromeos/components/print_management/resources/print_management.html +++ b/chromeos/components/print_management/resources/print_management.html
@@ -1 +1,16 @@ +<style> + #entryList { + padding-inline-start: 10%; + padding-inline-end: 10%; + } +</style> + <div id="header"></div> + +<iron-list id="entryList" items="[[printJobs_]]" role="grid"> + <template> + <div role="row" tabindex$="[[tabIndex]]"> + <print-job-entry job-entry="[[item]]"></print-job-entry> + </div> + </template> +</iron-list>
diff --git a/chromeos/components/print_management/resources/print_management.js b/chromeos/components/print_management/resources/print_management.js index 75b06a1..bee9efd 100644 --- a/chromeos/components/print_management/resources/print_management.js +++ b/chromeos/components/print_management/resources/print_management.js
@@ -2,10 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; +import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js'; +import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js'; +import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js'; +import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js'; +import './print_job_entry.js'; + import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getMetadataProvider} from './mojo_interface_provider.js'; /** + * @typedef {{ + * printJobs: !Array<!chromeos.printing.printingManager.mojom.PrintJobInfo> + * }} + */ +let PrintJobsList; + +/** * @fileoverview * 'print-management' is used as the main app to display print jobs. */ @@ -21,6 +35,16 @@ */ mojoInterfaceProvider_: null, + properties: { + /** + * @type {!Array<!chromeos.printing.printingManager.mojom.PrintJobInfo>} + * @private + */ + printJobs_: { + type: Array, + }, + }, + /** @override */ created() { this.mojoInterfaceProvider_ = getMetadataProvider(); @@ -30,5 +54,9 @@ ready() { // TODO(jimmyxgong): Remove this once the app has more capabilities. this.$$('#header').textContent = 'Print Management'; + this.mojoInterfaceProvider_.getPrintJobs() + .then((responseParams) => { + this.printJobs_ = responseParams.printJobs; + }); }, });
diff --git a/chromeos/components/print_management/resources/print_management_resources.grd b/chromeos/components/print_management/resources/print_management_resources.grd index 8b7dac2..28ec0ed 100644 --- a/chromeos/components/print_management/resources/print_management_resources.grd +++ b/chromeos/components/print_management/resources/print_management_resources.grd
@@ -15,12 +15,14 @@ <!-- Privileged app host contents. --> <include name="IDR_PRINT_MANAGEMENT_INDEX_HTML" file="index.html" type="BINDATA" compress="gzip" /> <include name="IDR_PRINT_MANAGEMENT_JS" file="${root_gen_dir}/chromeos/components/print_management/resources/print_management.js" use_base_dir="false" compress="gzip" type="BINDATA"/> + <include name="IDR_PRINT_MANAGEMENT_PRINT_JOB_ENTRY_HTML" file="print_job_entry.html" compress="gzip" type="BINDATA"/> + <include name="IDR_PRINT_MANAGEMENT_PRINT_JOB_ENTRY_JS" file="${root_gen_dir}/chromeos/components/print_management/resources/print_job_entry.js" use_base_dir="false" compress="gzip" type="BINDATA"/> <include name="IDR_PRINT_MANAGEMENT_MANIFEST" file="manifest.json" type="BINDATA" compress="gzip" /> <include name="IDR_PRINT_MANAGEMENT_ICON" file="app_icon_192.png" type="BINDATA" compress="gzip" /> <include name="IDR_PRINTING_MANAGER_MOJO_LITE_JS" file="${root_gen_dir}/chromeos/components/print_management/mojom/printing_manager.mojom-lite.js" compress="gzip" use_base_dir="false" type="BINDATA" /> - <include name="IDR_PRINT_MANAGEMENT_PWA_HTML" file="pwa.html" type="BINDATA" compress="gzip" /> + <include name="IDR_PRINT_MANAGEMENT_PWA_HTML" file="pwa.html" type="BINDATA" compress="gzip" /> <include name="IDR_SCANNING_UI_INDEX_HTML" file="scanning_ui_index.html" type="BINDATA" compress="gzip" /> - <include name="IDR_SCANNING_UI_JS" file="${root_gen_dir}/chromeos/components/print_management/resources/scanning_ui.js" use_base_dir="false" compress="gzip" type="BINDATA"/> + <include name="IDR_SCANNING_UI_JS" file="${root_gen_dir}/chromeos/components/print_management/resources/scanning_ui.js" use_base_dir="false" compress="gzip" type="BINDATA"/> </includes> <structures>
diff --git a/chromeos/dbus/cicerone_client.cc b/chromeos/dbus/cicerone_client.cc index 5d4d6c7..5db9ac5d 100644 --- a/chromeos/dbus/cicerone_client.cc +++ b/chromeos/dbus/cicerone_client.cc
@@ -98,6 +98,10 @@ return is_upgrade_container_progress_signal_connected_; } + bool IsStartLxdProgressSignalConnected() override { + return is_start_lxd_progress_signal_connected_; + } + void LaunchContainerApplication( const vm_tools::cicerone::LaunchContainerApplicationRequest& request, DBusMethodCallback<vm_tools::cicerone::LaunchContainerApplicationResponse> @@ -512,6 +516,27 @@ weak_ptr_factory_.GetWeakPtr(), std::move(callback))); } + void StartLxd(const vm_tools::cicerone::StartLxdRequest& request, + DBusMethodCallback<vm_tools::cicerone::StartLxdResponse> + callback) override { + dbus::MethodCall method_call(vm_tools::cicerone::kVmCiceroneInterface, + vm_tools::cicerone::kStartLxdMethod); + dbus::MessageWriter writer(&method_call); + + if (!writer.AppendProtoAsArrayOfBytes(request)) { + LOG(ERROR) << "Failed to encode StartLxdRequest protobuf"; + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), base::nullopt)); + return; + } + + cicerone_proxy_->CallMethod( + &method_call, kDefaultTimeout.InMilliseconds(), + base::BindOnce(&CiceroneClientImpl::OnDBusProtoResponse< + vm_tools::cicerone::StartLxdResponse>, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); + } + void WaitForServiceToBeAvailable( dbus::ObjectProxy::WaitForServiceToBeAvailableCallback callback) override { @@ -633,6 +658,14 @@ weak_ptr_factory_.GetWeakPtr()), base::BindOnce(&CiceroneClientImpl::OnSignalConnected, weak_ptr_factory_.GetWeakPtr())); + + cicerone_proxy_->ConnectToSignal( + vm_tools::cicerone::kVmCiceroneInterface, + vm_tools::cicerone::kStartLxdProgressSignal, + base::BindRepeating(&CiceroneClientImpl::OnStartLxdProgressSignal, + weak_ptr_factory_.GetWeakPtr()), + base::BindOnce(&CiceroneClientImpl::OnSignalConnected, + weak_ptr_factory_.GetWeakPtr())); } private: @@ -821,6 +854,18 @@ } } + void OnStartLxdProgressSignal(dbus::Signal* signal) { + vm_tools::cicerone::StartLxdProgressSignal proto; + dbus::MessageReader reader(signal); + if (!reader.PopArrayOfBytesAsProto(&proto)) { + LOG(ERROR) << "Failed to parse proto from DBus Signal"; + return; + } + for (auto& observer : observer_list_) { + observer.OnStartLxdProgress(proto); + } + } + void OnSignalConnected(const std::string& interface_name, const std::string& signal_name, bool is_connected) { @@ -865,6 +910,8 @@ } else if (signal_name == vm_tools::cicerone::kUpgradeContainerProgressSignal) { is_upgrade_container_progress_signal_connected_ = is_connected; + } else if (signal_name == vm_tools::cicerone::kStartLxdProgressSignal) { + is_start_lxd_progress_signal_connected_ = is_connected; } else { NOTREACHED(); } @@ -888,6 +935,7 @@ bool is_pending_app_list_updates_signal_connected_ = false; bool is_apply_ansible_playbook_progress_signal_connected_ = false; bool is_upgrade_container_progress_signal_connected_ = false; + bool is_start_lxd_progress_signal_connected_ = false; // Note: This should remain the last member so it'll be destroyed and // invalidate its weak pointers before any other members are destroyed.
diff --git a/chromeos/dbus/cicerone_client.h b/chromeos/dbus/cicerone_client.h index 2e6e393..189b6dc7 100644 --- a/chromeos/dbus/cicerone_client.h +++ b/chromeos/dbus/cicerone_client.h
@@ -94,6 +94,10 @@ virtual void OnUpgradeContainerProgress( const vm_tools::cicerone::UpgradeContainerProgressSignal& signal) = 0; + // This is signaled from Cicerone while LXD is starting via StartLxd. + virtual void OnStartLxdProgress( + const vm_tools::cicerone::StartLxdProgressSignal& signal) = 0; + protected: virtual ~Observer() = default; }; @@ -154,6 +158,9 @@ // This should be true prior to calling UpgradeContainer. virtual bool IsUpgradeContainerProgressSignalConnected() = 0; + // This should be true prior to calling StartLxd. + virtual bool IsStartLxdProgressSignalConnected() = 0; + // Launches an application inside a running Container. // |callback| is called after the method call finishes. virtual void LaunchContainerApplication( @@ -283,6 +290,12 @@ DBusMethodCallback<vm_tools::cicerone::CancelUpgradeContainerResponse> callback) = 0; + // Starts LXD. + // |callback| is called when the method completes. + virtual void StartLxd( + const vm_tools::cicerone::StartLxdRequest& request, + DBusMethodCallback<vm_tools::cicerone::StartLxdResponse> callback) = 0; + // Registers |callback| to run when the Cicerone service becomes available. // If the service is already available, or if connecting to the name-owner- // changed signal fails, |callback| will be run once asynchronously.
diff --git a/chromeos/dbus/fake_cicerone_client.cc b/chromeos/dbus/fake_cicerone_client.cc index a811897b..1895736 100644 --- a/chromeos/dbus/fake_cicerone_client.cc +++ b/chromeos/dbus/fake_cicerone_client.cc
@@ -44,6 +44,9 @@ cancel_upgrade_container_response_.set_status( vm_tools::cicerone::CancelUpgradeContainerResponse::CANCELLED); + + start_lxd_response_.set_status( + vm_tools::cicerone::StartLxdResponse::ALREADY_RUNNING); } FakeCiceroneClient::~FakeCiceroneClient() = default; @@ -108,6 +111,10 @@ return is_upgrade_container_progress_signal_connected_; } +bool FakeCiceroneClient::IsStartLxdProgressSignalConnected() { + return is_start_lxd_progress_signal_connected_; +} + // Currently no tests need to change the output of this method. If you want to // add one, make it return a variable like the above examples. bool FakeCiceroneClient::IsPendingAppListUpdatesSignalConnected() { @@ -328,6 +335,13 @@ base::BindOnce(std::move(callback), cancel_upgrade_container_response_)); } +void FakeCiceroneClient::StartLxd( + const vm_tools::cicerone::StartLxdRequest& request, + DBusMethodCallback<vm_tools::cicerone::StartLxdResponse> callback) { + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), start_lxd_response_)); +} + void FakeCiceroneClient::NotifyLxdContainerCreated( const vm_tools::cicerone::LxdContainerCreatedSignal& proto) { for (auto& observer : observer_list_) { @@ -405,4 +419,11 @@ } } +void FakeCiceroneClient::NotifyStartLxdProgress( + const vm_tools::cicerone::StartLxdProgressSignal& signal) { + for (auto& observer : observer_list_) { + observer.OnStartLxdProgress(signal); + } +} + } // namespace chromeos
diff --git a/chromeos/dbus/fake_cicerone_client.h b/chromeos/dbus/fake_cicerone_client.h index 6af2fb12..06ac42e 100644 --- a/chromeos/dbus/fake_cicerone_client.h +++ b/chromeos/dbus/fake_cicerone_client.h
@@ -39,6 +39,7 @@ bool IsPendingAppListUpdatesSignalConnected() override; bool IsApplyAnsiblePlaybookProgressSignalConnected() override; bool IsUpgradeContainerProgressSignalConnected() override; + bool IsStartLxdProgressSignalConnected() override; void LaunchContainerApplication( const vm_tools::cicerone::LaunchContainerApplicationRequest& request, DBusMethodCallback<vm_tools::cicerone::LaunchContainerApplicationResponse> @@ -118,6 +119,9 @@ const vm_tools::cicerone::CancelUpgradeContainerRequest& request, DBusMethodCallback<vm_tools::cicerone::CancelUpgradeContainerResponse> callback) override; + void StartLxd(const vm_tools::cicerone::StartLxdRequest& request, + DBusMethodCallback<vm_tools::cicerone::StartLxdResponse> + callback) override; void WaitForServiceToBeAvailable( dbus::ObjectProxy::WaitForServiceToBeAvailableCallback callback) override; @@ -168,6 +172,9 @@ void set_upgrade_container_progress_signal_connected(bool connected) { is_upgrade_container_progress_signal_connected_ = connected; } + void set_start_lxd_progress_signal_connected(bool connected) { + is_start_lxd_progress_signal_connected_ = connected; + } void set_launch_container_application_response( const vm_tools::cicerone::LaunchContainerApplicationResponse& launch_container_application_response) { @@ -275,6 +282,10 @@ cancel_upgrade_container_response_ = std::move(cancel_upgrade_container_response); } + void set_start_lxd_response( + vm_tools::cicerone::StartLxdResponse start_lxd_response) { + start_lxd_response_ = std::move(start_lxd_response); + } // Returns true if the method has been invoked at least once, false otherwise. bool configure_for_arc_sideload_called() { @@ -306,6 +317,8 @@ const vm_tools::cicerone::ApplyAnsiblePlaybookProgressSignal& signal); void NotifyUpgradeContainerProgress( const vm_tools::cicerone::UpgradeContainerProgressSignal& signal); + void NotifyStartLxdProgress( + const vm_tools::cicerone::StartLxdProgressSignal& signal); protected: void Init(dbus::Bus* bus) override {} @@ -324,6 +337,7 @@ bool is_import_lxd_container_progress_signal_connected_ = true; bool is_apply_ansible_playbook_progress_signal_connected_ = true; bool is_upgrade_container_progress_signal_connected_ = true; + bool is_start_lxd_progress_signal_connected_ = true; std::string last_container_username_; bool send_container_started_signal_ = true; @@ -372,6 +386,7 @@ vm_tools::cicerone::UpgradeContainerResponse upgrade_container_response_; vm_tools::cicerone::CancelUpgradeContainerResponse cancel_upgrade_container_response_; + vm_tools::cicerone::StartLxdResponse start_lxd_response_; vm_tools::cicerone::OsRelease lxd_container_os_release_;
diff --git a/chromeos/printing/uri.h b/chromeos/printing/uri.h new file mode 100644 index 0000000..fd4aa66 --- /dev/null +++ b/chromeos/printing/uri.h
@@ -0,0 +1,370 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_PRINTING_URI_H_ +#define CHROMEOS_PRINTING_URI_H_ + +#include <memory> +#include <string> +#include <utility> +#include <vector> + +namespace chromeos { + +// This is a simple URI builder/parser. +// This class has similar functionality as GURL (Google's URL parsing library). +// However, we were not able to use GURL because of the following reasons: +// - GURL has no support for ipp/ipps scheme +// - we need general parser and builder for http-like URIs with schemes +// different than http/https (expressions like scheme://host/path?query) +// - we need simple methods for replacing particular components (by SetX/GetX) +// - we do not care too much about edge cases, like empty Host or Path +// +// This class is a container for general http-like URI. It can parse any +// reasonable formatted http-like URI (see the grammar below) and return +// the normalized form. Valid UTF-8 characters and the escape character % are +// supported and normalized according to the rules specified in the standard +// https://tools.ietf.org/html/std66. While the general syntax of the URI is +// enforced, this class does no validate semantics of the URI. It means that +// you can freely set/modify every component with Set*(...) methods. +// +// +// General Rules +//=============== +// +// The URI consists of the following components: +// * Scheme +// * Userinfo +// * Host +// * Port +// * Path +// * Query +// * Fragment +// Objects of this class do not store original (input) strings. All parsed data +// is stored and returned in a normalized form. The syntax and the normalization +// algorithm is based on https://tools.ietf.org/html/std66 with the following +// modifications: +// +// 1. The grammar is simplified: +// +// uri = Scheme ":" [ authority ] [ Path ] [ "?" Query ] [ "#" Fragment ] +// +// authority = "//" [ Userinfo "@" ] Host [ ":" Port ] +// +// The grammar is written in ABNF notation (RFC2234). Square brackets ([...]) +// means optional. +// +// 2. The empty Scheme/Userinfo/Host/Path/Query/Fragment is treated the same way +// as "not specified", e.g.: +// +// http:///a = http:///a? = http:/a? = http:/a# = http:/a +// +// 3. Relative paths are not supported. Path must be empty or start with '/'. +// +// 4. Non-printable ASCII characters (0x00-0x1F and 0x7F-0xFF) are not +// supported, even when coded as %-escaped characters. The only exceptions +// are bytes coding UTF-8 characters. +// +// +// Example +//========= +// +// Let's say that we want to parse an URI: +// Uri uri("ipp://home.net:1234/my/printer/"); +// if (uri.GetLastParsingError().status != Uri::ParserStatus::kNoErrors) { +// std::cout << "Invalid URI" << std::endl; +// } else { +// std::cout << "Normalized form: " << uri.GetNormalized() << std::endl; +// std::cout << "Scheme: " << uri.GetScheme() << std::endl; +// std::cout << "Host: " << uri.GetHost() << std::endl; +// std::cout << "Port: " << uri.GetPort() << std::endl; +// std::cout << "Path: " << uri.GetPath() << std::endl; +// } +// // Change Port to the default one: +// uri.SetPort(-1); +// // Change Path "/ipp/printer" +// uri.SetPath({"ipp", "printer"}); +// +// +// Default Port Numbers +//====================== +// +// Some schemes have default port number. This Port number is set automatically +// when both of the following conditions are met: +// * the current Port number is unspecified (equals -1) +// * the Scheme equals to one of schemes from the list below +// The following schemes are recognize and has a default port number: +// * http : 80 +// * https : 443 +// * ipp : 631 +// * ipps : 443 +// * lpd : 515 +// * socket : 9100 +// +// +// Encoding +//========== +// +// The parser accepts valid UTF-8 characters and %-escaped characters. In the +// normalized form, all bytes coding UTF-8 characters are coded as %-escaped +// characters. The components Scheme and Port do not allow for %-escaped and +// UTF-8characters. See the section Components below for details. +// +// By %-escaped character we understand here a single byte coded as three ASCII +// characters: the percent sign ('%') and two hex digits coding the value. Both +// lowercase and uppercase letters may be used as a hex digit on the input, but +// they are always normalized to uppercase letters. +// +// In general, non-printable ASCII characters are not allowed, even as %-escaped +// characters. After decoding %-escaped characters, the parser applies the +// following criteria: +// * 0x00-0x1F - a disallowed ASCII character +// * 0x20-0x7E - a valid ASCII character +// * 0x7F-0xBF - a disallowed ASCII character +// * 0xC0-0xF7 - the beginning of UTF-8 character (try to parse UTF-8 sequence) +// * 0xF8-0xFF - a disallowed ASCII character +// +// +// Components +//============ +// +// These three sets of ASCII characters are used in components definitions: +// * ALPHA - any letter (A-Z or a-z) +// * DIGIT - any digit (0-9) +// * STD_CHARS = ALPHA | DIGIT | "-" | "." | "_" | "~" | "!" | "$" | "'" +// | "(" | ")" | "*" | "," | ";" +// +// These three properties are used in components' descriptions: +// * Allowed characters - a set of characters that is allowed in +// the normalized form of the component +// * %-escaped characters - if NO, then %-escaped characters are not allowed, +// neither on the input nor in the normalized form; it also means that +// only characters from the "Allowed characters" property are allowed +// on the input +// * Case-sensitive - if NO, then lowercase and uppercase letters have the +// same meaning and they are adjusted by the normalization algorithm +// +// Scheme +//-------- +// The first character must be ALPHA. +// Allowed characters : ALPHA | DIGIT | "+" | "-" | "." +// %-escaped characters: NO +// Case-sensitive : NO - normalized to lowercase +// +// Userinfo +//---------- +// Allowed characters : STD_CHARS | "+" | "&" | "=" | ":" +// %-escaped characters: YES +// Case-sensitive : YES +// +// Host +//------ +// Allowed characters : STD_CHARS | "+" | "&" | "=" +// %-escaped characters: YES +// Case-sensitive : NO - normalized to lowercase +// +// Port +//------ +// It is a non-negative number; it cannot be larger than 65535. +// If not-specified and the Scheme has default Port number then the default +// number is set. In normalized URI, the Port is omitted if it equals default +// port from the Scheme. Allowed characters : DIGIT +// %-escaped characters: NO +// +// Path +//------ +// It must match to the following grammar: +// Path = "/" segment [ Path ] | "/" +// Path equals "/" is normalized to empty Path. +// Segments "." and ".." are special and are reduced during normalization, e.g: +// /abac/./123/def/../x -> /abac/123/x +// /xzy/../../sss/ -> /../sss +// Segment is a non-empty string with the following properties: +// Allowed characters : STD_CHARS | "+" | "&" | "=" | ":" | "@" +// %-escaped characters: YES +// Case-sensitive : YES +// +// Query +//------- +// It must match to the following grammar: +// Query = [ pairs [ "&" ] ] +// pairs = pair [ "&" pairs ] +// pair = name [ "=" value ] +// The parser replaces all occurrences of "+" in Name and Value by " " (space). +// Name cannot be empty. When Value is empty, the separator "=" is omitted in +// the normalized form. +// Name and Value are strings with the following properties: +// Allowed characters : STD_CHARS | ":" | "@" | "/" | "?" +// %-escaped characters: YES +// Case-sensitive : YES +// +// Fragment +//---------- +// Allowed characters : STD_CHARS | "+" | "&" | "=" | ":" | "@" | "/" | "?" +// %-escaped characters: YES +// Case-sensitive : YES +// + +class Uri { + public: + enum class ParserStatus { + kNoErrors, + kInvalidPercentEncoding, // cannot parse hex number after % sign + kDisallowedASCIICharacter, // non-printable ASCII character + kInvalidUTF8Character, // error when tried to parse UTF-8 character + kInvalidScheme, // invalid Scheme format or no ':' in input + kInvalidPortNumber, + kEmptySegmentInPath, + kEmptyParameterNameInQuery + }; + + // This struct contains the last parser error. The parser error is always + // set/reset by the following methods: + // - the constructor with a parameter + // - Set*(...) methods + // - Set*Encoded(...) methods + // The parser stops on the first error and reports its position in + // |parsed_chars| as a number of successfully parsed characters from the + // string given on the input. Methods SetQuery(...), SetQueryEncoded(...), + // SetPath(...) and SetPathEncoded(...) may take as a parameter more than + // one string. For them, the parser reports the number of successfully + // parsed strings in |parsed_strings| and the position of the error in the + // invalid string as |parsed_chars|. + // If |status| == kNoErrors, values of the fields |parsed_chars| and + // |parsed_strings| are undefined. + struct ParserError { + ParserStatus status = ParserStatus::kNoErrors; + // The position in the input string where the parser error occurred. + // If |status| == kNoErrors, then this value is undefined. + size_t parsed_chars = 0; + // This field is relevant only for the methods SetQuery(...), + // SetPath(...), SetQueryEncoded(...) and SetPathEncoded(...). + // In case of a parser error, it holds the number of successfully + // parsed strings. For SetPath*(...) methods, it is an index of the + // invalid string in the input vector. For SetQuery*(...) methods, the + // index of invalid pair is (|parsed_strings|/2) and the value of + // (|parsed_strings|%2) indicates the invalid string in the pair. + // If |status| == kNoErrors, then this value is undefined. + size_t parsed_strings = 0; + }; + + // Returns the default port number for given |scheme|. If |scheme| is not + // known or it does not have a default port number, this method returns -1. + static int GetDefaultPort(const std::string& scheme); + + // Constructor, creates an empty URI. + Uri(); + + // Constructor, it tries to parse |uri|. + // Leading and trailing white spaces (space, \t, \n, \r, \f) are ignored. + explicit Uri(const std::string& uri); + + Uri(const Uri&); + Uri(Uri&&); + ~Uri(); + + Uri& operator=(const Uri&); + Uri& operator=(Uri&&); + + // Returns the last parser error. The parser error is set/reset by the + // following methods: + // - the constructor with parameter + // - Set*(...) methods + // - Set*Encoded(...) methods + const ParserError& GetLastParsingError() const; + + // Returns the URL in the normalized form. It never returns empty string! + // When all components are empty, this method returns ":" (see the grammar). + // If the Port is specified (GetPort() != -1) and |always_print_port| is set + // to true, a Port number is always included in the returned URI (even when + // it equals to a Scheme's default port number). + std::string GetNormalized(bool always_print_port = false) const; + + // Returns true <=> whole URL has no UTF-8 characters. + bool IsASCII() const; + + // Returns the Scheme. Scheme cannot have %-escaped or UTF-8 characters. + std::string GetScheme() const; + + // Sets Scheme. When the new Scheme has a default port value and the current + // Port value is non-specified (=-1), the Port is set to the default value. + // Scheme cannot have %-escaped or UTF-8 characters. + // Returns false when |scheme| is invalid. In this case, the current Scheme + // is not modified. + bool SetScheme(const std::string& scheme); + + // Returns the Port number or -1 if the Port number is not specified. + int GetPort() const; + + // Sets Port. |port| must be from the interval [-1,65535]. -1 means + // "not-specified". If the current Scheme has a default port value, setting + // -1 results in setting the default port value from the Scheme. + // Returns false when |port| is invalid. In this case, the current port is + // not modified. + bool SetPort(int port); + + // These methods return values of components. There is no %-escaped sequences + // and returned string may contain UTF-8 characters. + std::string GetUserinfo() const; + std::string GetHost() const; + std::vector<std::string> GetPath() const; + std::vector<std::pair<std::string, std::string>> GetQuery() const; + std::string GetFragment() const; + + // These methods are similar to aforementioned Get* methods. The only + // difference is that all strings are %-escaped according to the + // normalization rules. In other words, returned values are the same as + // in the normalized URI form returned by GetNormalized(). + std::string GetUserinfoEncoded() const; + std::string GetHostEncoded() const; + std::vector<std::string> GetPathEncoded() const; + std::string GetPathEncodedAsString() const; + std::vector<std::pair<std::string, std::string>> GetQueryEncoded() const; + std::string GetQueryEncodedAsString() const; + std::string GetFragmentEncoded() const; + + // These methods set value of a component. They DO NOT interpret % as an + // escape character. Input strings may contain UTF-8 characters. + // Returned value has the following meaning: + // - true - no parser errors => the component was set to a new value + // - false - a parser error occurred => no changes were made to the component + // Every call to one of these methods resets the state returned by the method + // GetLastParsingError(...). + bool SetUserinfo(const std::string&); + bool SetHost(const std::string&); + bool SetPath(const std::vector<std::string>&); + bool SetQuery(const std::vector<std::pair<std::string, std::string>>&); + bool SetFragment(const std::string&); + + // These methods are similar to aforementioned Set* methods. The only + // difference is that the DO interpret % as an escape character. UTF-8 + // characters are still allowed. + bool SetUserinfoEncoded(const std::string&); + bool SetHostEncoded(const std::string&); + bool SetPathEncoded(const std::vector<std::string>&); + bool SetPathEncoded(const std::string&); + bool SetQueryEncoded(const std::vector<std::pair<std::string, std::string>>&); + bool SetQueryEncoded(const std::string&); + bool SetFragmentEncoded(const std::string&); + + // <=> operators. The order is determined by ASCII-wise comparison of the + // vector of components (GetScheme(),GetUserinfo(),GetHost(),GetPort(), + // GetPath(),GetQuery(),GetFragment()). The value of GetLastParsingError() + // is not taken into account during comparison (URIs with the same components + // but different ParserError are ==). + bool operator<(const Uri& uri) const; + bool operator<=(const Uri& uri) const { return !(uri < *this); } + bool operator>(const Uri& uri) const { return (uri < *this); } + bool operator>=(const Uri& uri) const { return !(*this < uri); } + bool operator==(const Uri& uri) const; + bool operator!=(const Uri& uri) const { return !(*this == uri); } + + private: + struct Pim; + std::unique_ptr<Pim> pim_; +}; + +} // namespace chromeos + +#endif /* CHROMEOS_PRINTING_URI_H_ */
diff --git a/components/arc/mojom/arc_bridge.mojom b/components/arc/mojom/arc_bridge.mojom index 26b97b9c..47a7a84 100644 --- a/components/arc/mojom/arc_bridge.mojom +++ b/components/arc/mojom/arc_bridge.mojom
@@ -229,10 +229,3 @@ // Notifies Chrome that the WallpaperInstance interface is ready. [MinVersion=18] OnWallpaperInstanceReady@124(WallpaperInstance instance_ptr); }; - -interface ArcBridgeInstance { - // Establishes full-duplex communication with the host. - // |host_ptr| is the MessagePipe endpoint that is bound to the - // ArcBridgeHostPtr binding. - Init@0(ArcBridgeHost host_ptr); -};
diff --git a/components/arc/session/arc_bridge_host_impl.cc b/components/arc/session/arc_bridge_host_impl.cc index 82097b7c..c2c89e8 100644 --- a/components/arc/session/arc_bridge_host_impl.cc +++ b/components/arc/session/arc_bridge_host_impl.cc
@@ -69,17 +69,12 @@ ArcBridgeHostImpl::ArcBridgeHostImpl( ArcBridgeService* arc_bridge_service, - mojo::PendingRemote<mojom::ArcBridgeInstance> instance) + mojo::PendingReceiver<mojom::ArcBridgeHost> pending_receiver) : arc_bridge_service_(arc_bridge_service), - receiver_(this), - instance_(std::move(instance)) { + receiver_(this, std::move(pending_receiver)) { DCHECK(arc_bridge_service_); - DCHECK(instance_.is_bound()); - instance_.set_disconnect_handler( + receiver_.set_disconnect_handler( base::BindOnce(&ArcBridgeHostImpl::OnClosed, base::Unretained(this))); - mojom::ArcBridgeHostPtr host_proxy; - receiver_.Bind(mojo::MakeRequest(&host_proxy)); - instance_->Init(std::move(host_proxy)); } ArcBridgeHostImpl::~ArcBridgeHostImpl() { @@ -364,9 +359,7 @@ // Close all mojo channels. mojo_channels_.clear(); - instance_.reset(); - if (receiver_.is_bound()) - receiver_.reset(); + receiver_.reset(); arc_bridge_service_->ObserveAfterArcBridgeClosed(); }
diff --git a/components/arc/session/arc_bridge_host_impl.h b/components/arc/session/arc_bridge_host_impl.h index d0c78d4..cb8153e 100644 --- a/components/arc/session/arc_bridge_host_impl.h +++ b/components/arc/session/arc_bridge_host_impl.h
@@ -23,9 +23,9 @@ class MojoChannelBase; // Implementation of the ArcBridgeHost. -// The lifetime of ArcBridgeHost and ArcBridgeInstance mojo channels are tied -// to this instance. Also, any ARC related Mojo channel will be closed if -// either ArcBridgeHost or ArcBridgeInstance Mojo channels is closed on error. +// The lifetime of ArcBridgeHost mojo channel is tied to this instance. +// Also, any ARC related Mojo channel will be closed if ArcBridgeHost Mojo +// channel is closed on error. // When ARC Instance (not Host) Mojo channel gets ready (= passed via // OnFooInstanceReady(), and the QueryVersion() gets completed), then this sets // the raw pointer to the ArcBridgeService so that other services can access @@ -33,8 +33,9 @@ // Note that ArcBridgeService must be alive while ArcBridgeHostImpl is alive. class ArcBridgeHostImpl : public mojom::ArcBridgeHost { public: - ArcBridgeHostImpl(ArcBridgeService* arc_bridge_service, - mojo::PendingRemote<mojom::ArcBridgeInstance> instance); + ArcBridgeHostImpl( + ArcBridgeService* arc_bridge_service, + mojo::PendingReceiver<mojom::ArcBridgeHost> pending_receiver); ~ArcBridgeHostImpl() override; // ArcBridgeHost overrides. @@ -141,7 +142,6 @@ ArcBridgeService* const arc_bridge_service_; mojo::Receiver<mojom::ArcBridgeHost> receiver_; - mojo::Remote<mojom::ArcBridgeInstance> instance_; // Put as a last member to ensure that any callback tied to the elements // is not invoked.
diff --git a/components/arc/session/arc_client_adapter.h b/components/arc/session/arc_client_adapter.h index fc31abdb..2a36aaf 100644 --- a/components/arc/session/arc_client_adapter.h +++ b/components/arc/session/arc_client_adapter.h
@@ -14,6 +14,10 @@ #include "components/arc/session/arc_start_params.h" #include "components/arc/session/arc_upgrade_params.h" +namespace cryptohome { +class Identification; +} // namespace cryptohome + namespace arc { // An adapter to talk to a Chrome OS daemon to manage lifetime of ARC instance. @@ -42,9 +46,10 @@ // is called due to the browser being shut down. virtual void StopArcInstance(bool on_shutdown) = 0; - // Sets a hash string of the profile user ID and an ARC serial number for the + // Sets a hash string of the profile user IDs and an ARC serial number for the // user. - virtual void SetUserInfo(const std::string& hash, + virtual void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, const std::string& serial_number) = 0; void AddObserver(Observer* observer);
diff --git a/components/arc/session/arc_container_client_adapter.cc b/components/arc/session/arc_container_client_adapter.cc index 08b90ae3..ea87682e 100644 --- a/components/arc/session/arc_container_client_adapter.cc +++ b/components/arc/session/arc_container_client_adapter.cc
@@ -134,7 +134,8 @@ chromeos::SessionManagerClient::Get()->StopArcInstance(base::DoNothing()); } - void SetUserInfo(const std::string& hash, + void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, const std::string& serial_number) override {} // chromeos::SessionManagerClient::Observer overrides:
diff --git a/components/arc/session/arc_session.h b/components/arc/session/arc_session.h index 481a09e..4fe0d48 100644 --- a/components/arc/session/arc_session.h +++ b/components/arc/session/arc_session.h
@@ -21,6 +21,10 @@ class SchedulerConfigurationManagerBase; } +namespace cryptohome { +class Identification; +} + namespace version_info { enum class Channel; } @@ -82,9 +86,10 @@ // when it has already been called before. virtual void OnShutdown() = 0; - // Sets a hash string of the profile user ID and an ARC serial number for the + // Sets a hash string of the profile user IDs and an ARC serial number for the // user. - virtual void SetUserInfo(const std::string& hash, + virtual void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, const std::string& serial_number) = 0; void AddObserver(Observer* observer);
diff --git a/components/arc/session/arc_session_impl.cc b/components/arc/session/arc_session_impl.cc index 8365646..c141443 100644 --- a/components/arc/session/arc_session_impl.cc +++ b/components/arc/session/arc_session_impl.cc
@@ -277,11 +277,16 @@ std::vector<base::ScopedFD> fds; fds.emplace_back(channel.TakeRemoteEndpoint().TakePlatformHandle().TakeFD()); + // Version of protocol chrome is using. + uint8_t protocol_version = 0; + // We need to send the length of the message as a single byte, so make sure it // fits. DCHECK_LT(token.size(), 256u); uint8_t message_length = static_cast<uint8_t>(token.size()); - struct iovec iov[] = {{&message_length, sizeof(message_length)}, + + struct iovec iov[] = {{&protocol_version, sizeof(protocol_version)}, + {&message_length, sizeof(message_length)}, {const_cast<char*>(token.c_str()), token.size()}}; ssize_t result = mojo::SendmsgWithHandles(connection_fd.get(), iov, sizeof(iov) / sizeof(iov[0]), fds); @@ -303,8 +308,8 @@ } std::move(callback).Run(std::make_unique<ArcBridgeHostImpl>( - arc_bridge_service_, mojo::PendingRemote<mojom::ArcBridgeInstance>( - std::move(server_pipe), 0u))); + arc_bridge_service_, + mojo::PendingReceiver<mojom::ArcBridgeHost>(std::move(server_pipe)))); } } // namespace @@ -721,10 +726,12 @@ OnStopped(ArcStopReason::SHUTDOWN); } -void ArcSessionImpl::SetUserInfo(const std::string& hash, - const std::string& serial_number) { +void ArcSessionImpl::SetUserInfo( + const cryptohome::Identification& cryptohome_id, + const std::string& hash, + const std::string& serial_number) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - client_->SetUserInfo(hash, serial_number); + client_->SetUserInfo(cryptohome_id, hash, serial_number); } void ArcSessionImpl::OnConfigurationSet(bool success,
diff --git a/components/arc/session/arc_session_impl.h b/components/arc/session/arc_session_impl.h index b1c3ee72..a24529c 100644 --- a/components/arc/session/arc_session_impl.h +++ b/components/arc/session/arc_session_impl.h
@@ -25,6 +25,10 @@ class DefaultScaleFactorRetriever; } +namespace cryptohome { +class Identification; +} + namespace arc { namespace mojom { @@ -194,7 +198,8 @@ void Stop() override; bool IsStopRequested() override; void OnShutdown() override; - void SetUserInfo(const std::string& hash, + void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, const std::string& serial_number) override; // chromeos::SchedulerConfigurationManagerBase::Observer overrides:
diff --git a/components/arc/session/arc_session_impl_unittest.cc b/components/arc/session/arc_session_impl_unittest.cc index c79bb55..529abbf4 100644 --- a/components/arc/session/arc_session_impl_unittest.cc +++ b/components/arc/session/arc_session_impl_unittest.cc
@@ -27,6 +27,10 @@ #include "components/version_info/channel.h" #include "testing/gtest/include/gtest/gtest.h" +namespace cryptohome { +class Identification; +} // namespace cryptohome + namespace arc { namespace { @@ -74,7 +78,8 @@ base::Unretained(this))); } - void SetUserInfo(const std::string& hash, + void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, const std::string& serial_number) override {} // Notifies ArcSessionImpl of the ARC instance stop event.
diff --git a/components/arc/session/arc_session_runner.cc b/components/arc/session/arc_session_runner.cc index 28e029b..6b13287 100644 --- a/components/arc/session/arc_session_runner.cc +++ b/components/arc/session/arc_session_runner.cc
@@ -235,17 +235,20 @@ DCHECK(!arc_session_); } -void ArcSessionRunner::SetUserInfo(const std::string& hash, - const std::string& serial_number) { - // |hash| can be empty in unit tests. This function can also be called - // multiple times in tests. - // TODO(yusukes): Fix tests and add DCHECKs to make sure |hash| is not - // empty and the function is called only once. +void ArcSessionRunner::SetUserInfo( + const cryptohome::Identification& cryptohome_id, + const std::string& hash, + const std::string& serial_number) { + // |cryptohome_id.id()| and |hash| can be empty in unit tests. This function + // can also be called multiple times in tests. + // TODO(yusukes): Fix tests and add DCHECKs to make sure they are not empty + // and the function is called only once. DCHECK(!serial_number.empty()); + cryptohome_id_ = cryptohome_id; user_id_hash_ = hash; serial_number_ = serial_number; if (arc_session_) - arc_session_->SetUserInfo(user_id_hash_, serial_number_); + arc_session_->SetUserInfo(cryptohome_id_, user_id_hash_, serial_number_); } void ArcSessionRunner::SetRestartDelayForTesting( @@ -263,8 +266,10 @@ VLOG(1) << "Starting ARC instance"; if (!arc_session_) { arc_session_ = factory_.Run(); - if (!user_id_hash_.empty() && !serial_number_.empty()) - arc_session_->SetUserInfo(user_id_hash_, serial_number_); + if (!cryptohome_id_.id().empty() && !user_id_hash_.empty() && + !serial_number_.empty()) { + arc_session_->SetUserInfo(cryptohome_id_, user_id_hash_, serial_number_); + } arc_session_->AddObserver(this); arc_session_->StartMiniInstance(); // Record the UMA only when |restart_after_crash_count_| is zero to avoid
diff --git a/components/arc/session/arc_session_runner.h b/components/arc/session/arc_session_runner.h index 00dc2a8..1928823e 100644 --- a/components/arc/session/arc_session_runner.h +++ b/components/arc/session/arc_session_runner.h
@@ -17,6 +17,7 @@ #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "chromeos/cryptohome/cryptohome_parameters.h" #include "components/arc/session/arc_instance_mode.h" #include "components/arc/session/arc_session.h" #include "components/arc/session/arc_stop_reason.h" @@ -98,9 +99,11 @@ // when this function is called, MessageLoop is no longer exists. void OnShutdown(); - // Sets a hash string of the profile user ID and an ARC serial number for the + // Sets a hash string of the profile user IDs and an ARC serial number for the // user. - void SetUserInfo(const std::string& hash, const std::string& serial_number); + void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, + const std::string& serial_number); // Returns the current ArcSession instance for testing purpose. ArcSession* GetArcSessionForTesting() { return arc_session_.get(); } @@ -150,6 +153,8 @@ // Parameters to upgrade request. UpgradeParams upgrade_params_; + // A cryptohome ID of the profile. + cryptohome::Identification cryptohome_id_; // A hash string of the profile user ID. std::string user_id_hash_; // A serial number for the current profile.
diff --git a/components/arc/session/arc_vm_client_adapter.cc b/components/arc/session/arc_vm_client_adapter.cc index b5c3e2f..ac2a9bd5 100644 --- a/components/arc/session/arc_vm_client_adapter.cc +++ b/components/arc/session/arc_vm_client_adapter.cc
@@ -31,6 +31,7 @@ #include "base/task/thread_pool.h" #include "base/time/time.h" #include "chromeos/constants/chromeos_switches.h" +#include "chromeos/cryptohome/cryptohome_parameters.h" #include "chromeos/dbus/concierge_client.h" #include "chromeos/dbus/dbus_method_call_status.h" #include "chromeos/dbus/dbus_thread_manager.h" @@ -305,10 +306,10 @@ // Initializing |is_host_on_vm_| and |is_dev_mode_| is not always very fast. // Try to initialize them in the constructor and in StartMiniArc respectively. // They usually run when the system is not busy. - explicit ArcVmClientAdapter() : ArcVmClientAdapter({}) {} + ArcVmClientAdapter() : ArcVmClientAdapter(FileSystemStatusRewriter{}) {} // For testing purposes and the internal use (by the other ctor) only. - ArcVmClientAdapter(const FileSystemStatusRewriter& rewriter) + explicit ArcVmClientAdapter(const FileSystemStatusRewriter& rewriter) : is_host_on_vm_(chromeos::system::StatisticsProvider::GetInstance() ->IsRunningOnVm()), file_system_status_rewriter_for_testing_(rewriter) { @@ -391,14 +392,19 @@ weak_factory_.GetWeakPtr())); } - void SetUserInfo(const std::string& hash, + void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, const std::string& serial_number) override { + DCHECK(cryptohome_id_.id().empty()); DCHECK(user_id_hash_.empty()); DCHECK(serial_number_.empty()); + if (cryptohome_id.id().empty()) + LOG(WARNING) << "cryptohome_id is empty"; if (hash.empty()) LOG(WARNING) << "hash is empty"; if (serial_number.empty()) LOG(WARNING) << "serial_number is empty"; + cryptohome_id_ = cryptohome_id; user_id_hash_ = hash; serial_number_ = serial_number; } @@ -629,6 +635,8 @@ // True when the *host* is running on a VM. const bool is_host_on_vm_; + // A cryptohome ID of the primary profile. + cryptohome::Identification cryptohome_id_; // A hash of the primary profile user ID. std::string user_id_hash_; // A serial number for the current profile.
diff --git a/components/arc/session/arc_vm_client_adapter_unittest.cc b/components/arc/session/arc_vm_client_adapter_unittest.cc index 771fbf71..ba457b8 100644 --- a/components/arc/session/arc_vm_client_adapter_unittest.cc +++ b/components/arc/session/arc_vm_client_adapter_unittest.cc
@@ -20,6 +20,7 @@ #include "base/task/post_task.h" #include "base/test/bind_test_util.h" #include "base/time/time.h" +#include "chromeos/cryptohome/cryptohome_parameters.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/debug_daemon/fake_debug_daemon_client.h" #include "chromeos/dbus/fake_concierge_client.h" @@ -27,6 +28,7 @@ #include "components/arc/arc_util.h" #include "components/arc/session/arc_session.h" #include "components/arc/session/file_system_status.h" +#include "components/user_manager/user_names.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" @@ -191,8 +193,12 @@ GetTestDebugDaemonClient()->set_start_concierge_result(response); } - void SetValidUserInfo() { - adapter()->SetUserInfo(kUserIdHash, kSerialNumber); + void SetValidUserInfo() { SetUserInfo(kUserIdHash, kSerialNumber); } + + void SetUserInfo(const std::string& hash, const std::string& serial) { + adapter()->SetUserInfo( + cryptohome::Identification(user_manager::StubAccountId()), hash, + serial); } void StartMiniArcWithParams(bool expect_success, StartParams params) { @@ -341,7 +347,7 @@ // Tests that SetUserInfo() doesn't crash. TEST_F(ArcVmClientAdapterTest, SetUserInfo) { - adapter()->SetUserInfo(kUserIdHash, kSerialNumber); + SetUserInfo(kUserIdHash, kSerialNumber); } // Tests that StartMiniArc() succeeds by default. @@ -472,7 +478,7 @@ TEST_F(ArcVmClientAdapterTest, UpgradeArc_NoUserId) { // Don't set the user id hash. Note that we cannot call StartArcVm() without // it. - adapter()->SetUserInfo(std::string(), kSerialNumber); + SetUserInfo(std::string(), kSerialNumber); StartMiniArc(); UpgradeArc(false); @@ -495,7 +501,7 @@ TEST_F(ArcVmClientAdapterTest, UpgradeArc_NoSerial) { // Don't set the serial number. Note that we cannot call StartArcVm() without // it. - adapter()->SetUserInfo(kUserIdHash, std::string()); + SetUserInfo(kUserIdHash, std::string()); StartMiniArc(); UpgradeArc(false);
diff --git a/components/arc/test/fake_arc_session.cc b/components/arc/test/fake_arc_session.cc index 5a421da..08d5b9e 100644 --- a/components/arc/test/fake_arc_session.cc +++ b/components/arc/test/fake_arc_session.cc
@@ -40,8 +40,10 @@ StopWithReason(ArcStopReason::SHUTDOWN); } -void FakeArcSession::SetUserInfo(const std::string& hash, - const std::string& serial_number) {} +void FakeArcSession::SetUserInfo( + const cryptohome::Identification& cryptohome_id, + const std::string& hash, + const std::string& serial_number) {} void FakeArcSession::StopWithReason(ArcStopReason reason) { bool was_mojo_connected = running_;
diff --git a/components/arc/test/fake_arc_session.h b/components/arc/test/fake_arc_session.h index f628e89..f7c4e7a 100644 --- a/components/arc/test/fake_arc_session.h +++ b/components/arc/test/fake_arc_session.h
@@ -12,6 +12,10 @@ #include "components/arc/session/arc_session.h" #include "components/arc/session/arc_stop_reason.h" +namespace cryptohome { +class Identification; +} // namespace cryptohome + namespace arc { // A fake ArcSession that creates a local connection. @@ -26,7 +30,8 @@ void Stop() override; bool IsStopRequested() override; void OnShutdown() override; - void SetUserInfo(const std::string& hash, + void SetUserInfo(const cryptohome::Identification& cryptohome_id, + const std::string& hash, const std::string& serial_number) override; // To emulate unexpected stop, such as crash.
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 3d57367..9e81ee838 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -46,7 +46,7 @@ // has not turned on sync. const base::Feature kAutofillEnableLocalCardMigrationForNonSyncUser{ "AutofillEnableLocalCardMigrationForNonSyncUser", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // When enabled, Autofill data related icons will be shown in the status // chip in toolbar along with the avatar toolbar button.
diff --git a/components/components_locale_settings.grd b/components/components_locale_settings.grd index 89cb92d8..9e5a331 100644 --- a/components/components_locale_settings.grd +++ b/components/components_locale_settings.grd
@@ -246,14 +246,7 @@ <release seq="1" allow_pseudo="false"> <includes> <!-- The HTML for the about:terms page --> - <if expr="chromeos and _google_chrome"> - <include name="IDS_TERMS_HTML" file="resources/terms/chromeos/terms_en.html" type="BINDATA" /> - </if> - <if expr="chromeos and not _google_chrome"> - <include name="IDS_TERMS_HTML" file="resources/terms/terms_chromium.html" type="BINDATA" /> - </if> - - <if expr="not chromeos and not is_android and not is_ios and _google_chrome"> + <if expr="not is_android and not is_ios and _google_chrome"> <if expr="'am' == lang"> <include name="IDS_TERMS_HTML" file="resources/terms/terms_am.html" type="BINDATA" /></if> <if expr="'ar' == lang"> <include name="IDS_TERMS_HTML" file="resources/terms/terms_ar.html" type="BINDATA" /></if> <if expr="'bg' == lang"> <include name="IDS_TERMS_HTML" file="resources/terms/terms_bg.html" type="BINDATA" /></if> @@ -308,7 +301,7 @@ <if expr="'zh-TW' == lang"> <include name="IDS_TERMS_HTML" file="resources/terms/terms_zh-TW.html" type="BINDATA" /></if> </if> - <if expr="not chromeos and not is_android and not is_ios and not _google_chrome"> + <if expr="not is_android and not is_ios and not _google_chrome"> <include name="IDS_TERMS_HTML" file="resources/terms/terms_chromium.html" type="BINDATA" /> </if> </includes>
diff --git a/components/feed/core/proto/ui/action/ui_feed_action.proto b/components/feed/core/proto/ui/action/ui_feed_action.proto index 419ea25..0127322 100644 --- a/components/feed/core/proto/ui/action/ui_feed_action.proto +++ b/components/feed/core/proto/ui/action/ui_feed_action.proto
@@ -30,10 +30,11 @@ } // Metadata needed by the host to handle the action. -// Next Id: 19 +// Next Id: 11 message FeedActionMetadata { // The type of action, used by the host to perform any custom logic needed for // a specific type of action. + // Next Id: 20 enum Type { UNKNOWN = 0; OPEN_URL = 1; @@ -60,6 +61,7 @@ SEE_SUGGESTED_SITES = 16; SEND_FEEDBACK = 17; MANAGE_INTERESTS = 18; + REPORT_VIEW = 19; reserved 9, 10; // Deprecated } optional Type type = 1; @@ -80,8 +82,12 @@ // The data needed by the Stream to render a tooltip. TooltipData tooltip_data = 8; + + // The data needed by the Stream to report a view action. + ViewReportData view_report_data = 10; } // The type of element this action is bounded on. + // Next Id: 5 enum ElementType { UNKNOWN_ELEMENT_TYPE = 0; CARD_LARGE_IMAGE = 1; @@ -105,6 +111,7 @@ // opening the url. Once this finishes, the client will attach to the url its // latest frequency token as the value of this query param. optional string consistency_token_query_param_name = 2; + // The content ID that was interacted with to cause a URL open. optional feedwire1.ContentId content_id = 3; // Roundtripped server data on a per-action level. @@ -198,6 +205,21 @@ optional int32 bottom = 2; } +// Data used by the client to report a view action on content. +message ViewReportData { + enum Visibility { + UNKNOWN = 0; + SHOW = 1; + HIDE = 2; + } + // Whether we're showing or hiding the content. + optional Visibility visibility = 1; + // The content ID of the view that needs to be reported. + optional feedwire1.ContentId content_id = 2; + // Roundtripped server data on a per-action level. + optional feedwire1.ActionPayload payload = 3; +} + // FeedActionMetadata with a label to show in a context menu. message LabelledFeedActionData { optional string label = 1;
diff --git a/components/feed/core/proto/v2/ui.proto b/components/feed/core/proto/v2/ui.proto index c1258bc..b3e24a7 100644 --- a/components/feed/core/proto/v2/ui.proto +++ b/components/feed/core/proto/v2/ui.proto
@@ -41,6 +41,7 @@ oneof SliceData { XSurfaceSlice xsurface_slice = 1; ZeroStateSlice zero_state_slice = 3; + LoadingSpinnerSlice loading_spinner_slice = 4; } string slice_id = 2; } @@ -57,6 +58,13 @@ Type type = 1; } +// An indicator that the feed is loading. +message LoadingSpinnerSlice { + // True if the spinner is at the top of the feed. Otherwise, it is at the + // bottom. + bool is_at_top = 1; +} + message XSurfaceSlice { bytes xsurface_frame = 1; } @@ -66,45 +74,3 @@ string id = 1; bytes xsurface_shared_state = 2; } - -// An event on the UI. -message UiEvent { - enum Type { - UNKNOWN = 0; - CARD_TAPPED = 1; - CARD_VIEWED = 2; - CARD_SWIPED = 3; - MORE_BUTTON_VIEWED = 4; - MORE_BUTTON_CLICKED = 5; - SPINNER_STARTED = 6; - SPINNER_FINISHED = 7; - SPINNER_DESTROYED_WITHOUT_COMPLETING = 8; - PIET_FRAME_RENDERING_EVENT = 9; - SCROLL_STREAM = 10; - } - enum SpinnerType { - UNKNOWN_SPINNER_TYPE = 0; - // Spinner shown on initial load of the Feed. - INITIAL_LOAD = 1; - // Spinner shown when Feed is refreshed. - ZERO_STATE_REFRESH = 2; - // Spinner shown when more button is clicked. - MORE_BUTTON = 3; - // Spinner shown when a synthetic token is consumed. - SYNTHETIC_TOKEN = 4; - // Spinner shown when a spinner is shown for loading the infinite feed. - INFINITE_FEED = 5; - } - // For CARD_* type events. - string chunk_id = 1; - // For MORE_BUTTON_* type events. - int32 more_button_position = 2; - // For SPINNER_* type events. - SpinnerType spinner_type = 3; - // For SPINNER_FINISHED and SPINNER_DESTROYED_WITHOUT_COMPLETING. - int32 spinner_time_shown = 4; - // For PIET_FRAME_RENDERING_EVENT. - repeated int32 piet_error_codes = 5; - // For SCROLL_STREAM. - int32 scroll_distance = 6; -}
diff --git a/components/feed/core/proto/v2/wire/client_info.proto b/components/feed/core/proto/v2/wire/client_info.proto index a4e7753..f21907ad 100644 --- a/components/feed/core/proto/v2/wire/client_info.proto +++ b/components/feed/core/proto/v2/wire/client_info.proto
@@ -21,7 +21,10 @@ IOS = 2; } - enum AppType { CHROME = 3; } + enum AppType { + TEST_APP = 2; // For use with AGA endpoint for testing. + CHROME = 3; + } // The type of OS that the client is running. optional PlatformType platform_type = 1;
diff --git a/components/feed/core/proto/wire/capability.proto b/components/feed/core/proto/wire/capability.proto index 6bfb7860..4eefec5 100644 --- a/components/feed/core/proto/wire/capability.proto +++ b/components/feed/core/proto/wire/capability.proto
@@ -12,7 +12,7 @@ option java_outer_classname = "CapabilityProto"; // Feature capability of either the client or the server. -// Next ID: 14. +// Next ID: 15. enum Capability { UNKNOWN_CAPABILITY = 0; BASE_UI = 1; @@ -26,6 +26,7 @@ ELEMENTS = 10; SEND_FEEDBACK = 12; CLICK_ACTION = 13; + VIEW_ACTION = 14; reserved 3, 11; }
diff --git a/components/feed/core/v2/BUILD.gn b/components/feed/core/v2/BUILD.gn index 74aed0f..e2d7e7e 100644 --- a/components/feed/core/v2/BUILD.gn +++ b/components/feed/core/v2/BUILD.gn
@@ -29,6 +29,7 @@ "public/feed_service.cc", "public/feed_service.h", "public/feed_stream_api.h", + "public/types.h", "refresh_task_scheduler.h", "request_throttler.cc", "request_throttler.h", @@ -48,6 +49,7 @@ "tasks/load_stream_task.h", "tasks/wait_for_store_initialize_task.cc", "tasks/wait_for_store_initialize_task.h", + "types.h", ] deps = [ "//components/feed/core:feed_core", @@ -57,6 +59,7 @@ "//components/signin/public/identity_manager", "//components/variations", "//components/variations/net", + "//components/version_info:channel", "//components/web_resource:web_resource", "//net", "//services/network/public/cpp", @@ -77,6 +80,7 @@ "feed_network_impl_unittest.cc", "feed_store_unittest.cc", "feed_stream_unittest.cc", + "proto_util_unittest.cc", "request_throttler_unittest.cc", "stream_model_unittest.cc", "stream_model_update_request_unittest.cc", @@ -99,6 +103,7 @@ "//components/prefs:test_support", "//components/signin/public/identity_manager", "//components/signin/public/identity_manager:test_support", + "//components/version_info:channel", "//net:test_support", "//services/network:test_support", "//services/network/public/cpp",
diff --git a/components/feed/core/v2/feed_store_unittest.cc b/components/feed/core/v2/feed_store_unittest.cc index 28e2043f..e4f69d7 100644 --- a/components/feed/core/v2/feed_store_unittest.cc +++ b/components/feed/core/v2/feed_store_unittest.cc
@@ -132,6 +132,7 @@ content_id { content_domain: "root" } + consistency_token: "token-1" shared_state_id { content_domain: "render_data" }
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index fe1e13c3..7cb98e6 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -30,7 +30,6 @@ namespace feed { // Tracks UI changes in |StreamModel| and forwards them to |SurfaceInterface|s. -// TODO(harringtond): implement spinner slice. class FeedStream::SurfaceUpdater : public StreamModel::Observer { public: using ContentRevision = ContentRevision; @@ -92,6 +91,14 @@ } } + void LoadStreamStarted() { + if (model_) + return; + for (SurfaceInterface& surface : *surfaces_) { + SendLoadingSpinnerUpdate(&surface); + } + } + void LoadStreamFailed(LoadStreamStatus load_stream_status) { auto zero_state_type = feedui::ZeroStateSlice::NO_CARDS_AVAILABLE; switch (load_stream_status) { @@ -130,6 +137,14 @@ return result; } + static void SendLoadingSpinnerUpdate(SurfaceInterface* surface) { + feedui::StreamUpdate update; + feedui::Slice* slice = update.add_updated_slices()->mutable_slice(); + slice->mutable_loading_spinner_slice()->set_is_at_top(true); + slice->set_slice_id("loading-spinner"); + surface->StreamUpdate(update); + } + static void SendZeroStateUpdate(feedui::ZeroStateSlice::Type zero_state_type, SurfaceInterface* surface) { feedui::StreamUpdate update; @@ -186,16 +201,15 @@ current_time); } -FeedStream::FeedStream( - RefreshTaskScheduler* refresh_task_scheduler, - EventObserver* stream_event_observer, - Delegate* delegate, - PrefService* profile_prefs, - FeedNetwork* feed_network, - FeedStore* feed_store, - const base::Clock* clock, - const base::TickClock* tick_clock, - scoped_refptr<base::SequencedTaskRunner> background_task_runner) +FeedStream::FeedStream(RefreshTaskScheduler* refresh_task_scheduler, + EventObserver* stream_event_observer, + Delegate* delegate, + PrefService* profile_prefs, + FeedNetwork* feed_network, + FeedStore* feed_store, + const base::Clock* clock, + const base::TickClock* tick_clock, + const ChromeInfo& chrome_info) : refresh_task_scheduler_(refresh_task_scheduler), stream_event_observer_(stream_event_observer), delegate_(delegate), @@ -204,7 +218,7 @@ store_(feed_store), clock_(clock), tick_clock_(tick_clock), - background_task_runner_(background_task_runner), + chrome_info_(chrome_info), task_queue_(this), user_classifier_(std::make_unique<UserClassifier>(profile_prefs, clock)), request_throttler_(profile_prefs, clock) { @@ -247,6 +261,7 @@ } model_loading_in_progress_ = true; + surface_updater_->LoadStreamStarted(); task_queue_.AddTask(std::make_unique<LoadStreamTask>( this, base::BindOnce(&FeedStream::LoadStreamTaskComplete, base::Unretained(this))));
diff --git a/components/feed/core/v2/feed_stream.h b/components/feed/core/v2/feed_stream.h index 5c63682..fe5243c 100644 --- a/components/feed/core/v2/feed_stream.h +++ b/components/feed/core/v2/feed_stream.h
@@ -12,6 +12,7 @@ #include "base/observer_list.h" #include "base/sequenced_task_runner.h" #include "base/task_runner_util.h" +#include "base/version.h" #include "components/feed/core/common/enums.h" #include "components/feed/core/common/user_classifier.h" #include "components/feed/core/proto/v2/wire/response.pb.h" @@ -82,7 +83,7 @@ FeedStore* feed_store, const base::Clock* clock, const base::TickClock* tick_clock, - scoped_refptr<base::SequencedTaskRunner> background_task_runner); + const ChromeInfo& chrome_info); ~FeedStream() override; FeedStream(const FeedStream&) = delete; @@ -158,6 +159,7 @@ StreamModel* GetModel() { return model_.get(); } const base::Clock* GetClock() { return clock_; } + const ChromeInfo& GetChromeInfo() const { return chrome_info_; } WireResponseTranslator* GetWireResponseTranslator() const { return wire_response_translator_; @@ -196,7 +198,7 @@ const base::TickClock* tick_clock_; WireResponseTranslator* wire_response_translator_; - scoped_refptr<base::SequencedTaskRunner> background_task_runner_; + ChromeInfo chrome_info_; offline_pages::TaskQueue task_queue_; // Whether the model is being loaded. Used to prevent multiple simultaneous
diff --git a/components/feed/core/v2/feed_stream_unittest.cc b/components/feed/core/v2/feed_stream_unittest.cc index a514fd7..17faf11 100644 --- a/components/feed/core/v2/feed_stream_unittest.cc +++ b/components/feed/core/v2/feed_stream_unittest.cc
@@ -94,12 +94,41 @@ class TestSurface : public FeedStream::SurfaceInterface { public: + // Provide some helper functionality to attach/detach the surface. + // This way we can auto-detach in the destructor. + explicit TestSurface(FeedStream* stream = nullptr) { + if (stream) + Attach(stream); + } + + ~TestSurface() override { + if (stream_) + Detach(); + } + + void Attach(FeedStream* stream) { + EXPECT_FALSE(stream_); + stream_ = stream; + stream_->AttachSurface(this); + } + + void Detach() { + EXPECT_TRUE(stream_); + stream_->DetachSurface(this); + stream_ = nullptr; + } + // FeedStream::SurfaceInterface. void StreamUpdate(const feedui::StreamUpdate& stream_update) override { - if (!initial_state) + // Some special-case treatment for the loading spinner. We don't count it + // toward |initial_state| or |update_count_|. + bool is_initial_loading_spinner = IsInitialLoadSpinnerUpdate(stream_update); + if (!initial_state && !is_initial_loading_spinner) { initial_state = stream_update; + } update = stream_update; - ++update_count_; + if (!is_initial_loading_spinner) + ++update_count_; } // Test functions. @@ -113,6 +142,9 @@ // Describe what is shown on the surface in a format that can be easily // asserted against. std::string Describe() { + if (update && IsInitialLoadSpinnerUpdate(*update)) + return "loading"; + if (!initial_state) return "empty"; @@ -130,11 +162,20 @@ } return ss.str(); } - + // The initial state of the stream, if it was received. This is nullopt if + // only the loading spinner was seen. base::Optional<feedui::StreamUpdate> initial_state; + // The last stream update received. base::Optional<feedui::StreamUpdate> update; private: + bool IsInitialLoadSpinnerUpdate(const feedui::StreamUpdate& update) { + return update.updated_slices().size() == 1 && + update.updated_slices()[0].has_slice() && + update.updated_slices()[0].slice().has_loading_spinner_slice(); + } + // The stream if it was attached using the constructor. + FeedStream* stream_ = nullptr; int update_count_ = 0; }; @@ -251,11 +292,13 @@ feed::prefs::RegisterFeedSharedProfilePrefs(profile_prefs_.registry()); feed::RegisterProfilePrefs(profile_prefs_.registry()); CHECK_EQ(kTestTimeEpoch, task_environment_.GetMockClock()->Now()); + ChromeInfo chrome_info; + chrome_info.channel = version_info::Channel::STABLE; + chrome_info.version = base::Version({99, 1, 9911, 2}); stream_ = std::make_unique<FeedStream>( &refresh_scheduler_, &event_observer_, this, &profile_prefs_, &network_, store_.get(), task_environment_.GetMockClock(), - task_environment_.GetMockTickClock(), - task_environment_.GetMainThreadTaskRunner()); + task_environment_.GetMockTickClock(), chrome_info); // Set the user classifier. auto user_classifier = std::make_unique<TestUserClassifier>( @@ -365,8 +408,7 @@ model->Update(MakeTypicalInitialModelState()); stream_->LoadModelForTesting(std::move(model)); } - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); ASSERT_TRUE(surface.initial_state); const feedui::StreamUpdate& initial_state = surface.initial_state.value(); ASSERT_EQ(2, initial_state.updated_slices().size()); @@ -386,8 +428,7 @@ } TEST_F(FeedStreamTest, SurfaceReceivesInitialContentLoadedAfterAttach) { - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); ASSERT_FALSE(surface.initial_state); { auto model = std::make_unique<StreamModel>(); @@ -419,8 +460,7 @@ model->ExecuteOperations(MakeTypicalStreamOperations()); stream_->LoadModelForTesting(std::move(model)); } - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); // Remove #1, add #2. stream_->ExecuteOperations({ MakeOperation(MakeRemove(MakeClusterId(1))), @@ -448,8 +488,7 @@ model->ExecuteOperations(MakeTypicalStreamOperations()); stream_->LoadModelForTesting(std::move(model)); } - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); // Add #2. stream_->ExecuteOperations({ MakeOperation(MakeCluster(2, MakeRootId())), @@ -484,10 +523,9 @@ model->ExecuteOperations(MakeTypicalStreamOperations()); stream_->LoadModelForTesting(std::move(model)); } - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); EXPECT_TRUE(surface.initial_state); - stream_->DetachSurface(&surface); + surface.Detach(); surface.Clear(); // Arbitrary stream change. Surface should not see the update. @@ -500,12 +538,12 @@ TEST_F(FeedStreamTest, LoadFromNetwork) { // Store is empty, so we should fallback to a network request. response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); - EXPECT_TRUE(network_.query_request_sent); + ASSERT_TRUE(network_.query_request_sent); EXPECT_TRUE(response_translator_.InjectedResponseConsumed()); + EXPECT_EQ("2 slices", surface.Describe()); // Verify the model is filled correctly. EXPECT_STRINGS_EQUAL(ModelStateFor(MakeTypicalInitialModelState()), @@ -520,18 +558,20 @@ // fetch new data over the network. user_classifier_->OverrideUserClass(UserClass::kActiveSuggestionsConsumer); store_->SaveFullStream(MakeTypicalInitialModelState( - kTestTimeEpoch - base::TimeDelta::FromHours(12) - base::TimeDelta::FromMinutes(1)), base::DoNothing()); // Store is stale, so we should fallback to a network request. response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); - EXPECT_TRUE(network_.query_request_sent); + ASSERT_TRUE(network_.query_request_sent); + // The stored continutation token should be sent. + EXPECT_EQ( + "token-1", + network_.query_request_sent->feed_request().consistency_token().token()); EXPECT_TRUE(response_translator_.InjectedResponseConsumed()); ASSERT_TRUE(surface.initial_state); } @@ -540,8 +580,7 @@ // No data in the store, so we should fetch from the network. // The network will respond with an empty response, which should fail proto // translation. - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); EXPECT_EQ(LoadStreamStatus::kProtoTranslationFailed, @@ -551,8 +590,7 @@ TEST_F(FeedStreamTest, DoNotLoadFromNetworkWhenOffline) { is_offline_ = true; response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); EXPECT_EQ(LoadStreamStatus::kCannotLoadFromNetworkOffline, @@ -563,8 +601,7 @@ TEST_F(FeedStreamTest, DoNotLoadStreamWhenArticleListIsHidden) { stream_->SetArticlesListVisible(false); response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); EXPECT_EQ(LoadStreamStatus::kLoadNotAllowedArticlesListHidden, @@ -575,8 +612,7 @@ TEST_F(FeedStreamTest, DoNotLoadStreamWhenEulaIsNotAccepted) { is_eula_accepted_ = false; response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); EXPECT_EQ(LoadStreamStatus::kLoadNotAllowedEulaNotAccepted, @@ -589,8 +625,7 @@ task_environment_.FastForwardBy(kSuppressRefreshDuration - base::TimeDelta::FromSeconds(1)); response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); EXPECT_EQ("zero-state", surface.Describe()); @@ -598,9 +633,9 @@ EXPECT_EQ(LoadStreamStatus::kCannotLoadFromNetworkSupressedForHistoryDelete, event_observer_.load_stream_status); - stream_->DetachSurface(&surface); + surface.Detach(); task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(2)); - stream_->AttachSurface(&surface); + surface.Attach(stream_.get()); WaitForIdleTaskQueue(); EXPECT_EQ("2 slices 2 updates", surface.Describe()); @@ -623,8 +658,7 @@ kTestTimeEpoch - base::TimeDelta::FromHours(12) + base::TimeDelta::FromMinutes(1)), base::DoNothing()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); ASSERT_EQ("2 slices", surface.Describe()); @@ -634,38 +668,44 @@ stream_->GetModel()->DumpStateForTesting()); } +TEST_F(FeedStreamTest, LoadingSpinnerIsSentInitially) { + store_->SaveFullStream(MakeTypicalInitialModelState(), base::DoNothing()); + TestSurface surface(stream_.get()); + + ASSERT_EQ("loading", surface.Describe()); +} + TEST_F(FeedStreamTest, DetachSurfaceWhileLoadingModel) { response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - stream_->AttachSurface(&surface); - stream_->DetachSurface(&surface); + TestSurface surface(stream_.get()); + surface.Detach(); WaitForIdleTaskQueue(); - EXPECT_EQ("empty", surface.Describe()); + EXPECT_EQ("loading", surface.Describe()); EXPECT_TRUE(network_.query_request_sent); } TEST_F(FeedStreamTest, AttachMultipleSurfacesLoadsModelOnce) { response_translator_.InjectResponse(MakeTypicalInitialModelState()); - TestSurface surface; - TestSurface other_surface; - stream_->AttachSurface(&surface); - stream_->AttachSurface(&other_surface); + TestSurface surface(stream_.get()); + TestSurface other_surface(stream_.get()); WaitForIdleTaskQueue(); ASSERT_EQ(1, network_.send_query_call_count); + ASSERT_EQ("2 slices", surface.Describe()); + ASSERT_EQ("2 slices", other_surface.Describe()); - // After load, another surface doesn't trigger any tasks. - TestSurface later_surface; - stream_->AttachSurface(&later_surface); + // After load, another surface doesn't trigger any tasks, + // and immediately has content. + TestSurface later_surface(stream_.get()); + ASSERT_EQ("2 slices", later_surface.Describe()); EXPECT_TRUE(IsTaskQueueIdle()); } TEST_F(FeedStreamTest, ModelChangesAreSavedToStorage) { store_->SaveFullStream(MakeTypicalInitialModelState(), base::DoNothing()); - TestSurface surface; - stream_->AttachSurface(&surface); + TestSurface surface(stream_.get()); WaitForIdleTaskQueue(); ASSERT_TRUE(surface.initial_state); @@ -687,10 +727,10 @@ // Unload and reload the model from the store, and verify we can still apply // operations correctly. - stream_->DetachSurface(&surface); + surface.Detach(); surface.Clear(); UnloadModel(); - stream_->AttachSurface(&surface); + surface.Attach(stream_.get()); WaitForIdleTaskQueue(); ASSERT_TRUE(surface.initial_state);
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc index 9002971..7be8f2b0 100644 --- a/components/feed/core/v2/proto_util.cc +++ b/components/feed/core/v2/proto_util.cc
@@ -5,12 +5,105 @@ #include "components/feed/core/v2/proto_util.h" #include <tuple> +#include <vector> #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/system/sys_info.h" +#include "build/build_config.h" #include "components/feed/core/proto/v2/store.pb.h" +#include "components/feed/core/v2/feed_stream.h" + +#if defined(OS_ANDROID) +#include "base/android/build_info.h" +#endif namespace feed { +namespace { +feedwire::Version::Architecture GetBuildArchitecture() { +#if defined(ARCH_CPU_X86_64) + return feedwire::Version::X86_64; +#elif defined(ARCH_CPU_X86) + return feedwire::Version::X86; +#elif defined(ARCH_CPU_MIPS64) + return feedwire::Version::MIPS64; +#elif defined(ARCH_CPU_MIPS) + return feedwire::Version::MIPS; +#elif defined(ARCH_CPU_ARM64) + return feedwire::Version::ARM64; +#elif defined(ARCH_CPU_ARMEL) + return feedwire::Version::ARM; +#else + return feedwire::Version::UNKNOWN_ARCHITECTURE; +#endif +} + +feedwire::Version::Architecture GetSystemArchitecture() { + // By default, use |GetBuildArchitecture()|. + // In the case of x86 and ARM, the OS might be x86_64 or ARM_64. + feedwire::Version::Architecture build_arch = GetBuildArchitecture(); + if (build_arch == feedwire::Version::X86 && + base::SysInfo::OperatingSystemArchitecture() == "x86_64") { + return feedwire::Version::X86_64; + } + if (feedwire::Version::ARM && + base::SysInfo::OperatingSystemArchitecture() == "arm64") { + return feedwire::Version::ARM64; + } + return build_arch; +} + +feedwire::Version::BuildType GetBuildType(version_info::Channel channel) { + switch (channel) { + case version_info::Channel::CANARY: + return feedwire::Version::ALPHA; + case version_info::Channel::DEV: + return feedwire::Version::DEV; + case version_info::Channel::BETA: + return feedwire::Version::BETA; + case version_info::Channel::STABLE: + return feedwire::Version::RELEASE; + default: + return feedwire::Version::UNKNOWN_BUILD_TYPE; + } +} + +feedwire::Version GetPlatformVersionMessage() { + feedwire::Version result; + result.set_architecture(GetSystemArchitecture()); + result.set_build_type(feedwire::Version::RELEASE); + + int32_t major, minor, revision; + base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &revision); + result.set_major(major); + result.set_minor(minor); + result.set_revision(revision); +#if defined(OS_ANDROID) + result.set_api_version(base::android::BuildInfo::GetInstance()->sdk_int()); +#endif + return result; +} + +feedwire::Version GetAppVersionMessage(const ChromeInfo& chrome_info) { + feedwire::Version result; + result.set_architecture(GetBuildArchitecture()); + result.set_build_type(GetBuildType(chrome_info.channel)); + // Chrome's version is in the format: MAJOR,MINOR,BUILD,PATCH. + const std::vector<uint32_t>& numbers = chrome_info.version.components(); + if (numbers.size() > 3) { + result.set_major(static_cast<int32_t>(numbers[0])); + result.set_minor(static_cast<int32_t>(numbers[1])); + result.set_build(static_cast<int32_t>(numbers[2])); + result.set_revision(static_cast<int32_t>(numbers[3])); + } + +#if defined(OS_ANDROID) + result.set_api_version(base::android::BuildInfo::GetInstance()->sdk_int()); +#endif + return result; +} + +} // namespace std::string ContentIdString(const feedwire::ContentId& content_id) { return base::StrCat({content_id.content_domain(), ",", @@ -34,6 +127,24 @@ std::tie(b.content_domain(), b_id, b_type); } +feedwire::ClientInfo CreateClientInfo(const ChromeInfo& chrome_info) { + feedwire::ClientInfo client_info; + // TODO(harringtond): Fill out locale. + // TODO(harringtond): Fill out DisplayInfo. + // TODO(harringtond): Fill out client_instance_id. + // TODO(harringtond): Fill out advertising_id. + // TODO(harringtond): Fill out device_country. +#if defined(OS_ANDROID) + client_info.set_platform_type(feedwire::ClientInfo::ANDROID_ID); +#elif defined(OS_IOS) + client_info.set_platform_type(feedwire::ClientInfo::IOS); +#endif + client_info.set_app_type(feedwire::ClientInfo::CHROME); + *client_info.mutable_platform_version() = GetPlatformVersionMessage(); + *client_info.mutable_app_version() = GetAppVersionMessage(chrome_info); + return client_info; +} + } // namespace feed namespace feedstore {
diff --git a/components/feed/core/v2/proto_util.h b/components/feed/core/v2/proto_util.h index c7700625..588544e3 100644 --- a/components/feed/core/v2/proto_util.h +++ b/components/feed/core/v2/proto_util.h
@@ -8,8 +8,9 @@ #include <string> #include "base/time/time.h" - +#include "components/feed/core/proto/v2/wire/client_info.pb.h" #include "components/feed/core/proto/v2/wire/content_id.pb.h" +#include "components/feed/core/v2/types.h" namespace feedstore { class StreamData; @@ -18,6 +19,8 @@ // Helper functions/classes for dealing with feed proto messages. namespace feed { +using ContentId = feedwire::ContentId; +struct ChromeInfo; std::string ContentIdString(const feedwire::ContentId&); bool Equal(const feedwire::ContentId& a, const feedwire::ContentId& b); @@ -32,6 +35,8 @@ } }; +feedwire::ClientInfo CreateClientInfo(const ChromeInfo& chrome_info); + } // namespace feed namespace feedstore {
diff --git a/components/feed/core/v2/proto_util_unittest.cc b/components/feed/core/v2/proto_util_unittest.cc new file mode 100644 index 0000000..c36c652 --- /dev/null +++ b/components/feed/core/v2/proto_util_unittest.cc
@@ -0,0 +1,31 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/feed/core/v2/proto_util.h" + +#include "components/feed/core/proto/v2/wire/client_info.pb.h" +#include "components/feed/core/v2/types.h" +#include "components/version_info/channel.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace feed { +namespace { + +TEST(ProtoUtilTest, CreateClientInfo) { + ChromeInfo chrome_info; + chrome_info.version = base::Version({1, 2, 3, 4}); + chrome_info.channel = version_info::Channel::STABLE; + + feedwire::ClientInfo result = CreateClientInfo(chrome_info); + + EXPECT_EQ(feedwire::ClientInfo::CHROME, result.app_type()); + EXPECT_EQ(feedwire::Version::RELEASE, result.app_version().build_type()); + EXPECT_EQ(1, result.app_version().major()); + EXPECT_EQ(2, result.app_version().minor()); + EXPECT_EQ(3, result.app_version().build()); + EXPECT_EQ(4, result.app_version().revision()); +} + +} // namespace +} // namespace feed
diff --git a/components/feed/core/v2/public/feed_service.cc b/components/feed/core/v2/public/feed_service.cc index d1fb36f..69723aba 100644 --- a/components/feed/core/v2/public/feed_service.cc +++ b/components/feed/core/v2/public/feed_service.cc
@@ -82,7 +82,8 @@ signin::IdentityManager* identity_manager, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, scoped_refptr<base::SequencedTaskRunner> background_task_runner, - const std::string& api_key) + const std::string& api_key, + const ChromeInfo& chrome_info) : delegate_(std::move(delegate)), refresh_task_scheduler_(std::move(refresh_task_scheduler)) { stream_delegate_ = std::make_unique<StreamDelegateImpl>(local_state); @@ -97,7 +98,7 @@ nullptr, // TODO(harringtond): Implement EventObserver. stream_delegate_.get(), profile_prefs, feed_network_.get(), store_.get(), base::DefaultClock::GetInstance(), base::DefaultTickClock::GetInstance(), - background_task_runner); + chrome_info); stream_delegate_->Initialize(static_cast<FeedStream*>(stream_.get()));
diff --git a/components/feed/core/v2/public/feed_service.h b/components/feed/core/v2/public/feed_service.h index 2d24ad0d..d1b769e8 100644 --- a/components/feed/core/v2/public/feed_service.h +++ b/components/feed/core/v2/public/feed_service.h
@@ -11,6 +11,7 @@ #include "base/files/file_path.h" #include "base/memory/scoped_refptr.h" #include "components/feed/core/v2/public/feed_stream_api.h" +#include "components/feed/core/v2/public/types.h" #include "components/keyed_service/core/keyed_service.h" #include "components/leveldb_proto/public/proto_database.h" #include "components/web_resource/eula_accepted_notifier.h" @@ -57,7 +58,8 @@ signin::IdentityManager* identity_manager, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, scoped_refptr<base::SequencedTaskRunner> background_task_runner, - const std::string& api_key); + const std::string& api_key, + const ChromeInfo& chrome_info); ~FeedService() override; FeedService(const FeedService&) = delete; FeedService& operator=(const FeedService&) = delete;
diff --git a/components/feed/core/v2/public/feed_stream_api.h b/components/feed/core/v2/public/feed_stream_api.h index 46a025c..0887e82 100644 --- a/components/feed/core/v2/public/feed_stream_api.h +++ b/components/feed/core/v2/public/feed_stream_api.h
@@ -8,8 +8,7 @@ #include <vector> #include "base/observer_list_types.h" -#include "base/util/type_safety/id_type.h" -#include "components/feed/core/proto/v2/wire/content_id.pb.h" +#include "components/feed/core/v2/public/types.h" namespace feedui { class StreamUpdate; @@ -19,12 +18,6 @@ } namespace feed { -using ContentId = feedwire::ContentId; -// Uniquely identifies a revision of a |feedstore::Content|. If Content changes, -// it is assigned a new revision number. -using ContentRevision = util::IdTypeU32<class ContentRevisionClass>; -// A unique ID for an ephemeral change. -using EphemeralChangeId = util::IdTypeU32<class EphemeralChangeIdClass>; // This is the public access point for interacting with the Feed stream // contents.
diff --git a/components/feed/core/v2/public/types.h b/components/feed/core/v2/public/types.h new file mode 100644 index 0000000..a444364 --- /dev/null +++ b/components/feed/core/v2/public/types.h
@@ -0,0 +1,25 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_FEED_CORE_V2_PUBLIC_TYPES_H_ +#define COMPONENTS_FEED_CORE_V2_PUBLIC_TYPES_H_ + +#include "base/util/type_safety/id_type.h" +#include "base/version.h" +#include "components/version_info/channel.h" + +namespace feed { + +// Information about the Chrome build. +struct ChromeInfo { + version_info::Channel channel{}; + base::Version version; +}; + +// A unique ID for an ephemeral change. +using EphemeralChangeId = util::IdTypeU32<class EphemeralChangeIdClass>; + +} // namespace feed + +#endif // COMPONENTS_FEED_CORE_V2_PUBLIC_TYPES_H_
diff --git a/components/feed/core/v2/stream_model/ephemeral_change.h b/components/feed/core/v2/stream_model/ephemeral_change.h index fe293b3..d34e43fe9 100644 --- a/components/feed/core/v2/stream_model/ephemeral_change.h +++ b/components/feed/core/v2/stream_model/ephemeral_change.h
@@ -8,8 +8,8 @@ #include <memory> #include <vector> #include "components/feed/core/proto/v2/store.pb.h" -#include "components/feed/core/v2/public/feed_stream_api.h" #include "components/feed/core/v2/stream_model/feature_tree.h" +#include "components/feed/core/v2/types.h" namespace feed { namespace stream_model {
diff --git a/components/feed/core/v2/stream_model/feature_tree.h b/components/feed/core/v2/stream_model/feature_tree.h index 2aa79e8..5f5dee45 100644 --- a/components/feed/core/v2/stream_model/feature_tree.h +++ b/components/feed/core/v2/stream_model/feature_tree.h
@@ -13,7 +13,7 @@ #include "base/util/type_safety/id_type.h" #include "components/feed/core/proto/v2/store.pb.h" #include "components/feed/core/v2/proto_util.h" -#include "components/feed/core/v2/public/feed_stream_api.h" +#include "components/feed/core/v2/types.h" namespace feed { namespace stream_model {
diff --git a/components/feed/core/v2/tasks/load_stream_from_store_task.cc b/components/feed/core/v2/tasks/load_stream_from_store_task.cc index c3c2a261..02fd934 100644 --- a/components/feed/core/v2/tasks/load_stream_from_store_task.cc +++ b/components/feed/core/v2/tasks/load_stream_from_store_task.cc
@@ -11,9 +11,9 @@ #include "components/feed/core/proto/v2/store.pb.h" #include "components/feed/core/v2/feed_store.h" #include "components/feed/core/v2/proto_util.h" -#include "components/feed/core/v2/public/feed_stream_api.h" #include "components/feed/core/v2/scheduling.h" #include "components/feed/core/v2/stream_model_update_request.h" +#include "components/feed/core/v2/types.h" namespace feed { @@ -47,6 +47,11 @@ Complete(LoadStreamStatus::kFailedWithStoreError); return; } + + if (!result.stream_data.consistency_token().empty()) { + consistency_token_ = result.stream_data.consistency_token(); + } + if (result.stream_structures.empty()) { Complete(LoadStreamStatus::kNoStreamDataInStore); return; @@ -119,6 +124,8 @@ task_result.status = status; if (status == LoadStreamStatus::kLoadedFromStore) { task_result.update_request = std::move(update_request_); + } else { + task_result.consistency_token = consistency_token_; } std::move(result_callback_).Run(std::move(task_result)); TaskComplete();
diff --git a/components/feed/core/v2/tasks/load_stream_from_store_task.h b/components/feed/core/v2/tasks/load_stream_from_store_task.h index 3718c2c9..92bc527 100644 --- a/components/feed/core/v2/tasks/load_stream_from_store_task.h +++ b/components/feed/core/v2/tasks/load_stream_from_store_task.h
@@ -30,7 +30,10 @@ Result(Result&&); Result& operator=(Result&&); LoadStreamStatus status = LoadStreamStatus::kNoStatus; + // Only provided if successful. std::unique_ptr<StreamModelUpdateRequest> update_request; + // On failure, this data may be provided. + std::string consistency_token; }; LoadStreamFromStoreTask(FeedStore* store, @@ -61,7 +64,9 @@ bool ignore_staleness_ = false; base::OnceCallback<void(Result)> result_callback_; + // Data to be stuffed into the Result when the task is complete. std::unique_ptr<StreamModelUpdateRequest> update_request_; + std::string consistency_token_; base::WeakPtrFactory<LoadStreamFromStoreTask> weak_ptr_factory_{this}; };
diff --git a/components/feed/core/v2/tasks/load_stream_task.cc b/components/feed/core/v2/tasks/load_stream_task.cc index 82e1086..039525d 100644 --- a/components/feed/core/v2/tasks/load_stream_task.cc +++ b/components/feed/core/v2/tasks/load_stream_task.cc
@@ -16,6 +16,7 @@ #include "components/feed/core/proto/v2/wire/request.pb.h" #include "components/feed/core/v2/feed_network.h" #include "components/feed/core/v2/feed_stream.h" +#include "components/feed/core/v2/proto_util.h" #include "components/feed/core/v2/stream_model.h" #include "components/feed/core/v2/stream_model_update_request.h" @@ -68,12 +69,18 @@ // TODO(harringtond): Add throttling. // TODO(harringtond): Request parameters here are all placeholder values. feedwire::Request request; - feedwire::ClientInfo& client_info = - *request.mutable_feed_request()->mutable_client_info(); - client_info.set_platform_type(feedwire::ClientInfo::ANDROID_ID); - client_info.set_app_type(feedwire::ClientInfo::CHROME); - request.mutable_feed_request()->mutable_feed_query()->set_reason( + request.set_request_version(feedwire::Request::FEED_QUERY); + + feedwire::FeedRequest& feed_request = *request.mutable_feed_request(); + *feed_request.mutable_client_info() = + CreateClientInfo(stream_->GetChromeInfo()); + + feed_request.mutable_feed_query()->set_reason( feedwire::FeedQuery::MANUAL_REFRESH); + if (!result.consistency_token.empty()) { + feed_request.mutable_consistency_token()->set_token( + result.consistency_token); + } fetch_start_time_ = base::TimeTicks::Now(); stream_->GetNetwork()->SendQueryRequest(
diff --git a/components/feed/core/v2/tasks/load_stream_task.h b/components/feed/core/v2/tasks/load_stream_task.h index ad19cd9..062d0d3 100644 --- a/components/feed/core/v2/tasks/load_stream_task.h +++ b/components/feed/core/v2/tasks/load_stream_task.h
@@ -13,6 +13,7 @@ #include "components/feed/core/v2/feed_network.h" #include "components/feed/core/v2/tasks/load_stream_from_store_task.h" #include "components/offline_pages/task/task.h" +#include "components/version_info/channel.h" namespace feed { class FeedStream; @@ -20,8 +21,6 @@ // Loads the stream model from storage or network. // If successful, this directly forces a model load in |FeedStream()| // before completing the task. -// TODO(harringtond): If we read data from the network, it needs to be -// persisted. class LoadStreamTask : public offline_pages::Task { public: struct Result {
diff --git a/components/feed/core/v2/test/stream_builder.cc b/components/feed/core/v2/test/stream_builder.cc index 2dab90e..2394b642 100644 --- a/components/feed/core/v2/test/stream_builder.cc +++ b/components/feed/core/v2/test/stream_builder.cc
@@ -163,7 +163,9 @@ initial_update->shared_states.push_back(MakeSharedState(0)); *initial_update->stream_data.mutable_content_id() = MakeRootId(); *initial_update->stream_data.mutable_shared_state_id() = MakeSharedStateId(0); + initial_update->stream_data.set_consistency_token("token-1"); SetLastAddedTime(last_added_time, &initial_update->stream_data); + return initial_update; }
diff --git a/components/feed/core/v2/test/stream_builder.h b/components/feed/core/v2/test/stream_builder.h index 536c4d7de..8291574 100644 --- a/components/feed/core/v2/test/stream_builder.h +++ b/components/feed/core/v2/test/stream_builder.h
@@ -11,7 +11,8 @@ #include "base/time/time.h" #include "components/feed/core/proto/v2/store.pb.h" -#include "components/feed/core/v2/public/feed_stream_api.h" +#include "components/feed/core/v2/proto_util.h" +#include "components/feed/core/v2/types.h" // Functions that help build a feedstore::StreamStructure for testing. namespace feed {
diff --git a/components/feed/core/v2/testdata/request.textproto b/components/feed/core/v2/testdata/request.textproto new file mode 100644 index 0000000..b438e40 --- /dev/null +++ b/components/feed/core/v2/testdata/request.textproto
@@ -0,0 +1,33 @@ +request_version: FEED_QUERY +feed_request { + client_info { + platform_type: ANDROID_ID + platform_version { + major: 10 + architecture: ARM64 + build_type: DEV + api_version: 29 + } + app_type: CHROME + app_version { + major: 79 + minor: 0 + build: 3945 + revision: 93 + architecture: ARM64 + build_type: RELEASE + } + locale: "en-US" + display_info { + screen_density: 2.625 + screen_width_in_pixels: 1080 + screen_height_in_pixels: 1794 + } + } + feed_query { + reason: SCHEDULED_REFRESH + } + client_capability: BASE_UI + consistency_token { + } +}
diff --git a/components/feed/core/v2/tools/make_feed_query_request.sh b/components/feed/core/v2/tools/make_feed_query_request.sh new file mode 100755 index 0000000..204e9730 --- /dev/null +++ b/components/feed/core/v2/tools/make_feed_query_request.sh
@@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Usage: make_feed_query_request.sh request.textproto + +CHROMIUM_SRC=$(realpath $(dirname $(readlink -f $0))/../../../../..) + +PLD=$(python3 \ + $CHROMIUM_SRC/components/feed/core/v2/tools/textpb_to_binarypb.py \ + --chromium_path=$CHROMIUM_SRC \ + --message=feedwire.Request \ + --output_format=base64 \ + --source_file=$1) + +BASE_URL="https://www.google.com/httpservice" +ENDPOINT="TrellisClankService/FeedQuery" +QUERY_URL="$BASE_URL/retry/$ENDPOINT" + +echo "$QUERY_URL?fmt=bin&hl=en-US&reqpld=$PLD"
diff --git a/components/feed/core/v2/tools/protoc_util.py b/components/feed/core/v2/tools/protoc_util.py index 41104fe..2c793b2 100755 --- a/components/feed/core/v2/tools/protoc_util.py +++ b/components/feed/core/v2/tools/protoc_util.py
@@ -18,8 +18,12 @@ args, input=input, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - check=True) + stderr=subprocess.PIPE + ) + + if proc.returncode != 0: + raise RuntimeError(proc.stderr.decode('utf-8')) + return proc.stdout
diff --git a/components/feed/core/v2/tools/textpb_to_binarypb.py b/components/feed/core/v2/tools/textpb_to_binarypb.py index 14cb23e9..df32c69 100755 --- a/components/feed/core/v2/tools/textpb_to_binarypb.py +++ b/components/feed/core/v2/tools/textpb_to_binarypb.py
@@ -19,6 +19,8 @@ import os import protoc_util import subprocess +import base64 +import urllib.parse from absl import app from absl import flags @@ -26,9 +28,16 @@ DEFAULT_MESSAGE = 'feedwire.Response' FLAGS = flags.FLAGS -FLAGS = flags.FLAGS flags.DEFINE_string('chromium_path', '', 'The path of your chromium depot.') -flags.DEFINE_string('output_file', '', 'The target output binary file path.') +flags.DEFINE_string( + 'output_file', + '', + 'The target output file path. If not set, writes to stdout.') +flags.DEFINE_string( + 'output_format', + 'bin', + 'When encoding text to binary, this may be set to base64 to encode output ' + + 'suitable for URLs.') flags.DEFINE_string('source_file', '', 'The source proto file, in textpb format, path.') flags.DEFINE_string('message', @@ -46,8 +55,16 @@ encoded = protoc_util.encode_proto(value_text_proto, FLAGS.message, FLAGS.chromium_path, COMPONENT_FEED_PROTO_PATH) - with open(FLAGS.output_file, mode='wb') as file: - file.write(encoded) + + if FLAGS.output_format == 'base64': + encoded = urllib.parse.quote( + base64.urlsafe_b64encode(encoded).decode('utf-8')) + + if FLAGS.output_file: + with open(FLAGS.output_file, mode='wb') as file: + file.write(encoded) + else: + print(encoded) def binary_to_text(): with open(FLAGS.source_file, mode='rb') as file: @@ -57,18 +74,19 @@ FLAGS.chromium_path, COMPONENT_FEED_PROTO_PATH) - with open(FLAGS.output_file, mode='w') as file: - file.write(encoded) + if FLAGS.output_file: + with open(FLAGS.output_file, mode='w') as file: + file.write(encoded) + else: + print(encoded) def main(argv): if len(argv) > 1: - raise app.UsageError('Too many command-line arguments.') + raise app.UsageError('Too many arguments. Unknown: ' + ' '.join(argv[1:])) if not FLAGS.chromium_path: raise app.UsageError('chromium_path flag must be set.') if not FLAGS.source_file: raise app.UsageError('source_file flag must be set.') - if not FLAGS.output_file: - raise app.UsageError('output_file flag must be set.') if FLAGS.direction != 'forward' and FLAGS.direction != 'reverse': raise app.UsageError('direction must be forward or reverse')
diff --git a/components/feed/core/v2/types.h b/components/feed/core/v2/types.h new file mode 100644 index 0000000..2b4da07 --- /dev/null +++ b/components/feed/core/v2/types.h
@@ -0,0 +1,24 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_FEED_CORE_V2_TYPES_H_ +#define COMPONENTS_FEED_CORE_V2_TYPES_H_ + +#include "base/util/type_safety/id_type.h" +#include "components/feed/core/v2/public/types.h" + +namespace feed { + +// Make sure public types are included here too. +// See components/feed/core/v2/public/types.h. +using ::feed::ChromeInfo; +using ::feed::EphemeralChangeId; + +// Uniquely identifies a revision of a |feedstore::Content|. If Content changes, +// it is assigned a new revision number. +using ContentRevision = util::IdTypeU32<class ContentRevisionClass>; + +} // namespace feed + +#endif // COMPONENTS_FEED_CORE_V2_PUBLIC_TYPES_H_
diff --git a/components/metrics/system_session_analyzer_win.cc b/components/metrics/system_session_analyzer_win.cc index 16c3b74..ca39303 100644 --- a/components/metrics/system_session_analyzer_win.cc +++ b/components/metrics/system_session_analyzer_win.cc
@@ -50,9 +50,28 @@ return base::Time::FromFileTime(ft); } -bool GetEventInfo(EVT_HANDLE context, - EVT_HANDLE event, - SystemSessionAnalyzer::EventInfo* info) { +} // namespace + +SystemSessionAnalyzer::SystemSessionAnalyzer(uint32_t max_session_cnt) + : max_session_cnt_(max_session_cnt), sessions_queried_(0) {} + +SystemSessionAnalyzer::~SystemSessionAnalyzer() {} + +SystemSessionAnalyzer::ExtendedStatus +SystemSessionAnalyzer::GetExtendedFailureStatus() const { + return extended_status_; +} + +void SystemSessionAnalyzer::SetExtendedFailureStatus( + ExtendedStatus new_status) { + if (extended_status_ == ExtendedStatus::NO_FAILURE) + extended_status_ = new_status; +} + +bool SystemSessionAnalyzer::GetEventInfo( + EVT_HANDLE context, + EVT_HANDLE event, + SystemSessionAnalyzer::EventInfo* info) { DCHECK(context); DCHECK(event); DCHECK(info); @@ -67,14 +86,22 @@ DWORD retrieved_attribute_cnt = 0U; if (!::EvtRender(context, event, EvtRenderEventValues, buffer_size, buffer.data(), &buffer_used, &retrieved_attribute_cnt)) { + SetExtendedFailureStatus(ExtendedStatus::RENDER_EVENT_FAILURE); DLOG(ERROR) << "Failed to render the event."; return false; } // Validate the count and types of the retrieved attributes. - if ((retrieved_attribute_cnt != kAttributeCnt) || - (buffer[0].Type != EvtVarTypeUInt16) || - (buffer[1].Type != EvtVarTypeFileTime)) { + if (retrieved_attribute_cnt != kAttributeCnt) { + SetExtendedFailureStatus(ExtendedStatus::ATTRIBUTE_CNT_MISMATCH); + return false; + } + if (buffer[0].Type != EvtVarTypeUInt16) { + SetExtendedFailureStatus(ExtendedStatus::EXPECTED_INT16_TYPE); + return false; + } + if (buffer[1].Type != EvtVarTypeFileTime) { + SetExtendedFailureStatus(ExtendedStatus::EXPECTED_FILETIME_TYPE); return false; } @@ -84,13 +111,6 @@ return true; } -} // namespace - -SystemSessionAnalyzer::SystemSessionAnalyzer(uint32_t max_session_cnt) - : max_session_cnt_(max_session_cnt), sessions_queried_(0) {} - -SystemSessionAnalyzer::~SystemSessionAnalyzer() {} - SystemSessionAnalyzer::Status SystemSessionAnalyzer::IsSessionUnclean( base::Time timestamp) { if (!EnsureInitialized()) @@ -146,6 +166,7 @@ events[i].reset(events_raw[i]); if (!success) { + SetExtendedFailureStatus(ExtendedStatus::RETRIEVE_EVENTS_FAILURE); DLOG(ERROR) << "Failed to retrieve events."; return false; } @@ -182,6 +203,7 @@ ::EvtQuery(nullptr, kChannelName, kSessionEventsQuery, EvtQueryChannelPath | EvtQueryReverseDirection)); if (!query_handle_.get()) { + SetExtendedFailureStatus(ExtendedStatus::EVTQUERY_FAILED); DLOG(ERROR) << "Event query failed."; return false; } @@ -190,8 +212,10 @@ if (!render_context_.get()) { // Create the render context for extracting information from the events. render_context_ = CreateRenderContext(); - if (!render_context_.get()) + if (!render_context_.get()) { + SetExtendedFailureStatus(ExtendedStatus::CREATE_RENDER_CONTEXT_FAILURE); return false; + } } return true; @@ -203,12 +227,20 @@ // Fetch the first (current) session start event and the first session, // comprising an end and a start event for a total of 3 events. std::vector<EventInfo> events; - if (!FetchEvents(3U, &events)) + if (!FetchEvents(3U, &events)) { + SetExtendedFailureStatus(ExtendedStatus::FETCH_EVENTS_FAILURE); return false; + } // Validate that the initial event is what we expect. - if (events.size() != 3 || events[0].event_id != kIdSessionStart) + if (events.size() != 3) { + SetExtendedFailureStatus(ExtendedStatus::EVENT_COUNT_MISMATCH); return false; + } + if (events[0].event_id != kIdSessionStart) { + SetExtendedFailureStatus(ExtendedStatus::SESSION_START_MISMATCH); + return false; + } // Initialize the coverage start to allow detecting event time inversion. coverage_start_ = events[0].event_time; @@ -225,17 +257,25 @@ const EventInfo& start) { // Validate the ordering of events (newest to oldest). The expectation is a // (start / [unclean]shutdown) pair of events for each session. - if (coverage_start_ < end.event_time) + if (coverage_start_ < end.event_time) { + SetExtendedFailureStatus(ExtendedStatus::COVERAGE_START_ORDER_FAILURE); return false; - if (end.event_time < start.event_time) + } + if (end.event_time < start.event_time) { + SetExtendedFailureStatus(ExtendedStatus::EVENT_ORDER_FAILURE); return false; + } // Process a (start / shutdown) event pair, validating the types of events // and recording unclean sessions. - if (start.event_id != kIdSessionStart) + if (start.event_id != kIdSessionStart) { + SetExtendedFailureStatus(ExtendedStatus::UNEXPECTED_START_EVENT_TYPE); return false; // Unexpected event type. - if (end.event_id != kIdSessionEnd && end.event_id != kIdSessionEndUnclean) + } + if (end.event_id != kIdSessionEnd && end.event_id != kIdSessionEndUnclean) { + SetExtendedFailureStatus(ExtendedStatus::UNEXPECTED_END_EVENT_TYPE); return false; // Unexpected event type. + } if (end.event_id == kIdSessionEndUnclean) { unclean_sessions_.insert(
diff --git a/components/metrics/system_session_analyzer_win.h b/components/metrics/system_session_analyzer_win.h index 55e7ed2d..05081856 100644 --- a/components/metrics/system_session_analyzer_win.h +++ b/components/metrics/system_session_analyzer_win.h
@@ -32,6 +32,31 @@ PROCESS_SESSION_FAILED = 5, }; + // Track internal details of what went wrong. + enum class ExtendedStatus { + NO_FAILURE = 0, + RENDER_EVENT_FAILURE = 1, + ATTRIBUTE_CNT_MISMATCH = 2, + EXPECTED_INT16_TYPE = 3, + EXPECTED_FILETIME_TYPE = 4, + RETRIEVE_EVENTS_FAILURE = 5, + GET_EVENT_INFO_FAILURE = 6, + EVTQUERY_FAILED = 7, + CREATE_RENDER_CONTEXT_FAILURE = 8, + FETCH_EVENTS_FAILURE = 9, + EVENT_COUNT_MISMATCH = 10, + SESSION_START_MISMATCH = 11, + COVERAGE_START_ORDER_FAILURE = 12, + EVENT_ORDER_FAILURE = 13, + UNEXPECTED_START_EVENT_TYPE = 14, + UNEXPECTED_END_EVENT_TYPE = 15, + }; + + ExtendedStatus GetExtendedFailureStatus() const; + // Set an extended failure status code for easier diagnosing of test failures. + // The first extended status code is retained. + void SetExtendedFailureStatus(ExtendedStatus); + // Minimal information about a log event. struct EventInfo { uint16_t event_id; @@ -76,6 +101,9 @@ // as appropriate. bool ProcessSession(const EventInfo& end, const EventInfo& start); + bool GetEventInfo(EVT_HANDLE context, + EVT_HANDLE event, + SystemSessionAnalyzer::EventInfo* info); EvtHandle CreateRenderContext(); // The maximal number of sessions to query events for. @@ -96,6 +124,9 @@ // Timestamp of the oldest event. base::Time coverage_start_; + // Track details of what failures occurred. + ExtendedStatus extended_status_ = ExtendedStatus::NO_FAILURE; + DISALLOW_COPY_AND_ASSIGN(SystemSessionAnalyzer); };
diff --git a/components/metrics/system_session_analyzer_win_unittest.cc b/components/metrics/system_session_analyzer_win_unittest.cc index f8744bf4..ef0a3f1 100644 --- a/components/metrics/system_session_analyzer_win_unittest.cc +++ b/components/metrics/system_session_analyzer_win_unittest.cc
@@ -36,7 +36,9 @@ TEST(SystemSessionAnalyzerTest, ValidateEvents) { SystemSessionAnalyzer analyzer(1U); EXPECT_EQ(SystemSessionAnalyzer::CLEAN, - analyzer.IsSessionUnclean(base::Time::Now())); + analyzer.IsSessionUnclean(base::Time::Now())) + << "Extended error code is: " + << static_cast<int>(analyzer.GetExtendedFailureStatus()); } // Stubs FetchEvents.
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc index d74a65b9..7f482f65 100644 --- a/components/omnibox/browser/autocomplete_result.cc +++ b/components/omnibox/browser/autocomplete_result.cc
@@ -728,7 +728,7 @@ } base::string16 AutocompleteResult::GetHeaderForGroupId( - int suggestion_group_id) { + int suggestion_group_id) const { const auto& it = headers_map_.find(suggestion_group_id); if (it != headers_map_.end()) return it->second;
diff --git a/components/omnibox/browser/autocomplete_result.h b/components/omnibox/browser/autocomplete_result.h index 442bf033..27501e3 100644 --- a/components/omnibox/browser/autocomplete_result.h +++ b/components/omnibox/browser/autocomplete_result.h
@@ -155,7 +155,9 @@ // Get a list of comparators used for deduping for the matches in this result. std::vector<MatchDedupComparator> GetMatchDedupComparators() const; - base::string16 GetHeaderForGroupId(int suggestion_group_id); + // Gets the header string associated with |suggestion_group_id|. Returns an + // empty string if no header is found. + base::string16 GetHeaderForGroupId(int suggestion_group_id) const; // Logs metrics for when |new_result| replaces |old_result| asynchronously. // |old_result| a list of the comparators for the old matches.
diff --git a/components/omnibox/browser/clipboard_provider.cc b/components/omnibox/browser/clipboard_provider.cc index 754e773..22fd6d0 100644 --- a/components/omnibox/browser/clipboard_provider.cc +++ b/components/omnibox/browser/clipboard_provider.cc
@@ -106,6 +106,9 @@ } else if (match_type == AutocompleteMatchType::CLIPBOARD_TEXT) { UMA_HISTOGRAM_LONG_TIMES_100("Omnibox.ClipboardSuggestionRemovedAge.TEXT", clipboard_contents_age); + } else if (match_type == AutocompleteMatchType::CLIPBOARD_IMAGE) { + UMA_HISTOGRAM_LONG_TIMES_100("Omnibox.ClipboardSuggestionRemovedAge.IMAGE", + clipboard_contents_age); } } @@ -431,4 +434,3 @@ listener_->OnProviderUpdate(true); } } -
diff --git a/components/omnibox/browser/omnibox_popup_model.cc b/components/omnibox/browser/omnibox_popup_model.cc index 35664f3..4efa5443 100644 --- a/components/omnibox/browser/omnibox_popup_model.cc +++ b/components/omnibox/browser/omnibox_popup_model.cc
@@ -128,17 +128,24 @@ OmniboxPopupModel::LineState OmniboxPopupModel::GetNextLineState( LineState state, Direction direction) { + const bool button_row = OmniboxFieldTrial::IsSuggestionButtonRowEnabled(); switch (direction) { case kForward: switch (state) { case NO_STATE: return NORMAL; case NORMAL: - return KEYWORD; + return button_row ? FOCUSED_BUTTON_KEYWORD : KEYWORD; case KEYWORD: - return BUTTON_FOCUSED; + return button_row ? FOCUSED_BUTTON_TAB_SWITCH : BUTTON_FOCUSED; case BUTTON_FOCUSED: return NO_STATE; + case FOCUSED_BUTTON_KEYWORD: + return FOCUSED_BUTTON_TAB_SWITCH; + case FOCUSED_BUTTON_TAB_SWITCH: + return FOCUSED_BUTTON_PEDAL; + case FOCUSED_BUTTON_PEDAL: + return NO_STATE; default: break; } @@ -146,13 +153,19 @@ case kBackward: switch (state) { case NO_STATE: - return BUTTON_FOCUSED; + return button_row ? FOCUSED_BUTTON_PEDAL : BUTTON_FOCUSED; case NORMAL: return NO_STATE; case KEYWORD: return NORMAL; case BUTTON_FOCUSED: return KEYWORD; + case FOCUSED_BUTTON_KEYWORD: + return NORMAL; + case FOCUSED_BUTTON_TAB_SWITCH: + return FOCUSED_BUTTON_KEYWORD; + case FOCUSED_BUTTON_PEDAL: + return FOCUSED_BUTTON_TAB_SWITCH; default: break; } @@ -447,17 +460,23 @@ } const auto& match = result().match_at(selection.line); switch (selection.state) { - case OmniboxPopupModel::NO_STATE: + case NO_STATE: return false; - case OmniboxPopupModel::NORMAL: + case NORMAL: return true; - case OmniboxPopupModel::KEYWORD: + case KEYWORD: return match.associated_keyword != nullptr; - case OmniboxPopupModel::BUTTON_FOCUSED: + case BUTTON_FOCUSED: // TODO(orinj): Here is an opportunity to clean up the presentational // logic that pkasting wanted to take out of AutocompleteMatch. The view // should be driven by the model, so this is really the place to decide. return match.ShouldShowTabMatchButton(); + case FOCUSED_BUTTON_KEYWORD: + return match.associated_keyword != nullptr; + case FOCUSED_BUTTON_TAB_SWITCH: + return match.has_tab_match; + case FOCUSED_BUTTON_PEDAL: + return match.pedal != nullptr; default: break; }
diff --git a/components/omnibox/browser/omnibox_popup_model.h b/components/omnibox/browser/omnibox_popup_model.h index 82030bc..82bd47f5 100644 --- a/components/omnibox/browser/omnibox_popup_model.h +++ b/components/omnibox/browser/omnibox_popup_model.h
@@ -55,9 +55,20 @@ // See |Selection::state| below for details. enum LineState { NORMAL, + + // KEYWORD state means actually in keyword mode, as distinct from the + // FOCUSED_BUTTON_KEYWORD state, which is only for button focus. KEYWORD, + + // The single (ambiguous) button focus state is not used when button row + // is enabled. Instead, the specific FOCUSED_* states below apply. BUTTON_FOCUSED, + // Button row focus states: + FOCUSED_BUTTON_KEYWORD, + FOCUSED_BUTTON_TAB_SWITCH, + FOCUSED_BUTTON_PEDAL, + // NO_STATE logically indicates unavailability of a state, and is // only used internally. NO_STATE values are not persisted in members, // are not returned from public methods, and should not be used by
diff --git a/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.cc b/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.cc index 65392044..10ae9b4 100644 --- a/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.cc +++ b/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.cc
@@ -271,6 +271,14 @@ const char kHistogramBackForwardCacheEvent[] = "PageLoad.BackForwardCache.Event"; +const char kHistogramFontPreloadFirstPaint[] = + "PageLoad.Clients.FontPreload.PaintTiming.NavigationToFirstPaint"; +const char kHistogramFontPreloadFirstContentfulPaint[] = + "PageLoad.Clients.FontPreload.PaintTiming.NavigationToFirstContentfulPaint"; +const char kHistogramFontPreloadLargestContentfulPaint[] = + "PageLoad.Clients.FontPreload.PaintTiming." + "NavigationToLargestContentfulPaint"; + } // namespace internal CorePageLoadMetricsObserver::CorePageLoadMetricsObserver() @@ -344,6 +352,13 @@ timing.paint_timing->first_paint, GetDelegate())) { PAGE_LOAD_HISTOGRAM(internal::kHistogramFirstPaint, timing.paint_timing->first_paint.value()); + + // Note: This depends on PageLoadMetrics internally processing loading + // behavior before timing metrics if they come in the same IPC update. + if (font_preload_started_before_rendering_observed_) { + PAGE_LOAD_HISTOGRAM(internal::kHistogramFontPreloadFirstPaint, + timing.paint_timing->first_paint.value()); + } if (timing.input_to_navigation_start) { PAGE_LOAD_HISTOGRAM(internal::kHistogramInputToFirstPaint, timing.input_to_navigation_start.value() + @@ -389,6 +404,13 @@ timing.paint_timing->first_contentful_paint.value() - timing.parse_timing->parse_start.value()); + // Note: This depends on PageLoadMetrics internally processing loading + // behavior before timing metrics if they come in the same IPC update. + if (font_preload_started_before_rendering_observed_) { + PAGE_LOAD_HISTOGRAM(internal::kHistogramFontPreloadFirstContentfulPaint, + timing.paint_timing->first_contentful_paint.value()); + } + // Emit a trace event to highlight a long navigation to first contentful // paint. if (timing.paint_timing->first_contentful_paint > @@ -755,6 +777,13 @@ UMA_HISTOGRAM_ENUMERATION( internal::kHistogramLargestContentfulPaintContentType, all_frames_largest_contentful_paint.Type()); + + // Note: This depends on PageLoadMetrics internally processing loading + // behavior before timing metrics if they come in the same IPC update. + if (font_preload_started_before_rendering_observed_) { + PAGE_LOAD_HISTOGRAM(internal::kHistogramFontPreloadLargestContentfulPaint, + all_frames_largest_contentful_paint.Time().value()); + } } if (main_frame_timing.paint_timing->first_paint && @@ -920,3 +949,12 @@ internal::PageLoadBackForwardCacheEvent::kEnterBackForwardCache); return PageLoadMetricsObserver::OnEnterBackForwardCache(timing); } + +void CorePageLoadMetricsObserver::OnLoadingBehaviorObserved( + content::RenderFrameHost* rfh, + int behavior_flag) { + if (behavior_flag & blink::LoadingBehaviorFlag:: + kLoadingBehaviorFontPreloadStartedBeforeRendering) { + font_preload_started_before_rendering_observed_ = true; + } +}
diff --git a/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.h b/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.h index 53dd31c..86644fd 100644 --- a/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.h +++ b/components/page_load_metrics/browser/observers/core_page_load_metrics_observer.h
@@ -99,6 +99,13 @@ extern const char kBackgroundHistogramInputToFirstContentfulPaint[]; extern const char kHistogramBackForwardCacheEvent[]; +// Split histograms recorded only when the first rendering cycle has been +// delayed for web font preloading. +// See design doc https://bit.ly/36E8UKB for details. +extern const char kHistogramFontPreloadFirstPaint[]; +extern const char kHistogramFontPreloadFirstContentfulPaint[]; +extern const char kHistogramFontPreloadLargestContentfulPaint[]; + enum FirstMeaningfulPaintStatus { FIRST_MEANINGFUL_PAINT_RECORDED, FIRST_MEANINGFUL_PAINT_BACKGROUNDED, @@ -174,6 +181,8 @@ content::NavigationHandle* navigation_handle) override; ObservePolicy OnEnterBackForwardCache( const page_load_metrics::mojom::PageLoadTiming& timing) override; + void OnLoadingBehaviorObserved(content::RenderFrameHost* rfh, + int behavior_flags) override; private: void RecordTimingHistograms( @@ -215,6 +224,10 @@ // True if we've received a scroll input after first paint has happened. bool received_scroll_input_after_first_paint_ = false; + // True if the first rendering cycle has been delayed due to web font + // preloading. + bool font_preload_started_before_rendering_observed_ = false; + base::TimeTicks first_paint_; page_load_metrics::LargestContentfulPaintHandler
diff --git a/components/page_load_metrics/browser/observers/core_page_load_metrics_observer_unittest.cc b/components/page_load_metrics/browser/observers/core_page_load_metrics_observer_unittest.cc index 0b269b71..55fa4a45 100644 --- a/components/page_load_metrics/browser/observers/core_page_load_metrics_observer_unittest.cc +++ b/components/page_load_metrics/browser/observers/core_page_load_metrics_observer_unittest.cc
@@ -1392,3 +1392,119 @@ tester()->histogram_tester().ExpectUniqueSample( internal::kHistogramPageLoadUnfinishedBytes, 10, 1); } + +// PageLoad.Clients.FontPreload.* shouldn't be recorded when the behavior is not +// observed. +TEST_F(CorePageLoadMetricsObserverTest, FontPreloadHistogramsNotObserved) { + page_load_metrics::mojom::PageLoadTiming timing; + page_load_metrics::InitPageLoadTimingForTest(&timing); + timing.navigation_start = base::Time::FromDoubleT(1); + timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1); + timing.parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(100); + timing.paint_timing->first_paint = base::TimeDelta::FromMilliseconds(150); + timing.paint_timing->first_contentful_paint = + base::TimeDelta::FromMilliseconds(200); + timing.paint_timing->largest_text_paint = + base::TimeDelta::FromMilliseconds(250); + timing.paint_timing->largest_text_paint_size = 100u; + timing.paint_timing->largest_image_paint = + base::TimeDelta::FromMilliseconds(250); + timing.paint_timing->largest_image_paint_size = 100u; + PopulateRequiredTimingFields(&timing); + + NavigateAndCommit(GURL("https://www.google.com/")); + tester()->SimulateTimingUpdate(timing); + + // Simulate closing the tab. + DeleteContents(); + + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadFirstPaint, 0); + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadFirstContentfulPaint, 0); + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadLargestContentfulPaint, 0); +} + +// PageLoad.Clients.FontPreload.* should be recorded when the behavior is +// observed. +TEST_F(CorePageLoadMetricsObserverTest, FontPreloadHistogramsObserved) { + page_load_metrics::mojom::PageLoadTiming timing; + page_load_metrics::InitPageLoadTimingForTest(&timing); + timing.navigation_start = base::Time::FromDoubleT(1); + timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1); + timing.parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(100); + timing.paint_timing->first_paint = base::TimeDelta::FromMilliseconds(150); + timing.paint_timing->first_contentful_paint = + base::TimeDelta::FromMilliseconds(200); + timing.paint_timing->largest_text_paint = + base::TimeDelta::FromMilliseconds(250); + timing.paint_timing->largest_text_paint_size = 100u; + timing.paint_timing->largest_image_paint = + base::TimeDelta::FromMilliseconds(250); + timing.paint_timing->largest_image_paint_size = 100u; + PopulateRequiredTimingFields(&timing); + + // Note: PageLoadMetrics internally processes loading behavior before timing + // metrics if they come in the same IPC update. + page_load_metrics::mojom::FrameMetadata metadata; + metadata.behavior_flags |= blink::LoadingBehaviorFlag:: + kLoadingBehaviorFontPreloadStartedBeforeRendering; + NavigateAndCommit(GURL("https://www.google.com/")); + tester()->SimulateTimingAndMetadataUpdate(timing, metadata); + + // Similate closing the tab. + DeleteContents(); + + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadFirstPaint, 1); + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadFirstContentfulPaint, 1); + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadLargestContentfulPaint, 1); +} + +// PageLoad.Clients.FontPreload.* depends on the order that, we need to first +// observe the load behavior and then observe the paint timings. This should +// have been guaranteed by the renderer. However, If the ordering is wrong, we +// can't observe the histograms correctly. +TEST_F(CorePageLoadMetricsObserverTest, + FontPreloadHistogramsNotObservedOnWrongDispatchOrder) { + page_load_metrics::mojom::PageLoadTiming timing; + page_load_metrics::InitPageLoadTimingForTest(&timing); + timing.navigation_start = base::Time::FromDoubleT(1); + timing.parse_timing->parse_start = base::TimeDelta::FromMilliseconds(1); + timing.parse_timing->parse_stop = base::TimeDelta::FromMilliseconds(100); + timing.paint_timing->first_paint = base::TimeDelta::FromMilliseconds(150); + timing.paint_timing->first_contentful_paint = + base::TimeDelta::FromMilliseconds(200); + timing.paint_timing->largest_text_paint = + base::TimeDelta::FromMilliseconds(250); + timing.paint_timing->largest_text_paint_size = 100u; + timing.paint_timing->largest_image_paint = + base::TimeDelta::FromMilliseconds(250); + timing.paint_timing->largest_image_paint_size = 100u; + PopulateRequiredTimingFields(&timing); + + // Note: PageLoadMetrics internally processes loading behavior before timing + // metrics if they come in the same IPC update. + page_load_metrics::mojom::FrameMetadata metadata; + metadata.behavior_flags |= blink::LoadingBehaviorFlag:: + kLoadingBehaviorFontPreloadStartedBeforeRendering; + + NavigateAndCommit(GURL("https://www.google.com/")); + tester()->SimulateTimingUpdate(timing); + tester()->SimulateMetadataUpdate(metadata, main_rfh()); + + // Similate closing the tab. + DeleteContents(); + + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadFirstPaint, 0); + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadFirstContentfulPaint, 0); + + // LCP is recorded on page complete/closing, so it can still be observed. + tester()->histogram_tester().ExpectTotalCount( + internal::kHistogramFontPreloadLargestContentfulPaint, 1); +}
diff --git a/components/paint_preview/browser/compositor_utils.cc b/components/paint_preview/browser/compositor_utils.cc index 6e8af2d5..6802f1f 100644 --- a/components/paint_preview/browser/compositor_utils.cc +++ b/components/paint_preview/browser/compositor_utils.cc
@@ -33,12 +33,24 @@ mojo::Remote<mojom::PaintPreviewCompositorCollection> CreateCompositorCollection() { - auto collection = content::ServiceProcessHost::Launch< - mojom::PaintPreviewCompositorCollection>( + mojo::Remote<mojom::PaintPreviewCompositorCollection> collection; + CreateCompositorCollectionPending(collection.BindNewPipeAndPassReceiver()); + BindDiscardableSharedMemoryManager(&collection); + return collection; +} + +void CreateCompositorCollectionPending( + mojo::PendingReceiver<mojom::PaintPreviewCompositorCollection> collection) { + content::ServiceProcessHost::Launch<mojom::PaintPreviewCompositorCollection>( + std::move(collection), content::ServiceProcessHost::Options() .WithDisplayName(IDS_PAINT_PREVIEW_COMPOSITOR_SERVICE_DISPLAY_NAME) .WithSandboxType(service_manager::SandboxType::kPrintCompositor) .Pass()); +} + +void BindDiscardableSharedMemoryManager( + mojo::Remote<mojom::PaintPreviewCompositorCollection>* collection) { mojo::PendingRemote<discardable_memory::mojom::DiscardableSharedMemoryManager> discardable_memory_manager; @@ -48,9 +60,8 @@ base::BindOnce( &BindDiscardableSharedMemoryManagerOnIOThread, discardable_memory_manager.InitWithNewPipeAndPassReceiver())); - collection->SetDiscardableSharedMemoryManager( + collection->get()->SetDiscardableSharedMemoryManager( std::move(discardable_memory_manager)); - return collection; } } // namespace paint_preview
diff --git a/components/paint_preview/browser/compositor_utils.h b/components/paint_preview/browser/compositor_utils.h index d9c4fbd..8a2225c 100644 --- a/components/paint_preview/browser/compositor_utils.h +++ b/components/paint_preview/browser/compositor_utils.h
@@ -17,6 +17,28 @@ mojo::Remote<mojom::PaintPreviewCompositorCollection> CreateCompositorCollection(); +// Same as the above method, but the initialization is performed for a remote +// or pending remote owned by the caller. NOTE: the caller must explicitly +// initialize the discardable memory manager. +// +// EXAMPLE USAGE: (pending remote) +// +// mojo::PendingRemote<mojom::PaintPreviewCompositorCollection> pending_remote; +// CreateCompositorCollectionPending( +// pending_remote.InitWithNewPipeAndPassReceiver())); +// +// mojo::Remote<mojom::PaintPreviewCompositorCollection> +// remote(pending_remote); +// BindDiscardableSharedMemoryManager(&remote); +void CreateCompositorCollectionPending( + mojo::PendingReceiver<mojom::PaintPreviewCompositorCollection> + pending_receiver); + +// Binds a discardable memory manager for |collection|. +// NOTE: this requires the remote to be bound. +void BindDiscardableSharedMemoryManager( + mojo::Remote<mojom::PaintPreviewCompositorCollection>* collection); + } // namespace paint_preview #endif // COMPONENTS_PAINT_PREVIEW_BROWSER_COMPOSITOR_UTILS_H_
diff --git a/components/paint_preview/browser/paint_preview_base_service.cc b/components/paint_preview/browser/paint_preview_base_service.cc index a426d3c..a623982a 100644 --- a/components/paint_preview/browser/paint_preview_base_service.cc +++ b/components/paint_preview/browser/paint_preview_base_service.cc
@@ -110,8 +110,27 @@ std::unique_ptr<PaintPreviewCompositorService> PaintPreviewBaseService::StartCompositorService( base::OnceClosure disconnect_handler) { + // Create a dedicated sequence for communicating with the compositor. This + // sequence will handle message serialization/deserialization of bitmaps so it + // affects user visible elements. This is an implementation detail and the + // caller should continue to communicate with the compositor via the sequence + // that called this. + auto compositor_task_runner = base::ThreadPool::CreateSequencedTaskRunner( + {base::TaskPriority::USER_VISIBLE, + base::ThreadPolicy::MUST_USE_FOREGROUND}); + + // The discardable memory manager isn't initialized here. This is handled in + // the constructor of PaintPreviewCompositorServiceImpl once the pending + // remote becomes bound. + mojo::PendingRemote<mojom::PaintPreviewCompositorCollection> pending_remote; + compositor_task_runner->PostTask( + FROM_HERE, + base::BindOnce(&CreateCompositorCollectionPending, + pending_remote.InitWithNewPipeAndPassReceiver())); + return std::make_unique<PaintPreviewCompositorServiceImpl>( - CreateCompositorCollection(), std::move(disconnect_handler)); + std::move(pending_remote), compositor_task_runner, + std::move(disconnect_handler)); } void PaintPreviewBaseService::OnCaptured(
diff --git a/components/paint_preview/browser/paint_preview_compositor_client_impl.cc b/components/paint_preview/browser/paint_preview_compositor_client_impl.cc index 24d11c3..208bb675 100644 --- a/components/paint_preview/browser/paint_preview_compositor_client_impl.cc +++ b/components/paint_preview/browser/paint_preview_compositor_client_impl.cc
@@ -10,28 +10,87 @@ namespace paint_preview { +namespace { + +// These methods bind a callback to a task runner. This simplifies situations +// where a caller provides a callback which should be passed to |compositor_| +// verbatim, but should be run on the caller's task runner rather than +// |compositor_task_runner_|. +// +// Based on the implementation in: chromecast/base/bind_to_task_runner.h + +template <typename Sig> +struct BindToTaskRunnerTrampoline; + +template <typename... Args> +struct BindToTaskRunnerTrampoline<void(Args...)> { + static void Run(base::TaskRunner* task_runner, + base::OnceCallback<void(Args...)> callback, + Args... args) { + task_runner->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), std::forward<Args>(args)...)); + } +}; + +template <typename T> +base::OnceCallback<T> BindToTaskRunner( + scoped_refptr<base::TaskRunner> task_runner, + base::OnceCallback<T> callback) { + return base::BindOnce(&BindToTaskRunnerTrampoline<T>::Run, + base::RetainedRef(std::move(task_runner)), + std::move(callback)); +} + +} // namespace + PaintPreviewCompositorClientImpl::PaintPreviewCompositorClientImpl( + scoped_refptr<base::SequencedTaskRunner> compositor_task_runner, base::WeakPtr<PaintPreviewCompositorServiceImpl> service) - : service_(service) {} + : compositor_task_runner_(compositor_task_runner), + default_task_runner_(base::SequencedTaskRunnerHandle::Get()), + service_(service), + compositor_(new mojo::Remote<mojom::PaintPreviewCompositor>(), + base::OnTaskRunnerDeleter(compositor_task_runner_)) {} PaintPreviewCompositorClientImpl::~PaintPreviewCompositorClientImpl() { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); NotifyServiceOfInvalidation(); } const base::Optional<base::UnguessableToken>& PaintPreviewCompositorClientImpl::Token() const { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); return token_; } void PaintPreviewCompositorClientImpl::SetDisconnectHandler( base::OnceClosure closure) { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); user_disconnect_closure_ = std::move(closure); } +// For the following methods the use of base::Unretained for |compositor_| and +// things |compositor_| owns is safe as: +// 1. |compositor_| is deleted on the |compositor_task_runner_| after other +// non-delayed tasks in the current sequence are run. +// 2. New tasks cannot be created that reference |compositor_| once it is +// deleted as its lifetime is tied to that of the +// PaintPreviewCompositorClient. +// +// NOTE: This is only safe as no delayed tasks are posted and there are no +// cases of base::Unretained(this) or other class members passed as pointers. + void PaintPreviewCompositorClientImpl::BeginComposite( mojom::PaintPreviewBeginCompositeRequestPtr request, mojom::PaintPreviewCompositor::BeginCompositeCallback callback) { - compositor_->BeginComposite(std::move(request), std::move(callback)); + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); + compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &mojom::PaintPreviewCompositor::BeginComposite, + base::Unretained(compositor_.get()->get()), std::move(request), + BindToTaskRunner(default_task_runner_, std::move(callback)))); } void PaintPreviewCompositorClientImpl::BitmapForFrame( @@ -39,54 +98,94 @@ const gfx::Rect& clip_rect, float scale_factor, mojom::PaintPreviewCompositor::BitmapForFrameCallback callback) { - compositor_->BitmapForFrame(frame_guid, clip_rect, scale_factor, - std::move(callback)); + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); + compositor_task_runner_->PostTask( + FROM_HERE, base::BindOnce(&mojom::PaintPreviewCompositor::BitmapForFrame, + base::Unretained(compositor_.get()->get()), + frame_guid, clip_rect, scale_factor, + BindToTaskRunner(default_task_runner_, + std::move(callback)))); } void PaintPreviewCompositorClientImpl::SetRootFrameUrl(const GURL& url) { - compositor_->SetRootFrameUrl(url); + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); + compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&mojom::PaintPreviewCompositor::SetRootFrameUrl, + base::Unretained(compositor_.get()->get()), url)); } -bool PaintPreviewCompositorClientImpl::IsBoundAndConnected() const { - return compositor_.is_bound() && compositor_.is_connected(); +void PaintPreviewCompositorClientImpl::IsBoundAndConnected( + base::OnceCallback<void(bool)> callback) { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); + compositor_task_runner_->PostTask( + FROM_HERE, base::BindOnce( + [](mojo::Remote<mojom::PaintPreviewCompositor>* compositor, + scoped_refptr<base::SequencedTaskRunner> task_runner, + base::OnceCallback<void(bool)> callback) { + task_runner->PostTask( + FROM_HERE, + base::BindOnce(std::move(callback), + compositor->is_bound() && + compositor->is_connected())); + }, + base::Unretained(compositor_.get()), default_task_runner_, + std::move(callback))); } mojo::PendingReceiver<mojom::PaintPreviewCompositor> PaintPreviewCompositorClientImpl::BindNewPipeAndPassReceiver() { - return compositor_.BindNewPipeAndPassReceiver(); + DCHECK(compositor_task_runner_->RunsTasksInCurrentSequence()); + return compositor_->BindNewPipeAndPassReceiver(); } PaintPreviewCompositorClientImpl::OnCompositorCreatedCallback PaintPreviewCompositorClientImpl::BuildCompositorCreatedCallback( base::OnceClosure user_closure, OnCompositorCreatedCallback service_callback) { - return base::BindOnce(&PaintPreviewCompositorClientImpl::OnCompositorCreated, - weak_ptr_factory_.GetWeakPtr(), std::move(user_closure), - std::move(service_callback)); + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); + return BindToTaskRunner( + default_task_runner_, + base::BindOnce(&PaintPreviewCompositorClientImpl::OnCompositorCreated, + weak_ptr_factory_.GetWeakPtr(), std::move(user_closure), + std::move(service_callback))); } void PaintPreviewCompositorClientImpl::OnCompositorCreated( base::OnceClosure user_closure, OnCompositorCreatedCallback service_callback, const base::UnguessableToken& token) { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); token_ = token; std::move(user_closure).Run(); std::move(service_callback).Run(token); - compositor_.set_disconnect_handler( - base::BindOnce(&PaintPreviewCompositorClientImpl::DisconnectHandler, - weak_ptr_factory_.GetWeakPtr())); + compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + &mojo::Remote<mojom::PaintPreviewCompositor>::set_disconnect_handler, + base::Unretained(compositor_.get()), + BindToTaskRunner( + default_task_runner_, + base::BindOnce( + &PaintPreviewCompositorClientImpl::DisconnectHandler, + weak_ptr_factory_.GetWeakPtr())))); } void PaintPreviewCompositorClientImpl::NotifyServiceOfInvalidation() { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); if (service_ && token_.has_value()) service_->MarkCompositorAsDeleted(token_.value()); } void PaintPreviewCompositorClientImpl::DisconnectHandler() { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); if (user_disconnect_closure_) std::move(user_disconnect_closure_).Run(); NotifyServiceOfInvalidation(); - compositor_.reset(); + compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&mojo::Remote<mojom::PaintPreviewCompositor>::reset, + base::Unretained(compositor_.get()))); } } // namespace paint_preview
diff --git a/components/paint_preview/browser/paint_preview_compositor_client_impl.h b/components/paint_preview/browser/paint_preview_compositor_client_impl.h index d8bbf79..bfc40f3 100644 --- a/components/paint_preview/browser/paint_preview_compositor_client_impl.h +++ b/components/paint_preview/browser/paint_preview_compositor_client_impl.h
@@ -17,12 +17,21 @@ namespace paint_preview { +using CompositorPtr = + std::unique_ptr<mojo::Remote<mojom::PaintPreviewCompositor>, + base::OnTaskRunnerDeleter>; + +// The implementation of the PaintPreviewCompositorClient class. +// The public interface should be invoked only on the |default_task_runner_| +// which is the the runner returned by base::SequencedTaskRunnerHandle::Get() +// when this is constructed. class PaintPreviewCompositorClientImpl : public PaintPreviewCompositorClient { public: using OnCompositorCreatedCallback = base::OnceCallback<void(const base::UnguessableToken&)>; explicit PaintPreviewCompositorClientImpl( + scoped_refptr<base::SequencedTaskRunner> compositor_task_runner, base::WeakPtr<PaintPreviewCompositorServiceImpl> service); ~PaintPreviewCompositorClientImpl() override; @@ -43,7 +52,7 @@ mojo::PendingReceiver<mojom::PaintPreviewCompositor> BindNewPipeAndPassReceiver(); - bool IsBoundAndConnected() const; + void IsBoundAndConnected(base::OnceCallback<void(bool)> callback); OnCompositorCreatedCallback BuildCompositorCreatedCallback( base::OnceClosure user_closure, @@ -63,9 +72,12 @@ void DisconnectHandler(); - base::Optional<base::UnguessableToken> token_; + scoped_refptr<base::SequencedTaskRunner> compositor_task_runner_; + scoped_refptr<base::SequencedTaskRunner> default_task_runner_; base::WeakPtr<PaintPreviewCompositorServiceImpl> service_; - mojo::Remote<mojom::PaintPreviewCompositor> compositor_; + CompositorPtr compositor_; + + base::Optional<base::UnguessableToken> token_; base::OnceClosure user_disconnect_closure_; base::WeakPtrFactory<PaintPreviewCompositorClientImpl> weak_ptr_factory_{
diff --git a/components/paint_preview/browser/paint_preview_compositor_service_impl.cc b/components/paint_preview/browser/paint_preview_compositor_service_impl.cc index ea75e7e..212f581d7 100644 --- a/components/paint_preview/browser/paint_preview_compositor_service_impl.cc +++ b/components/paint_preview/browser/paint_preview_compositor_service_impl.cc
@@ -4,19 +4,55 @@ #include "components/paint_preview/browser/paint_preview_compositor_service_impl.h" +#include "base/callback.h" +#include "components/paint_preview/browser/compositor_utils.h" #include "components/paint_preview/browser/paint_preview_compositor_client_impl.h" #include "components/paint_preview/public/paint_preview_compositor_client.h" namespace paint_preview { +namespace { + +base::OnceClosure BindToTaskRunner( + scoped_refptr<base::SequencedTaskRunner> task_runner, + base::OnceClosure closure) { + return base::BindOnce( + [](scoped_refptr<base::SequencedTaskRunner> task_runner, + base::OnceClosure closure) { + task_runner->PostTask(FROM_HERE, std::move(closure)); + }, + task_runner, std::move(closure)); +} + +} // namespace + PaintPreviewCompositorServiceImpl::PaintPreviewCompositorServiceImpl( - mojo::Remote<mojom::PaintPreviewCompositorCollection> remote, + mojo::PendingRemote<mojom::PaintPreviewCompositorCollection> pending_remote, + scoped_refptr<base::SequencedTaskRunner> compositor_task_runner_, base::OnceClosure disconnect_handler) - : compositor_service_(std::move(remote)), + : default_task_runner_(base::SequencedTaskRunnerHandle::Get()), + compositor_task_runner_(compositor_task_runner_), + compositor_service_( + new mojo::Remote<mojom::PaintPreviewCompositorCollection>(), + base::OnTaskRunnerDeleter(compositor_task_runner_)), user_disconnect_closure_(std::move(disconnect_handler)) { - compositor_service_.set_disconnect_handler( - base::BindOnce(&PaintPreviewCompositorServiceImpl::DisconnectHandler, - weak_ptr_factory_.GetWeakPtr())); + compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + [](mojo::Remote<mojom::PaintPreviewCompositorCollection>* remote, + mojo::PendingRemote<mojom::PaintPreviewCompositorCollection> + pending, + base::OnceClosure disconnect_closure) { + remote->Bind(std::move(pending)); + BindDiscardableSharedMemoryManager(remote); + remote->set_disconnect_handler(std::move(disconnect_closure)); + }, + compositor_service_.get(), std::move(pending_remote), + BindToTaskRunner( + default_task_runner_, + base::BindOnce( + &PaintPreviewCompositorServiceImpl::DisconnectHandler, + weak_ptr_factory_.GetWeakPtr())))); } // The destructor for the |compositor_service_| will automatically result in any @@ -27,42 +63,60 @@ std::unique_ptr<PaintPreviewCompositorClient> PaintPreviewCompositorServiceImpl::CreateCompositor( base::OnceClosure connected_closure) { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); auto compositor = std::make_unique<PaintPreviewCompositorClientImpl>( - weak_ptr_factory_.GetWeakPtr()); - compositor_service_->CreateCompositor( - compositor->BindNewPipeAndPassReceiver(), - compositor->BuildCompositorCreatedCallback( - std::move(connected_closure), - base::BindOnce( - &PaintPreviewCompositorServiceImpl::OnCompositorCreated, - weak_ptr_factory_.GetWeakPtr()))); + compositor_task_runner_, weak_ptr_factory_.GetWeakPtr()); + + compositor_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + [](mojo::Remote<mojom::PaintPreviewCompositorCollection>* remote, + PaintPreviewCompositorClientImpl* compositor, + base::OnceCallback<void(const base::UnguessableToken&)> + on_connected) { + // This binds the remote in compositor to the + // |compositor_task_runner_|. + remote->get()->CreateCompositor( + compositor->BindNewPipeAndPassReceiver(), + std::move(on_connected)); + }, + compositor_service_.get(), compositor.get(), + // This builder ensures the callback it returns is called on the + // correct sequence. + compositor->BuildCompositorCreatedCallback( + std::move(connected_closure), + base::BindOnce( + &PaintPreviewCompositorServiceImpl::OnCompositorCreated, + weak_ptr_factory_.GetWeakPtr())))); + return compositor; } bool PaintPreviewCompositorServiceImpl::HasActiveClients() const { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); return !active_clients_.empty(); } void PaintPreviewCompositorServiceImpl::MarkCompositorAsDeleted( const base::UnguessableToken& token) { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); active_clients_.erase(token); } -bool PaintPreviewCompositorServiceImpl::IsServiceBoundAndConnected() const { - return compositor_service_.is_bound() && compositor_service_.is_connected(); -} - const base::flat_set<base::UnguessableToken>& PaintPreviewCompositorServiceImpl::ActiveClientsForTesting() const { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); return active_clients_; } void PaintPreviewCompositorServiceImpl::OnCompositorCreated( const base::UnguessableToken& token) { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); active_clients_.insert(token); } void PaintPreviewCompositorServiceImpl::DisconnectHandler() { + DCHECK(default_task_runner_->RunsTasksInCurrentSequence()); std::move(user_disconnect_closure_).Run(); compositor_service_.reset(); }
diff --git a/components/paint_preview/browser/paint_preview_compositor_service_impl.h b/components/paint_preview/browser/paint_preview_compositor_service_impl.h index 93617807..181bfa3a 100644 --- a/components/paint_preview/browser/paint_preview_compositor_service_impl.h +++ b/components/paint_preview/browser/paint_preview_compositor_service_impl.h
@@ -16,24 +16,33 @@ namespace paint_preview { +using CompositorCollectionPtr = + std::unique_ptr<mojo::Remote<mojom::PaintPreviewCompositorCollection>, + base::OnTaskRunnerDeleter>; + +// The implementation of the PaintPreviewCompositorService class. +// The public interface should be invoked only on the |default_task_runner_| +// which is the the runner returned by base::SequencedTaskRunnerHandle::Get() +// when this is constructed. class PaintPreviewCompositorServiceImpl : public PaintPreviewCompositorService { public: explicit PaintPreviewCompositorServiceImpl( - mojo::Remote<mojom::PaintPreviewCompositorCollection> remote, + mojo::PendingRemote<mojom::PaintPreviewCompositorCollection> + pending_remote, + scoped_refptr<base::SequencedTaskRunner> compositor_task_runner_, base::OnceClosure disconnect_closure); ~PaintPreviewCompositorServiceImpl() override; // PaintPreviewCompositorService Implementation. std::unique_ptr<PaintPreviewCompositorClient> CreateCompositor( base::OnceClosure connected_closure) override; + bool HasActiveClients() const override; // Marks the compositor associated with |token| as deleted in the // |active_clients_| set. void MarkCompositorAsDeleted(const base::UnguessableToken& token); - bool IsServiceBoundAndConnected() const; - // Test method to validate internal state. const base::flat_set<base::UnguessableToken>& ActiveClientsForTesting() const; @@ -47,8 +56,17 @@ void DisconnectHandler(); - mojo::Remote<mojom::PaintPreviewCompositorCollection> compositor_service_; base::flat_set<base::UnguessableToken> active_clients_; + + scoped_refptr<base::SequencedTaskRunner> default_task_runner_; + scoped_refptr<base::SequencedTaskRunner> compositor_task_runner_; + + // Bound to |compositor_task_runner_| all methods for the remote owned by this + // must be called on |compositor_task_runner_| this is deleted on the same + // task runner so that using it with base::Unretained is safe. + CompositorCollectionPtr compositor_service_; + + // Called on |default_task_runner_|. base::OnceClosure user_disconnect_closure_; base::WeakPtrFactory<PaintPreviewCompositorServiceImpl> weak_ptr_factory_{
diff --git a/components/permissions/android/res/drawable-hdpi/vr_headset.png b/components/permissions/android/res/drawable-hdpi/vr_headset.png index bb72cf4f..306d065 100644 --- a/components/permissions/android/res/drawable-hdpi/vr_headset.png +++ b/components/permissions/android/res/drawable-hdpi/vr_headset.png Binary files differ
diff --git a/components/permissions/android/res/drawable-mdpi/vr_headset.png b/components/permissions/android/res/drawable-mdpi/vr_headset.png index 42622a47..3d4cfab 100644 --- a/components/permissions/android/res/drawable-mdpi/vr_headset.png +++ b/components/permissions/android/res/drawable-mdpi/vr_headset.png Binary files differ
diff --git a/components/permissions/android/res/drawable-xhdpi/vr_headset.png b/components/permissions/android/res/drawable-xhdpi/vr_headset.png index 5ee2bb1..1b0d4a1 100644 --- a/components/permissions/android/res/drawable-xhdpi/vr_headset.png +++ b/components/permissions/android/res/drawable-xhdpi/vr_headset.png Binary files differ
diff --git a/components/permissions/android/res/drawable-xxhdpi/vr_headset.png b/components/permissions/android/res/drawable-xxhdpi/vr_headset.png index 57278c11..56824205 100644 --- a/components/permissions/android/res/drawable-xxhdpi/vr_headset.png +++ b/components/permissions/android/res/drawable-xxhdpi/vr_headset.png Binary files differ
diff --git a/components/permissions/android/res/drawable-xxxhdpi/vr_headset.png b/components/permissions/android/res/drawable-xxxhdpi/vr_headset.png index 261bda3..a00d1f5 100644 --- a/components/permissions/android/res/drawable-xxxhdpi/vr_headset.png +++ b/components/permissions/android/res/drawable-xxxhdpi/vr_headset.png Binary files differ
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 301ccc3..9827554 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -1055,6 +1055,7 @@ 'CrostiniExportImportUIAllowed', 'CrostiniRootAccessAllowed', 'CrostiniAnsiblePlaybook', + 'CrostiniArcAdbSideloadingAllowed', ] }, { @@ -15804,6 +15805,44 @@ If you set the policy, users can't change it. If not set, users can continue using default Crostini container in its ongoing configuration if Crostini is allowed by policies.''', }, { + 'name': 'CrostiniArcAdbSideloadingAllowed', + 'owners': ['janagrill@chromium.org', 'okalitova@chromium.org'], + 'future': True, + 'type': 'int-enum', + 'schema': { + 'type': 'integer', + 'enum': [ 0, 1 ], + }, + 'items': [ + { + 'name': 'Disallow', + 'value': 0, + 'caption': '''Prevent the user from using Android apps from untrusted sources.''', + }, + { + 'name': 'Allow', + 'value': 1, + 'caption': '''Allow the user to use Android apps from untrusted sources.''', + }, + ], + 'supported_on': ['chrome_os:84-'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': False, + }, + 'example_value': 1, + 'id': 690, + 'caption': '''Control usage of Android apps from untrusted sources for the user''', + 'tags': ['system-security'], + 'desc': '''This policy controls the usage of Android apps from untrusted sources (other than Google Play Store) on a per-user basis. + + If the value for this policy is not set, then the functionality is treated as disallowed. + + If the user's device is managed, the availability of this functionality is additionally dependant on the corresponding device policy. + + If the user's device is not managed, the availability of this functionality is additionally dependant on whether the user is the device owner.''', + }, + { 'name': 'SafeBrowsingWhitelistDomains', 'owners': ['bdea@chromium.org', 'nparker@chromium.org'], 'type': 'list', @@ -21262,6 +21301,6 @@ ], 'placeholders': [], 'deleted_policy_ids': [412, 546, 562, 569, 578], - 'highest_id_currently_used': 689, + 'highest_id_currently_used': 690, 'highest_atomic_group_id_currently_used': 38 }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index c6c7c30..01f4747 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -3565,11 +3565,11 @@ Wenn für die Richtlinie "false" festgelegt wird, können Nutzer nicht mehr durch diese Seiten klicken.</translation> <translation id="6319198883324703402">Zeitpunkt der ersten Nutzerbenachrichtigung zum Neustart festlegen</translation> <translation id="6342187235303612558">Nutzer am Hoch- oder Herunterladen von Dateien hindern, bei denen der Schutz vor Datenverlust oder der Malware-Scan nicht unterstützt wird.</translation> -<translation id="6348718801326095108">Cookies, die von Seiten gesetzt werden, die diesen URL-Mustern entsprechen, sind auf die aktuelle Sitzung beschränkt. Sie werden also gelöscht, wenn der Browser beendet wird. +<translation id="6348718801326095108">Cookies, die von Seiten gesetzt werden, die diesen URL-Mustern entsprechen, sind auf die aktuelle Sitzung beschränkt. Sie werden also gelöscht, wenn der Browser geschlossen wird. Für URLs, die diesen URL-Mustern nicht entsprechen, wird der globale Standardwert verwendet, entweder aus der Richtlinie "DefaultCookiesSetting", sofern diese konfiguriert ist, oder aus der persönlichen Konfiguration des Nutzers. Ist diese Richtlinie nicht konfiguriert, ist das für alle URLs der Fall. - Wird <ph name="PRODUCT_NAME" /> im Hintergrund ausgeführt, wird die Sitzung unter Umständen nicht beendet, wenn das letzte Browserfenster geschlossen wird. Sie bleibt aktiv, bis der Browser beendet wird. Weitere Informationen zu entsprechenden Konfigurationen finden Sie in der Richtlinie "BackgroundModeEnabled". + Wird <ph name="PRODUCT_NAME" /> im Hintergrund ausgeführt, wird die Sitzung unter Umständen nicht beendet, wenn das letzte Browserfenster geschlossen wird. Sie bleibt aktiv, bis der Browser geschlossen wird. Weitere Informationen zu entsprechenden Konfigurationen finden Sie in der Richtlinie "BackgroundModeEnabled". Sehen Sie sich auch die Richtlinien "CookiesAllowedForUrls" und "CookiesBlockedForUrls" an. Es darf keine widersprüchlichen URL-Muster zwischen diesen drei Richtlinien geben. Es ist nicht festgelegt, welche Richtlinie Vorrang hat. @@ -3712,7 +3712,7 @@ Ist diese Richtlinie nicht konfiguriert, wird für alle Websites der globale Standardwert verwendet, entweder aus der Richtlinie "DefaultCookiesSetting", sofern diese konfiguriert ist, oder aus der persönlichen Konfiguration des Nutzers. - Sehen Sie sich auch die Richtlinien "CookiesBlockedForUrls" und "CookiesSessionOnlyForUrls". Es darf keine widersprüchlichen URL-Muster zwischen diesen drei Richtlinien geben. Es ist nicht festgelegt, welche Richtlinie Vorrang hat. + Sehen Sie sich auch die Richtlinien "CookiesBlockedForUrls" und "CookiesSessionOnlyForUrls" an. Es darf keine widersprüchlichen URL-Muster zwischen diesen drei Richtlinien geben. Es ist nicht festgelegt, welche Richtlinie Vorrang hat. Genaue Informationen zu gültigen URL-Mustern finden Sie unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="6553143066970470539">Displayhelligkeit in %</translation>
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index ef663bd..51f360f 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -143,9 +143,9 @@ Si no estableces esta política, los comentarios por voz estarán inhabilitados cuando se muestre por primera vez la pantalla de acceso. En este caso, los usuarios podrán habilitar o inhabilitar los comentarios por voz en cualquier momento y la opción que elijan se mantendrá entre los usuarios. Nota: <ph name="DEVICE_LOGIN_SCREEN_SPOKEN_FEEDBACK_ENABLED_POLICY_NAME" /> anula esta política si se especifica la política anterior.</translation> -<translation id="1128717055763152639">Te permite establecer una lista de patrones de URL que especifican los sitios que pueden mostrar contenido mixto (p. ej., contenido HTTP en sitios HTTPS) bloqueable (p. ej., activo) y los sitios en los que se inhabilitará el contenido mixto bloqueable de forma opcional. +<translation id="1128717055763152639">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que pueden mostrar contenido mixto (p. ej., contenido HTTP en sitios HTTPS) bloqueable (p. ej., activo) y para los cuales se inhabilitarán las actualizaciones del contenido mixto bloqueable de forma opcional. - Si no configuras esta política, se bloqueará el contenido mixto bloqueable y se actualizará el contenido mixto bloqueable de forma opcional. Además, los usuarios podrán establecer excepciones para permitir este contenido en sitios específicos. + Si no se establece esta política, se bloqueará el contenido mixto bloqueable y se actualizará el contenido mixto bloqueable de forma opcional; además, los usuarios podrán establecer excepciones para permitir ese contenido en sitios específicos. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="1128903365609589950">Configura el directorio que <ph name="PRODUCT_NAME" /> usará para almacenar archivos en caché en el disco. @@ -270,9 +270,9 @@ Si se inhabilita la política, el Asistente de Google no podrá acceder a este contexto. Si no se configura, los usuarios podrán decidir la acción del Asistente de Google.</translation> <translation id="1376119291123231789">Habilitar el modo avanzado de carga de la batería</translation> -<translation id="1376298389964661475">Te permite establecer una lista de patrones de URL con los sitios que puedan mostrar notificaciones. +<translation id="1376298389964661475">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que puedan mostrar notificaciones. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultNotificationsSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultNotificationsSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="1377134027840513298">Ten en cuenta que esta política es obsoleta y se eliminará en la versión 82 de <ph name="PRODUCT_OS_NAME" />. En su lugar, utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. @@ -334,9 +334,9 @@ <translation id="1474273443907024088">Inhabilitar TLS False Start</translation> <translation id="1477934438414550161">TLS 1.2</translation> <translation id="1486021504508098388">Enviar información sobre la luz de fondo</translation> -<translation id="1497640071678474358">Te permite configurar una lista de patrones de URL con los sitios que no están autorizados a abrir ventanas emergentes. +<translation id="1497640071678474358">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no están autorizados a abrir ventanas emergentes. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPopupsSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPopupsSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="1502843533062797703">Habilitar el bloqueo de inserción de software de terceros</translation> @@ -495,17 +495,17 @@ La política debe establecerse en una URL de la cual <ph name="PRODUCT_OS_NAME" /> pueda descargar las Condiciones del Servicio. Estas deberán estar en texto sin formato y ofrecerse como texto sin formato tipo MIME. No se permiten marcas.</translation> <translation id="1750315445671978749">Bloquear todas las descargas</translation> -<translation id="1757544636315644531">Te permite configurar una lista de patrones de URL con los sitios que pueden mostrar imágenes. +<translation id="1757544636315644531">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que pueden mostrar imágenes. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultImagesSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultImagesSetting" si se establece o, en caso contrario, de la configuración personal del usuario. - Ten en cuenta que esta política estaba habilitada en Android por equivocación, pero esta funcionalidad nunca fue totalmente compatible en ese SO. + Ten en cuenta que esta política estaba habilitada en Android por error, pero esta funcionalidad nunca fue totalmente compatible en ese SO. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="1767673020408652620">Habilitar las recomendaciones de apps cuando el cuadro de búsqueda se encuentra sin estado</translation> -<translation id="1777842213242723063">Te permite configurar una lista de patrones de URL con los sitios que no pueden ejecutar el complemento <ph name="FLASH_PLUGIN_NAME" />. +<translation id="1777842213242723063">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no pueden ejecutar el complemento <ph name="FLASH_PLUGIN_NAME" />. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPluginsSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPluginsSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="1781356041596378058">Esta política también controla el acceso a las Opciones para programador de Android. Si habilitas esta política, los usuarios no podrán acceder a las Opciones para programador. Si estableces esta política como falsa o no la estableces, los usuarios podrán acceder a las Opciones para programador al presionar siete veces el número de compilación en la app de Configuración de Android.</translation> @@ -908,11 +908,11 @@ Si se establece esta política como verdadera, es posible que el usuario establezca "Always open" para el protocolo sin futuros mensajes de confirmación (cuando se muestre un mensaje de confirmación del protocolo externo). Si se establece esta política como falsa o no se establece, no se mostrará la casilla de verificación "Always open" y el usuario deberá realizar una acción cuando se invoque un protocolo externo.</translation> -<translation id="2406820201690307634">Te permite configurar una lista de patrones de URL con los sitios que no pueden mostrar imágenes. +<translation id="2406820201690307634">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no pueden mostrar imágenes. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultImagesSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultImagesSetting" si se establece o, en caso contrario, de la configuración personal del usuario. - Ten en cuenta que esta política estaba habilitada en Android por equivocación, pero esta funcionalidad nunca fue totalmente compatible en ese SO. + Ten en cuenta que esta política estaba habilitada en Android por error, pero esta funcionalidad nunca fue totalmente compatible en ese SO. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="2411817661175306360">La advertencia de la protección de la contraseña está desactivada</translation> @@ -1039,9 +1039,9 @@ Cuando no se configura esta política o se establece como "No aplicar filtros de contenido para adultos a los sitios", no se filtrarán los sitios. Cuando se configura como "Aplicar filtros de contenido para adultos a los sitios principales", se filtrarán los sitios clasificados como pornográficos.</translation> -<translation id="2484356232170636726">Te permite configurar una lista de patrones de URL con los sitios que pueden ejecutar JavaScript. +<translation id="2484356232170636726">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que pueden ejecutar JavaScript. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultJavaScriptSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultJavaScriptSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="2486371469462493753">Inhabilita la aplicación de los requisitos del Certificado de transparencia para las URL de la lista. @@ -1569,9 +1569,9 @@ Sin embargo, solo se mostrarán estas notificaciones si el proveedor de identidad de SAML envía la información de vencimiento de contraseña al dispositivo durante el proceso de acceso de SAML. Si configuras esta política, el usuario no podrá cambiarla ni anularla.</translation> -<translation id="3312835062252480209">Te permite establecer una lista de patrones de URL que especifican los sitios que no pueden usar la generación de claves. Si un patrón de URL tiene configurada la política "KeygenAllowedForUrls", se anulan estas excepciones. +<translation id="3312835062252480209">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no pueden usar la generación de claves. Si un patrón de URL aparece en "KeygenAllowedForUrls", la política anula estas excepciones. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultKeygenSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultKeygenSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="3327195598110816609">No demorar ninguna entrega</translation> @@ -1802,16 +1802,16 @@ La inscripción en la política de nube para el alcance de máquinas usa esta política en el escritorio. Se puede configurar mediante el registro o GPO en Windows, plist en Mac y el archivo de políticas JSON en Linux.</translation> <translation id="3660562134618097814">Transferir cookies del IdP de SAML durante el acceso</translation> -<translation id="3684866411224031107">Te permite configurar una lista de patrones de URL con los sitios que pueden ejecutar el complemento <ph name="FLASH_PLUGIN_NAME" />. +<translation id="3684866411224031107">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que pueden ejecutar el complemento <ph name="FLASH_PLUGIN_NAME" />. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPluginsSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPluginsSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> -<translation id="3688225008199664446">Te permite establecer una lista de patrones de URL que especifican los sitios que no pueden solicitarle al usuario acceso a un dispositivo USB. +<translation id="3688225008199664446">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no pueden solicitarle al usuario acceso a un dispositivo USB. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultWebUsbGuardSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultWebUsbGuardSetting" si se establece o, en caso contrario, de la configuración personal del usuario. - Los patrones de URL en esta política no deben entrar en conflicto con los que se configuren a través de WebUsbAskForUrls. No se especifica cuál de las dos políticas prevalece si una URL coincide con ambas. + Los patrones de URL que se incluyan en esta política no deben superponerse con los que se configuren a través de WebUsbAskForUrls. No se especifica cuál de las dos políticas prevalece si una URL coincide con ambas. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="3701121231485832347">Controla la configuración específica de los dispositivos <ph name="PRODUCT_OS_NAME" /> administrados por <ph name="MS_AD_NAME" />.</translation> @@ -2445,9 +2445,9 @@ Si se asigna el valor Forzado (Forced), es posible que las páginas se abran SOLO en modo Incógnito. Ten en cuenta que la opción Forzado (Forced) no funciona para Android-on-Chrome.</translation> <translation id="4600786265870346112">Habilita el cursor grande.</translation> <translation id="4604931264910482931">Configurar la lista negra de mensajería nativa</translation> -<translation id="4614701085541180174">Te permite definir una lista de los patrones de URL que especifican sitios para los que se selecciona automáticamente un certificado de cliente en la pantalla de acceso, en el marco que aloja el flujo de SAML (si el sitio lo solicita). Por ejemplo, se puede configurar un certificado en todo el dispositivo para presentarlo en el IdP de SAML. +<translation id="4614701085541180174">Te permite configurar una lista de patrones de URL donde se indiquen los sitios para los que se selecciona automáticamente un certificado de cliente en la pantalla de acceso, en el marco que aloja el flujo de SAML, si el sitio solicita un certificado. Por ejemplo, se puede configurar un certificado para todo el dispositivo que se presente en el IdP de SAML. - El valor debe ser un conjunto de diccionarios en formato JSON con strings. Cada diccionario debe tener el formato <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, en donde <ph name="URL_PATTERN_PLACEHOLDER" /> es un patrón de configuración de contenido. <ph name="FILTER_PLACEHOLDER" /> restringe los certificados de cliente que el navegador seleccionará automáticamente. Más allá del filtro, solo se seleccionarán los certificados que cumplan con la solicitud de certificado del servidor. Si <ph name="FILTER_PLACEHOLDER" /> tiene el formato <ph name="JSON_DICTIONARY_EXAMPLE" />, solo se seleccionarán de forma adicional los certificados de cliente emitidos por un certificado con el nombre común <ph name="ISSUER_CN_PLACEHOLDER" />. Si <ph name="FILTER_PLACEHOLDER" /> es el diccionario vacío {}, no se aplicarán más restricciones a la selección de certificados de cliente. + El valor debe ser una matriz de diccionarios convertidos en cadenas de JSON. Cada diccionario debe tener el formato <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, donde <ph name="URL_PATTERN_PLACEHOLDER" /> es un patrón de configuración de contenido. <ph name="FILTER_PLACEHOLDER" /> restringe los certificados de cliente entre los seleccionará automáticamente el navegador. Más allá del filtro, solo se seleccionarán certificados que se ajusten a la solicitud de certificado del servidor. Si <ph name="FILTER_PLACEHOLDER" /> tiene el formato <ph name="JSON_DICTIONARY_EXAMPLE" />, además solo se seleccionarán certificados de cliente emitidos por un certificado con el nombre común <ph name="ISSUER_CN_PLACEHOLDER" />. Si <ph name="FILTER_PLACEHOLDER" /> es el diccionario vacío {}, no se aplicarán restricciones adicionales a la selección de certificados de cliente. Si no se configura esta política, no se implementará la selección automática para ningún sitio. @@ -2572,9 +2572,9 @@ Si se establece la política como falsa o no se establece, no se enviará el informe con las actualizaciones del SO. Si se establece como verdadera, se enviará el informe con esos datos.</translation> <translation id="4858735034935305895">Permitir el modo de pantalla completa</translation> <translation id="4861767323695239729">Configurar los métodos de entrada permitidos en una sesión de usuario</translation> -<translation id="4869603341164509842">Se compararán los patrones de esta lista con el origen +<translation id="4869603341164509842">Los patrones de esta lista se compararán con el origen de seguridad de la URL solicitante. Si se encuentra una coincidencia, - se concederá acceso a los dispositivos de captura de video sin solicitarlo. + se concederá acceso a los dispositivos de captura de video sin consultar al usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. @@ -2699,9 +2699,9 @@ Si esta política se establece como 0, se inhabilita el cambio de la contraseña de la cuenta de máquina. Ten en cuenta que las contraseñas pueden ser más antiguas que la cantidad de días especificada si el cliente no se conectó por un período mayor.</translation> -<translation id="5101600510268095939">Te permite establecer una lista de patrones de URL que especifican los sitios que no pueden mostrar contenido mixto (p. ej., contenido HTTP en sitios HTTPS) bloqueable (p. ej., activo) y los sitios en los que se actualizará el contenido mixto bloqueable de forma opcional (p. ej., pasivo). +<translation id="5101600510268095939">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no pueden mostrar contenido mixto (p. ej., contenido HTTP en sitios HTTPS) bloqueable (p. ej., activo) y para los cuales se actualizará el contenido mixto bloqueable de forma opcional (p. ej., pasivo). - Si no se establece esta política, se bloqueará el contenido mixto bloqueable y se actualizará el contenido mixto bloqueable de forma opcional, pero los usuarios podrán establecer excepciones para permitir la actualización de contenido en sitios específicos. + Si no se establece esta política, se bloqueará el contenido mixto bloqueable y se actualizará el contenido mixto bloqueable de forma opcional, pero los usuarios podrán establecer excepciones para permitir ese contenido en sitios específicos. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="510196893779239086">Esta política controla si se cierra Chrome por completo cuando la última pestaña cambia a otro navegador. @@ -2904,11 +2904,11 @@ <translation id="5323200200131319468">Habilita los comentarios por voz en la pantalla de acceso</translation> <translation id="532668836479219203">Esta política controla el comportamiento de acceso del navegador. Te permite especificar si el usuario puede acceder a <ph name="PRODUCT_NAME" /> con su cuenta y usar los servicios relacionados, como la Sincronización de Chrome. - Si la política se establece como "Inhabilitar el acceso en el navegador", el usuario no podrá acceder a su cuenta en el navegador ni podrá usar los servicios basados en la cuenta. En este caso, las funciones al nivel del navegador (como la Sincronización de Chrome) no se podrán usar ni estarán disponibles. Si el usuario accedió a su cuenta y la política se establece como "Inhabilitada", saldrá de su cuenta la próxima vez que ejecute Chrome, pero se conservarán sus datos de perfil locales (como los favoritos, las contraseñas, etc.). El usuario podrá acceder a servicios web de Google, como Gmail, y usarlos. + Si la política se establece como "Inhabilitar el acceso en el navegador", el usuario no podrá acceder a su cuenta en el navegador ni usar los servicios basados en la cuenta. En este caso, las funciones al nivel del navegador tales como la Sincronización de Chrome no se podrán usar ni estarán disponibles. Si el usuario ya había accedido a su cuenta y la política se establece como "Inhabilitada", saldrá de su cuenta la próxima vez que ejecute Chrome, pero se conservarán sus datos de perfil locales, como los favoritos, las contraseñas, etc. El usuario podrá seguir accediendo a servicios web de Google, como Gmail, y usarlos. - Si la política se establece como "Habilitar el acceso en el navegador", el usuario podrá acceder a su cuenta en el navegador. Además, ingresará automáticamente cuando acceda a servicios web de Google, como Gmail. Esta acción implica que el navegador guardará la información de la cuenta del usuario. Sin embargo, no significa que la Sincronización de Chrome se activará de forma predeterminada; para usar esta función, el usuario debe habilitarla de manera explícita. Para controlar la disponibilidad de la Sincronización de Chrome, usa la política "SyncDisabled". + Si la política se establece como "Habilitar el acceso en el navegador", el usuario podrá acceder a su cuenta en el navegador. Además, ingresará automáticamente cuando acceda a servicios web de Google como Gmail. La habilitación del acceso en el navegador implica que el navegador guardará la información de la cuenta del usuario. Sin embargo, no significa que la Sincronización de Chrome se activará de forma predeterminada; para usar esta función, el usuario debe habilitarla de manera independiente. Si se habilita esta política, el usuario no podrá desactivar la configuración que permite el acceso en el navegador. Para controlar la disponibilidad de la Sincronización de Chrome, usa la política "SyncDisabled". - Si la política se establece como "Forzar el acceso en el navegador", el usuario verá un cuadro de diálogo para seleccionar una cuenta de acceso. Esta opción asegura que se apliquen las políticas asociadas a las cuentas administradas. De manera predeterminada, esta opción activa la Sincronización de Chrome para la cuenta, excepto si el administrador del dominio inhabilitó la sincronización o se hizo mediante la política "SyncDisabled". El valor predeterminado de BrowserGuestModeEnabled se establecerá como falso. Ten en cuenta que, después de habilitar esta política, se bloquearán los perfiles existentes a los que no se haya accedido y no se podrá acceder a ellos. Para obtener más información, consulta el artículo del Centro de ayuda: https://support.google.com/chrome/a/answer/7572556. Esta opción no es compatible con Linux ni Android y, si se utiliza, se volverá a establecer como "Habilitar el acceso en el navegador". + Si la política se establece como "Forzar el acceso en el navegador", el usuario verá un cuadro de diálogo para seleccionar una cuenta de acceso a fin de usar el navegador. Esta opción asegura que se apliquen las políticas asociadas a las cuentas administradas. De manera predeterminada, esta opción activa la Sincronización de Chrome para la cuenta, excepto si el administrador del dominio o la política "SyncDisabled" inhabilitaron la sincronización. El valor predeterminado de BrowserGuestModeEnabled se establecerá como falso. Ten en cuenta que después de habilitar esta política se bloquearán los perfiles existentes a los que no se haya accedido y no se podrá acceder a ellos. Para obtener más información, consulta el artículo del Centro de ayuda: https://support.google.com/chrome/a/answer/7572556. Esta opción no es compatible con Linux ni Android y, de usarse, se asignará la configuración "Habilitar el acceso en el navegador". Si no se establece esta política, el usuario podrá decidir si desea habilitar el acceso en el navegador y usarlo según su criterio.</translation> <translation id="532848608876725157">Habilitar DNS sobre HTTPS con resguardo inseguro</translation> @@ -3306,13 +3306,13 @@ <translation id="5836064773277134605">Restringir el intervalo de puertos UDP que utiliza el host de acceso remoto</translation> <translation id="5844300486330234296">Controla la lista blanca de los patrones de URL con la reproducción automática siempre habilitada. - Si la reproducción automática está habilitada, los videos podrán realizar esta acción (sin el consentimiento del usuario) con contenido de audio en <ph name="PRODUCT_NAME" />. + Si la reproducción automática está habilitada, los videos podrán reproducirse automáticamente (sin el consentimiento del usuario) con contenido de audio en <ph name="PRODUCT_NAME" />. Si se establece la política AutoplayAllowed como verdadera, esta política no tendrá ningún efecto. - Si se establece la política AutoplayAllowed como falsa, podrá reproducirse cualquier patrón de URL incluido en esta política. + Si se establece la política AutoplayAllowed como falsa, de todos modos podrá reproducirse cualquier patrón de URL incluido en esta política. - Si cambias esta política cuando <ph name="PRODUCT_NAME" /> se está ejecutando, solo se aplicará a las pestañas abiertas nuevas. Por lo tanto, es posible que algunas pestañas todavía muestren el comportamiento anterior. + Si cambias esta política cuando <ph name="PRODUCT_NAME" /> se está ejecutando, solo se aplicará a las nuevas pestañas abiertas. Por lo tanto, es posible que algunas pestañas todavía muestren el comportamiento anterior. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="5855010364142818361">Esta política controla los parámetros de la línea de comandos para Chrome desde Internet Explorer. @@ -3576,13 +3576,13 @@ <translation id="6342187235303612558">No permitir que los usuarios carguen o descarguen archivos que no admitan el análisis de DLP o software malicioso</translation> <translation id="6348718801326095108">Las cookies que establecen las páginas que coinciden con estos patrones de URL se restringirán solo a la sesión actual, es decir, se borrarán cuando se cierre el navegador. - En el caso de las URL que no estén contempladas por los patrones especificados, se usará el valor predeterminado general, ya sea desde la política "DefaultCookiesSetting" (si se establece) o la configuración personal del usuario. Lo mismo ocurre con todas las URL si no se establece la política. + En el caso de URL que no estén contempladas en los patrones indicados, se usará el valor predeterminado general, ya sea de la política "DefaultCookiesSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Lo mismo ocurrirá con todas las URL si no se establece la política. - Ten en cuenta que, si se está ejecutando <ph name="PRODUCT_NAME" /> en el "modo en segundo plano", es posible que la sesión permanezca activa hasta que el usuario salga del navegador. Para obtener más información sobre la configuración de este comportamiento, visita la política "BackgroundModeEnabled". + Ten en cuenta que, si se está ejecutando <ph name="PRODUCT_NAME" /> en el "modo en segundo plano", es posible que la sesión se mantenga activa cuando se cierre la última ventana del navegador y se cierre recién cuando el usuario salga del navegador. Para obtener más información sobre la configuración de este comportamiento, consulta la política "BackgroundModeEnabled". - También visita las políticas "CookiesAllowedForUrls" y "CookiesBlockedForUrls". Ten en cuenta que no debe haber patrones de URL en conflicto entre estas tres políticas. No se especifica qué política tiene prioridad. + Consulta también las políticas "CookiesAllowedForUrls" y "CookiesBlockedForUrls". Ten en cuenta que no debe haber patrones de URL en conflicto entre estas tres políticas. No se especifica qué política prevalecerá en esa situación. - Si se establece la política "RestoreOnStartup" para que restablezca URL de sesiones anteriores, se omitirá esta política, y las cookies se almacenarán de forma permanente para esos sitios. + Si se establece la política "RestoreOnStartup" para que restablezca URL de sesiones anteriores, no se aplicará esta política y las cookies se almacenarán de forma permanente para esos sitios. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="6352543686437322588">Se establece una cuenta local del dispositivo con acceso automático después de un retraso. @@ -3609,11 +3609,11 @@ Si esta política se establece en "False", no se informará sobre los usuarios.</translation> <translation id="638668187106406971">Revisar las cargas para detectar si se infringen las normas relacionadas con la protección de datos sensibles</translation> <translation id="6394350458541421998">Esta política se eliminó a partir de la versión 29 de <ph name="PRODUCT_OS_NAME" />. Utiliza la política PresentationScreenDimDelayScale en su lugar.</translation> -<translation id="6394657112569857636">Te permite configurar una lista de patrones de URL con los sitios que no están autorizados a configurar cookies. +<translation id="6394657112569857636">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no están autorizados a configurar cookies. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultCookiesSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultCookiesSetting" si se establece o, en caso contrario, de la configuración personal del usuario. - Consulta también las políticas "CookiesAllowedForUrls" y "CookiesSessionOnlyForUrls". Ten en cuenta que no debe haber patrones de URL en conflicto entre estas tres políticas. No se especifica qué política tiene prioridad. + Consulta también las políticas "CookiesAllowedForUrls" y "CookiesSessionOnlyForUrls". Ten en cuenta que no debe haber patrones de URL en conflicto entre estas tres políticas. No se especifica qué política prevalece en esa situación. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="6399242659768117666">Esta política controla si se envía información de las extensiones y los complementos. @@ -3716,11 +3716,11 @@ <translation id="6544897973797372144">Si esta política se establece en Verdadera y la política ChromeOsReleaseChannel no se especifica, los usuarios del dominio de inscripción podrán cambiar el canal de versiones del dispositivo. Si esta política se establece en Falsa, el dispositivo se bloqueará en cualquier canal que se haya establecido anteriormente. El canal seleccionado por el usuario será reemplazado por la política ChromeOsReleaseChannel, pero si el canal de la política es más estable que el que fue instalado en el dispositivo, el canal solo cambiará después de que la versión del canal más estable alcance un número de versión más alto que la instalada en el dispositivo.</translation> -<translation id="6548795012081567926">Te permite configurar una lista de patrones de URL con los sitios autorizados a configurar cookies. +<translation id="6548795012081567926">Te permite configurar una lista de patrones de URL donde se indiquen los sitios autorizados a configurar cookies. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultCookiesSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultCookiesSetting" si se establece o, en caso contrario, de la configuración personal del usuario. - Consulta también las políticas "CookiesBlockedForUrls" y "CookiesSessionOnlyForUrls". Ten en cuenta que no debe haber patrones de URL en conflicto entre estas tres políticas. No se especifica qué política tiene prioridad. + Consulta también las políticas "CookiesBlockedForUrls" y "CookiesSessionOnlyForUrls". Ten en cuenta que no debe haber patrones de URL en conflicto entre estas tres políticas. No se especifica qué política prevalece en esa situación. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="6553143066970470539">Porcentaje del brillo de pantalla</translation> @@ -3815,7 +3815,7 @@ <translation id="6734521799274931721">Controlar la disponibilidad de "Network File Shares" para el Sistema operativo Chrome</translation> <translation id="6735701345096330595">Habilitar la corrección ortográfica de idiomas</translation> <translation id="6757613329154374267">Se habilitó la funcionalidad de copia de seguridad y restablecimiento</translation> -<translation id="6758659208493449452">Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada reciben protección adicional. Es posible que algunas de estas funciones contemplen el uso compartido de datos con Google (por ejemplo, los usuarios de la Protección avanzada podrán enviar sus descargas a Google para comprobar que no incluyan software malicioso). Si se establece como verdadera o no se establece, los usuarios inscritos recibirán protección adicional. Si se establece como falsa, los usuarios de la Protección avanzada solo recibirán las funciones estándar para el consumidor.</translation> +<translation id="6758659208493449452">Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada reciben protección adicional. Es posible que algunas de estas funciones compartan datos con Google (por ejemplo, los usuarios de la Protección avanzada podrán enviar sus descargas a Google para comprobar que no incluyan software malicioso). Si se establece como verdadera o no se establece, los usuarios inscritos recibirán protección adicional. Si se establece como falsa, los usuarios de la Protección avanzada solo recibirán las funciones estándar para el consumidor.</translation> <translation id="6762235610019366960">Permite controlar la presentación en pestaña completa de contenido educativo o promocional en <ph name="PRODUCT_NAME" />. Si no se configura o se habilita (se establece como verdadera), <ph name="PRODUCT_NAME" /> puede mostrar a los usuarios contenido sobre productos en pestaña completa. @@ -3823,9 +3823,9 @@ Si se inhabilita (se establece como falsa), <ph name="PRODUCT_NAME" /> no mostrará a los usuarios contenido sobre productos en pestaña completa. Esta configuración controla la presentación de las páginas de bienvenida que permiten a los usuarios acceder a <ph name="PRODUCT_NAME" />, elegirlo como navegador predeterminado o recibir información sobre funciones de productos.</translation> -<translation id="6764421313777250384">Te permite establecer una lista de patrones de URL con los sitios que no pueden mostrar notificaciones. +<translation id="6764421313777250384">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no pueden mostrar notificaciones. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultNotificationsSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultNotificationsSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="6766216162565713893">Permitir que los sitios soliciten permiso al usuario para acceder a un dispositivo Bluetooth cercano</translation> @@ -4265,9 +4265,9 @@ <translation id="7485730741952775732">Si se configura esta política, el host de acceso remoto usará esta URL para validar los tokens de autenticación de los clientes de acceso remoto, a fin de aceptar las conexiones. Debe usarse junto con RemoteAccessHostTokenUrl. Actualmente, esta función está inhabilitada en el lado del servidor.</translation> -<translation id="7490270439948288519">Te permite configurar una lista de patrones de URL con los sitios autorizados a abrir ventanas emergentes. +<translation id="7490270439948288519">Te permite configurar una lista de patrones de URL donde se indiquen los sitios autorizados a abrir ventanas emergentes. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPopupsSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultPopupsSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="749556411189861380">Informa sobre la versión del firmware y del sistema operativo de los dispositivos registrados. @@ -4308,9 +4308,9 @@ Esta política está disponible en instancias de Windows vinculadas a un dominio de <ph name="MS_AD_NAME" /> o instancias de Windows 10 Pro o Enterprise habilitadas para la administración de dispositivos.</translation> <translation id="7511361072385293666">Si esta política no se configura o se establece en true, se permite el uso del protocolo QUIC en <ph name="PRODUCT_NAME" />. Si esta política se establece en false, no se permite el uso del protocolo QUIC.</translation> -<translation id="7515572751689937649">Te permite configurar una lista de patrones de URL con los sitios que no pueden ejecutar JavaScript. +<translation id="7515572751689937649">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que no pueden ejecutar JavaScript. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultJavaScriptSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultJavaScriptSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="7517845714620372896">Permite especificar el porcentaje del brillo de pantalla. @@ -4796,9 +4796,9 @@ <translation id="8331479227794770304">Habilitar teclas de acción prolongada</translation> <translation id="8339420913453596618">Se inhabilitó el segundo factor</translation> <translation id="8344454543174932833">Importar favoritos del navegador predeterminado en la primera ejecución</translation> -<translation id="8351446723835838047">Te permite establecer una lista de patrones de URL con los sitios que pueden usar la generación de claves. Si un patrón de URL tiene configurada la política "KeygenBlockedForUrls", se anulan estas excepciones. +<translation id="8351446723835838047">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que pueden usar la generación de claves. Si un patrón de URL aparece en la política "KeygenBlockedForUrls", se anulan estas excepciones. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultKeygenSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultKeygenSetting" si se establece o, en caso contrario, de la configuración personal del usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="8357681633047935212">Limitar la duración de la sesión de usuario</translation> @@ -5022,11 +5022,11 @@ Si no se establece esta política, <ph name="PRODUCT_NAME" /> intentará detectar si un servidor se encuentra en la intranet y solo entonces responderá las solicitudes de IWA. Si se detecta un servidor como Internet, <ph name="PRODUCT_NAME" /> ignorará las solicitudes de IWA que provengan de ese servidor.</translation> <translation id="8656110680728938054">Habilita Seleccionar para pronunciar</translation> -<translation id="8659729040032759711">Te permite establecer una lista de patrones de URL con los sitios que pueden solicitarle al usuario que les otorgue acceso a un dispositivo USB. +<translation id="8659729040032759711">Te permite configurar una lista de patrones de URL donde se indiquen los sitios que pueden solicitarle al usuario que les otorgue acceso a un dispositivo USB. - Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultWebUsbGuardSetting" (si se establece) o de la configuración personal del usuario. + Si no se establece esta política, se usará el valor predeterminado general para todos los sitios, ya sea de la política "DefaultWebUsbGuardSetting" si se establece o, en caso contrario, de la configuración personal del usuario. - Los patrones de URL en esta política deben ser compatibles con los que se configuran a través de WebUsbBlockedForUrls. No se especifica cuál de las dos políticas prevalece si una URL coincide con ambas. + Los patrones de URL que se incluyan en esta política no deben superponerse con los que se configuren a través de WebUsbBlockedForUrls. No se especifica cuál de las dos políticas prevalece si una URL coincide con ambas. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="8661297125441579970">No permitir la migración de datos y ARC</translation> @@ -5165,9 +5165,9 @@ Si no la estableces, inicialmente la función estará inhabilitada en la pantalla de acceso, pero el usuario podrá habilitarla en cualquier momento.</translation> <translation id="8876188741456358123">Anula el modo predeterminado de impresión doble. Si el modo no está disponible, se ignorará esta política.</translation> -<translation id="8878850056189891727">Se compararán los patrones de esta lista con el origen +<translation id="8878850056189891727">Los patrones de esta lista se compararán con el origen de seguridad de la URL solicitante. Si se encuentra una coincidencia, - se concederá acceso a los dispositivos de captura de audio sin solicitarlo. + se concederá acceso a los dispositivos de captura de audio sin consultar al usuario. Para obtener información detallada sobre los patrones de URL válidos, consulta: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 6f9cf97..9cf5adca 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -2976,7 +2976,7 @@ <translation id="5323200200131319468">Activer les commentaires audio sur l'écran de connexion</translation> <translation id="532668836479219203">Cette règle vous permet de gérer la connexion au navigateur, et de spécifier si l'utilisateur peut ou non se connecter à <ph name="PRODUCT_NAME" /> avec son compte et utiliser les services associés, comme la synchronisation Chrome. - Si la règle est définie sur "Désactiver la connexion au navigateur", l'utilisateur ne peut pas se connecter au navigateur et utiliser les services associés à son compte. Dans ce cas, les fonctionnalités qui opèrent au niveau du navigateur, comme la synchronisation Chrome, ne peuvent pas être utilisées et sont donc indisponibles. Si l'utilisateur était connecté au moment où la règle est passée à l'état "Désactivée", il sera déconnecté la prochaine fois qu'il utilisera Chrome, mais ses données de profil locales (favoris, mots de passe, etc.) seront conservées. Il pourra tout de même se connecter aux services Web Google, comme Gmail, et s'en servir. + Si la règle est définie sur "Désactiver la connexion au navigateur", l'utilisateur ne peut pas se connecter au navigateur ni utiliser les services associés à son compte. Dans ce cas, les fonctionnalités qui opèrent au niveau du navigateur, comme la synchronisation Chrome, ne peuvent pas être utilisées et sont donc indisponibles. Si l'utilisateur était connecté au moment où la règle est passée à l'état "Désactivée", il sera déconnecté la prochaine fois qu'il utilisera Chrome, mais ses données de profil locales (favoris, mots de passe, etc.) seront conservées. Il pourra tout de même se connecter aux services Web Google, comme Gmail, et s'en servir. Si la règle est définie sur "Activer la connexion au navigateur", l'utilisateur peut se connecter au navigateur, et la connexion se fait automatiquement lorsqu'il accède à des services Web Google, comme Gmail. Lorsque l'utilisateur est connecté au navigateur, ses informations de compte sont conservées par le navigateur. Cependant, cela ne signifie pas que la synchronisation Chrome est activée par défaut : l'utilisateur doit explicitement accepter d'utiliser cette fonctionnalité. En activant cette règle, vous l'empêchez de désactiver le paramètre qui autorise la connexion au navigateur. Pour contrôler la disponibilité de la synchronisation Chrome, utilisez la règle "SyncDisabled". @@ -3693,7 +3693,7 @@ Si cette règle est définie sur "False", aucune liste d'utilisateurs n'est générée.</translation> <translation id="638668187106406971">Vérifier que les importations respectent les règles de protection des données sensibles</translation> <translation id="6394350458541421998">Cette règle a été supprimée à partir de la version 29 de <ph name="PRODUCT_OS_NAME" />. Veuillez utiliser la règle PresentationScreenDimDelayScale à la place.</translation> -<translation id="6394657112569857636">Permet de définir une liste de formats d'URL indiquant les sites non autorisés à placer des cookies. +<translation id="6394657112569857636">Permet de définir une liste de formats d'URL indiquant les sites non autorisés à activer des cookies. 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 "DefaultCookiesSetting" si celle-ci est définie ou, à défaut, à partir de la configuration personnelle de l'utilisateur. @@ -3800,7 +3800,7 @@ <translation id="6544897973797372144">Si cette règle est définie sur "True", et si la règle ChromeOsReleaseChannel n'est pas spécifiée, les utilisateurs du domaine correspondant sont autorisés à modifier la version de l'appareil. Si elle est définie sur "False", l'appareil est verrouillé sur la dernière version configurée. La règle ChromeOsReleaseChannel prévaut sur la version sélectionnée par l'utilisateur. Toutefois, si cette dernière est plus stable que la version installée sur l'appareil, elle n'est remplacée qu'une fois que la version la plus stable atteint un numéro supérieur à celui de la version installée sur l'appareil.</translation> -<translation id="6548795012081567926">Permet de définir une liste de formats d'URL indiquant les sites autorisés à placer des cookies. +<translation id="6548795012081567926">Permet de définir une liste de formats d'URL indiquant les sites autorisés à activer des cookies. 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 "DefaultCookiesSetting" si celle-ci est définie ou, à défaut, à partir de la configuration personnelle de l'utilisateur.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 871fd279..976254fd 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -3803,7 +3803,7 @@ <translation id="6734521799274931721">Mengontrol fitur Berbagi File Jaringan untuk ketersediaan ChromeOS</translation> <translation id="6735701345096330595">Mengaktifkan paksa pemeriksaan ejaan bahasa</translation> <translation id="6757613329154374267">Pencadangan dan pemulihan diaktifkan</translation> -<translation id="6758659208493449452">Kebijakan ini mengontrol apakah pengguna yang terdaftar dalam Program Perlindungan Lanjutan menerima perlindungan tambahan. Beberapa fitur ini dapat mencakup pembagian data dengan Google (misalnya, pengguna Perlindungan Lanjutan akan dapat mengirimkan hasil downloadnya ke Google untuk pemindaian malware). Jika ditetapkan ke Benar atau tidak ditetapkan, pengguna terdaftar akan menerima perlindungan tambahan. Jika ditetapkan ke Salah, pengguna Perlindungan Lanjutan hanya akan menerima fitur konsumen standar.</translation> +<translation id="6758659208493449452">Kebijakan ini mengontrol apakah pengguna yang terdaftar dalam Program Perlindungan Lanjutan menerima perlindungan tambahan. Beberapa fitur ini dapat mencakup pembagian data kepada Google (misalnya, pengguna Perlindungan Lanjutan akan dapat mengirimkan hasil downloadnya ke Google untuk pemindaian malware). Jika ditetapkan ke Benar atau tidak ditetapkan, pengguna terdaftar akan menerima perlindungan tambahan. Jika ditetapkan ke Salah, pengguna Perlindungan Lanjutan hanya akan menerima fitur konsumen standar.</translation> <translation id="6762235610019366960">Memungkinkan Anda mengontrol penyajian konten promosi dan/atau edukasi tab penuh di <ph name="PRODUCT_NAME" />. Jika tidak dikonfigurasi atau diaktifkan (disetel ke true), <ph name="PRODUCT_NAME" /> dapat menampilkan konten tab penuh kepada pengguna untuk memberikan informasi produk.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 67bfa6a..f2282f5 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -1142,6 +1142,7 @@ <translation id="2592162121850992309">Se questa norma è impostata su true o non è impostata, verrà attivata l'accelerazione hardware a meno che una determinata funzione della GPU non sia stata inserita nella lista nera. Se la norma è impostata su false, l'accelerazione hardware verrà disattivata.</translation> +<translation id="2593762551209145088">Navigazione sicura non è mai attiva.</translation> <translation id="2596260130957832043">Consente di stabilire se attivare o meno l'autenticazione NTLMv2. Tutte le versioni recenti dei server Samba e Windows supportano l'autenticazione NTLMv2, che deve essere disattivata solo per garantire la compatibilità con le versioni precedenti, in quanto riduce la sicurezza dell'autenticazione. @@ -1213,6 +1214,7 @@ Visita il sito https://developers.google.com/safe-browsing per avere ulteriori informazioni sulla funzione Navigazione sicura.</translation> <translation id="2706708761587205154">Consenti la stampa solo con PIN</translation> +<translation id="2707873794476722903">Navigazione sicura è attiva in modalità standard.</translation> <translation id="2710534340210290498">Se la norma viene impostata su false, gli utenti non potranno bloccare lo schermo (sarà possibile solo la disconnessione dalla sessione utente). Se l'impostazione viene impostata su true o non viene configurata, gli utenti autenticati mediante password potranno bloccare lo schermo.</translation> <translation id="2731627323327011390">Disattiva l'utilizzo dei certificati <ph name="PRODUCT_OS_NAME" /> per le app ARC</translation> <translation id="2742843273354638707">Consente di nascondere l'app Chrome Web Store e il link nel piè di pagina nella pagina Nuova scheda e in Avvio applicazioni di <ph name="PRODUCT_OS_NAME" />. @@ -1552,9 +1554,9 @@ Tuttavia, queste notifiche verranno mostrate solo se le informazioni sulla scadenza della password vengono inviate al dispositivo dal Provider di identità SAML durante il flusso di accesso SAML. Se questo criterio viene impostato, l'utente non può modificarlo o ignorarlo.</translation> -<translation id="3312835062252480209">Consente di impostare un elenco di pattern URL che specifica i siti non autorizzati a utilizzare la generazione di chiavi. Se un pattern URL è indicato in "KeygenAllowedForUrls", il criterio ha la precedenza su queste eccezioni. +<translation id="3312835062252480209">Consente di impostare un elenco di pattern URL che specificano i siti non autorizzati a utilizzare la generazione di chiavi. Se un pattern URL è indicato in "KeygenAllowedForUrls", il criterio ha la precedenza su queste eccezioni. - Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultKeygenSetting" se impostato) o della configurazione personale dell'utente (se non impostato). + Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultKeygenSetting" (se impostato) o della configurazione personale dell'utente (se non impostato). Per informazioni dettagliate sui pattern URL validi, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="3327195598110816609">Non ritardare alcuna consegna</translation> @@ -1794,7 +1796,7 @@ Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultWebUsbGuardSetting" (se impostato) o della configurazione personale dell'utente (se non impostato). - I pattern URL di questo criterio non devono essere in conflitto con quelli configurati tramite WebUsbAskForUrls. Non viene specificato quale dei due criteri debba avere precedenza se un URL presenta corrispondenze con entrambe. + I pattern URL di questo criterio non devono essere in conflitto con quelli configurati tramite WebUsbAskForUrls. Non viene specificato quale dei due criteri debba avere precedenza se un URL presenta corrispondenze con entrambi. Per informazioni dettagliate sui pattern URL validi, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</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> @@ -2303,6 +2305,19 @@ <translation id="437791893267799639">Norma non impostata. Non consentire migrazione dei dati e ARC</translation> <translation id="4389073105055031853">Consenti agli utenti di gestire tutti i certificati</translation> <translation id="4389091865841123886">Configura l'attestazione da remoto con meccanismo TPM.</translation> +<translation id="4401496838830169080">Consente di controllare se la funzionalità Navigazione sicura di <ph name="PRODUCT_NAME" /> è attiva e la relativa modalità. + + Se questo criterio viene impostato su "NoProtection" (valore 0), la Navigazione sicura non è mai attiva. + + Se questo criterio viene impostato su "StandardProtection" (valore 1, predefinito), la Navigazione sicura è sempre attiva in modalità standard. + + Se questo criterio viene impostato su "EnhancedProtection" (valore 2), la Navigazione sicura è sempre attiva in modalità avanzata e fornisce maggior sicurezza, ma non richiede la condivisione di ulteriori dati di navigazione con Google. + + Se imposti questo criterio come obbligatorio, gli utenti non potranno modificare o ignorare l'impostazione Navigazione sicura in <ph name="PRODUCT_NAME" />. + + Se questo criterio non viene impostato, la Navigazione sicura sarà attiva in modalità di protezione standard, ma gli utenti potranno modificare questa impostazione. + + Visita il sito https://developers.google.com/safe-browsing per ulteriori informazioni sulla funzionalità Navigazione sicura.</translation> <translation id="4408428864159735559">Elenco di condivisioni di file di rete preconfigurate.</translation> <translation id="4410236409016356088">Attiva la limitazione della larghezza di banda della rete</translation> <translation id="441217499641439905">Disattiva Google Drive su reti cellulari nell'app File di <ph name="PRODUCT_OS_NAME" /></translation> @@ -2668,7 +2683,7 @@ Se la norma è impostata su 0, la modifica della password dell'account del computer è disattivata. Tieni presente che le password potrebbero durare più a lungo rispetto ai giorni specificati se il client è offline per un periodo più lungo di tempo.</translation> -<translation id="5101600510268095939">Consente di impostare un elenco di pattern URL che specifica i siti non autorizzati a mostrare contenuti misti (ossia contenuti HTTP su siti HTTPS) bloccabili (ossia attivi) e per i quali i contenuti misti bloccabili facoltativi (ossia passivi) verranno aggiornati. +<translation id="5101600510268095939">Consente di impostare un elenco di pattern URL che specificano i siti non autorizzati a visualizzare contenuti misti (ossia contenuti HTTP su siti HTTPS) bloccabili (ossia attivi) e per i quali i contenuti misti bloccabili facoltativi (ossia passivi) verranno aggiornati. Se questo criterio non viene impostato, i contenuti misti bloccabili verranno bloccati e quelli bloccabili facoltativi verranno aggiornati, ma gli utenti potranno configurare eccezioni per consentire i contenuti misti per siti specifici. @@ -2869,13 +2884,13 @@ Se questa norma viene impostata su False, gli utenti non potranno trasmettere contenuti al proprio dispositivo. Se questa norma viene impostata su True, gli utenti potranno trasmettere contenuti. Se questa norma non viene impostata, gli utenti non potranno trasmettere contenuti a dispositivi Chrome OS registrati, ma potranno trasmetterli a dispositivi non registrati.</translation> <translation id="5323200200131319468">Attiva la funzione di lettura vocale nella schermata di accesso</translation> -<translation id="532668836479219203">Questo criterio consente di stabilire il comportamento di accesso del browser. Ti consente di specificare se l'utente può accedere a <ph name="PRODUCT_NAME" /> con il proprio account e usare i servizi correlati all'account come Sincronizzazione Chrome. +<translation id="532668836479219203">Questo criterio consente di stabilire il comportamento di accesso del browser. Consente di specificare se l'utente può accedere a <ph name="PRODUCT_NAME" /> con il proprio account e usare i servizi correlati all'account come Sincronizzazione Chrome. Se il criterio viene impostato su "Disattiva accesso al browser", l'utente non potrà accedere al browser e usare i servizi basati sull'account. In questo caso, le funzionalità a livello di browser come la Sincronizzazione Chrome non potranno essere usate e non saranno disponibili. Se il criterio viene impostato su "Disattivato" dopo che l'utente ha eseguito l'accesso, l'utente verrà scollegato alla successiva esecuzione di Chrome, ma i dati locali del profilo, come preferiti, password ecc., verranno mantenuti. L'utente potrà comunque accedere e usare i servizi web di Google come Gmail. Se il criterio viene impostato su "Attiva accesso al browser", l'utente potrà accedere al browser e verrà collegato automaticamente al browser se accederà a servizi web di Google come Gmail. Se viene eseguito l'accesso al browser, i dati dell'account dell'utente vengono memorizzati dal browser, ma la funzione Sincronizzazione Chrome non viene attivata per impostazione predefinita; per poter utilizzare questa funzione, l'utente deve attivarla separatamente. Se attivi questo criterio, l'utente non potrà disattivare l'impostazione che consente l'accesso al browser. Per gestire la disponibilità della funzione Sincronizzazione Chrome, usa il criterio "SyncDisabled". - Se il criterio viene impostato su "Forza accesso al browser", all'utente verrà mostrata una finestra di dialogo di selezione dell'account, da cui dovrà scegliere un account a cui accedere per usare il browser. Questa misura garantisce l'applicazione, nell'ambito degli account gestiti, dei criteri associati all'account. La funzione Sincronizzazione Chrome viene attivata per impostazione predefinita per l'account, ad eccezione del caso in cui la sincronizzazione sia stata disattivata dall'amministratore di dominio o tramite il criterio "SyncDisabled". Il valore predefinito del criterio BrowserGuestModeEnabled sarà falso. Tieni presente che i profili esistenti a cui non viene eseguito l'accesso saranno bloccati e inaccessibili dopo l'attivazione di questo criterio. Per ulteriori informazioni, leggi il seguente articolo del Centro assistenza: https://support.google.com/chrome/a/answer/7572556. Questa opzione non supporta Linux e, se utilizzata in tale ambiente, imposterà "Attiva accesso al browser". + Se il criterio viene impostato su "Forza accesso al browser", all'utente verrà mostrata una finestra di dialogo di selezione dell'account, da cui dovrà scegliere un account a cui accedere per usare il browser. Questa misura garantisce l'applicazione, nell'ambito degli account gestiti, dei criteri associati all'account. La funzione Sincronizzazione Chrome viene attivata per impostazione predefinita per l'account, ad eccezione del caso in cui la sincronizzazione sia stata disattivata dall'amministratore di dominio o tramite il criterio "SyncDisabled". Il valore predefinito del criterio BrowserGuestModeEnabled sarà falso. Tieni presente che i profili esistenti a cui non viene eseguito l'accesso saranno bloccati e inaccessibili dopo l'attivazione di questo criterio. Per ulteriori informazioni, leggi il seguente articolo del Centro assistenza: https://support.google.com/chrome/a/answer/7572556. Questa opzione non supporta Linux e Android e, se utilizzata in tali ambienti, imposterà "Attiva accesso al browser". Se questo criterio non è impostato, l'utente potrà decidere se attivare o meno l'opzione di accesso al browser e di usarla in base alle necessità.</translation> <translation id="532848608876725157">Attiva DNS over HTTPS con fallback non sicuro</translation> @@ -3276,13 +3291,13 @@ Gli URL (ad esempio https://example.com/some/path) corrisponderanno soltanto ad appID U2F. I domini (come example.com) corrisponderanno soltanto a ID RP webauthn. Di conseguenza, per includere entrambe le API U2F e webauthn per un determinato sito, devono essere elencati sia il dominio sia l'URL appID.</translation> <translation id="5836064773277134605">Limita l'intervallo di porte UDP utilizzate dall'host di accesso remoto</translation> -<translation id="5844300486330234296">Controlla la whitelist dei pattern URL su cui è sempre attivata la riproduzione automatica. +<translation id="5844300486330234296">Consente di controllare la whitelist dei pattern URL su cui è sempre attivata la riproduzione automatica. Se la riproduzione automatica è attivata, i video possono essere riprodotti automaticamente (ovvero senza il consenso dell'utente) in <ph name="PRODUCT_NAME" />. Se il criterio AutoplayAllowed è impostato su vero, questo criterio non avrà effetto. - Se il criterio AutoplayAllowed è impostato su falso, i pattern URL configurati in questo criterio potranno ancora essere riprodotti. + Se il criterio AutoplayAllowed è impostato su falso, i pattern URL configurati in questo criterio potranno comunque essere riprodotti. Tieni presente che, se <ph name="PRODUCT_NAME" /> è in esecuzione e il criterio cambia, sarà applicato solo alle nuove schede aperte. Pertanto alcune schede potrebbero continuare a osservare il comportamento precedente. @@ -3408,6 +3423,7 @@ <translation id="6111936128861357925">Attiva il gioco del dinosauro</translation> <translation id="6114416803310251055">obsoleto</translation> <translation id="6133088669883929098">Consenti a tutti i siti di utilizzare la generazione di chiavi</translation> +<translation id="6135398260575578389">Navigazione sicura è attiva in modalità avanzata. Questa modalità fornisce maggior sicurezza, ma non richiede la condivisione di ulteriori dati di navigazione con Google.</translation> <translation id="6136537398661737682">Questo criterio consente di controllare lo stato iniziale dei Servizi di geolocalizzazione di Google. Se questo criterio non viene configurato o viene impostato su <ph name="GLS_DISABLED" />, i Servizi di geolocalizzazione di Google sono inizialmente disattivati. @@ -4385,6 +4401,23 @@ <translation id="7687943045976362719">Se questa norma viene impostata, i tipi di contenuto specificati vengono gestiti da <ph name="PRODUCT_FRAME_NAME" />. Se la norma non viene impostata, verrà utilizzato per tutti i siti il renderer predefinito. (È possibile utilizzare la norma <ph name="CHROME_FRAME_RENDERER_SETTINGS_POLICY_NAME" /> per configurare il renderer predefinito).</translation> +<translation id="7691028179743802462">Questo criterio è obsoleto in M83, utilizza invece SafeBrowsingProtectionLevel. + + Consente di attivare la funzionalità Navigazione sicura di <ph name="PRODUCT_NAME" /> e di impedire agli utenti di modificare questa impostazione. + + Se attivi questa impostazione, la Navigazione sicura è sempre attiva. + + Se la disattivi, la Navigazione sicura non è mai attiva. + + Se attivi questa impostazione o la disattivi, gli utenti non potranno modificare o ignorare l'impostazione "Attiva protezione contro phishing e malware" in <ph name="PRODUCT_NAME" />. + + Se questo criterio non viene impostato, l'impostazione verrà attivata ma gli utenti non potranno modificarla. + + Visita il sito https://developers.google.com/safe-browsing per ulteriori informazioni sulla funzionalità Navigazione sicura. + + Questo criterio è disponibile esclusivamente per le istanze di Windows che fanno parte di un dominio <ph name="MS_AD_NAME" /> così come per le istanze di Windows 10 Pro o Enterprise registrate per la gestione dei dispositivi. + + Se il criterio SafeBrowsingProtectionLevel è impostato, il valore del criterio SafeBrowsingEnabled verrà ignorato.</translation> <translation id="7694245791806617022">Consente di controllare se la funzionalità "Ricorda password" è attiva nella finestra di dialogo dell'autenticazione Kerberos. Le password sono memorizzate criptate su disco, accessibili solo al demone del sistema Kerberos durante una sessione utente. Se il criterio è attivato o non configurato, gli utenti possono decidere se le password Kerberos vengono ricordate, in modo da non dovere essere inserite nuovamente. Le richieste di Kerberos vengono recuperate automaticamente, a meno che non sia necessaria un'ulteriore autenticazione (autenticazione a due fattori). @@ -4750,9 +4783,9 @@ <translation id="8331479227794770304">Attiva tasti permanenti</translation> <translation id="8339420913453596618">Autenticazione a due fattori disattivata</translation> <translation id="8344454543174932833">Importa Preferiti dal browser predefinito alla prima esecuzione</translation> -<translation id="8351446723835838047">Consente di impostare un elenco di pattern URL che specifica i siti autorizzati a utilizzare la generazione di chiavi. Se un pattern URL è indicato in "KeygenBlockedForUrls", quest'ultimo ha la precedenza su queste eccezioni. +<translation id="8351446723835838047">Consente di impostare un elenco di pattern URL che specificano i siti autorizzati a utilizzare la generazione di chiavi. Se un pattern URL è indicato in "KeygenBlockedForUrls", ha la precedenza su queste eccezioni. - Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultKeygenSetting" se impostato) o della configurazione personale dell'utente (se non impostato). + Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultKeygenSetting" (se impostato) o della configurazione personale dell'utente (se non impostato). Per informazioni dettagliate sui pattern URL validi, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="8357681633047935212">Limita la durata di una sessione utente</translation> @@ -4958,10 +4991,11 @@ Se questo criterio non viene impostato, per tutti i siti viene usato il valore predefinito globale del criterio "DefaultWebUsbGuardSetting" (se impostato) o della 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. Non viene specificato quale dei due criteri debba avere precedenza se un URL presenta corrispondenze con entrambe. + I pattern URL di questo criterio non devono essere in conflitto con quelli configurati tramite il criterio WebUsbBlockedForUrls. Non viene specificato quale dei due criteri debba avere precedenza se un URL presenta corrispondenze con entrambi. Per informazioni dettagliate sui pattern URL validi, consulta https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="8661297125441579970">Non consentire migrazione dei dati e ARC.</translation> +<translation id="8665314828727504286">Livello di protezione Navigazione sicura</translation> <translation id="8672321184841719703">Scegli versione target dell'aggiornamento automatico</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> <translation id="8685024486845674965">L'avviso di protezione tramite password viene attivato se vengono riutilizzate password</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 57e16f8..524228d9 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -2148,7 +2148,7 @@ 이 설정이 사용 중지되거나, 설정되지 않거나, 빈 목록으로 설정되면 어떤 계정을 사용하든 호스트를 공유할 수 있습니다. - RemoteAccessHostDomain이 있는 경우 이 설정이 우선 적용됩니다. + RemoteAccessHostDomain이 있더라도 이 설정이 우선 적용됩니다. RemoteAccessHostClientDomainList도 참조하세요.</translation> <translation id="4056910949759281379">SPDY 프로토콜 사용 중지</translation> @@ -3900,7 +3900,7 @@ <translation id="6734521799274931721">Chrome OS의 네트워크 파일 공유 가능 여부를 제어합니다.</translation> <translation id="6735701345096330595">언어 맞춤법 검사 강제 사용</translation> <translation id="6757613329154374267">백업 및 복원 사용 설정됨</translation> -<translation id="6758659208493449452">이 정책은 고급 보호 프로그램에 등록한 사용자에게 추가 보호를 제공할지 결정합니다. 추가 기능 중 일부를 사용하려면 Google과 데이터를 공유해야 합니다. 예를 들어, 고급 보호 사용자가 멀웨어 검사를 위해 다운로드한 파일을 Google에 전송할 수 있습니다. 정책을 True로 설정하거나 설정하지 않으면 등록된 사용자에게 추가 보호가 제공됩니다. False로 설정하면 고급 보호 사용자에게 표준 소비자 기능만 제공됩니다.</translation> +<translation id="6758659208493449452">이 정책은 고급 보호 프로그램에 등록한 사용자에게 추가 보호를 제공할지 결정합니다. 추가 기능 중 일부를 사용하려면 Google과 데이터를 공유해야 합니다. 예를 들어, 고급 보호 사용자가 멀웨어 검사를 위해 다운로드 항목을 Google에 전송할 수 있습니다. 정책을 True로 설정하거나 설정하지 않으면 등록된 사용자에게 추가 보호가 제공됩니다. False로 설정하면 고급 보호 사용자에게 표준 소비자 기능만 제공됩니다.</translation> <translation id="6762235610019366960"><ph name="PRODUCT_NAME" />에서의 전체 탭 프로모션 및/또는 교육용 콘텐츠 표시를 제어할 수 있습니다. 구성되지 않거나 사용 설정(True로 설정)되면 <ph name="PRODUCT_NAME" />에서 전체 탭 콘텐츠를 표시하여 사용자에게 제품 정보를 제공할 수 있습니다. @@ -4388,7 +4388,7 @@ 이 설정이 사용 중지되거나, 설정되지 않거나, 빈 목록으로 설정되면 연결 유형에 관한 기본 정책이 적용됩니다. 원격 지원의 경우 이 정책은 어떤 도메인의 클라이언트든 호스트에 연결할 수 있도록 허용합니다. 단, 상시 원격 액세스의 경우 호스트 소유자만이 연결할 수 있습니다. - RemoteAccessHostClientDomain이 있는 경우 이 설정이 우선 적용됩니다. + RemoteAccessHostClientDomain이 있더라도 이 설정이 우선 적용됩니다. RemoteAccessHostDomainList도 참조하세요.</translation> <translation id="7509496865303347769"><ph name="PRODUCT_NAME" />의 기본 홈페이지 URL을 설정하며 사용자가 변경하지 못하게 차단합니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index e8f5972..1c53ba12 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -144,7 +144,7 @@ Als dit beleid niet is ingesteld, wordt gesproken feedback uitgeschakeld als het inlogscherm voor het eerst wordt weergegeven. Gebruikers kunnen gesproken feedback op elk gewenst moment in- of uitschakelen. De status op het inlogscherm is van toepassing op alle gebruikers. Opmerking: <ph name="DEVICE_LOGIN_SCREEN_SPOKEN_FEEDBACK_ENABLED_POLICY_NAME" /> overschrijft dit beleid als het voorgaande is opgegeven.</translation> -<translation id="1128717055763152639">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd waarop blokkeerbare (actieve) gecombineerde content (zoals HTTP-content op een HTTPS-site) mag worden weergegeven en waarvoor optioneel blokkeerbare gecombineerde content wordt uitgeschakeld. +<translation id="1128717055763152639">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop blokkeerbare (actieve) gecombineerde content (zoals HTTP-content op een HTTPS-site) mag worden weergegeven en waarvoor optioneel blokkeerbare gecombineerde content wordt uitgeschakeld. Als dit beleid niet is ingesteld, wordt blokkeerbare gecombineerde content geblokkeerd en wordt optioneel blokkeerbare gecombineerde content geüpgraded. Bovendien kunnen gebruikers uitzonderingen instellen om dergelijke content toe te staan voor specifieke sites. @@ -334,7 +334,7 @@ <translation id="1474273443907024088">TLS False Start uitschakelen</translation> <translation id="1477934438414550161">TLS 1.2</translation> <translation id="1486021504508098388">Informatie over schermverlichting melden</translation> -<translation id="1497640071678474358">Hiermee kun je een lijst met URL-patronen opgeven waarmee sites worden gespecificeerd waarop geen pop-ups mogen worden geopend. +<translation id="1497640071678474358">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop geen pop-ups mogen worden geopend. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultPopupsSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -499,7 +499,7 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige URL-patronen.</translation> <translation id="1767673020408652620">App-aanbevelingen inschakelen voor de nulstatus van het zoekvak</translation> -<translation id="1777842213242723063">Hiermee kun je een lijst met URL-patronen opgeven waarmee sites worden gespecificeerd waarop de plug-in <ph name="FLASH_PLUGIN_NAME" /> niet mag worden uitgevoerd. +<translation id="1777842213242723063">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop de plug-in <ph name="FLASH_PLUGIN_NAME" /> niet mag worden uitgevoerd. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultPluginsSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -1052,7 +1052,7 @@ Wanneer dit beleid niet is geconfigureerd of is ingesteld op 'Sites niet filteren op content voor volwassenen', worden de sites niet gefilterd. Wanneer dit beleid is ingesteld op 'Sites op hoofdniveau filteren op inhoud voor volwassenen', worden de sites gefilterd die zijn geclassificeerd als pornografisch.</translation> -<translation id="2484356232170636726">Hiermee kun je een lijst met URL-patronen opgeven waarmee sites worden gespecificeerd waarop JavaScript mag worden uitgevoerd. +<translation id="2484356232170636726">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop JavaScript mag worden uitgevoerd. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultJavaScriptSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -1178,6 +1178,7 @@ <translation id="2592162121850992309">Als dit beleid is ingesteld op 'true' of niet is ingesteld, wordt hardwareversnelling ingeschakeld, tenzij een specifieke GPU-functie op de blacklist wordt gezet. Als dit beleid is ingesteld op 'false', wordt hardwareversnelling uitgeschakeld.</translation> +<translation id="2593762551209145088">Safe Browsing is nooit actief.</translation> <translation id="2596260130957832043">Bepaalt of NTLMv2 is ingeschakeld. Alle recente versies van Samba en Windows-servers ondersteunen NTLMv2. Dit moet alleen worden uitgeschakeld voor achterwaartse compatibiliteit en vermindert de beveiliging van verificatie. @@ -1255,6 +1256,7 @@ Zie https://developers.google.com/safe-browsing voor meer informatie over Safe Browsing.</translation> <translation id="2706708761587205154">Afdrukken alleen toestaan met pincode</translation> +<translation id="2707873794476722903">Safe Browsing is actief in de standaardmodus.</translation> <translation id="2710534340210290498">Als dit beleid wordt ingesteld op 'false', kunnen gebruikers het scherm niet vergrendelen (alleen uitloggen van de gebruikerssessie is mogelijk). Als deze instelling is ingesteld op 'true' of niet is ingesteld, kunnen gebruikers die verificatie met een wachtwoord hebben uitgevoerd het scherm vergrendelen.</translation> <translation id="2731627323327011390">Gebruik van certificaten van <ph name="PRODUCT_OS_NAME" /> voor ARC-apps uitschakelen</translation> <translation id="2742843273354638707">De app en voettekstlink voor de Chrome Web Store verbergen op de pagina 'Nieuw tabblad' en in de App Launcher van <ph name="PRODUCT_OS_NAME" />. @@ -1599,7 +1601,7 @@ Deze meldingen worden alleen weergegeven als de SAML-identiteitsprovider tijdens de SAML-inlogprocedure informatie over het verlopen van het wachtwoord verzendt naar het apparaat. Als dit beleid is ingesteld, kan de gebruiker het niet wijzigen of overschrijven.</translation> -<translation id="3312835062252480209">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die geen sleutels mogen genereren. Als een URL-patroon in 'KeygenBlockedForUrls' wordt vermeld, worden deze uitzonderingen door dit beleid overschreven. +<translation id="3312835062252480209">Hiermee kun je een lijst met URL-patronen opgeven van sites die geen sleutels mogen genereren. Als een URL-patroon in 'KeygenBlockedForUrls' wordt vermeld, worden deze uitzonderingen door dit beleid overschreven. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultKeygenSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -1833,12 +1835,12 @@ Dit beleid wordt gebruikt door cloud-beleidsinschrijving voor machinebereik op desktop en kan worden ingesteld via register of GPO op Windows, plist op Mac en JSON-beleidsbestand op Linux.</translation> <translation id="3660562134618097814">SAML IdP-cookies overdragen tijdens het inloggen</translation> -<translation id="3684866411224031107">Hiermee kun je een lijst met URL-patronen opgeven waarmee sites worden gespecificeerd waarop de plug-in <ph name="FLASH_PLUGIN_NAME" /> mag worden uitgevoerd. +<translation id="3684866411224031107">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop de plug-in <ph name="FLASH_PLUGIN_NAME" /> mag worden uitgevoerd. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultPluginsSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige URL-patronen.</translation> -<translation id="3688225008199664446">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die de gebruiker niet mogen vragen om toegang tot een USB-apparaat. +<translation id="3688225008199664446">Hiermee kun je een lijst met URL-patronen opgeven van sites die de gebruiker niet mogen vragen om toegang tot een USB-apparaat. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultWebUsbGuardSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -2355,6 +2357,19 @@ <translation id="437791893267799639">Beleid niet ingesteld, gegevensmigratie en ARC niet toestaan</translation> <translation id="4389073105055031853">Gebruikers toestaan alle certificaten te beheren</translation> <translation id="4389091865841123886">De externe bevestiging configureren met een TPM-mechanisme.</translation> +<translation id="4401496838830169080">Hiermee kun je bepalen of de Safe Browsing-functie van <ph name="PRODUCT_NAME" /> moet zijn ingeschakeld en in welke modus de functie actief moet zijn. + + Als dit beleid is ingesteld op 'NoProtection' (waarde 0), is Safe Browsing nooit actief. + + Als dit beleid is ingesteld op 'StandardProtection' (waarde 1, de standaardinstelling), is Safe Browsing altijd actief in de standaardmodus. + + Als dit beleid is ingesteld op 'EnhancedProtection' (waarde 2), is Safe Browsing altijd actief in de uitgebreide modus. Deze modus biedt betere beveiliging, maar vereist dat er meer browsegegevens worden gedeeld met Google. + + Als je dit beleid instelt als verplicht, kunnen gebruikers de instelling voor Safe Browsing in <ph name="PRODUCT_NAME" /> niet wijzigen of overschrijven. + + Als dit beleid niet is ingesteld, is Safe Browsing ingeschakeld voor de standaard beveiligingsmodus, maar kunnen gebruikers deze instelling wijzigen. + + Zie https://developers.google.com/safe-browsing voor meer informatie over Safe Browsing.</translation> <translation id="4408428864159735559">Lijst met vooraf geconfigureerde netwerkfileshares.</translation> <translation id="4410236409016356088">Netwerkbandbreedtebeperking inschakelen</translation> <translation id="441217499641439905">Google Drive uitschakelen via mobiele verbindingen in de app Bestanden van <ph name="PRODUCT_OS_NAME" /></translation> @@ -2605,7 +2620,7 @@ Als het beleid is ingesteld op False of niet is ingesteld, worden de OS-updategegevens niet gerapporteerd. Als het beleid is ingesteld op True, worden de OS-updategegevens gerapporteerd.</translation> <translation id="4858735034935305895">Modus voor volledig scherm toestaan</translation> <translation id="4861767323695239729">De toegestane invoermethoden in een gebruikerssessie configureren</translation> -<translation id="4869603341164509842">Patronen in deze lijst worden vergeleken met de beveiligingsoorsprong van de aanvragende URL. Als een overeenkomst wordt gevonden, wordt toegang tot apparaten voor het vastleggen van video zonder prompt toegestaan. +<translation id="4869603341164509842">Patronen in deze lijst worden vergeleken met de beveiligingsoorsprong van de aanvragende URL. Als er een overeenkomst wordt gevonden, wordt toegang tot apparaten voor het vastleggen van video zonder prompt toegestaan. Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige URL-patronen. @@ -2733,7 +2748,7 @@ Als het beleid is ingesteld op 0, wordt het wachtwoord van het computeraccount niet gewijzigd. Wachtwoorden kunnen ouder zijn dan de ingestelde periode als de client langere tijd offline is.</translation> -<translation id="5101600510268095939">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd waarop blokkeerbare (actieve) gecombineerde content (zoals HTTP-content op HTTPS-sites) niet mag worden weergegeven en waarvoor optioneel blokkeerbare (passieve) gecombineerde content wordt geüpgraded. +<translation id="5101600510268095939">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop blokkeerbare (actieve) gecombineerde content (zoals HTTP-content op HTTPS-sites) niet mag worden weergegeven en waarvoor optioneel blokkeerbare (passieve) gecombineerde content wordt geüpgraded. Als dit beleid niet is ingesteld, wordt blokkeerbare gecombineerde content geblokkeerd en wordt optioneel blokkeerbare gecombineerde content geüpgraded. Gebruikers kunnen wel uitzonderingen instellen om dergelijke content toe te staan voor specifieke sites. @@ -2953,7 +2968,7 @@ Als het beleid is ingesteld op 'Inloggen bij browser inschakelen', mag de gebruiker inloggen bij de browser en wordt automatisch ingelogd bij de browser als de gebruiker is ingelogd bij Google-webservices zoals Gmail. Als een gebruiker wordt ingelogd bij de browser, betekent dit dat de accountgegevens van de gebruiker worden bewaard door de browser. Het betekent echter niet dat Chrome-synchronisatie standaard wordt ingeschakeld. De gebruiker moet zich afzonderlijk aanmelden voor gebruik van deze functie. Als dit beleid wordt ingeschakeld, kan de gebruiker de instelling die inloggen bij de browser toestaat, niet uitschakelen. Gebruik het beleid 'SyncDisabled' om de beschikbaarheid van Chrome-synchronisatie te beheren. - Als het beleid is ingesteld op 'Inloggen bij browser afdwingen', krijgt de gebruiker een dialoogvenster voor accountselectie te zien en moet deze een account kiezen en inloggen om de browser te gebruiken. Dit zorgt ervoor dat voor beheerde accounts de aan het account gekoppelde beleidsregels worden toegepast en afgedwongen. Hiermee wordt Chrome-synchronisatie standaard ingeschakeld voor het account, behalve als synchronisatie is uitgeschakeld door de domeinbeheerder of via het beleid 'SyncDisabled'. De standaardwaarde van 'BrowserGuestModeEnabled' wordt ingesteld op 'False'. Houd er rekening mee dat bestaande, niet-ingelogde profielen worden vergrendeld en niet toegankelijk zijn na inschakeling van dit beleid. Bekijk het Helpcentrum-artikel voor meer informatie: https://support.google.com/chrome/a/answer/7572556. Deze optie wordt niet ondersteund voor Linux en wordt bij gebruik op de reserveoptie 'Inloggen bij browser inschakelen' gezet. + Als het beleid is ingesteld op 'Inloggen bij browser afdwingen', krijgt de gebruiker een dialoogvenster voor accountselectie te zien en moet deze een account kiezen en inloggen om de browser te gebruiken. Dit zorgt ervoor dat voor beheerde accounts de aan het account gekoppelde beleidsregels worden toegepast en afgedwongen. Hiermee wordt Chrome-synchronisatie standaard ingeschakeld voor het account, behalve als synchronisatie is uitgeschakeld door de domeinbeheerder of via het beleid 'SyncDisabled'. De standaardwaarde van 'BrowserGuestModeEnabled' wordt ingesteld op 'False'. Houd er rekening mee dat bestaande, niet-ingelogde profielen worden vergrendeld en niet toegankelijk zijn na inschakeling van dit beleid. Bekijk het Helpcentrum-artikel voor meer informatie: https://support.google.com/chrome/a/answer/7572556. Deze optie wordt niet ondersteund voor Linux en Android en wordt bij gebruik op de reserveoptie 'Inloggen bij browser inschakelen' gezet. Als dit beleid niet is ingesteld, kan de gebruiker bepalen of deze de optie voor inloggen bij de browser wil inschakelen en deze naar wens gebruiken.</translation> <translation id="532848608876725157">DNS-over-HTTPS met onveilige fallback inschakelen</translation> @@ -3498,6 +3513,7 @@ <translation id="6111936128861357925">Easter egg-dinosaurusgame toestaan</translation> <translation id="6114416803310251055">verouderd</translation> <translation id="6133088669883929098">Alle sites toestaan sleutels te genereren</translation> +<translation id="6135398260575578389">Safe Browsing is actief in de uitgebreide modus. Deze modus biedt betere beveiliging, maar vereist dat er meer browsegegevens worden gedeeld met Google.</translation> <translation id="6136537398661737682">Met dit beleid wordt de beginstatus van Google-locatieservices beheerd. Als dit beleid niet is geconfigureerd of niet is ingesteld op <ph name="GLS_DISABLED" />, zijn Google-locatieservices aanvankelijk uitgeschakeld. @@ -3763,7 +3779,7 @@ <translation id="6544897973797372144">Als dit beleid is ingesteld op 'True' en het beleid ChromeOsReleaseChannel niet is ingesteld, mogen gebruikers van het registrerende domein het releasekanaal van het apparaat wijzigen. Als dit beleid is ingesteld op 'False', wordt het apparaat vergrendeld op het laatst ingestelde kanaal. Het door de gebruiker geselecteerde kanaal wordt overschreven door het beleid ChromeOsReleaseChannel. Als het beleidskanaal echter stabieler is dan het kanaal dat is geïnstalleerd op het apparaat, wordt het kanaal pas gewijzigd nadat de versie van het stabielere kanaal een hoger versienummer bereikt dan de versie die op het apparaat is geïnstalleerd.</translation> -<translation id="6548795012081567926">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die cookies mogen instellen. +<translation id="6548795012081567926">Hiermee kun je een lijst met URL-patronen opgeven van sites die cookies mogen instellen. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultCookiesSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -4320,7 +4336,7 @@ <translation id="7485730741952775732">Als dit beleid is ingesteld, gebruikt de host voor externe toegang deze URL om verificatietokens van clients voor externe toegang te valideren om zo connecties te accepteren. Moet samen met RemoteAccessHostTokenUrl worden gebruikt. Deze functie is momenteel uitgeschakeld aan de serverzijde.</translation> -<translation id="7490270439948288519">Hiermee kun je een lijst met URL-patronen opgeven waarmee sites worden gespecificeerd waarop pop-ups mogen worden geopend. +<translation id="7490270439948288519">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop pop-ups mogen worden geopend. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultPopupsSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -4363,7 +4379,7 @@ Dit beleid is alleen beschikbaar op Windows-instanties die gekoppeld zijn aan een <ph name="MS_AD_NAME" />-domein of op instanties van Windows 10 Pro of Enterprise die ingeschreven zijn voor apparaatbeheer.</translation> <translation id="7511361072385293666">Als dit beleid wordt ingesteld op 'True' of niet wordt ingesteld, wordt het gebruik van het QUIC-protocol in <ph name="PRODUCT_NAME" /> toegestaan. Als dit beleid wordt ingesteld op 'False', wordt het gebruik van het QUIC-protocol niet toegestaan.</translation> -<translation id="7515572751689937649">Hiermee kun je een lijst met URL-patronen opgeven waarmee sites worden gespecificeerd waarop JavaScript niet mag worden uitgevoerd. +<translation id="7515572751689937649">Hiermee kun je een lijst met URL-patronen opgeven van sites waarop JavaScript niet mag worden uitgevoerd. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultJavaScriptSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -4479,6 +4495,23 @@ <translation id="7687943045976362719">Als dit beleid is ingesteld, worden de opgegeven contenttypen verwerkt door <ph name="PRODUCT_FRAME_NAME" />. Als dit beleid niet is ingesteld, wordt het standaard weergaveprogramma gebruikt voor alle sites. (Het beleid <ph name="CHROME_FRAME_RENDERER_SETTINGS_POLICY_NAME" /> kan worden gebruikt om het standaard weergaveprogramma te configureren.)</translation> +<translation id="7691028179743802462">Dit beleid is beëindigd in M83. Gebruik in plaats daarvan SafeBrowsingProtectionLevel. + + Hiermee schakel je de functie Safe Browsing van <ph name="PRODUCT_NAME" /> in en voorkom je dat gebruikers deze instelling kunnen wijzigen. + + Als je deze instelling inschakelt, is Safe Browsing altijd actief. + + Als je deze instelling uitschakelt, is Safe Browsing nooit actief. + + Als je deze instelling in- of uitschakelt, kunnen gebruikers de instelling 'Bescherming tegen phishing en malware inschakelen' in <ph name="PRODUCT_NAME" /> niet wijzigen of overschrijven. + + Als dit beleid niet is ingesteld, is het beleid ingeschakeld, maar kan de gebruiker dit wijzigen. + + Zie https://developers.google.com/safe-browsing voor meer informatie over Safe Browsing. + + Dit beleid is alleen beschikbaar op Windows-instanties die gekoppeld zijn aan een <ph name="MS_AD_NAME" />-domein of op instanties van Windows 10 Pro of Enterprise die ingeschreven zijn voor apparaatbeheer. + + Als het beleid SafeBrowsingProtectionLevel is ingesteld, wordt de waarde van het beleid SafeBrowsingEnabled genegeerd.</translation> <translation id="7694245791806617022">Beheert of de functie 'Wachtwoord onthouden' is ingeschakeld in het dialoogvenster voor Kerberos-verificatie. Wachtwoorden worden versleuteld opgeslagen op een schijf, alleen toegankelijk voor de systeemdaemon van Kerberos en tijdens een gebruikerssessie. Als dit beleid is ingeschakeld of niet is ingesteld, kunnen gebruikers besluiten of Kerberos-wachtwoorden worden onthouden, zodat deze niet opnieuw hoeven worden ingevoerd. Kerberos-tickets worden automatisch opgehaald tenzij aanvullende verificatie vereist is (verificatie in twee stappen). @@ -4850,7 +4883,7 @@ <translation id="8331479227794770304">Plaktoetsen inschakelen</translation> <translation id="8339420913453596618">Tweede factor uitgeschakeld</translation> <translation id="8344454543174932833">Bladwijzers importeren uit standaardbrowser bij eerste uitvoering</translation> -<translation id="8351446723835838047">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die sleutels mogen genereren. Als een URL-patroon in 'KeygenBlockedForUrls' wordt vermeld, worden deze uitzonderingen overschreven. +<translation id="8351446723835838047">Hiermee kun je een lijst met URL-patronen opgeven van sites die sleutels mogen genereren. Als een URL-patroon in 'KeygenBlockedForUrls' wordt vermeld, worden deze uitzonderingen overschreven. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultKeygenSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -5054,7 +5087,7 @@ Als je dit beleid niet instelt, probeert <ph name="PRODUCT_NAME" /> te detecteren of een server zich in het intranet bevindt en wordt daarna pas gereageerd op IWA-verzoeken. Als een server wordt gedetecteerd als intranet, worden IWA-verzoeken van de server genegeerd door <ph name="PRODUCT_NAME" />.</translation> <translation id="8656110680728938054">'Selecteer om uitgesproken te worden' inschakelen</translation> -<translation id="8659729040032759711">Hiermee kun je een lijst met URL-patronen instellen waarmee sites worden gespecificeerd die de gebruiker mogen vragen de site toegang te geven tot een USB-apparaat. +<translation id="8659729040032759711">Hiermee kun je een lijst met URL-patronen opgeven van sites die de gebruiker mogen vragen de site toegang te geven tot een USB-apparaat. Als dit beleid niet is ingesteld, wordt de algemene standaardwaarde gebruikt voor alle sites. Deze vind je in het beleid 'DefaultWebUsbGuardSetting' (als dit is ingesteld) of in de persoonlijke configuratie van de gebruiker. @@ -5062,6 +5095,7 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige URL-patronen.</translation> <translation id="8661297125441579970">Gegevensmigratie en ARC niet toestaan.</translation> +<translation id="8665314828727504286">Safe Browsing-beveiligingsniveau</translation> <translation id="8672321184841719703">Doelversie voor automatische updates</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> <translation id="8685024486845674965">Waarschuwing voor wachtwoordbeveiliging wordt geactiveerd bij hergebruik van een wachtwoord</translation> @@ -5205,7 +5239,7 @@ Als dit beleid niet is ingesteld, is automatisch klikken in eerste instantie uitgeschakeld op het inlogscherm. De gebruiker kan deze functie op elk gewenst moment inschakelen.</translation> <translation id="8876188741456358123">Hiermee overschrijf je de standaardmodus voor dubbelzijdig afdrukken. Als de modus niet beschikbaar is, wordt dit beleid genegeerd.</translation> -<translation id="8878850056189891727">Patronen in deze lijst worden vergeleken met de beveiligingsoorsprong van de aanvragende URL. Als een overeenkomst wordt gevonden, wordt toegang tot apparaten voor het vastleggen van audio zonder prompt toegestaan. +<translation id="8878850056189891727">Patronen in deze lijst worden vergeleken met de beveiligingsoorsprong van de aanvragende URL. Als er een overeenkomst wordt gevonden, wordt toegang tot apparaten voor het vastleggen van audio zonder prompt toegestaan. Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige URL-patronen.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 9d680a2b..e85feb6 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -1162,6 +1162,7 @@ <translation id="2592162121850992309">Se esta política for definida como verdadeira ou não for definida, a aceleração de hardware será ativada, a menos que um determinado recurso de GPU seja incluído na lista de proibições. Se a política for definida como falsa, a aceleração de hardware será desativada.</translation> +<translation id="2593762551209145088">O "Navegação segura" nunca está ativado.</translation> <translation id="2596260130957832043">Controla se a política NTLMv2 está ativada. Todas as versões recentes dos servidores Samba e Windows são compatíveis com NTLMv2. Esta política só deve ser desativada para compatibilidade com versões anteriores e reduz a segurança da autenticação. @@ -1231,6 +1232,7 @@ Consulte https://developers.google.com/safe-browsing para ver mais informações sobre o recurso "Navegação segura".</translation> <translation id="2706708761587205154">Permitir impressão apenas com PIN</translation> +<translation id="2707873794476722903">O "Navegação segura" está ativo no modo padrão.</translation> <translation id="2710534340210290498">Se esta política for definida como falsa, os usuários não conseguirão bloquear a tela, apenas sair da sessão do usuário. Se esta política for definida como verdadeira ou não for definida, os usuários que tiverem feito a autenticação com uma senha poderão bloquear a tela.</translation> <translation id="2731627323327011390">Desativar o uso de certificados do <ph name="PRODUCT_OS_NAME" /> para apps Arc</translation> <translation id="2742843273354638707">Oculta o link do aplicativo e do rodapé da Chrome Web Store na página "Nova guia" e no iniciador de aplicativos do <ph name="PRODUCT_OS_NAME" />. @@ -2321,6 +2323,19 @@ <translation id="437791893267799639">Política não definida. Bloquear migração de dados e ARC</translation> <translation id="4389073105055031853">Permitir que os usuários gerenciem todos os certificados</translation> <translation id="4389091865841123886">Configurar a declaração remota com mecanismo TPM</translation> +<translation id="4401496838830169080">Permite que você controle se o recurso "Navegação segura" do <ph name="PRODUCT_NAME" /> está ativado e em que modo ele opera. + + Se esta política for definida como "NoProtection" (valor 0), o "Navegação segura" nunca estará ativo. + + Se a política for definida como "StandardProtection" (valor 1, que é o padrão), o "Navegação segura" sempre estará ativo no modo padrão. + + Se a política for definida como "EnhancedProtection" (valor 2), o "Navegação segura" sempre estará ativo no modo avançado, que oferece maior segurança, mas requer o compartilhamento de mais informações de navegação com o Google. + + Se você definir esta política como obrigatória, os usuários não poderão mudar ou substituir a configuração "Navegação segura" no <ph name="PRODUCT_NAME" />. + + Se esta política não for definida, o "Navegação segura" operará no modo "Proteção padrão", mas os usuários poderão mudar a configuração. + + Consulte https://developers.google.com/safe-browsing (em inglês) para ver mais informações sobre o "Navegação segura".</translation> <translation id="4408428864159735559">Lista de compartilhamentos de arquivos de rede pré-configurados.</translation> <translation id="4410236409016356088">Ativar o acelerador de largura de banda da rede</translation> <translation id="441217499641439905">Desativar o Google Drive em conexões celulares no app Arquivos do <ph name="PRODUCT_OS_NAME" /></translation> @@ -3416,6 +3431,7 @@ <translation id="6111936128861357925">Permitir jogo easter egg de dinossauro</translation> <translation id="6114416803310251055">obsoleto</translation> <translation id="6133088669883929098">Permitir que todos os sites usem a geração de chaves</translation> +<translation id="6135398260575578389">O "Navegação segura" está ativo no modo avançado. Esse modo oferece maior segurança, mas requer o compartilhamento de mais informações de navegação com o Google.</translation> <translation id="6136537398661737682">Esta política controla o estado inicial dos Serviços de localização do Google. Quando esta política não estiver configurada ou estiver definida como <ph name="GLS_DISABLED" />, os Serviços de localização do Google estarão inicialmente desativados. @@ -4393,6 +4409,23 @@ <translation id="7687943045976362719">Se esta política for definida, os tipos de conteúdo especificados serão processados pelo <ph name="PRODUCT_FRAME_NAME" />. Se esta política não for definida, o renderizador padrão será usado para todos os sites. A política <ph name="CHROME_FRAME_RENDERER_SETTINGS_POLICY_NAME" /> pode ser usada para configurar o renderizador padrão.</translation> +<translation id="7691028179743802462">Essa política está obsoleta na versão M83, use a SafeBrowsingProtectionLevel. + + Ativa o recurso "Navegação segura" do <ph name="PRODUCT_NAME" /> e impede que os usuários mudem essa configuração. + + Se você ativar a configuração, o "Navegação segura" ficará sempre ativado. + + Se você desativá-la, o "Navegação segura" nunca ficará ativado. + + Se você ativar ou desativar essa configuração, os usuários não poderão mudar ou substituir a configuração "Ativar proteção contra phishing e malware" no <ph name="PRODUCT_NAME" />. + + Se esta política não for definida, a configuração será ativada, mas os usuários não poderão mudá-la. + + Consulte https://developers.google.com/safe-browsing (em inglês) para ver mais informações sobre o "Navegação segura". + + Esta política está disponível apenas em instâncias do Windows associadas a um domínio do <ph name="MS_AD_NAME" /> ou instâncias do Windows 10 Pro ou Enterprise inscritas no gerenciamento de dispositivos. + + Se a política SafeBrowsingProtectionLevel for definida, o valor da política SafeBrowsingEnabled será ignorado.</translation> <translation id="7694245791806617022">Controla se o recurso "Lembrar senha" está ativado na caixa de diálogo de autenticação do Kerberos. As senhas são armazenadas de maneira criptografada no disco e só podem ser acessadas pelo daemon do sistema Kerberos e durante uma sessão do usuário. Se esta política for ativada ou não estiver definida, o usuário poderá decidir se as senhas do Kerberos serão memorizadas, para que ele não precise digitá-las novamente. Os tíquetes do Kerberos serão buscados automaticamente, a não ser que uma autenticação adicional seja necessária (autenticação de dois fatores). @@ -4983,6 +5016,7 @@ Para informações detalhadas sobre padrões de URL válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns (em inglês).</translation> <translation id="8661297125441579970">Bloquear migração de dados e ARC.</translation> +<translation id="8665314828727504286">Nível de proteção do "Navegação segura"</translation> <translation id="8672321184841719703">Versão de atualização automática de destino</translation> <translation id="867410340948518937">Segundo fator universal (U2F, na sigla em inglês)</translation> <translation id="8685024486845674965">O aviso de proteção de senha é acionado pela reutilização da senha</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 69d1e041..117b75ed 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -145,9 +145,9 @@ Если правило не настроено, при первом переходе на экран входа озвучивание текста будет отключено. Пользователь сможет в любое время включить или отключить данную функцию, и эта настройка будет действовать для всех пользователей на экране входа. Примечание. Если настроено правило "<ph name="DEVICE_LOGIN_SCREEN_SPOKEN_FEEDBACK_ENABLED_POLICY_NAME" />", его значение будет иметь приоритет над этим правилом.</translation> -<translation id="1128717055763152639">Позволяет задать список шаблонов URL для указания сайтов, на которых разрешено показывать блокируемый (то есть активный) смешанный контент (например, HTTP-контент на сайтах с протоколом HTTPS) и на которых опционально блокируемый смешанный контент будет отключен. +<translation id="1128717055763152639">Позволяет задать список шаблонов URL для указания сайтов, на которых разрешено показывать блокируемый (то есть активный) смешанный контент (например, HTTP-контент на сайтах с протоколом HTTPS) и на которых изменение протокола опционально блокируемого смешанного контента будет отключено. - Если не настроить это правило, блокируемый смешанный контент будет заблокирован, а для опционально блокируемого смешанного контента будет повышен уровень безопасности. Пользователи смогут создавать исключения, разрешающие показ блокируемого смешанного контента на указанных сайтах. + Если не настроить это правило, блокируемый смешанный контент будет заблокирован, а для опционально блокируемого смешанного контента будет изменен протокол. Пользователи смогут создавать исключения, разрешающие показ блокируемого смешанного контента на указанных сайтах. О допустимых шаблонах URL рассказано на странице https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="1128903365609589950">Определяет на диске каталог, где <ph name="PRODUCT_NAME" /> будет хранить кешированные файлы. @@ -2442,7 +2442,7 @@ Если правило включено принудительно, страницы можно просматривать ТОЛЬКО в режиме инкогнито. Принудительное применение не работает в приложениях Android для устройств Chrome.</translation> <translation id="4600786265870346112">Включение большого курсора</translation> <translation id="4604931264910482931">Создание черного списка для хостов обмена сообщениями с оригинальными приложениями</translation> -<translation id="4614701085541180174">Позволяет создать список шаблонов URL с целью указать сайты, для которых при запросе сертификат клиента будет автоматически выбран на экране входа во фрейме, содержащем механизм аутентификации с использованием SAML. Например, можно задать такие настройки, чтобы сертификат для устройств предоставлялся поставщику идентификационной информации. +<translation id="4614701085541180174">Позволяет создать список шаблонов URL с целью указать сайты, для которых при запросе сертификат клиента будет автоматически выбран на экране входа во фрейме, содержащем механизм аутентификации с использованием SAML. Например, можно задать такие настройки, чтобы поставщику идентификационной информации SAML предоставлялся сертификат устройства. Значение должно представлять собой массив словарей JSON, преобразованных в строки. Каждый словарь должен иметь форму <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />, где <ph name="URL_PATTERN_PLACEHOLDER" /> – это шаблон настроек контента. <ph name="FILTER_PLACEHOLDER" /> определяет набор клиентских сертификатов, из которых браузер будет автоматически выбирать нужный. Независимо от настроек фильтра, в набор будут входить только сертификаты, соответствующие запросу сервера. Если <ph name="FILTER_PLACEHOLDER" /> имеет форму <ph name="JSON_DICTIONARY_EXAMPLE" />, выбираются только клиентские сертификаты, выданные сертификатом с общим именем CommonName <ph name="ISSUER_CN_PLACEHOLDER" />. Если <ph name="FILTER_PLACEHOLDER" /> – пустой словарь {}, к выбору сертификатов не будут применяться никакие дополнительные ограничения. @@ -2699,9 +2699,9 @@ Если задано значение 0, смена пароля аккаунта на компьютере будет отключена. Обратите внимание, что пароли могут оставаться неизменными дольше указанного периода времени, если клиент долгое время не был подключен к Интернету.</translation> -<translation id="5101600510268095939">Позволяет задать список шаблонов URL для указания сайтов, на которых запрещено показывать блокируемый (то есть активный) смешанный контент (например, HTTP-контент на сайтах с протоколом HTTPS) и на которых будет повышен уровень безопасности для опционально блокируемого (то есть пассивного) смешанного контента. +<translation id="5101600510268095939">Позволяет задать список шаблонов URL для указания сайтов, на которых запрещено показывать блокируемый (то есть активный) смешанный контент (например, HTTP-контент на сайтах с протоколом HTTPS) и на которых будет изменен протокол для опционально блокируемого (то есть пассивного) смешанного контента. - Если не настроить это правило, блокируемый смешанный контент будет заблокирован, а для опционально блокируемого смешанного контента будет повышен уровень безопасности. Однако пользователи смогут создавать исключения, разрешающие показ блокируемого смешанного контента на указанных сайтах. + Если не настроить это правило, блокируемый смешанный контент будет заблокирован, а для опционально блокируемого смешанного контента будет изменен протокол. Однако пользователи смогут создавать исключения, разрешающие показ блокируемого смешанного контента на указанных сайтах. О допустимых шаблонах URL рассказано на странице https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="510196893779239086">Это правило определяет, будет ли Chrome полностью закрываться при открытии последней вкладки в альтернативном браузере. @@ -2905,7 +2905,7 @@ <translation id="5323200200131319468">Включить озвучивание текста на экране входа</translation> <translation id="532668836479219203">Это правило определяет, должен ли выполняться вход в браузере. Оно позволяет указать, может ли пользователь входить в <ph name="PRODUCT_NAME" /> с помощью учетных данных своего аккаунта, и настроить доступность связанных с аккаунтом функций (например, синхронизации Chrome). - Если для правила выбрано значение "Отключить вход в браузере", пользователь не сможет выполнить вход в браузере и работать с сервисами, связанными с аккаунтом. В этом случае некоторые функции браузера, например синхронизация Chrome, будут недоступны. Если это значение было выбрано уже после того, как пользователь выполнил вход, то при следующем запуске Chrome произойдет автоматический выход из аккаунта. При этом данные профиля (пароли, закладки и т. д.) останутся сохранены. Пользователь по-прежнему сможет входить в веб-сервисы Google, например Gmail. + Если для правила выбрано значение "Отключить вход в браузере", пользователь не сможет выполнить вход в браузере и работать с сервисами, связанными с аккаунтом. В этом случае некоторые функции браузера, например синхронизация Chrome, будут недоступны. Если это значение было выбрано уже после того, как пользователь выполнил вход, то при следующем запуске Chrome произойдет автоматический выход из аккаунта. При этом данные локального профиля (пароли, закладки и т. д.) останутся сохранены. Пользователь по-прежнему сможет входить в веб-сервисы Google, например Gmail. Если для правила выбрано значение "Включить вход в браузере", пользователь сможет выполнять вход в браузере. При входе в веб-сервисы Google (например, Gmail) вход в браузере будет выполняться автоматически. Если войти в систему через браузер, в нем будет сохраняться информация аккаунта. Однако это не значит, что синхронизация Chrome будет работать по умолчанию – ее понадобится настроить отдельно. Если правило активно, пользователь не сможет отключить функцию, разрешающую вход в браузере. Для управления синхронизацией Chrome предназначено правило SyncDisabled. @@ -3583,9 +3583,9 @@ Если указано значение False, пользователям запрещается переходить на такую страницу.</translation> <translation id="6319198883324703402">Задать время первого уведомления о перезагрузке</translation> <translation id="6342187235303612558">Запретить пользователям загружать и скачивать файлы, для которых не поддерживается функция DLP и проверка на наличие вредоносного ПО</translation> -<translation id="6348718801326095108">Файлы cookie, сохраненные страницами, URL которых совпадает с шаблонами в этом правиле, будут удалены после выхода из браузера. +<translation id="6348718801326095108">Файлы cookie, сохраненные страницами, URL которых совпадает с шаблонами в этом правиле, будут удалены после завершения сеанса, т. е. после выхода из браузера. - Если значение этого правила не задано, для всех сайтов используется глобальное значение по умолчанию из правила DefaultCookiesSetting (если оно настроено, в противном случае применяется пользовательская конфигурация). Такие параметры применяются для сайтов, URL которых не включены в список шаблонов. + Для URL, которые не соответствуют ни одному шаблону из списка, используется глобальное значение по умолчанию из правила DefaultCookiesSetting (если оно настроено, в противном случае применяется пользовательская конфигурация). Если правило не задано, это происходит для всех URL. Обратите внимание, что если <ph name="PRODUCT_NAME" /> работает в фоновом режиме, то сеанс может остаться активным даже после закрытия всех окон браузера. Чтобы настроить этот параметр, воспользуйтесь правилом BackgroundModeEnabled.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index fa06683f..deb35be 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -1160,6 +1160,7 @@ <translation id="2592162121850992309">หากตั้งค่านโยบายนี้เป็น "จริง" หรือไม่ได้ตั้งค่า ระบบจะเปิดใช้การเร่งฮาร์ดแวร์ เว้นแต่ในกรณีที่ฟีเจอร์ GPU อยู่ในบัญชีดำ หากตั้งค่านโยบายนี้เป็น "เท็จ" ระบบจะปิดใช้การเร่งฮาร์ดแวร์</translation> +<translation id="2593762551209145088">Safe Browsing จะไม่ทำงานเลย</translation> <translation id="2596260130957832043">ควบคุมว่าจะเปิดใช้ NTLMv2 ไหม เซิร์ฟเวอร์ Samba และ Windows เวอร์ชันล่าสุดทั้งหมดจะรองรับ NTLMv2 ควรปิดใช้การตั้งค่านี้เฉพาะเมื่อต้องการให้ใช้งานได้กับเวอร์ชันก่อนหน้าเท่านั้น เพราะการปิดใช้จะลดความปลอดภัยในการตรวจสอบสิทธิ์ @@ -1231,6 +1232,7 @@ ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Safe Browsing ได้ที่ https://developers.google.com/safe-browsing</translation> <translation id="2706708761587205154">อนุญาตให้พิมพ์เฉพาะเมื่อมี PIN เท่านั้น</translation> +<translation id="2707873794476722903">Google Safe Browsing ทำงานในโหมดมาตรฐาน</translation> <translation id="2710534340210290498">หากตั้งค่านโยบายนี้เป็น "เท็จ" ผู้ใช้จะล็อกหน้าจอไม่ได้ (จะทำได้เฉพาะออกจากระบบเซสชันผู้ใช้) หากตั้งค่าเป็น "จริง" หรือไม่ได้ตั้งค่า ผู้ใช้ที่ตรวจสอบสิทธิ์ด้วยรหัสผ่านจะล็อกหน้าจอได้</translation> <translation id="2731627323327011390">ปิดการใช้งานใบรับรอง <ph name="PRODUCT_OS_NAME" /> สำหรับแอป ARC</translation> <translation id="2742843273354638707">ซ่อนแอป Chrome เว็บสโตร์ และลิงก์ส่วนท้ายจากหน้าแท็บใหม่ และเครื่องเรียกใช้งานแอป <ph name="PRODUCT_OS_NAME" /> @@ -2319,6 +2321,19 @@ <translation id="437791893267799639">ไม่ได้ตั้งนโยบาย ไม่อนุญาตให้ย้ายข้อมูลและใช้ ARC</translation> <translation id="4389073105055031853">อนุญาตให้ผู้ใช้จัดการใบรับรองทั้งหมด</translation> <translation id="4389091865841123886">กำหนดค่าการยืนยันระยะไกลกับกลไก TPM</translation> +<translation id="4401496838830169080">ให้คุณควบคุมว่าจะเปิดหรือปิดใช้ฟีเจอร์ Google Safe Browsing ของ <ph name="PRODUCT_NAME" /> และกำหนดโหมดการทำงานของฟีเจอร์นี้ + + หากตั้งค่านโยบายนี้เป็น "NoProtection" (ค่า 0) Google Safe Browsing จะไม่ทำงานเลย + + หากตั้งค่านโยบายนี้เป็น "StandardProtection" (ค่า 1 ซึ่งเป็นค่าเริ่มต้น) Google Safe Browsing จะทำงานในโหมดมาตรฐานเสมอ + + หากตั้งค่านโยบายนี้เป็น "EnhancedProtection" (ค่า 2) Google Safe Browsing จะทำงานในโหมดที่ปรับปรุงแล้วเสมอ ซึ่งรักษาความปลอดภัยได้ดีขึ้นแต่ต้องมีการแชร์ข้อมูลการท่องเว็บกับ Google มากขึ้น + + หากตั้งค่านโยบายนี้เป็นแบบบังคับ ผู้ใช้จะเปลี่ยนหรือลบล้างการตั้งค่า Google Safe Browsing ใน <ph name="PRODUCT_NAME" /> ไม่ได้ + + หากไม่ได้ตั้งค่านโยบายนี้ Google Safe Browsing จะทำงานในโหมดการปกป้องแบบมาตรฐาน แต่ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้ + + ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Safe Browsing ได้ที่ https://developers.google.com/safe-browsing</translation> <translation id="4408428864159735559">รายการพื้นที่แชร์ไฟล์ของเครือข่ายที่กำหนดค่าไว้ล่วงหน้า</translation> <translation id="4410236409016356088">เปิดใช้การควบคุมปริมาณแบนด์วิดท์ของเครือข่าย</translation> <translation id="441217499641439905">ปิดใช้ Google ไดรฟ์ผ่านการเชื่อมต่อเครือข่ายมือถือในแอป "ไฟล์" ของ <ph name="PRODUCT_OS_NAME" /></translation> @@ -3424,6 +3439,7 @@ <translation id="6111936128861357925">อนุญาตให้เล่นเกมไดโนเสาร์ที่ซ่อนไว้ได้</translation> <translation id="6114416803310251055">ถูกกำหนดให้เลิกใช้</translation> <translation id="6133088669883929098">อนุญาตให้เว็บไซต์ทั้งหมดใช้การสร้างคีย์</translation> +<translation id="6135398260575578389">Google Safe Browsing ทำงานในโหมดที่ปรับปรุงแล้ว โหมดนี้รักษาความปลอดภัยได้ดีขึ้นแต่ต้องมีการแชร์ข้อมูลการท่องเว็บกับ Google มากขึ้น</translation> <translation id="6136537398661737682">นโยบายนี้ควบคุมสถานะเริ่มต้นของบริการตำแหน่งของ Google เมื่อไม่ได้กำหนดค่านโยบายนี้หรือตั้งค่าเป็น <ph name="GLS_DISABLED" /> บริการตำแหน่งของ Google จะปิดใช้ตั้งแต่เริ่มต้น @@ -4408,6 +4424,23 @@ <translation id="7687943045976362719">หากตั้งค่านโยบายนี้ <ph name="PRODUCT_FRAME_NAME" /> จะจัดการประเภทของเนื้อหาที่ระบุไว้ หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้การแสดงผลเริ่มต้นกับทุกเว็บไซต์ (อาจมีการใช้นโยบาย <ph name="CHROME_FRAME_RENDERER_SETTINGS_POLICY_NAME" /> เพื่อกำหนดค่าการแสดงผลเริ่มต้น)</translation> +<translation id="7691028179743802462">เราเลิกใช้งานนโยบายนี้แล้วใน M83 โปรดใช้ SafeBrowsingProtectionLevel แทน + + เปิดใช้ฟีเจอร์ Google Safe Browsing ของ <ph name="PRODUCT_NAME" /> และป้องกันไม่ให้ผู้ใช้เปลี่ยนการตั้งค่านี้ + + หากคุณเปิดใช้การตั้งค่านี้ Google Safe Browsing จะทำงานอยู่เสมอ + + หากคุณปิดใช้การตั้งค่านี้ Google Safe Browsing จะไม่ทำงานเลย + + หากคุณเปิดหรือปิดใช้การตั้งค่านี้ ผู้ใช้จะเปลี่ยนหรือลบล้างการตั้งค่า "เปิดใช้การป้องกันฟิชชิงและมัลแวร์" ใน <ph name="PRODUCT_NAME" /> ไม่ได้ + + หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะเปิดใช้การตั้งค่านี้แต่ผู้ใช้จะเปลี่ยนได้ + + ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Safe Browsing ได้ที่ https://developers.google.com/safe-browsing + + นโยบายนี้ใช้ได้เฉพาะในอินสแตนซ์ Windows ซึ่งเข้าร่วมโดเมน <ph name="MS_AD_NAME" /> หรืออินสแตนซ์ Windows 10 Pro หรือ Enterprise ที่เข้าร่วมการจัดการอุปกรณ์ + + หากตั้งค่านโยบาย SafeBrowsingProtectionLevel ระบบจะไม่สนใจค่าของนโยบาย SafeBrowsingEnabled</translation> <translation id="7694245791806617022">ควบคุมว่าจะเปิดใช้ฟีเจอร์ "จำรหัสผ่าน" ในกล่องโต้ตอบการตรวจสอบสิทธิ์ Kerberos หรือไม่ จะมีการเข้ารหัสและจัดเก็บรหัสผ่านในดิสก์ ซึ่งจะเข้าถึงได้โดย Daemon ของระบบ Kerberos และระหว่างเซสชันของผู้ใช้เท่านั้น หากเปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า ผู้ใช้จะเลือกได้ว่าจะให้ระบบจำรหัสผ่าน Kerberos หรือไม่ เพื่อที่จะไม่ต้องป้อนรหัสผ่านอีกครั้ง จะมีการดึงข้อมูลตั๋ว Kerberos โดยอัตโนมัติ เว้นแต่จะต้องตรวจสอบสิทธิ์เพิ่มเติม (การตรวจสอบสิทธิ์แบบ 2 ปัจจัย) @@ -5000,6 +5033,7 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ URL ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns</translation> <translation id="8661297125441579970">ไม่อนุญาตให้ย้ายข้อมูลและใช้ ARC</translation> +<translation id="8665314828727504286">ระดับการปกป้องของ Google Safe Browsing</translation> <translation id="8672321184841719703">กำหนดเป้าหมายรุ่นที่อัปเดตอัตโนมัติ</translation> <translation id="867410340948518937">U2F (Universal Second Factor)</translation> <translation id="8685024486845674965">เรียกใช้การแจ้งเตือนการป้องกันด้วยรหัสผ่านเมื่อมีการใช้รหัสผ่านซ้ำ</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 6d91492a..4ef01c8 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1184,6 +1184,7 @@ <translation id="2592162121850992309">Якщо це правило не налаштовано або для нього вибрано значення true, вмикається апаратне прискорення (за умови, що певну функцію ГП не додано в чорний список). Якщо для цього правила вибрано значення false, апаратне прискорення вимикається.</translation> +<translation id="2593762551209145088">Безпечний перегляд завжди вимкнено.</translation> <translation id="2596260130957832043">Визначає, чи ввімкнено NTLMv2. Усі останні версії серверів Samba та Windows підтримують NTLMv2. Цей параметр потрібно вимкнути лише для зворотної сумісності, він зменшує надійність автентифікації. @@ -1255,6 +1256,7 @@ Докладніше про Безпечний перегляд читайте на сторінці https://developers.google.com/safe-browsing.</translation> <translation id="2706708761587205154">Дозволити друк лише з PIN-кодом</translation> +<translation id="2707873794476722903">Безпечний перегляд увімкнено в стандартному режимі.</translation> <translation id="2710534340210290498">Якщо для цього правила вибрано значення false, користувачі не можуть блокувати екран (можна лише вийти із сеансу). Якщо це правило не налаштовано або для нього вибрано значення true, користувачі, які пройшли автентифікацію за допомогою пароля, можуть блокувати екран.</translation> <translation id="2731627323327011390">Заборонити використовувати сертифікати <ph name="PRODUCT_OS_NAME" /> для додатків ARC</translation> <translation id="2742843273354638707">Ховає додаток Веб-магазин Chrome і посилання внизу на сторінці нової вкладки та панелі запуску додатків <ph name="PRODUCT_OS_NAME" />. @@ -2354,6 +2356,19 @@ <translation id="437791893267799639">Правило не налаштовано. Заборонити перенесення даних і ARC</translation> <translation id="4389073105055031853">Дозволити користувачам керувати всіма сертифікатами</translation> <translation id="4389091865841123886">Налаштувати віддалене засвідчення за допомогою механізму TPM.</translation> +<translation id="4401496838830169080">Дозволяє вмикати й вимикати Безпечний перегляд у <ph name="PRODUCT_NAME" />, а також змінювати режим цієї функції. + + Якщо для правила вибрано значення NoProtection (0), Безпечний перегляд завжди вимкнено. + + Якщо для правила вибрано значення StandardProtection (1, установлено за умовчанням), Безпечний перегляд завжди ввімкнено в стандартному режимі. + + Якщо для правила вибрано значення EnhancedProtection (2), Безпечний перегляд завжди ввімкнено в режимі покращеного захисту, який надає вищий рівень безпеки, але в Google надсилатиметься більше інформації. + + Якщо це правило налаштовано як обов'язкове, користувачі не можуть змінити або замінити налаштування Безпечного перегляду в <ph name="PRODUCT_NAME" />. + + Якщо це правило не налаштовано, Безпечний перегляд буде ввімкнено в режимі стандартного захисту, але користувачі можуть змінити цей параметр. + + Докладніше про Безпечний перегляд читайте на сторінці https://developers.google.com/safe-browsing.</translation> <translation id="4408428864159735559">Список попередньо налаштованих мережевих файлообмінників.</translation> <translation id="4410236409016356088">Увімкнути обмеження пропускної спроможності мережі</translation> <translation id="441217499641439905">Вимкнути Google Диск через мобільні з’єднання в додатку Файли в <ph name="PRODUCT_OS_NAME" /></translation> @@ -3472,6 +3487,7 @@ <translation id="6111936128861357925">Дозволити грати в гру Dinosaur Easter Egg</translation> <translation id="6114416803310251055">не рекомендується</translation> <translation id="6133088669883929098">Дозволити всім сайтам генерувати ключі</translation> +<translation id="6135398260575578389">Безпечний перегляд увімкнено в режимі покращеного захисту. Цей режим забезпечує вищий рівень захисту, але в Google надсилатиметься більше інформації.</translation> <translation id="6136537398661737682">Це правило керує початковим станом Служб локації Google. Якщо це правило не налаштовано або має значення <ph name="GLS_DISABLED" />, Служби локації Google вимкнено. @@ -4452,6 +4468,23 @@ <translation id="7687943045976362719">Якщо це правило налаштовано, вказані типи вмісту обробляє<ph name="PRODUCT_FRAME_NAME" />. Якщо це правило не налаштовано, для всіх сайтів використовується засіб обробки за умовчанням. (Його можна налаштувати в правилі <ph name="CHROME_FRAME_RENDERER_SETTINGS_POLICY_NAME" />.)</translation> +<translation id="7691028179743802462">Це правило не підтримується у версії M83. Натомість використовуйте правило SafeBrowsingProtectionLevel. + + Вмикає Безпечний перегляд у <ph name="PRODUCT_NAME" /> і забороняє користувачам змінювати це налаштування. + + Якщо це налаштування ввімкнено, Безпечний перегляд завжди активний. + + Якщо його вимкнено, Безпечний перегляд завжди неактивний. + + Якщо це налаштування ввімкнено або вимкнено, користувачі не можуть змінювати чи замінювати параметр "Активувати захист від фішингу та зловмисного програмного забезпечення" в <ph name="PRODUCT_NAME" />. + + Якщо це правило не налаштовано, його буде ввімкнено, але користувач зможе змінити його. + + Докладніше про Безпечний перегляд читайте на сторінці https://developers.google.com/safe-browsing. + + Це правило доступне лише у версіях Windows, зареєстрованих у домені <ph name="MS_AD_NAME" />, або Windows 10 Pro чи Enterprise, зареєстрованих для керування пристроєм. + + Якщо правило SafeBrowsingProtectionLevel налаштовано, значення правила SafeBrowsingEnabled ігнорується.</translation> <translation id="7694245791806617022">Указує, чи функцію "Запам’ятати пароль" увімкнено у вікні автентифікації Kerberos. Паролі зберігаються зашифрованими на диску. Вони доступні лише диспетчеру системи Kerberos і під час сеансу користувача. Якщо це правило ввімкнено або не налаштовано, користувачі вирішують, чи потрібно запам’ятовувати паролі Kerberos, щоб не вводити їх повторно. Запити Kerberos завантажуються автоматично, якщо не потрібно проходити додатковий крок автентифікації (двохетапна перевірка). @@ -5046,6 +5079,7 @@ Докладніше про дійсні шаблони URL-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.</translation> <translation id="8661297125441579970">Заборонити перенесення даних і ARC.</translation> +<translation id="8665314828727504286">Рівень захисту Безпечного перегляду</translation> <translation id="8672321184841719703">Цільова версія автоматичного оновлення</translation> <translation id="867410340948518937">U2F (універсальний другий фактор)</translation> <translation id="8685024486845674965">Застереження про захист паролем активується під час повторного введення пароля</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 0b32b1e9..981fd4d 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -1991,13 +1991,13 @@ <translation id="402759845255257575">不允许任何网站运行 JavaScript</translation> <translation id="4027608872760987929">启用默认搜索服务提供商</translation> <translation id="4039085364173654945">控制是否允许网页上的第三方子内容弹出 HTTP 基本身份认证对话框。通常情况下,为了防止网上诱骗,此设置是停用的。如果未设置此政策,就会停用此设置,而不允许第三方子内容弹出 HTTP 基本身份认证对话框。</translation> -<translation id="4044054366426171256">配置要强制远程访问主机使用的必要主机域名,并禁止用户更改此设置。 +<translation id="4044054366426171256">配置指定域名来限制主机接受远程访问,并禁止用户更改此设置。 - 如果启用了此设置并将其设为一个或多个域名,则必须使用已通过某一个指定域名注册的帐号才能共享主机。 + 如果启用此设置并将其设为一个或多个域名,则只有使用在这些指定域名注册的帐号才能用主机接受远程访问。 - 如果停用了/不指定此设置,或将其设为一个空列表,则可以使用任意帐号共享主机。 + 如果不进行设置、停用此设置或将其设为一个空列表,则可使用任意账号来用主机接受远程访问。 - 此设置会覆盖 RemoteAccessHostDomain(如果存在)。 + 若曾设置RemoteAccessHostDomain,该设置将被本设置覆盖。 另请参阅 RemoteAccessHostClientDomainList。</translation> <translation id="4056910949759281379">停用 SPDY 协议</translation> @@ -3614,7 +3614,7 @@ <translation id="6734521799274931721">控制是否允许在 Chrome 操作系统中使用网络文件共享功能</translation> <translation id="6735701345096330595">强制检查语言拼写</translation> <translation id="6757613329154374267">已启用备份和恢复服务</translation> -<translation id="6758659208493449452">此政策用于控制已加入“高级保护”计划的用户是否可获享额外的保护。其中的部分功能可能会涉及与 Google 分享数据(例如,已加入“高级保护”计划的用户将能够把他们的下载内容发送给 Google 进行恶意软件扫描)。如果此政策设为 True 或未设置,已加入“高级保护”计划的用户将会获享额外的保护。如果此政策设为 False,已加入“高级保护”计划的用户将只能获享标准的消费者级别功能。</translation> +<translation id="6758659208493449452">此政策决定了加入“高级保护”计划的用户是否可获享额外的保护。其中部分功能可能涉及与 Google 共享数据(例如,加入“高级保护”计划的用户可将他们的下载内容发送给 Google 进行恶意软件扫描)。如果此政策设为 True 或未设置,已加入“高级保护”计划的用户将会获享额外的保护。如果此政策设为 False,已加入“高级保护”计划的用户只能使用标准的消费者级功能。</translation> <translation id="6762235610019366960">让您能够控制是否在 <ph name="PRODUCT_NAME" /> 中使用整个标签页显示宣传内容和/或教育内容。 如果未配置或已启用(设为 true),<ph name="PRODUCT_NAME" /> 便可能会使用整个标签页向用户提供产品信息。 @@ -4069,13 +4069,13 @@ 如果此政策设为“Enabled”或未设置,Google Chrome 将会接受作为 Signed HTTP Exchange 提供的内容。 如果此政策设为“Disabled”,则无法加载 Signed HTTP Exchange。</translation> -<translation id="7506758875409719208">配置要强制远程访问客户端使用的必要客户端域名,并禁止用户更改此设置。 +<translation id="7506758875409719208">配置指定域名来限制客户端进行远程访问,并禁止用户更改此设置。 - 如果启用了此设置并将其设为一个或多个域名,则只有来自某一个指定域名的客户端才能连接到主机。 + 如果启用此设置并将其设为一个或多个域名,则只有来自这些指定域名的客户端才能连接到主机。 - 如果停用了/不指定此设置,或将其设为一个空列表,则会应用与连接类型对应的默认政策。对于远程协助,这会允许来自任何域名的客户端连接到主机;对于无时间限制的远程访问,只有主机所有者可以连接到主机。 + 如果不进行设置、停用此设置或将其设为一个空列表,系统将会应用针对连接类型的默认政策。对于远程协助,来自任何域名的客户端都可连接到主机;对于无时间限制的远程访问,只有主机所有者可以连接到主机。 - 此设置会覆盖 RemoteAccessHostClientDomain(如果存在)。 + 若曾设置RemoteAccessHostClientDomain,该设置将被本设置覆盖。 另请参阅 RemoteAccessHostDomainList。</translation> <translation id="7509496865303347769">配置 <ph name="PRODUCT_NAME" /> 中的默认主页网址,并禁止用户更改此配置。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 1ff85b6..a7c77924 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -134,6 +134,11 @@ 如果不設定這項政策,系統會在初次顯示登入畫面時停用互動朗讀功能。使用者隨時可以啟用或停用互動朗讀功能,且所有使用者的登入畫面將一律維持相同的狀態。 注意:如果指定 <ph name="DEVICE_LOGIN_SCREEN_SPOKEN_FEEDBACK_ENABLED_POLICY_NAME" />,這項政策會遭到覆寫。</translation> +<translation id="1128717055763152639">你可以設定網址模式清單,指定哪些網站能夠顯示可封鎖 (亦即使用中) 混合內容 (亦即 HTTPS 網站上的 HTTP 內容),並指定要停用哪些選擇性可封鎖混合內容的升級功能。 + + 如果不設定這項政策,可封鎖的混合內容將遭到封鎖,且系統會升級選擇性可封鎖混合內容。使用者可以設定例外網站,允許特定網站顯示可封鎖的混合內容。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="1128903365609589950">設定 <ph name="PRODUCT_NAME" /> 在磁碟中儲存快取檔案時所使用的目錄。 如果設定這項政策,無論使用者是否指定「--disk-cache-dir」標記,<ph name="PRODUCT_NAME" /> 都會使用您所提供的目錄。請勿將這項政策設為磁碟區的根目錄或用於其他用途的目錄 (因為 <ph name="PRODUCT_NAME" /> 會管理相關內容),以免遺失資料或發生其他未預期的錯誤。 @@ -256,6 +261,11 @@ 如果停用這項政策,Google 助理將無法存取畫面內容。 如果不設定這項政策,使用者可自行決定是否要允許 Google 助理存取畫面內容</translation> <translation id="1376119291123231789">啟用進階充電模式</translation> +<translation id="1376298389964661475">你可以設定網址模式清單,指定可顯示通知的網站。 + + 如果不設定這項政策,系統會根據「DefaultNotificationsSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="1377134027840513298">請注意,這項政策已遭淘汰,並將在 <ph name="PRODUCT_OS_NAME" />第 82 版中移除。請改用 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />。 這項政策會針對內容更具體的 <ph name="IDLE_ACTION_AC_POLICY_NAME" /> 和 <ph name="IDLE_ACTION_BATTERY_POLICY_NAME" /> 政策提供備用值。如果設定這項政策,但未設定內容更具體的相關政策,系統就會使用這項政策的值。 @@ -315,6 +325,11 @@ <translation id="1474273443907024088">停用 TLS False Start</translation> <translation id="1477934438414550161">TLS 1.2</translation> <translation id="1486021504508098388">回報背光資訊</translation> +<translation id="1497640071678474358">你可以設定網址模式清單,指定不可開啟彈出式視窗的網站。 + + 如果不設定這項政策,系統會根據「DefaultPopupsSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="1502843533062797703">啟用禁止第三方軟體置入可執行程式碼的政策</translation> <translation id="1507382822467487898"> 設定當裝置插入座架時,要使用的 MAC (媒體存取控制) 位址。 @@ -471,7 +486,19 @@ 你需將政策設為可供 <ph name="PRODUCT_OS_NAME" /> 下載《服務條款》的網址。《服務條款》需為純文字內容,以 MIME 類型 text/plain 提供。不允許任何標記。</translation> <translation id="1750315445671978749">封鎖所有下載作業</translation> +<translation id="1757544636315644531">你可以設定網址模式清單,指定可顯示圖片的網站。 + + 如果不設定這項政策,系統會根據「DefaultImagesSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 請注意,先前我們誤在 Android 裝置上啟用這項政策,但這項功能從未針對 Android 裝置提供完整支援。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="1767673020408652620">在零狀態搜尋框中啟用應用程式推薦</translation> +<translation id="1777842213242723063">你可以設定網址模式清單,指定不可執行 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式的網站。 + + 如果不設定這項政策,系統會根據「DefaultPluginsSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="1781356041596378058">這項政策也可以控制 Android 開發人員選項的存取權。如果將這項政策設為 true,使用者將無法存取開發人員選項。如果將這項政策設為 false 或不予設定,使用者只要在 Android 設定應用程式中輕觸版本號碼 7 次,即可存取開發人員選項。</translation> <translation id="1793346220873697538">預設為停用 PIN 碼列印模式</translation> <translation id="1797233582739332495">顯示週期性提示,要求使用者重新啟動瀏覽器</translation> @@ -878,6 +905,13 @@ 如果將這項政策設為 True,當系統顯示外部通訊協定的確認訊息時,使用者可以選擇「一律開啟」通訊協定,這樣系統日後將不再顯示確認提示。 如果不設定這項政策或設為 False,系統將不會顯示「一律開啟」核取方塊,並會在每次叫用外部通訊協定時向使用者顯示提示。</translation> +<translation id="2406820201690307634">你可以設定網址模式清單,指定不可顯示圖片的網站。 + + 如果不設定這項政策,系統會根據「DefaultImagesSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 請注意,先前我們誤在 Android 裝置上啟用這項政策,但這項功能從未針對 Android 裝置提供完整支援。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="2411817661175306360">密碼保護警告已關閉</translation> <translation id="2411919772666155530">封鎖這些網站的通知</translation> <translation id="2413022450179356125">啟用/停用隱私保護畫面功能。 @@ -1002,6 +1036,11 @@ 如果未設定這項政策,或是將這項政策設為「不要針對成人內容篩選網站」,網站將不會經過篩選。 如果將這項政策設為「針對成人內容篩選頂層網站」,被判定為含有色情內容的網站就會遭到篩除。</translation> +<translation id="2484356232170636726">你可以設定網址模式清單,指定可執行 JavaScript 的網站。 + + 如果不設定這項政策,系統會根據「DefaultJavaScriptSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="2486371469462493753">不強制要求列出的網址符合憑證透明化規定。 這項政策可讓指定的網址中的主機名稱不依憑證透明化規定公開憑證。原本不受信任的憑證 (因未依規定對外公開) 將因此可繼續使用,但系統會因此而不容易偵測到這些主機誤用憑證的情形。 @@ -1346,6 +1385,15 @@ <translation id="2959898425599642200">Proxy 略過規則</translation> <translation id="2960128438010718932">分階段套用更新的時程</translation> <translation id="2960691910306063964">針對遠端存取主機啟用或停用無 PIN 碼驗證機制</translation> +<translation id="2969797921412053304">這項政策會設定哪些網址可在登入畫面的 SAML 流程中,取得使用裝置身分遠端認證機制的存取權。 + + 具體來說,如果網址符合這項政策提供的其中一種模式,系統會允許該網址接收 HTTP 標頭 (其中包含對遠端認證機制驗證問題的回覆),以認證裝置身分及裝置狀態。 + + 如果不設定這項政策或將其設為空白,系統將不允許任何網址在登入畫面使用遠端認證機制。 + + 網址必須採用 HTTPS 架構,例如「https://example.com」。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="2987155890997901449">啟用 ARC</translation> <translation id="2987227569419001736">控制 Web Bluetooth API 使用權限</translation> <translation id="3016255526521614822">將「<ph name="PRODUCT_OS_NAME" />」螢幕鎖定畫面允許的筆記應用程式加入許可清單</translation> @@ -1515,6 +1563,11 @@ 但是,只有當 SAML 識別資訊提供者在 SAML 登入流程中將密碼到期資訊傳送至裝置時,系統才會顯示這些通知。 設定這項政策後,使用者即無法變更或覆寫。</translation> +<translation id="3312835062252480209">你可以設定網址模式清單,指定不可使用金鑰產生功能的網站。如果網址模式也列在「KeygenAllowedForUrls」中,這項政策會覆寫這類例外狀況。 + + 如果不設定這項政策,系統會根據「DefaultKeygenSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="3327195598110816609">不要延遲提供檔案</translation> <translation id="332771718998993005">確定公開為「<ph name="PRODUCT_NAME" />」目的地的名稱。 @@ -1739,6 +1792,18 @@ <translation id="3660510274595679517"> 如果將這項政策設定為 True,系統會強制你註冊雲端管理服務。如果註冊失敗,系統會封鎖 Chrome 啟動程序。如果不設定這項政策或設為 False,你可以選擇是否要註冊雲端管理服務。即使註冊失敗,系統也不會封鎖 Chrome 啟動程序。在桌面註冊機器範圍雲端政策時會使用這項政策,你可以透過 Windows 的登錄檔或 GPO、Mac 的 plist 以及 Linux 的 JSON 政策檔設定這項政策。</translation> <translation id="3660562134618097814">登入時移轉 SAML IdP Cookie</translation> +<translation id="3684866411224031107">你可以設定網址模式清單,指定可執行 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式的網站。 + + 如果不設定這項政策,系統會根據「DefaultPluginsSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> +<translation id="3688225008199664446">你可以設定網址模式清單,指定不可要求使用者授予 USB 裝置存取權的網站。 + + 如果不設定這項政策,系統會根據「DefaultWebUsbGuardSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 這項政策中的網址模式不可與 WebUsbAskForUrls 的設定發生相衝突。如果網址同時符合這兩項政策,系統將無法判斷應優先採用哪項政策。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</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> @@ -2012,11 +2077,11 @@ <translation id="402759845255257575">不允許任何網站執行 JavaScript</translation> <translation id="4027608872760987929">啟用預設搜尋引擎</translation> <translation id="4039085364173654945">控制是否允許網頁上的第三方附屬內容彈出「HTTP 基本驗證」對話方塊。為了防止網路釣魚,這項功能通常會停用。如果未設定這項政策,系統會停用這項功能,並且不允許第三方附屬內容彈出「HTTP 基本驗證」對話方塊。</translation> -<translation id="4044054366426171256">這會設定必要的主機網域名稱並套用到遠端存取主機,同時防止使用者變更這些名稱。 +<translation id="4044054366426171256">這會設定遠端存取主機必須使用的主機網域名稱,同時防止使用者變更這些名稱。 - 如果啟用這項設定並設為一個以上的網域,主機只能透過在任一指定名稱的網域所註冊的帳戶進行共用。 + 如果啟用這項設定並設為一個以上的網域,則須透過以任一指定網域名稱註冊的帳戶才能共用主機。 - 如果停用這項設定、不設定或設為空白清單,則主機可透過任何帳戶進行共用。 + 如果停用這項設定、不設定或設為空白清單,則可透過任何帳戶共用主機。 這項設定會覆寫 RemoteAccessHostDomain 設定 (如有設定的話)。 @@ -2353,6 +2418,13 @@ 如果設為「強制」,使用者只能以無痕模式開啟網頁。請注意,「強制」選項不適用於 Chrome Android 版。</translation> <translation id="4600786265870346112">啟用大型游標</translation> <translation id="4604931264910482931">設定內建訊息傳遞黑名單</translation> +<translation id="4614701085541180174">你可以設定網址模式清單,指定在 SAML 流程代管架構的登入畫面中,系統要為哪些網站自動選取用戶端憑證 (如果網站要求憑證的話)。實際應用範例:設定要提供給 SAML IdP 的裝置通用憑證。 + + 這個值必須是字串化的 JSON 字典陣列。每個字典的格式都必須為 <ph name="DEVICE_LOGIN_SCREEN_AUTO_SELECT_CERTIFICATE_FOR_URLS_EXAMPLE" />,其中 <ph name="URL_PATTERN_PLACEHOLDER" /> 是內容設定模式。<ph name="FILTER_PLACEHOLDER" /> 會限制瀏覽器可自動選取的用戶端憑證。無論是否設定篩選器,瀏覽器都只會選取符合伺服器憑證要求的憑證。如果 <ph name="FILTER_PLACEHOLDER" /> 的格式為 <ph name="JSON_DICTIONARY_EXAMPLE" />,瀏覽器只會選取由 CommonName <ph name="ISSUER_CN_PLACEHOLDER" /> 憑證所核發的用戶端憑證。如果 <ph name="FILTER_PLACEHOLDER" /> 是空白的字典 {},則瀏覽器在選取用戶端憑證時不會受到額外限制。 + + 如果不設定這項政策,系統不會為任何網站自動選取憑證。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="4617338332148204752">在 <ph name="PRODUCT_FRAME_NAME" /> 內略過中繼標記檢查</translation> <translation id="4625915093043961294">設定擴充功能安裝許可清單</translation> <translation id="4632343302005518762">允許 <ph name="PRODUCT_FRAME_NAME" /> 處理下列內容類型</translation> @@ -2475,6 +2547,11 @@ 如果將這項政策設為 False 或不予設定,系統將不會回報作業系統的更新資訊。如果設為 True,則系統會回報作業系統的更新資訊。</translation> <translation id="4858735034935305895">允許全螢幕模式</translation> <translation id="4861767323695239729">設定可在使用者工作階段中使用的輸入法</translation> +<translation id="4869603341164509842">系統會將這份清單中的模式與要求網址的安全性來源進行比對。如果找到相符項目,系統會授權網址存取影片擷取裝置,並且不會提示使用者。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。 + + 注意:在第 45 版以下版本中,這項政策僅支援 Kiosk 模式。</translation> <translation id="487460824085252184">自動遷移,不要求使用者同意。</translation> <translation id="4874982543810021567">在這些網站上封鎖 WebUSB</translation> <translation id="4876805738539874299">已啟用 SSL 最高版本</translation> @@ -2597,6 +2674,11 @@ 如果將這項政策設為 0,就會停用本機帳戶密碼變更功能。 請注意,如果用戶端有很長一段時間處於離線狀態,則即使已過了指定的天數,密碼也可能不會變更。</translation> +<translation id="5101600510268095939">你可以設定網址模式清單,指定哪些網站不能顯示可封鎖 (亦即使用中) 混合內容 (亦即 HTTPS 網站上的 HTTP 內容),並指定要升級哪些選擇性可封鎖 (亦即非使用中) 混合內容。 + + 如果不設定這項政策,可封鎖的混合內容將遭到封鎖,且系統會升級選擇性可封鎖混合內容。但使用者可以設定例外網站,允許特定網站顯示可封鎖的混合內容。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="510196893779239086">這項政策可控管是否要在最後一個 Chrome 分頁改以其他瀏覽器開啟後,完全關閉 Chrome。 如果將這項政策設為 True 或不設定這項政策,當 Chrome 分頁改以其他瀏覽器開啟後,Chrome 中仍會有至少一個分頁保持開啟。 @@ -2793,6 +2875,15 @@ 如果這項政策設為 False,使用者就無法將內容投放至自己的裝置。如果這項政策設為 True,則使用者可投放內容。如果未設定這項政策,使用者就無法將內容投放至已註冊的 Chrome 作業系統裝置,但可投放至未註冊的裝置。</translation> <translation id="5323200200131319468">在登入畫面上啟用互動朗讀功能</translation> +<translation id="532668836479219203">這項政策可控管瀏覽器的登入行為,讓你指定使用者是否能用個人帳戶登入 <ph name="PRODUCT_NAME" />,並使用帳戶相關服務 (例如 Chrome 同步功能)。 + + 如果將這項政策設為「禁止登入瀏覽器」,使用者將無法登入瀏覽器,也無法使用帳戶相關服務。在這種情況下,使用者無法使用瀏覽器層級的功能 (例如 Chrome 同步功能)。如果這項政策在使用者登入瀏覽器後才設為「停用」,則這些已登入的使用者會在下次執行 Chrome 時被登出,但系統仍會保留他們的本機設定檔資料 (例如書籤、密碼等)。使用者仍然可以登入並使用 Gmail 等 Google 網路服務。 + + 如果將這項政策設為「允許登入瀏覽器」,則使用者可以登入瀏覽器,並會在登入 Gmail 等 Google 網路服務後自動登入瀏覽器。在登入瀏覽器的狀態下,瀏覽器會保留使用者的帳戶資訊。不過,Chrome 同步功能不會因此預設為開啟,使用者必須另外選擇啟用這項功能。啟用這項政策後,使用者將無法關閉允許登入瀏覽器的設定。如要控管是否要提供 Chrome 同步功能,請使用「SyncDisabled」政策。 + + 如果將這項政策設為「強制登入瀏覽器」,使用者會看到選取帳戶的對話方塊,而且必須選擇帳並登入戶才能使用瀏覽器。這樣可以確保系統在與該帳戶關聯的所有受管理帳戶中套用並強制執行相關政策。根據預設,這項設定會開啟帳戶的 Chrome 同步功能 (除非網域管理員已停用同步功能,或是另外設定了「SyncDisabled」政策)。BrowserGuestModeEnabled 的預設值將設為 False。請注意,啟用這項政策後,未經簽署的現有設定檔會遭到鎖定,無法再使用。詳情請參閱說明中心文章:https://support.google.com/chrome/a/answer/7572556。這個選項不支援 Linux 和 Android,如果你採用這個選項,系統將改為使用「允許登入瀏覽器」。 + + 如果不設定這項政策,使用者可以決定是否要啟用瀏覽器登入選項,並視需要自行選用。</translation> <translation id="532848608876725157">啟用 DNS-over-HTTPS,而且可以改用不安全查詢</translation> <translation id="5329007337159326804">警告:自 <ph name="PRODUCT_NAME" /> 版本 75 (2019 年 6 月左右推出) 起,我們將全面移除 TLS 最高版本政策。 @@ -3187,6 +3278,17 @@ 網址 (例如 https://example.com/some/path) 只會比對為 U2F appID,網域 (例如 example.com) 則只會比對為 WebAuthn RP ID。因此,如要同時涵蓋指定網站的 U2F API 和 WebAuthn API,必須一併列出 appID 網址和網域。</translation> <translation id="5836064773277134605">限制遠端存取主機所使用的 UDP 通訊埠範圍</translation> +<translation id="5844300486330234296">這項政策可控管要一律啟用自動播放功能的網址模式許可清單。 + + 如果自動播放功能設定為啟用,則 <ph name="PRODUCT_NAME" /> 中的影片和音訊內容可自動播放,無須經過使用者同意。 + + 如果將 AutoplayAllowed 政策設為 True,這項政策不會有任何作用。 + + 如果將 AutoplayAllowed 政策設為 False,這項政策中設定的任何網址模式仍可自動播放內容。 + + 請注意,如果你在 <ph name="PRODUCT_NAME" /> 執行期間變更這項政策,則只有新開啟的分頁會套用變更。因此,有些分頁可能仍會沿用先前的設定。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="5855010364142818361">這項政策可控管從 Internet Explorer 切換至 Chrome 時使用的指令列參數。 如果 Internet Explorer 未安裝「舊版瀏覽器支援」增益集,這項政策將不會生效。 @@ -3431,6 +3533,17 @@ 這項政策設為 False 時,系統會禁止使用者忽略任何警告網頁。</translation> <translation id="6319198883324703402">設定第一次通知使用者重新啟動的時間</translation> <translation id="6342187235303612558">禁止使用者上傳或下載目前不支援 DLP 或惡意軟體掃描的檔案。</translation> +<translation id="6348718801326095108">如果 Cookie 由符合這些網址模式的網頁所設定,則這些 Cookie 僅限在目前的工作階段中有效。也就是說,系統會在瀏覽器關閉時刪除這些 Cookie。 + + 如果網址不符合此處指定的模式,系統會根據「DefaultCookiesSetting」政策 (如有設定) 或使用者的個人設定,對網址套用全域預設值。如果不設定這項政策,系統也會為所有網址採用這種做法。 + + 請注意,如果 <ph name="PRODUCT_NAME" /> 是以「背景模式」運作,當你關閉最後一個瀏覽器視窗時,工作階段可能不會結束,而會持續運作到瀏覽器關閉為止。請參閱「BackgroundModeEnabled」政策,進一步瞭解如何設定這項行為。 + + 另請查看「CookiesAllowedForUrls」和「CookiesBlockedForUrls」政策。請注意,這三項政策的網址模式不可發生衝突,否則系統將無法判斷應優先採用哪項政策。 + + 如果將「RestoreOnStartup」政策設為還原先前工作階段的網址,則系統不會遵循這項政策,並會為這些網站永久儲存 Cookie。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="6352543686437322588">要在延遲時間過後自動登入的裝置本機帳戶。 如果設定這項政策,系統會在使用者於登入畫面停止互動後的一段時間過後,自動登入指定工作階段。你必須已設定裝置本機帳戶 (請參閱 |DeviceLocalAccounts|)。 @@ -3455,6 +3568,13 @@ 如果這項政策設為 False,則不會回報這些使用者。</translation> <translation id="638668187106406971">檢查上傳內容是否違反機密資料保護規則</translation> <translation id="6394350458541421998">我們已於 <ph name="PRODUCT_OS_NAME" />版本 29 中移除這項政策。請改用 PresentationScreenDimDelayScale 政策。</translation> +<translation id="6394657112569857636">你可以設定網址模式清單,指定不可設定 Cookie 的網站。 + + 如果不設定這項政策,系統會根據「DefaultCookiesSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 另請參閱「CookiesAllowedForUrls」和「CookiesSessionOnlyForUrls」政策。請注意,這三項政策的網址模式不可發生衝突,否則系統將無法判斷應優先採用哪項政策。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="6399242659768117666">這項政策可控管系統是否要回報擴充功能和外掛程式資訊。 如果不設定這項政策或設為 True,系統會收集擴充功能和外掛程式資料。 @@ -3554,6 +3674,13 @@ <translation id="6544897973797372144">如果你將這項政策設為「True」,且並未指定 ChromeOsReleaseChannel 政策,則註冊網域的使用者將可變更裝置的發布頻道。如果你將這項政策設為「False」,則系統會將裝置鎖定為先前設定的任何頻道。 ChromeOsReleaseChannel 政策會覆寫使用者選取的頻道,但如果政策設定的頻道比裝置原本安裝的頻道更穩定,則系統只會在更穩定的頻道發布比裝置上安裝的頻道更高的版本時,才會切換至該版本。</translation> +<translation id="6548795012081567926">你可以設定網址模式清單,指定可設定 Cookie 的網站。 + + 如果不設定這項政策,系統會根據「DefaultCookiesSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 另請參閱「CookiesBlockedForUrls」和「CookiesSessionOnlyForUrls」政策。請注意,這三項政策的網址模式不可發生衝突,否則系統將無法判斷應優先採用哪項政策。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="6553143066970470539">螢幕亮度百分比</translation> <translation id="6559057113164934677">不允許任何網站使用攝影機和麥克風</translation> <translation id="6561396069801924653">在系統匣選單中顯示無障礙選項</translation> @@ -3651,6 +3778,11 @@ 如果停用這項政策 (設為 false),<ph name="PRODUCT_NAME" /> 就不會以顯示完整分頁內容的方式向使用者提供產品資訊。 這項設定將決定歡迎頁面顯示與否,歡迎頁面可協助使用者登入 <ph name="PRODUCT_NAME" />,並將其設為預設瀏覽器,或是讓使用者瞭解產品功能。</translation> +<translation id="6764421313777250384">你可以設定網址模式清單,指定不可顯示通知的網站。 + + 如果不設定這項政策,系統會根據「DefaultNotificationsSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="6766216162565713893">允許網站要求使用者授權存取附近的藍牙裝置</translation> <translation id="6770454900105963262">回報運作中資訊站工作階段相關資訊</translation> <translation id="6786747875388722282">擴充功能</translation> @@ -4085,6 +4217,11 @@ <translation id="7485730741952775732">如果設定這項政策,遠端存取主機會使用這個網址,驗證遠端存取用戶端提供的驗證憑證,據此決定是否要接受連線。這項政策必須搭配 RemoteAccessHostTokenUrl 使用。 這項功能目前在伺服器端設為停用。</translation> +<translation id="7490270439948288519">你可以設定網址模式清單,指定可開啟彈出式視窗的網站。 + + 如果不設定這項政策,系統會根據「DefaultPopupsSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="749556411189861380">回報註冊裝置的作業系統和韌體版本。 如果這項政策未設定或設為 True,註冊的裝置會定期回報作業系統和韌體版本。如果設為 False,則不會回報版本資訊。</translation> @@ -4099,7 +4236,7 @@ 如果未設定這項政策或設為啟用,Google Chrome 將接受透過 Signed HTTP Exchange 提供的網路內容。 如果將這項政策設為停用,系統將無法載入 Signed HTTP Exchange。</translation> -<translation id="7506758875409719208">這會設定必要的用戶端網域名稱並套用到遠端存取主機,同時防止使用者變更這些名稱。 +<translation id="7506758875409719208">這會設定遠端存取用戶端必須使用的用戶端網域名稱,同時防止使用者變更這些名稱。 如果啟用這項設定並設為一個以上的網域,只有任一指定網域中的用戶端才能連線到主機。 @@ -4123,6 +4260,11 @@ 這項政策僅適用於已加入 <ph name="MS_AD_NAME" /> 網域的 Windows 執行個體,或是已註冊裝置管理服務的 Windows 10 專業版或企業版執行個體。</translation> <translation id="7511361072385293666">如果這項政策設為 True 或未設定,可在 <ph name="PRODUCT_NAME" /> 中使用 QUIC 通訊協定。 如果這項政策設為 False,則不可使用 QUIC 通訊協定。</translation> +<translation id="7515572751689937649">你可以設定網址模式清單,指定不可執行 JavaScript 的網站。 + + 如果不設定這項政策,系統會根據「DefaultJavaScriptSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="7517845714620372896">指定螢幕亮度百分比。 如果這項政策設定了數值,螢幕初始亮度將調整為該政策值,但使用者之後可進行變更。自動調整亮度功能在這種情況下會停用。 如果這項政策未設定數值,則使用者螢幕控制選項和自動調整亮度功能不會受到影響。 @@ -4589,6 +4731,11 @@ <translation id="8331479227794770304">啟用相黏鍵</translation> <translation id="8339420913453596618">已停用雙重驗證</translation> <translation id="8344454543174932833">第一次執行時從預設瀏覽器匯入書籤</translation> +<translation id="8351446723835838047">你可以設定網址模式清單,指定可使用金鑰產生功能的網站。如果網址模式符合「KeygenBlockedForUrls」的設定,這項政策會覆寫這類例外狀況。 + + 如果不設定這項政策,系統會根據「DefaultKeygenSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="8357681633047935212">限制使用者工作階段的時間長度</translation> <translation id="8359734107661430198">從 2008 年 9 月 2 日開始啟用 ExampleDeprecatedFeature API</translation> <translation id="8367209241899435947">在 Windows 裝置上啟用 Chrome 清理功能</translation> @@ -4796,6 +4943,13 @@ 如果未設定這項政策,<ph name="PRODUCT_NAME" /> 會嘗試偵測伺服器是否位於內部網路,然後回應伺服器傳來的 IWA 要求。如果伺服器位於網際網路,<ph name="PRODUCT_NAME" /> 就會忽略伺服器傳來的 IWA 要求。</translation> <translation id="8656110680728938054">啟用隨選朗讀功能</translation> +<translation id="8659729040032759711">你可以設定網址模式清單,指定可要求使用者授予 USB 裝置存取權的網站。 + + 如果不設定這項政策,系統會根據「DefaultWebUsbGuardSetting」政策 (如有設定) 或使用者的個人設定,將全域預設值套用至所有網站。 + + 這項政策中的網址模式不可與 WebUsbBlockedForUrls 的設定發生衝突。如果網址同時符合這兩項政策,系統將無法判斷應優先採用哪項政策。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。</translation> <translation id="8661297125441579970">不允許資料遷移功能和 ARC。</translation> <translation id="8672321184841719703">指定目標的自動更新版本</translation> <translation id="867410340948518937">U2F (通用雙重驗證)</translation> @@ -4932,6 +5086,11 @@ 如果不設定這項政策,系統會在初次顯示登入畫面時停用自動點擊功能,但使用者隨時可以啟用。</translation> <translation id="8876188741456358123">覆寫預設的雙面列印模式。如果設定的模式不適用,系統會忽略這項政策。</translation> +<translation id="8878850056189891727">系統會將這份清單中的模式與要求網址的安全性來源進行比對。如果找到相符項目,系統會授權網址存取音訊擷取裝置,並且不會提示使用者。 + + 如果想進一步瞭解有效的網址模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。 + + 注意:在第 45 版以下版本中,這項政策僅支援 Kiosk 模式。</translation> <translation id="8882006618241293596">禁止在這些網站上執行 <ph name="FLASH_PLUGIN_NAME" /> 外掛程式</translation> <translation id="8906768759089290519">啟用訪客模式</translation> <translation id="8908294717014659003">讓你設定網站是否允許網站存取媒體擷取裝置。根據預設,系統允許網站存取媒體擷取裝置,你也可設為每當網站要存取媒體擷取裝置時詢問使用者。
diff --git a/components/resources/terms/chromeos/terms_en.html b/components/resources/terms/chromeos/terms_en.html deleted file mode 100644 index b84f4fe..0000000 --- a/components/resources/terms/chromeos/terms_en.html +++ /dev/null
@@ -1,171 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>Chrome OS Terms</title> -<style> -body { font-family:Arial; font-size:13px; } -h2 { font-size:1em; margin-top:0 } -</style> -</head> - -<body> -<div> -<h2>Chrome OS Terms</h2> -<p>BY USING THIS DEVICE, YOU AGREE TO BE BOUND BY THE FOLLOWING TERMS. IF YOU DO NOT AGREE TO THESE TERMS, RETURN THE DEVICE IN ACCORDANCE WITH ITS RETURN POLICY.</p> -<p>The Chrome OS device provided to you includes Chrome OS software, such as the operating system executable code, embedded software, firmware, fonts, and other data, including any updates (referred to collectively as the “Software”). These Terms apply to the Software and your use of the Software with your Chrome OS device. Source code for Chrome OS is available free of charge under open source software license agreements at www.chromium.org.</p> -<p><strong>1. Your relationship with Google</strong></p> -<p>1.1 Your use of the Software and your use of the Software with Google’s products, software, services and web sites (referred to collectively as the “Services” in this document and excluding any services provided to you by Google under a separate written agreement) is subject to the terms of a legal agreement between you and Google. “Google” means Google Inc., whose principal place of business is at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States. This document explains how the agreement is made up, and sets out some of the terms of that agreement.</p> -<p>1.2 Unless otherwise agreed in writing with Google, your agreement with Google will always include, at a minimum, the terms and conditions set out in this document. These are referred to below as the “Universal Terms”. Open source software licenses for Chrome OS source code constitute separate written agreements. To the limited extent that the open source software licenses expressly supersede these Universal Terms, the open source licenses govern your agreement with Google for the use of Chrome OS or specific included components of Chrome OS.</p> -<p>1.3 Your agreement with Google will also include the terms set forth below in the Chrome OS Additional Terms and terms of any Legal Notices applicable to the Services, in addition to the Universal Terms. All of these are referred to below as the “Additional Terms”. Where Additional Terms apply to a Service, these will be accessible for you to read either within, or through your use of, that Service.</p> -<p>1.4 The Universal Terms, together with the Additional Terms, form a legally binding agreement between you and Google in relation to your use of the Software and Services. It is important that you take the time to read them carefully. Collectively, this legal agreement is referred to below as the “Terms”.</p> -<p>1.5 If there is any contradiction between what the Additional Terms say and what the Universal Terms say, then the Additional Terms shall take precedence in relation to that Service or that component of the Software.</p> -<p><strong>2. Accepting the Terms</strong></p> -<p>2.1 In order to use the Software, you must first agree to the Terms. You may not use the Software if you do not accept the Terms.</p> -<p>2.2 You can accept the Terms by:</p> -<p>(A) clicking to accept or agree to the Terms, where this option is made available to you by Google in the user interface; or</p> -<p>(B) by actually using the Software. In this case, you understand and agree that Google will treat your use of the Software as acceptance of the Terms from that point onwards.</p> -<p><strong>3. License from Google</strong></p> -<p>3.1 Google gives you a limited non-exclusive license to use the Software, and any updates provided to you by Google, on the Chrome OS device provided to you. This license is for the sole purpose of enabling you to use and enjoy the Software as provided by Google, in the manner permitted by the Terms.</p> -<p>3.2 Subject to section 1.2, you may not (and you may not permit anyone else to) copy, modify, create a derivative work of, reverse engineer, decompile or otherwise attempt to extract the source code of the Software or any part thereof, unless this is expressly permitted or required by law, or unless you have been specifically told that you may do so by Google, in writing.</p> -<p>3.3 Subject to section 1.2, unless Google has given you specific written permission to do so, you may not assign (or grant a sub-license of) your rights to use the Software, grant a security interest in or over your rights to use the Software, or otherwise transfer any part of your rights to use the Software.</p> -<p><strong>4. Software updates</strong></p> -<p>4.1 The Software may automatically download and install updates from time to time from Google. These updates are designed to improve, enhance and further develop the Software and may take the form of bug fixes, enhanced functions, new software modules and completely new versions. You agree to receive such updates (and permit Google to deliver these to you) as part of your use of the Software.</p> -<p><strong>5. Apps, Extensions, and Themes</strong></p> -<p>5.1 These terms in this section apply if you install apps, extensions, or themes in the Software. Apps are web applications, developed by Google or third parties, that you can install in Chrome OS. Extensions are small software programs, developed by Google or third parties, that can modify and enhance the functionality of the Chrome OS. Themes are a special kind of extension that changes the way the Software looks. Extensions and apps may have greater privileges to access your browser or your computer than regular webpages, including the ability to read and modify your private data.</p> -<p>5.2 From time to time, Chrome OS may check with remote servers (hosted by Google or by third parties) for available updates to apps and extensions, including but not limited to bug fixes or enhanced functionality. You agree that such updates will be automatically requested, downloaded, and installed without further notice to you.</p> -<p>5.3 From time to time, Google may discover an app or extension that violates Google developer terms or other legal agreements, laws, regulations or policies. Chrome OS will periodically download a list of such apps and extensions from Google’s servers. You agree that Google may remotely disable or remove any such app or extension from user systems in its sole discretion.</p> -<p><strong>6. Provision of the Services by Google</strong></p> -<p>6.1 Google has subsidiaries and affiliated legal entities around the world (“Subsidiaries and Affiliates”). Sometimes, these companies will be providing the Services to you on behalf of Google itself. You acknowledge and agree that Subsidiaries and Affiliates will be entitled to provide the Services to you.</p> -<p>6.2 Google is constantly innovating in order to provide the best possible experience for its users. You acknowledge and agree that the form and nature of the Services which Google provides may change from time to time without prior notice to you.</p> -<p>6.3 As part of this continuing innovation, you acknowledge and agree that Google may stop (permanently or temporarily) providing the Services (or any features within the Services) to you or to users generally at Google’s sole discretion, without prior notice to you. You may stop using the Services at any time. You do not need to specifically inform Google when you stop using the Services.</p> -<p>6.4 You acknowledge and agree that if Google disables access to your account, you may be prevented from accessing the Services, your account details or any files or other content which is contained in your account.</p> -<p><strong>7. Use of the Services by you</strong></p> -<p>7.1 You agree to use the Services only for purposes that are permitted by (a) the Terms and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries).</p> -<p>7.2 You agree that you will not engage in any activity that interferes with or disrupts the Services (or the servers and networks which are connected to the Services).</p> -<p>7.3 Unless you have been specifically permitted to do so in a separate agreement with Google, you agree that you will not reproduce, duplicate, copy, sell, trade or resell the Services for any purpose.</p> -<p>7.4 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the Terms and for the consequences (including any loss or damage which Google may suffer) of any such breach.</p> -<p><strong>8. Privacy and your personal information</strong></p> -<p>8.1 For information about Google’s data protection practices, please read Google’s privacy policy at http://www.google.com/privacy.html and at http://www.google.com/chromeos/intl/en/privacy.html. This policy explains how Google treats your personal information, and protects your privacy, when you use the Software and the Services.</p> -<p>8.2 You agree to the use of your data in accordance with Google’s privacy policies.</p> -<p><strong>9. Content in the Services</strong></p> -<p>9.1 You understand that all information (such as data files, written text, computer software, music, audio files or other sounds, photographs, videos or other images) which you may have access to as part of, or through your use of, the Services are the sole responsibility of the person from which such content originated. All such information is referred to below as the “Content.”</p> -<p>9.2 You should be aware that Content presented to you as part of the Services, including but not limited to advertisements in the Services and sponsored Content within the Services may be protected by intellectual property rights which are owned by the sponsors or advertisers who provide that Content to Google (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this Content (either in whole or in part) unless you have been specifically told that you may do so by Google or by the owners of that Content, in a separate agreement.</p> -<p>9.3 Google reserves the right (but shall have no obligation) to pre-screen, review, flag, filter, modify, refuse or remove any or all Content from any Service. For some of the Services, Google may provide tools to filter out explicit sexual content. These tools include the SafeSearch preference settings (see https://support.google.com/websearch/answer/510). In addition, there are commercially available services and software to limit access to material that you may find objectionable.</p> -<p>9.4 You understand that by using the Services you may be exposed to Content that you may find offensive, indecent or objectionable and that, in this respect, you use the Services at your own risk.</p> -<p>9.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any Content that you create, transmit or display while using the Services and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so. You retain copyright and any other rights you already hold in Content which you submit, post or display on or through, the Services.</p> -<p><strong>10. Proprietary rights</strong></p> -<p>10.1 You acknowledge and agree that Google (or Google’s licensors) own all legal right, title and interest in and to the Software and the Services, including any intellectual property rights which subsist in the Software and the Services (whether those rights happen to be registered or not, and wherever in the world those rights may exist).</p> -<p>10.2 Unless you have agreed otherwise in writing with Google, nothing in the Terms gives you a right to use any of Google’s trade names, trade marks, service marks, logos, domain names, and other distinctive brand features.</p> -<p>10.3 If you have been given an explicit right to use any of these brand features in a separate written agreement with Google, then you agree that your use of such features shall be in compliance with that agreement, any applicable provisions of the Terms, and Google's brand feature use guidelines as updated from time to time. These guidelines can be viewed online at http://www.google.com/permissions/guidelines.html (or such other URL as Google may provide for this purpose from time to time).</p> -<p>10.4 Google acknowledges and agrees that it obtains no right, title or interest from you (or your licensors) under these Terms in or to any Content that you submit, post, transmit or display on, or through, the Services, including any intellectual property rights which subsist in that Content (whether those rights happen to be registered or not, and wherever in the world those rights may exist). Unless you have agreed otherwise in writing with Google, you agree that you are responsible for protecting and enforcing those rights and that Google has no obligation to do so on your behalf.</p> -<p>10.5 You agree that you shall not remove, obscure, or alter any proprietary rights notices (including copyright and trade mark notices) which may be affixed to or contained within the Software or the Services.</p> -<p>10.6 Unless you have been expressly authorized to do so in writing by Google, you agree that in using the Services, you will not use any trade mark, service mark, trade name, logo of any company or organization in a way that is likely or intended to cause confusion about the owner or authorized user of such marks, names or logos.</p> -<p><strong>11. Ending your relationship with Google</strong></p> -<p>11.1 The Terms will continue to apply until terminated by either you or Google as set out below.</p> -<p>11.2 Google may at any time, terminate its legal agreement with you if:</p> -<p>(A) you have breached any provision of the Terms (or have acted in manner which clearly shows that you do not intend to, or are unable to comply with the provisions of the Terms); or</p> -<p>(B) Google is required to do so by law (for example, where the provision of the Software or Services to you is, or becomes, unlawful); or</p> -<p>(C) the partner with whom Google offered the Software or Services to you has terminated its relationship with Google or ceased to offer the Software or Services to you; or</p> -<p>(D) Google is transitioning to no longer providing the Software or Services to users in the country in which you are resident or from which you use the service; or</p> -<p>(E) the provision of the Software or Services to you by Google is, in Google’s opinion, no longer commercially viable.</p> -<p>11.3 Nothing in this Section shall affect Google’s rights regarding provision of Software or Services under Section 6 of the Terms.</p> -<p>11.4 When these Terms come to an end, all of the legal rights, obligations and liabilities that you and Google have benefited from, been subject to (or which have accrued over time whilst the Terms have been in force) or which are expressed to continue indefinitely, shall be unaffected by this cessation, and the provisions of paragraph 19.7 shall continue to apply to such rights, obligations and liabilities indefinitely.</p> -<p><strong>12. EXCLUSION OF WARRANTIES</strong></p> -<p>12.1 NOTHING IN THESE TERMS, INCLUDING SECTIONS 12 AND 13, SHALL EXCLUDE OR LIMIT GOOGLE’S WARRANTY OR LIABILITY FOR LOSSES WHICH MAY NOT BE LAWFULLY EXCLUDED OR LIMITED BY APPLICABLE LAW. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR CONDITIONS OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR LOSS OR DAMAGE CAUSED BY NEGLIGENCE, BREACH OF CONTRACT OR BREACH OF IMPLIED TERMS, OR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, ONLY THE LIMITATIONS WHICH ARE LAWFUL IN YOUR JURISDICTION WILL APPLY TO YOU AND OUR LIABILITY WILL BE LIMITED TO THE MAXIMUM EXTENT PERMITTED BY LAW.</p> -<p>12.2 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SOFTWARE AND SERVICES IS AT YOUR SOLE RISK AND THAT THE SOFTWARE AND SERVICES ARE PROVIDED "AS IS" AND “AS AVAILABLE.”</p> -<p>12.3 IN PARTICULAR, GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS DO NOT REPRESENT OR WARRANT TO YOU THAT:</p> -<p>(A) YOUR USE OF THE SOFTWARE AND SERVICES WILL MEET YOUR REQUIREMENTS,</p> -<p>(B) YOUR USE OF THE SOFTWARE AND SERVICES WILL BE UNINTERRUPTED, TIMELY, SECURE OR FREE FROM ERROR,</p> -<p>(C) ANY INFORMATION OBTAINED BY YOU AS A RESULT OF YOUR USE OF THE SOFTWARE AND SERVICES WILL BE ACCURATE OR RELIABLE, AND</p> -<p>(D) THAT DEFECTS IN THE OPERATION OR FUNCTIONALITY OF ANY SOFTWARE PROVIDED TO YOU AS PART OF THE SERVICES WILL BE CORRECTED.</p> -<p>12.4 ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SOFTWARE AND SERVICES IS DONE AT YOUR OWN DISCRETION AND RISK AND THAT YOU WILL BE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM THE DOWNLOAD OF ANY SUCH MATERIAL.</p> -<p>12.5 NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM GOOGLE OR THROUGH OR FROM THE SOFTWARE AND SERVICES SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THE TERMS.</p> -<p>12.6 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.</p> -<p><strong>13. LIMITATION OF LIABILITY</strong></p> -<p>13.1 SUBJECT TO OVERALL PROVISION IN PARAGRAPH 12.1 ABOVE, YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU FOR:</p> -<p>(A) ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL CONSEQUENTIAL OR EXEMPLARY DAMAGES WHICH MAY BE INCURRED BY YOU, HOWEVER CAUSED AND UNDER ANY THEORY OF LIABILITY.. THIS SHALL INCLUDE, BUT NOT BE LIMITED TO, ANY LOSS OF PROFIT (WHETHER INCURRED DIRECTLY OR INDIRECTLY), ANY LOSS OF GOODWILL OR BUSINESS REPUTATION, ANY LOSS OF DATA SUFFERED, COST OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR OTHER INTANGIBLE LOSS;</p> -<p>(B) ANY LOSS OR DAMAGE WHICH MAY BE INCURRED BY YOU, INCLUDING BUT NOT LIMITED TO LOSS OR DAMAGE AS A RESULT OF:</p> -<p>(I) ANY RELIANCE PLACED BY YOU ON THE COMPLETENESS, ACCURACY OR EXISTENCE OF ANY ADVERTISING, OR AS A RESULT OF ANY RELATIONSHIP OR TRANSACTION BETWEEN YOU AND ANY ADVERTISER OR SPONSOR WHOSE ADVERTISING APPEARS ON THE SERVICES;</p> -<p>(II) ANY CHANGES WHICH GOOGLE MAY MAKE TO THE SOFTWARE OR SERVICES, OR FOR ANY PERMANENT OR TEMPORARY CESSATION IN THE PROVISION OF THE SERVICES (OR ANY FEATURES WITHIN THE SOFTWARE OR SERVICES);</p> -<p>(III) THE DELETION OF, CORRUPTION OF, OR FAILURE TO STORE, ANY CONTENT AND OTHER COMMUNICATIONS DATA MAINTAINED OR TRANSMITTED BY OR THROUGH YOUR USE OF THE SOFTWARE OR SERVICES;</p> -<p>(IV) YOUR FAILURE TO PROVIDE GOOGLE WITH ACCURATE ACCOUNT INFORMATION;</p> -<p>(V) YOUR FAILURE TO KEEP YOUR PASSWORD OR ACCOUNT DETAILS SECURE AND CONFIDENTIAL;</p> -<p>13.2 THE LIMITATIONS ON GOOGLE’S LIABILITY TO YOU IN PARAGRAPH 13.1 ABOVE SHALL APPLY WHETHER OR NOT GOOGLE HAS BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.</p> -<p><strong>14. Copyright and trade mark policies</strong></p> -<p>14.1 It is Google’s policy to respond to notices of alleged copyright infringement that comply with applicable international intellectual property law (including, in the United States, the Digital Millennium Copyright Act) and to terminating the accounts of repeat infringers. Details of Google’s policy can be found at http://www.google.com/dmca.html.</p> -<p>14.2 Google operates a trade mark complaints procedure in respect of Google’s advertising business, details of which can be found at http://www.google.com/tm_complaint.html.</p> -<p><strong>15. Advertisements</strong></p> -<p>15.1 Some of the Services are supported by advertising revenue and may display advertisements and promotions. These advertisements may be targeted to the content of information stored on the Services, queries made through the Services or other information.</p> -<p>15.2 The manner, mode and extent of advertising by Google on the Services are subject to change without specific notice to you.</p> -<p>15.3 In consideration for Google granting you access to and use of the Services, you agree that Google may place such advertising on the Services.</p> -<p><strong>16. Other content</strong></p> -<p>16.1 The Services may include hyperlinks to other web sites or content or resources. Google may have no control over any web sites or resources which are provided by companies or persons other than Google.</p> -<p>16.2 You acknowledge and agree that Google is not responsible for the availability of any such external sites or resources, and does not endorse any advertising, products or other materials on or available from such web sites or resources.</p> -<p>16.3 You acknowledge and agree that Google is not liable for any loss or damage which may be incurred by you as a result of the availability of those external sites or resources, or as a result of any reliance placed by you on the completeness, accuracy or existence of any advertising, products or other materials on, or available from, such web sites or resources.</p> -<p><strong>17. Language of the Terms</strong></p> -<p>17.1 Where Google has provided you with a translation of the English language version of the Terms, then you agree that the translation is provided for your convenience only and that the English language versions of the Terms will govern your relationship with Google.</p> -<p>17.2 If there is any contradiction between what the English language version of the Terms says and what a translation says, then the English language version shall take precedence.</p> -<p><strong>18. Changes to the Terms</strong></p> -<p>18.1 Google may make changes to the Universal Terms or Additional Terms from time to time. When these changes are made, Google will make a new copy of the Universal Terms available at http://www.google.com/chromeos/intl/en/eula_text.html and any new Additional Terms will be made available to you from within, or through, the affected Software or Services.</p> -<p>18.2 You understand and agree that if you use the Software or Services after the date on which the Universal Terms or Additional Terms have changed, Google will treat your use as acceptance of the updated Universal Terms or Additional Terms.</p> -<p><strong>19. General legal terms</strong></p> -<p>19.1 Sometimes when you use the Services, you may (as a result of, or in connection with your use of the Services) use a service or download a piece of software, or purchase goods, which are provided by another person or company. Your use of these other services, software or goods may be subject to separate terms between you and the company or person concerned. If so, the Terms do not affect your legal relationship with these other companies or individuals.</p> -<p>19.2 The Terms constitute the whole legal agreement between you and Google and govern your use of the Software or Services (but excluding any services which Google may provide to you under a separate written agreement), and completely replace any prior agreements between you and Google in relation to the Software and Services.</p> -<p>19.3 You agree that Google may provide you with notices, including those regarding changes to the Terms, by email, regular mail, or postings on the Services.</p> -<p>19.4 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the Terms (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google’s rights and that those rights or remedies will still be available to Google.</p> -<p>19.5 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of these Terms is invalid, then that provision will be removed from the Terms without affecting the rest of the Terms. The remaining provisions of the Terms will continue to be valid and enforceable.</p> -<p>19.6 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the Terms and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the Terms which confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the Terms.</p> -<p>19.7 The Terms, and your relationship with Google under the Terms, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the Terms. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.</p> -<p>December 7, 2010</p> -<br> -<hr> -<br> -<h2>Chrome OS Additional Terms</h2> -<p>Your use of any pre-installed apps or extensions provided by Google, unless otherwise indicated, is subject to the terms of service at http://accounts.google.com/TOS. Your use of any pre-installed apps or extensions provided by a third party may be subject to terms provided to you by the third party.</p> -<p>Your use of certain components of the Software is also subject to the following terms:</p> -<p><strong>MPEGLA</strong></p> -<p>THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL AND NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD ( “AVC VIDEO”) AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PARTNER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM.</p> -<p><strong>Adobe</strong></p> -<p>Chrome OS may include one or more components provided by Adobe Systems Incorporated and Adobe Software Ireland Limited (collectively “Adobe”). Your use of the Adobe software as provided by Google (“Adobe Software”) is subject to the following additional terms (the “Adobe Terms”). You, the entity receiving the Adobe Software, will be hereinafter referred to as “Sublicensee.”</p> -<p>1. License Restrictions.</p> -<p>(a) Flash Player, Version 10.x is designed only as a browser plugin. Sublicensee may not modify or distribute this Adobe Software for use as anything but a browser plugin for playing back content on a web page. For example, Sublicensee will not modify this Adobe Software in order to allow interoperation with applications that run outside of the browser (e.g., standalone applications, widgets, device UI).</p> -<p>(b) Sublicensee will not expose any APIs of the Flash Player, Version 10.x through a browser plugin interface in such a way that allows such extension to be used to playback content from a web page as a stand-alone application.</p> -<p>(c) The Chrome-Reader Software may not be used to render any PDF or EPUB documents that utilize digital rights management protocols or systems other than Adobe DRM.</p> -<p>(d) Adobe DRM must be enabled in the Chrome-Reader Software for all Adobe DRM protected PDF and EPUB documents.</p> -<p>(e) The Chrome-Reader Software may not, other than as explicitly permitted by the technical specifications, disable any capabilities provided by Adobe in the Adobe Software, including but not limited to, support for PDF and EPUB formats and Adobe DRM.</p> -<p>2. Electronic Transmission. Sublicensee may allow the download of the Adobe Software from a web site, the Internet, an intranet, or similar technology (an, “Electronic Transmissions”) provided that Sublicensee agrees that any distributions of the Adobe Software by Sublicensee, including those on CD-ROM, DVD-ROM or other storage media and Electronic Transmissions, if expressly permitted, shall be subject to reasonable security measures to prevent unauthorized use. With relation to Electronic Transmissions approved hereunder, Sublicensee agrees to employ any reasonable use restrictions set by Adobe, including those related to security and/or the restriction of distribution to end users of the Sublicensee Product.</p> -<p>3. EULA and Distribution Terms.</p> -<p>(a) Sublicensee shall ensure that the Adobe Software is distributed to end users under an enforceable end user license agreement, in favor of Sublicensee and its suppliers containing at least each of the following minimum terms (the “End-User License”): (i) a prohibition against distribution and copying, (ii) a prohibition against modifications and derivative works, (iii) a prohibition against decompiling, reverse engineering, disassembling, and otherwise reducing the Adobe Software to a human-perceivable form, (iv) a provision indicating ownership of Sublicensee Product (as defined in Section 8) by Sublicensee and its licensors, (v) a disclaimer of indirect, special, incidental, punitive, and consequential damages, and (vi) other industry standard disclaimers and limitations, including, as applicable: a disclaimer of all applicable statutory warranties, to the full extent allowed by law.</p> -<p>(b) Sublicensee shall ensure that the Adobe Software is distributed to Sublicensee’s distributors under an enforceable distribution license agreement, in favor of Sublicensee and its suppliers containing terms as protective of Adobe as the Adobe Terms.</p> -<p>4. Opensource. Sublicensee will not directly or indirectly grant, or purport to grant, to any third party any rights or immunities under Adobe’s intellectual property or proprietary rights that will subject such intellectual property to an open source license or scheme in which there is or could be interpreted to be a requirement that as a condition of use, modification and/or distribution, the Adobe Software be: (i) disclosed or distributed in source code form; (ii) licensed for the purpose of making derivative works; or (iii) redistributable at no charge. For clarification purposes, the foregoing restriction does not preclude Sublicensee from distributing, and Sublicensee will distribute the Adobe Software as bundled with the Google Software, without charge.</p> -<p>5. Additional Terms. With respect to any update, upgrade, new versions of the Adobe Software (collectively “Upgrades”) provided to Sublicenses, Adobe reserves the right to require additional terms and conditions applicable solely to the Upgrade and future versions thereof, and solely to the extent that such restrictions are imposed by Adobe on all licensees of such Upgrade. If Sublicensee does not agree to such additional terms or conditions, Sublicensee will have no license rights with respect to such Upgrade, and Sublicensee’s license rights with respect to the Adobe Software will terminate automatically on the 90th day from the date such additional terms are made available to Sublicensee.</p> -<p>6. Proprietary Rights Notices. Sublicensee shall not, and shall require its distributors not to, delete or in any manner alter the copyright notices, trademarks, logos or related notices, or other proprietary rights notices of Adobe (and its licensors, if any) appearing on or within the Adobe Software or accompanying materials.</p> -<p>7. Technical Requirements. Sublicensee and its distributors may only distribute Adobe Software and/or Upgrade on devices that (i) meet the technical specifications posted on http://www.adobe.com/mobile/licensees, (or a successor web site thereto), and (ii) has been verified by Adobe as set forth below.</p> -<p>8. Verification and Update. Sublicensee must submit to Adobe each Sublicensee product (and each version thereof) containing the Adobe Software and/or Upgrade (“Sublicensee Product”) that do not meet the Device Verification exemption criteria to be communicated by Google, for Adobe to verify. Sublicensee shall pay for each submission made by Sublicensee by procuring verification packages at Adobe’s then-current terms set forth at http://flashmobile.adobe.com/. Sublicensee Product that has not passed verification may not be distributed. Verification will be accomplished in accordance with Adobe’s then-current process described at http://flashmobile.adobe.com/ (“Verification”).</p> -<p>9. Profiles and Device Central. Sublicensee will be prompted to enter certain profile information about the Sublicensee Products either as part of the Verification process or some other method, and Sublicensee will provide such information, to Adobe. Adobe may (i) use such profile information as reasonably necessary to verify the Sublicensee Product (if such product is subject to Verification), and (ii) display such profile information in “Adobe Device Intelligence system,” located at https://devices.adobe.com/partnerportal/, and made available through Adobe’s authoring and development tools and services to enable developers and end users to see how content or applications are displayed in Sublicensee Products (e.g. how video images appear in certain phones).</p> -<p>10. Export. Sublicensee acknowledges that the laws and regulations of the United States restrict the export and re-export of commodities and technical data of United States origin, which may include the Adobe Software. Sublicensee agrees that it will not export or re-export the Adobe Software, without the appropriate United States and foreign governmental clearances, if any.</p> -<p>11. Technology Pass-through Terms.</p> -<p>(a) Except pursuant to applicable permissions or agreements therefor, from or with the applicable parties, Sublicensees shall not use and shall not allow the use of, the Adobe Software for the encoding or decoding of mp3 audio only (.mp3) data on any non-pc device (e.g., mobile phone or set-top box), nor may the mp3 encoders or decoders contained in the Adobe Software be used or accessed by any product other than the Adobe Software. The Adobe Software may be used for the encoding or decoding of MP3 data contained within a swf or flv file, which contains video, picture or other data. Sublicensee shall acknowledge that use of the Adobe Software for non-PC devices, as described in the prohibitions in this section, may require the payment of licensing royalties or other amounts to third parties who may hold intellectual property rights related to the MP3 technology and that Adobe nor Sublicensee has not paid any royalties or other amounts on account of third party intellectual property rights for such use. If Sublicensee requires an MP3 encoder or decoder for such use, Sublicensee is responsible for obtaining the necessary intellectual property license, including any applicable patent rights.</p> -<p>(b) Sublicensee will not use, copy, reproduce and modify (i) the On2 source code (provided hereunder as a component of the Source Code) as necessary to enable the Adobe Software to decode video in the Flash video file format (.flv or .f4v), and (ii) the Sorenson Spark source code (provided hereunder as a component of the Source Code) for the limited purpose of making bug fixes and performance enhancements to the Adobe Software. All codecs provided with the Adobe Software may only be used and distributed as an integrated part of the Adobe Software and may not be accessed by any other application, including other Google applications.</p> -<p>(c) The Source Code may be provided with an AAC codec and/or HE-AAC codec (“the AAC Codec”). Use of the AAC Codec is conditioned on Sublicensee obtaining a proper patent license covering necessary patents as provided by VIA Licensing, for end products on or in which the AAC Codec will be used. Sublicensee acknowledges and agrees that Adobe is not providing a patent license for an AAC Codec under this Agreement to Sublicensee or its sublicensees.</p> -<p>(d) THE SOURCE CODE MAY CONTAIN CODE LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD ("AVC VIDEO") AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR WILL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. See http://www.mpegla.com</p> -<p>12. Update. Sublicensee will not circumvent Google’s or Adobe’s efforts to update the Adobe Software in all Sublicensee’s products incorporating the Adobe Software as bundled with the Google Software (“Sublicensee Products”).</p> -<p>13. Attribution and Proprietary Notices. Sublicensee will list the Adobe Software in publicly available Sublicensee Product specifications and include appropriate Adobe Software branding (specifically excluding the Adobe corporate logo) on the Sublicensee Product packaging or marketing materials in a manner consistent with branding of other third party products contained within the Sublicensee Product.</p> -<p>14. No Warranty. THE ADOBE SOFTWARE IS MADE AVAILABLE TO SUBLICENSEE FOR USE AND REPRODUCTION “AS IS” AND ADOBE MAKES NO WARRANTY AS TO ITS USE OR PERFORMANCE. ADOBE AND ITS SUPPLIERS DO NOT AND CANNOT WARRANT THE PERFORMANCE OR RESULTS OBTAINED BY USING THE ADOBE SOFTWARE. EXCEPT FOR ANY WARRANTY, CONDITION, REPRESENTATION OR TERM TO THE EXTENT TO WHICH THE SAME CANNOT OR MAY NOT BE EXCLUDED OR LIMITED BY LAW APPLICABLE TO SUBLICENSEEIN SUBLICENSEE’S JURISDICTION, ADOBE AND ITS SUPPLIERS MAKE NO WARRANTIES, CONDITIONS, REPRESENTATIONS, OR TERMS (EXPRESS OR IMPLIED WHETHER BY STATUTE, COMMON LAW, CUSTOM, USAGE OR OTHERWISE) AS TO ANY MATTER INCLUDING WITHOUT LIMITATION NONINFRINGEMENT OF THIRD PARTY RIGHTS, MERCHANTABILITY, INTEGRATION, SATISFACTORY QUALITY, OR FITNESS FOR ANY PARTICULAR PURPOSE. SUBLICENSEE AGREES THAT SUBLICENSEE SHALL NOT MAKE ANY WARRANTY, EXPRESS OR IMPLIED, ON BEHALF OF ADOBE.</p> -<p>15. Limitation of Liability. IN NO EVENT WILL ADOBE OR ITS SUPPLIERS BE LIABLE TO SUBLICENSEE FOR ANY DAMAGES, CLAIMS OR COSTS WHATSOEVER OR ANY CONSEQUENTIAL, INDIRECT, OR INCIDENTAL DAMAGES, OR ANY LOST PROFITS OR LOST SAVINGS, EVEN IF AN ADOBE REPRESENTATIVE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS OR FOR ANY CLAIM BY ANY THIRD PARTY. THE FOREGOING LIMITATIONS AND EXCLUSIONS APPLY TO THE EXTENT PERMITTED BY APPLICABLE LAW IN SUBLICENSEE’S JURISDICTION. ADOBE’S AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION WITH THIS AGREEMENT SHALL BE LIMITED TO ONE THOUSAND DOLLARS (US$1,000). Nothing contained in this Agreement limits Adobe’s liability to Sublicensee in the event of death or personal injury resulting from Adobe’s negligence or for the tort of deceit (fraud). Adobe is acting on behalf of its suppliers for the purpose of disclaiming, excluding and/or limiting obligations, warranties and liability as provided in this Agreement, but in no other respects and for no other purpose.</p> -<p>16. Content Protection Terms</p> -<p>(a) Definitions.</p> -<p>“Compliance and Robustness Rules” means the document setting forth compliance and robustness rules for the Adobe Software located at http://www.adobe.com/mobile/licensees, or a successor web site thereto.</p> -<p>“Content Protection Functions” means those aspects of the Adobe Software that are designed to ensure compliance with the Compliance and Robustness Rules, and to prevent playback, copying, modification, redistribution or other actions with respect to digital content distributed for consumption by users of the Adobe Software when such actions are not authorized by the owners of such digital content or its licensed distributors.</p> -<p>“Content Protection Code” means code within certain designated versions of the Adobe Software that enables certain Content Protection Functions.</p> -<p>“Key” means a cryptographic value contained in the Adobe Software for use in decrypting digital content.</p> -<p>(b) License Restrictions. Sublicensee’s right to exercise the licenses with respect to the Adobe Software is subject to the following additional restrictions and obligations. Sublicensee will ensure that Sublicensee’s customers comply with these restrictions and obligations to the same extent imposed on Sublicensee with respect to the Adobe Software; any failure by Sublicensee’s customers to comply with these additional restrictions and obligations shall be treated as a material breach by Sublicensee.</p> -<p>b.1. Sublicensee and customers may only distribute the Adobe Software that meets the Robustness and Compliance Rules as so confirmed by Sublicensee during the verification process described above in the Adobe Terms.</p> -<p>b.2. Sublicensee shall not (i) circumvent the Content Protection Functions of either the Adobe Software or any related Adobe Software that is used to encrypt or decrypt digital content for authorized consumption by users of the Adobe Software, or (ii) develop or distribute products that are designed to circumvent the Content Protection Functions of either the Adobe Software or any Adobe Software that is used to encrypt or decrypt digital content for authorized consumption by users of the Adobe Software.</p> -<p>(c) The Keys are hereby designated as Adobe’s Confidential Information, and Sublicensee will, with respect to the Keys, adhere to Adobe’s Source Code Handling Procedure (to be provided by Adobe upon request).</p> -<p>(d) Injunctive Relief. Sublicensee agrees that a breach of this Agreement may compromise the Content Protection Functions of the Adobe Software and may cause unique and lasting harm to the interests of Adobe and owners of digital content that rely on such Content Protection Functions, and that monetary damages may be inadequate to compensate fully for such harm. Therefore, Sublicensee further agrees that Adobe may be entitled to seek injunctive relief to prevent or limit the harm caused by any such breach, in addition to monetary damages.</p> -<p>17. Intended Third-party Beneficiary. Adobe Systems Incorporated and Adobe Software Ireland Limited are the intended third-party beneficiaries of Google’s agreement with Sublicensee with respect to the Adobe Software, including but not limited to, the Adobe Terms. Sublicensee agrees, notwithstanding anything to the contrary in its agreement with Google, that Google may disclose Sublicensee’s identity to Adobe and certify in writing that Sublicensee has entered into a license agreement with Google which includes the Adobe Terms. Sublicensee must have an agreement with each of its licensees, and if such licensees are allowed to redistribute the Adobe Software, such agreement will include the Adobe Terms.</p> -</div> -</body></html>
diff --git a/components/safe_browsing/content/password_protection/BUILD.gn b/components/safe_browsing/content/password_protection/BUILD.gn index e4143999..26d6f07d 100644 --- a/components/safe_browsing/content/password_protection/BUILD.gn +++ b/components/safe_browsing/content/password_protection/BUILD.gn
@@ -40,6 +40,7 @@ "//components/sessions", "//components/signin/public/base", "//components/signin/public/identity_manager", + "//components/url_formatter", "//content/public/browser:browser", "//net:net", "//third_party/protobuf:protobuf_lite",
diff --git a/components/safe_browsing/content/password_protection/DEPS b/components/safe_browsing/content/password_protection/DEPS index 69b6aa7..c39c8a73 100644 --- a/components/safe_browsing/content/password_protection/DEPS +++ b/components/safe_browsing/content/password_protection/DEPS
@@ -5,6 +5,7 @@ "+components/password_manager/core/browser/password_reuse_detector.h", "+components/sessions", "+components/signin/public/identity_manager/account_info.h", + "+components/url_formatter", "+components/zoom", "+net", "+services/network/public",
diff --git a/components/safe_browsing/content/password_protection/password_protection_request.cc b/components/safe_browsing/content/password_protection/password_protection_request.cc index cfbe5ee..82b2171 100644 --- a/components/safe_browsing/content/password_protection/password_protection_request.cc +++ b/components/safe_browsing/content/password_protection/password_protection_request.cc
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +#include "base/containers/flat_set.h" // 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. @@ -8,6 +8,7 @@ #include <memory> #include "base/bind.h" +#include "base/containers/flat_set.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" #include "base/task/post_task.h" @@ -23,6 +24,7 @@ #include "components/safe_browsing/core/db/allowlist_checker_client.h" #include "components/safe_browsing/core/features.h" #include "components/safe_browsing/core/proto/csd.pb.h" +#include "components/url_formatter/url_formatter.h" #include "components/zoom/zoom_controller.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/render_widget_host_view.h" @@ -30,7 +32,6 @@ #include "net/base/escape.h" #include "net/base/load_flags.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" -#include "net/base/url_util.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/simple_url_loader.h" @@ -77,16 +78,19 @@ std::vector<std::string> matching_domains; matching_domains.reserve(matching_reused_credentials.size()); for (const auto& credential : matching_reused_credentials) { - std::string domain = net::registry_controlled_domains::GetDomainAndRegistry( + // This only works for Web credentials. For Android credentials, there needs + // to be special handing and should use affiliation information instead of + // the signon_realm. + std::string domain = base::UTF16ToUTF8(url_formatter::FormatUrl( GURL(credential.signon_realm), - net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); + url_formatter::kFormatUrlOmitDefaults | + url_formatter::kFormatUrlOmitHTTPS | + url_formatter::kFormatUrlOmitTrivialSubdomains | + url_formatter::kFormatUrlTrimAfterHost, + net::UnescapeRule::SPACES, nullptr, nullptr, nullptr)); matching_domains.push_back(std::move(domain)); } - auto matching_domains_it = - std::unique(matching_domains.begin(), matching_domains.end()); - matching_domains.resize( - std::distance(matching_domains.begin(), matching_domains_it)); - return matching_domains; + return base::flat_set<std::string>(std::move(matching_domains)).extract(); } } // namespace
diff --git a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc index 27ba5ef5..ac880fb 100644 --- a/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc +++ b/components/safe_browsing/content/password_protection/password_protection_service_unittest.cc
@@ -1115,7 +1115,8 @@ InitializeAndStartPasswordEntryRequest( PasswordType::SAVED_PASSWORD, {{kSavedDomain, ASCIIToUTF16("username")}, - {kSavedDomain2, ASCIIToUTF16("username")}}, + {kSavedDomain2, ASCIIToUTF16("username")}, + {"http://localhost:8080", ASCIIToUTF16("username")}}, false /* match whitelist */, 100000 /* timeout in ms*/, web_contents.get()); password_protection_service_->WaitForResponse(); @@ -1128,9 +1129,10 @@ if (password_protection_service_->IsExtendedReporting() && !password_protection_service_->IsIncognito()) { - ASSERT_EQ(2, reuse_event.domains_matching_password_size()); - EXPECT_EQ("saved_domain.com", reuse_event.domains_matching_password(0)); - EXPECT_EQ("saved_domain2.com", reuse_event.domains_matching_password(1)); + ASSERT_EQ(3, reuse_event.domains_matching_password_size()); + EXPECT_EQ("localhost:8080", reuse_event.domains_matching_password(0)); + EXPECT_EQ("saved_domain.com", reuse_event.domains_matching_password(1)); + EXPECT_EQ("saved_domain2.com", reuse_event.domains_matching_password(2)); } else { EXPECT_EQ(0, reuse_event.domains_matching_password_size()); }
diff --git a/components/safe_browsing/core/realtime/BUILD.gn b/components/safe_browsing/core/realtime/BUILD.gn index 6faee2a8..bf9f1078 100644 --- a/components/safe_browsing/core/realtime/BUILD.gn +++ b/components/safe_browsing/core/realtime/BUILD.gn
@@ -38,6 +38,7 @@ "//components/safe_browsing/core:realtimeapi_proto", "//components/safe_browsing/core/common", "//components/safe_browsing/core/common:safe_browsing_prefs", + "//components/signin/public/identity_manager", "//components/sync", "//components/unified_consent", "//components/user_prefs",
diff --git a/components/safe_browsing/core/realtime/policy_engine.cc b/components/safe_browsing/core/realtime/policy_engine.cc index a9c1914..574fde65 100644 --- a/components/safe_browsing/core/realtime/policy_engine.cc +++ b/components/safe_browsing/core/realtime/policy_engine.cc
@@ -11,6 +11,9 @@ #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/safe_browsing/core/common/safebrowsing_constants.h" #include "components/safe_browsing/core/features.h" +#include "components/signin/public/identity_manager/account_info.h" +#include "components/signin/public/identity_manager/consent_level.h" +#include "components/signin/public/identity_manager/identity_manager.h" #include "components/sync/base/user_selectable_type.h" #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_service_utils.h" @@ -68,6 +71,15 @@ } // static +bool RealTimePolicyEngine::IsPrimaryAccountSignedIn( + signin::IdentityManager* identity_manager) { + CoreAccountInfo primary_account_info = + identity_manager->GetPrimaryAccountInfo( + signin::ConsentLevel::kNotRequired); + return !primary_account_info.account_id.empty(); +} + +// static bool RealTimePolicyEngine::CanPerformFullURLLookup(PrefService* pref_service, bool is_off_the_record) { if (is_off_the_record) @@ -83,13 +95,16 @@ bool RealTimePolicyEngine::CanPerformFullURLLookupWithToken( PrefService* pref_service, bool is_off_the_record, - syncer::SyncService* sync_service) { + syncer::SyncService* sync_service, + signin::IdentityManager* identity_manager) { if (!CanPerformFullURLLookup(pref_service, is_off_the_record)) { return false; } - if (IsUrlLookupEnabledForEp() && IsUserEpOptedIn(pref_service)) + if (IsUrlLookupEnabledForEp() && IsUserEpOptedIn(pref_service) && + IsPrimaryAccountSignedIn(identity_manager)) { return true; + } if (!base::FeatureList::IsEnabled(kRealTimeUrlLookupEnabledWithToken)) { return false;
diff --git a/components/safe_browsing/core/realtime/policy_engine.h b/components/safe_browsing/core/realtime/policy_engine.h index e92d8be..e6edcdaf 100644 --- a/components/safe_browsing/core/realtime/policy_engine.h +++ b/components/safe_browsing/core/realtime/policy_engine.h
@@ -13,6 +13,10 @@ class SyncService; } +namespace signin { +class IdentityManager; +} + namespace safe_browsing { enum class ResourceType; @@ -51,7 +55,8 @@ static bool CanPerformFullURLLookupWithToken( PrefService* pref_service, bool is_off_the_record, - syncer::SyncService* sync_service); + syncer::SyncService* sync_service, + signin::IdentityManager* identity_manager); friend class SafeBrowsingService; friend class SafeBrowsingUIHandler; @@ -70,6 +75,10 @@ // Whether the user has opted-in to Enhanced Protection. static bool IsUserEpOptedIn(PrefService* pref_service); + // Whether the primary account is signed in. Sync is not required. + static bool IsPrimaryAccountSignedIn( + signin::IdentityManager* identity_manager); + friend class RealTimePolicyEngineTest; }; // class RealTimePolicyEngine
diff --git a/components/safe_browsing/core/realtime/policy_engine_unittest.cc b/components/safe_browsing/core/realtime/policy_engine_unittest.cc index ab89e37..6075b8a8 100644 --- a/components/safe_browsing/core/realtime/policy_engine_unittest.cc +++ b/components/safe_browsing/core/realtime/policy_engine_unittest.cc
@@ -10,6 +10,7 @@ #include "components/safe_browsing/core/common/safebrowsing_constants.h" #include "components/safe_browsing/core/common/test_task_environment.h" #include "components/safe_browsing/core/features.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/sync/driver/test_sync_service.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/unified_consent/pref_names.h" @@ -43,10 +44,12 @@ is_off_the_record); } - bool CanPerformFullURLLookupWithToken(bool is_off_the_record, - syncer::SyncService* sync_service) { + bool CanPerformFullURLLookupWithToken( + bool is_off_the_record, + syncer::SyncService* sync_service, + signin::IdentityManager* identity_manager) { return RealTimePolicyEngine::CanPerformFullURLLookupWithToken( - &pref_service_, is_off_the_record, sync_service); + &pref_service_, is_off_the_record, sync_service, identity_manager); } std::unique_ptr<base::test::TaskEnvironment> task_environment_; @@ -224,38 +227,58 @@ pref_service_.SetUserPref( unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, std::make_unique<base::Value>(true)); + std::unique_ptr<signin::IdentityTestEnvironment> identity_test_env = + std::make_unique<signin::IdentityTestEnvironment>(); + signin::IdentityManager* identity_manager = + identity_test_env->identity_manager(); syncer::TestSyncService sync_service; // Sync is disabled. sync_service.SetDisableReasons( {syncer::SyncService::DISABLE_REASON_USER_CHOICE}); sync_service.SetTransportState(syncer::SyncService::TransportState::DISABLED); - EXPECT_FALSE(CanPerformFullURLLookupWithToken(/* is_off_the_record */ false, - &sync_service)); + EXPECT_FALSE(CanPerformFullURLLookupWithToken( + /* is_off_the_record */ false, &sync_service, identity_manager)); + + // Sync is enabled. + sync_service.SetDisableReasons({}); + sync_service.SetTransportState(syncer::SyncService::TransportState::ACTIVE); + EXPECT_TRUE(CanPerformFullURLLookupWithToken( + /* is_off_the_record */ false, &sync_service, identity_manager)); // History sync is disabled. sync_service.GetUserSettings()->SetSelectedTypes( /* sync_everything */ false, {}); - EXPECT_FALSE(CanPerformFullURLLookupWithToken(/* is_off_the_record */ false, - &sync_service)); + EXPECT_FALSE(CanPerformFullURLLookupWithToken( + /* is_off_the_record */ false, &sync_service, identity_manager)); // Custom passphrase is enabled. sync_service.GetUserSettings()->SetSelectedTypes( false, {syncer::UserSelectableType::kHistory}); sync_service.SetIsUsingSecondaryPassphrase(true); - EXPECT_FALSE(CanPerformFullURLLookupWithToken(/* is_off_the_record */ false, - &sync_service)); + EXPECT_FALSE(CanPerformFullURLLookupWithToken( + /* is_off_the_record */ false, &sync_service, identity_manager)); } TEST_F(RealTimePolicyEngineTest, TestCanPerformFullURLLookupWithToken_EnhancedProtection) { base::test::ScopedFeatureList feature_list; feature_list.InitAndEnableFeature(kEnhancedProtection); + std::unique_ptr<signin::IdentityTestEnvironment> identity_test_env = + std::make_unique<signin::IdentityTestEnvironment>(); + signin::IdentityManager* identity_manager = + identity_test_env->identity_manager(); syncer::TestSyncService sync_service; - // Only enhanced protection is on. + + // Enhanced protection is on but user is not signed in. pref_service_.SetBoolean(prefs::kSafeBrowsingEnhanced, true); - EXPECT_TRUE(CanPerformFullURLLookupWithToken(/* is_off_the_record */ false, - &sync_service)); + EXPECT_FALSE(CanPerformFullURLLookupWithToken( + /* is_off_the_record */ false, &sync_service, identity_manager)); + + // User is signed in. + identity_test_env->MakeUnconsentedPrimaryAccountAvailable("test@example.com"); + EXPECT_TRUE(CanPerformFullURLLookupWithToken( + /* is_off_the_record */ false, &sync_service, identity_manager)); // Sync and history sync is disabled but enhanced protection is enabled. sync_service.SetDisableReasons( @@ -263,8 +286,8 @@ sync_service.SetTransportState(syncer::SyncService::TransportState::DISABLED); sync_service.GetUserSettings()->SetSelectedTypes( /* sync_everything */ false, {}); - EXPECT_TRUE(CanPerformFullURLLookupWithToken(/*is_off_the_record=*/false, - &sync_service)); + EXPECT_TRUE(CanPerformFullURLLookupWithToken( + /*is_off_the_record=*/false, &sync_service, identity_manager)); } TEST_F(RealTimePolicyEngineTest,
diff --git a/components/safe_browsing/core/realtime/url_lookup_service.cc b/components/safe_browsing/core/realtime/url_lookup_service.cc index 1a35193..9a7887d 100644 --- a/components/safe_browsing/core/realtime/url_lookup_service.cc +++ b/components/safe_browsing/core/realtime/url_lookup_service.cc
@@ -407,7 +407,7 @@ bool RealTimeUrlLookupService::CanPerformFullURLLookupWithToken() const { return RealTimePolicyEngine::CanPerformFullURLLookupWithToken( - pref_service_, is_off_the_record_, sync_service_); + pref_service_, is_off_the_record_, sync_service_, identity_manager_); } bool RealTimeUrlLookupService::IsUserEpOptedIn() const {
diff --git a/components/services/storage/public/mojom/service_worker_storage_control.mojom b/components/services/storage/public/mojom/service_worker_storage_control.mojom index fa7a93d..4dd57e1 100644 --- a/components/services/storage/public/mojom/service_worker_storage_control.mojom +++ b/components/services/storage/public/mojom/service_worker_storage_control.mojom
@@ -9,6 +9,12 @@ import "services/network/public/mojom/url_response_head.mojom"; import "url/mojom/url.mojom"; +// This struct represents a serialized service worker registration. +struct SerializedServiceWorkerRegistration { + ServiceWorkerRegistrationData registration_data; + array<ServiceWorkerResourceRecord> resources; +}; + // Conveys a result of finding a registration. If a registration is found, // |status| will be kOk. |registration| and |resources| are null and empty // if there is no matching registration. @@ -67,6 +73,11 @@ FindRegistrationForId(int64 registration_id, url.mojom.Url origin) => (ServiceWorkerFindRegistrationResult result); + // Returns all stored registrations for a given origin. + GetRegistrationsForOrigin(url.mojom.Url origin) => + (ServiceWorkerDatabaseStatus status, + array<SerializedServiceWorkerRegistration> registrations); + // Stores |registration_data| and |resources| on persistent storage. StoreRegistration(ServiceWorkerRegistrationData registration, array<ServiceWorkerResourceRecord> resources) => @@ -78,6 +89,10 @@ (ServiceWorkerDatabaseStatus status, ServiceWorkerStorageOriginState origin_state); + // Returns a new registration id which is guaranteed to be unique in the + // storage. Returns blink::mojom::kInvalidServiceWorkerRegistrationId if the + // storage is disabled. + GetNewRegistrationId() => (int64 registration_id); // Returns a new resource id which is guaranteed to be unique in the storage. // Returns blink::mojom::kInvalidServiceWorkerResourceId if the storage // is disabled.
diff --git a/components/sessions/BUILD.gn b/components/sessions/BUILD.gn index bee84f6..3128da9 100644 --- a/components/sessions/BUILD.gn +++ b/components/sessions/BUILD.gn
@@ -97,6 +97,8 @@ "core/serialized_navigation_driver.h", "core/serialized_navigation_entry.cc", "core/serialized_navigation_entry.h", + "core/serialized_user_agent_override.cc", + "core/serialized_user_agent_override.h", "core/session_command.cc", "core/session_command.h", "core/session_constants.cc",
diff --git a/components/sessions/content/content_live_tab.cc b/components/sessions/content/content_live_tab.cc index 26c42aa1..a0fb414 100644 --- a/components/sessions/content/content_live_tab.cc +++ b/components/sessions/content/content_live_tab.cc
@@ -65,8 +65,14 @@ web_contents()); } -const std::string& ContentLiveTab::GetUserAgentOverride() { - return web_contents()->GetUserAgentOverride().ua_string_override; +SerializedUserAgentOverride ContentLiveTab::GetUserAgentOverride() { + const blink::UserAgentOverride& ua_override = + web_contents()->GetUserAgentOverride(); + SerializedUserAgentOverride serialized_ua_override; + serialized_ua_override.ua_string_override = ua_override.ua_string_override; + serialized_ua_override.opaque_ua_metadata_override = + blink::UserAgentMetadata::Marshal(ua_override.ua_metadata_override); + return serialized_ua_override; } } // namespace sessions
diff --git a/components/sessions/content/content_live_tab.h b/components/sessions/content/content_live_tab.h index 56f1322..a11bd412 100644 --- a/components/sessions/content/content_live_tab.h +++ b/components/sessions/content/content_live_tab.h
@@ -41,7 +41,7 @@ int GetEntryCount() override; std::unique_ptr<PlatformSpecificTabData> GetPlatformSpecificTabData() override; - const std::string& GetUserAgentOverride() override; + SerializedUserAgentOverride GetUserAgentOverride() override; content::WebContents* web_contents() { return web_contents_; } const content::WebContents* web_contents() const { return web_contents_; }
diff --git a/components/sessions/content/session_tab_helper.cc b/components/sessions/content/session_tab_helper.cc index f5cf214..5350696 100644 --- a/components/sessions/content/session_tab_helper.cc +++ b/components/sessions/content/session_tab_helper.cc
@@ -8,6 +8,7 @@ #include "components/sessions/content/content_serialized_navigation_builder.h" #include "components/sessions/content/session_tab_helper_delegate.h" #include "components/sessions/core/serialized_navigation_entry.h" +#include "components/sessions/core/serialized_user_agent_override.h" #include "content/public/browser/navigation_details.h" #include "content/public/browser/web_contents.h" #include "extensions/buildflags/buildflags.h" @@ -66,11 +67,14 @@ void SessionTabHelper::UserAgentOverrideSet( const blink::UserAgentOverride& ua_override) { - // TODO(https://crbug.com/1061917): handle |ua_override.ua_metadata_override|. SessionTabHelperDelegate* delegate = GetDelegate(); if (delegate) { + sessions::SerializedUserAgentOverride serialized_override; + serialized_override.ua_string_override = ua_override.ua_string_override; + serialized_override.opaque_ua_metadata_override = + blink::UserAgentMetadata::Marshal(ua_override.ua_metadata_override); delegate->SetTabUserAgentOverride(window_id(), session_id(), - ua_override.ua_string_override); + serialized_override); } }
diff --git a/components/sessions/content/session_tab_helper_delegate.h b/components/sessions/content/session_tab_helper_delegate.h index e3453e4f..45f7ee0c 100644 --- a/components/sessions/content/session_tab_helper_delegate.h +++ b/components/sessions/content/session_tab_helper_delegate.h
@@ -14,6 +14,7 @@ namespace sessions { class SerializedNavigationEntry; +struct SerializedUserAgentOverride; // Defines the interface used by SessionTabHelper to record changes to // navigation entries so that they can restored at a later date. @@ -23,7 +24,7 @@ virtual void SetTabUserAgentOverride( const SessionID& window_id, const SessionID& tab_id, - const std::string& user_agent_override) = 0; + const SerializedUserAgentOverride& user_agent_override) = 0; // Sets the index of the selected entry in the navigation controller for the // specified tab.
diff --git a/components/sessions/core/base_session_service_commands.cc b/components/sessions/core/base_session_service_commands.cc index cd3bf65..fe79bbae 100644 --- a/components/sessions/core/base_session_service_commands.cc +++ b/components/sessions/core/base_session_service_commands.cc
@@ -79,7 +79,7 @@ std::unique_ptr<SessionCommand> CreateSetTabUserAgentOverrideCommand( SessionCommand::id_type command_id, SessionID tab_id, - const std::string& user_agent_override) { + const SerializedUserAgentOverride& user_agent_override) { // Use pickle to handle marshalling. base::Pickle pickle; pickle.WriteInt(tab_id.id()); @@ -87,12 +87,24 @@ // Enforce a max for the user agent length. They should never be anywhere // near this size. static const SessionCommand::size_type max_user_agent_size = - std::numeric_limits<SessionCommand::size_type>::max() - 1024; + (std::numeric_limits<SessionCommand::size_type>::max() - 1024) / 2; int bytes_written = 0; WriteStringToPickle(pickle, &bytes_written, max_user_agent_size, - user_agent_override); + user_agent_override.ua_string_override); + + bool have_usable_ua_metadata_override = + user_agent_override.opaque_ua_metadata_override.has_value() && + user_agent_override.opaque_ua_metadata_override->size() < + max_user_agent_size; + pickle.WriteBool(have_usable_ua_metadata_override); + if (have_usable_ua_metadata_override) { + bytes_written = 0; + WriteStringToPickle( + pickle, &bytes_written, max_user_agent_size, + user_agent_override.opaque_ua_metadata_override.value()); + } return std::unique_ptr<SessionCommand>( new SessionCommand(command_id, pickle)); @@ -154,6 +166,37 @@ iterator.ReadString(user_agent_override); } +bool RestoreSetTabUserAgentOverrideCommand2( + const SessionCommand& command, + SessionID* tab_id, + std::string* user_agent_override, + base::Optional<std::string>* opaque_ua_metadata_override) { + std::unique_ptr<base::Pickle> pickle(command.PayloadAsPickle()); + if (!pickle) + return false; + + base::PickleIterator iterator(*pickle); + if (!ReadSessionIdFromPickle(&iterator, tab_id)) + return false; + if (!iterator.ReadString(user_agent_override)) + return false; + // See if there is UA metadata override. + bool has_ua_metadata_override; + if (!iterator.ReadBool(&has_ua_metadata_override)) + return false; + if (!has_ua_metadata_override) { + *opaque_ua_metadata_override = base::nullopt; + return true; + } + + std::string ua_metadata_override_value; + if (!iterator.ReadString(&ua_metadata_override_value)) + return false; + + *opaque_ua_metadata_override = std::move(ua_metadata_override_value); + return true; +} + bool RestoreSetWindowAppNameCommand(const SessionCommand& command, SessionID* window_id, std::string* app_name) {
diff --git a/components/sessions/core/base_session_service_commands.h b/components/sessions/core/base_session_service_commands.h index 3fa30535..e5ba6c5 100644 --- a/components/sessions/core/base_session_service_commands.h +++ b/components/sessions/core/base_session_service_commands.h
@@ -8,6 +8,8 @@ #include <memory> #include <string> +#include "base/optional.h" +#include "components/sessions/core/serialized_user_agent_override.h" #include "components/sessions/core/session_command.h" #include "components/sessions/core/session_id.h" #include "components/sessions/core/sessions_export.h" @@ -36,7 +38,7 @@ std::unique_ptr<SessionCommand> CreateSetTabUserAgentOverrideCommand( SessionCommand::id_type command_id, SessionID tab_id, - const std::string& user_agent_override); + const SerializedUserAgentOverride& user_agent_override); // Creates a SessionCommand stores a browser window's app name. std::unique_ptr<SessionCommand> CreateSetWindowAppNameCommand( @@ -61,7 +63,16 @@ std::string* extension_app_id); // Extracts a SessionCommand as previously created by -// CreateSetTabUserAgentOverrideCommand into the tab id and user agent. +// CreateSetTabUserAgentOverrideCommand into the tab id and user agent and +// structured user agent. +bool RestoreSetTabUserAgentOverrideCommand2( + const SessionCommand& command, + SessionID* tab_id, + std::string* user_agent_override, + base::Optional<std::string>* opaque_ua_metadata_override); + +// Backwards compatible version that restores versions that didn't have +// structured user agent override. bool RestoreSetTabUserAgentOverrideCommand(const SessionCommand& command, SessionID* tab_id, std::string* user_agent_override);
diff --git a/components/sessions/core/live_tab.h b/components/sessions/core/live_tab.h index 1ea71f1..46e0a97 100644 --- a/components/sessions/core/live_tab.h +++ b/components/sessions/core/live_tab.h
@@ -6,6 +6,7 @@ #define COMPONENTS_SESSIONS_CORE_LIVE_TAB_H_ #include "components/sessions/core/serialized_navigation_entry.h" +#include "components/sessions/core/serialized_user_agent_override.h" #include "components/sessions/core/sessions_export.h" #include "components/sessions/core/tab_restore_service.h" @@ -33,7 +34,7 @@ virtual std::unique_ptr<PlatformSpecificTabData> GetPlatformSpecificTabData(); // Returns the user agent override, if any. - virtual const std::string& GetUserAgentOverride() = 0; + virtual SerializedUserAgentOverride GetUserAgentOverride() = 0; }; } // namespace sessions
diff --git a/components/sessions/core/live_tab_context.h b/components/sessions/core/live_tab_context.h index f14affec..ea0a346 100644 --- a/components/sessions/core/live_tab_context.h +++ b/components/sessions/core/live_tab_context.h
@@ -71,7 +71,7 @@ bool pin, bool from_last_session, const PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) = 0; + const sessions::SerializedUserAgentOverride& user_agent_override) = 0; // Note: |tab_platform_data| may be null (e.g., if |from_last_session| is // true, as this data is not persisted, or if the platform does not provide @@ -83,7 +83,7 @@ bool from_last_session, const std::string& extension_app_id, const PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) = 0; + const sessions::SerializedUserAgentOverride& user_agent_override) = 0; virtual void CloseTab() = 0; protected:
diff --git a/components/sessions/core/serialized_user_agent_override.cc b/components/sessions/core/serialized_user_agent_override.cc new file mode 100644 index 0000000..f4da6386 --- /dev/null +++ b/components/sessions/core/serialized_user_agent_override.cc
@@ -0,0 +1,32 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/sessions/core/serialized_user_agent_override.h" + +#include "base/trace_event/memory_usage_estimator.h" + +namespace sessions { + +SerializedUserAgentOverride::SerializedUserAgentOverride() = default; +SerializedUserAgentOverride::SerializedUserAgentOverride( + const SerializedUserAgentOverride& other) = default; +SerializedUserAgentOverride::SerializedUserAgentOverride( + SerializedUserAgentOverride&& other) = default; + +SerializedUserAgentOverride& SerializedUserAgentOverride::operator=( + const SerializedUserAgentOverride& other) = default; +SerializedUserAgentOverride& SerializedUserAgentOverride::operator=( + SerializedUserAgentOverride&& other) = default; + +SerializedUserAgentOverride::~SerializedUserAgentOverride() = default; + +size_t SerializedUserAgentOverride::EstimateMemoryUsage() const { + return base::trace_event::EstimateMemoryUsage(ua_string_override) + + (opaque_ua_metadata_override.has_value() + ? base::trace_event::EstimateMemoryUsage( + opaque_ua_metadata_override.value()) + : 0u); +} + +} // namespace sessions
diff --git a/components/sessions/core/serialized_user_agent_override.h b/components/sessions/core/serialized_user_agent_override.h new file mode 100644 index 0000000..6d91a683 --- /dev/null +++ b/components/sessions/core/serialized_user_agent_override.h
@@ -0,0 +1,53 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SESSIONS_CORE_SERIALIZED_USER_AGENT_OVERRIDE_H_ +#define COMPONENTS_SESSIONS_CORE_SERIALIZED_USER_AGENT_OVERRIDE_H_ + +#include <string> + +#include "base/optional.h" +#include "components/sessions/core/sessions_export.h" + +namespace sessions { + +// SerializedUserAgentOverride is used to record custom values of user-agent +// and possibly user agent client hints for session and tab restore. +// +// See also blink::UserAgentOverride which this is a dependency-breaking +// representation for. +struct SESSIONS_EXPORT SerializedUserAgentOverride { + SerializedUserAgentOverride(); + SerializedUserAgentOverride(const SerializedUserAgentOverride& other); + SerializedUserAgentOverride(SerializedUserAgentOverride&& other); + + SerializedUserAgentOverride& operator=( + const SerializedUserAgentOverride& other); + SerializedUserAgentOverride& operator=(SerializedUserAgentOverride&& other); + + ~SerializedUserAgentOverride(); + + static SerializedUserAgentOverride UserAgentOnly(const std::string& ua) { + // Helper which sets only UA, no client hints. + SerializedUserAgentOverride result; + result.ua_string_override = ua; + return result; + } + + size_t EstimateMemoryUsage() const; + + // Override of User-Agent string. Empty means no override. If non-empty, this + // string is used as the user agent whenever the tab's NavigationEntries need + // it overridden. + std::string ua_string_override; + + // Override of user-agent client hints. Format is user dependent; content/ + // encodes it via blink::UserAgentMetadata::Marshal(). Should be nullopt + // if |ua_string_override| is empty. + base::Optional<std::string> opaque_ua_metadata_override; +}; + +} // namespace sessions + +#endif // COMPONENTS_SESSIONS_CORE_SERIALIZED_USER_AGENT_OVERRIDE_H_
diff --git a/components/sessions/core/session_service_commands.cc b/components/sessions/core/session_service_commands.cc index f7c5bf3..9858682 100644 --- a/components/sessions/core/session_service_commands.cc +++ b/components/sessions/core/session_service_commands.cc
@@ -54,6 +54,7 @@ static const SessionCommand::id_type kCommandSetWindowAppName = 15; static const SessionCommand::id_type kCommandTabClosed = 16; static const SessionCommand::id_type kCommandWindowClosed = 17; +// OBSOLETE: Superseded by kCommandSetTabUserAgentOverride2. static const SessionCommand::id_type kCommandSetTabUserAgentOverride = 18; static const SessionCommand::id_type kCommandSessionStorageAssociated = 19; static const SessionCommand::id_type kCommandSetActiveWindow = 20; @@ -66,6 +67,7 @@ static const SessionCommand::id_type kCommandSetTabGroupMetadata = 26; static const SessionCommand::id_type kCommandSetTabGroupMetadata2 = 27; static const SessionCommand::id_type kCommandSetTabGuid = 28; +static const SessionCommand::id_type kCommandSetTabUserAgentOverride2 = 29; namespace { @@ -716,7 +718,26 @@ return true; } - GetTab(tab_id, tabs)->user_agent_override.swap(user_agent_override); + SessionTab* tab = GetTab(tab_id, tabs); + tab->user_agent_override.ua_string_override.swap(user_agent_override); + tab->user_agent_override.opaque_ua_metadata_override = base::nullopt; + break; + } + + case kCommandSetTabUserAgentOverride2: { + SessionID tab_id = SessionID::InvalidValue(); + std::string user_agent_override; + base::Optional<std::string> opaque_ua_metadata_override; + if (!RestoreSetTabUserAgentOverrideCommand2( + *command, &tab_id, &user_agent_override, + &opaque_ua_metadata_override)) { + return true; + } + SessionTab* tab = GetTab(tab_id, tabs); + tab->user_agent_override.ua_string_override = + std::move(user_agent_override); + tab->user_agent_override.opaque_ua_metadata_override = + std::move(opaque_ua_metadata_override); break; } @@ -980,8 +1001,8 @@ std::unique_ptr<SessionCommand> CreateSetTabUserAgentOverrideCommand( const SessionID& tab_id, - const std::string& user_agent_override) { - return CreateSetTabUserAgentOverrideCommand(kCommandSetTabUserAgentOverride, + const SerializedUserAgentOverride& user_agent_override) { + return CreateSetTabUserAgentOverrideCommand(kCommandSetTabUserAgentOverride2, tab_id, user_agent_override); }
diff --git a/components/sessions/core/session_service_commands.h b/components/sessions/core/session_service_commands.h index 815f2266..192e93d 100644 --- a/components/sessions/core/session_service_commands.h +++ b/components/sessions/core/session_service_commands.h
@@ -75,8 +75,9 @@ CreateSetTabExtensionAppIDCommand(const SessionID& tab_id, const std::string& extension_id); SESSIONS_EXPORT std::unique_ptr<SessionCommand> -CreateSetTabUserAgentOverrideCommand(const SessionID& tab_id, - const std::string& user_agent_override); +CreateSetTabUserAgentOverrideCommand( + const SessionID& tab_id, + const SerializedUserAgentOverride& user_agent_override); SESSIONS_EXPORT std::unique_ptr<SessionCommand> CreateSetWindowAppNameCommand( const SessionID& window_id, const std::string& app_name);
diff --git a/components/sessions/core/session_types.h b/components/sessions/core/session_types.h index 671a553..cb0ab53 100644 --- a/components/sessions/core/session_types.h +++ b/components/sessions/core/session_types.h
@@ -16,6 +16,7 @@ #include "base/time/time.h" #include "base/token.h" #include "components/sessions/core/serialized_navigation_entry.h" +#include "components/sessions/core/serialized_user_agent_override.h" #include "components/sessions/core/session_id.h" #include "components/sessions/core/sessions_export.h" #include "components/tab_groups/tab_group_id.h" @@ -82,7 +83,7 @@ // If non-empty, this string is used as the user agent whenever the tab's // NavigationEntries need it overridden. - std::string user_agent_override; + SerializedUserAgentOverride user_agent_override; // Timestamp for when this tab was last modified. base::Time timestamp;
diff --git a/components/sessions/core/tab_restore_service.cc b/components/sessions/core/tab_restore_service.cc index f6dde30..8d39271 100644 --- a/components/sessions/core/tab_restore_service.cc +++ b/components/sessions/core/tab_restore_service.cc
@@ -28,10 +28,9 @@ size_t TabRestoreService::Tab::EstimateMemoryUsage() const { using base::trace_event::EstimateMemoryUsage; - return - EstimateMemoryUsage(navigations) + - EstimateMemoryUsage(extension_app_id) + - EstimateMemoryUsage(user_agent_override); + return EstimateMemoryUsage(navigations) + + EstimateMemoryUsage(extension_app_id) + + user_agent_override.EstimateMemoryUsage(); } TabRestoreService::Window::Window() : Entry(WINDOW) {}
diff --git a/components/sessions/core/tab_restore_service.h b/components/sessions/core/tab_restore_service.h index ec5cc7ad..9849132 100644 --- a/components/sessions/core/tab_restore_service.h +++ b/components/sessions/core/tab_restore_service.h
@@ -17,6 +17,7 @@ #include "components/keyed_service/core/keyed_service.h" #include "components/sessions/core/live_tab_context.h" #include "components/sessions/core/serialized_navigation_entry.h" +#include "components/sessions/core/serialized_user_agent_override.h" #include "components/sessions/core/session_id.h" #include "components/sessions/core/session_types.h" #include "components/sessions/core/sessions_export.h" @@ -119,7 +120,7 @@ std::unique_ptr<PlatformSpecificTabData> platform_data; // The user agent override used for the tab's navigations (if applicable). - std::string user_agent_override; + SerializedUserAgentOverride user_agent_override; // The group the tab belonged to, if any. base::Optional<tab_groups::TabGroupId> group;
diff --git a/components/sessions/core/tab_restore_service_impl.cc b/components/sessions/core/tab_restore_service_impl.cc index 6b81da7..a0a62a6 100644 --- a/components/sessions/core/tab_restore_service_impl.cc +++ b/components/sessions/core/tab_restore_service_impl.cc
@@ -106,9 +106,11 @@ const SessionCommand::id_type kCommandPinnedState = 5; const SessionCommand::id_type kCommandSetExtensionAppID = 6; const SessionCommand::id_type kCommandSetWindowAppName = 7; +// Deprecated for kCommandSetTabUserAgentOverride2 const SessionCommand::id_type kCommandSetTabUserAgentOverride = 8; const SessionCommand::id_type kCommandWindow = 9; const SessionCommand::id_type kCommandGroup = 10; +const SessionCommand::id_type kCommandSetTabUserAgentOverride2 = 11; // Number of entries (not commands) before we clobber the file and write // everything. @@ -719,9 +721,9 @@ kCommandSetExtensionAppID, tab.id, tab.extension_app_id)); } - if (!tab.user_agent_override.empty()) { + if (!tab.user_agent_override.ua_string_override.empty()) { command_storage_manager_->ScheduleCommand( - CreateSetTabUserAgentOverrideCommand(kCommandSetTabUserAgentOverride, + CreateSetTabUserAgentOverrideCommand(kCommandSetTabUserAgentOverride2, tab.id, tab.user_agent_override)); } @@ -1030,7 +1032,30 @@ &user_agent_override)) { return; } - current_tab->user_agent_override.swap(user_agent_override); + current_tab->user_agent_override.ua_string_override.swap( + user_agent_override); + current_tab->user_agent_override.opaque_ua_metadata_override = + base::nullopt; + break; + } + + case kCommandSetTabUserAgentOverride2: { + if (!current_tab) { + // Should be in a tab when we get this. + return; + } + SessionID tab_id = SessionID::InvalidValue(); + std::string user_agent_override; + base::Optional<std::string> opaque_ua_metadata_override; + if (!RestoreSetTabUserAgentOverrideCommand2( + command, &tab_id, &user_agent_override, + &opaque_ua_metadata_override)) { + return; + } + current_tab->user_agent_override.ua_string_override = + std::move(user_agent_override); + current_tab->user_agent_override.opaque_ua_metadata_override = + std::move(opaque_ua_metadata_override); break; }
diff --git a/components/sessions/ios/ios_live_tab.h b/components/sessions/ios/ios_live_tab.h index 4d50f12..19f14e7 100644 --- a/components/sessions/ios/ios_live_tab.h +++ b/components/sessions/ios/ios_live_tab.h
@@ -35,7 +35,7 @@ sessions::SerializedNavigationEntry GetEntryAtIndex(int index) override; sessions::SerializedNavigationEntry GetPendingEntry() override; int GetEntryCount() override; - const std::string& GetUserAgentOverride() override; + sessions::SerializedUserAgentOverride GetUserAgentOverride() override; web::WebState* web_state() { return web_state_; } const web::WebState* web_state() const { return web_state_; } @@ -51,9 +51,6 @@ web::WebState* web_state_; - // Needed to return an empty string in GetUserAgentOverride(). - std::string user_agent_override_; - DISALLOW_COPY_AND_ASSIGN(IOSLiveTab); };
diff --git a/components/sessions/ios/ios_live_tab.mm b/components/sessions/ios/ios_live_tab.mm index d3bdbc6f..0e657e03 100644 --- a/components/sessions/ios/ios_live_tab.mm +++ b/components/sessions/ios/ios_live_tab.mm
@@ -53,9 +53,9 @@ return navigation_manager()->GetItemCount(); } -const std::string& IOSLiveTab::GetUserAgentOverride() { +sessions::SerializedUserAgentOverride IOSLiveTab::GetUserAgentOverride() { // Dynamic user agent overrides are not supported on iOS. - return user_agent_override_; + return sessions::SerializedUserAgentOverride(); } } // namespace sessions
diff --git a/components/sessions/ios/ios_restore_live_tab.h b/components/sessions/ios/ios_restore_live_tab.h index e68c2e6..da6dca3e 100644 --- a/components/sessions/ios/ios_restore_live_tab.h +++ b/components/sessions/ios/ios_restore_live_tab.h
@@ -29,13 +29,10 @@ sessions::SerializedNavigationEntry GetEntryAtIndex(int index) override; sessions::SerializedNavigationEntry GetPendingEntry() override; int GetEntryCount() override; - const std::string& GetUserAgentOverride() override; + sessions::SerializedUserAgentOverride GetUserAgentOverride() override; private: CRWSessionStorage* session_; - - // Needed to return an empty string in GetUserAgentOverride(). - const std::string user_agent_override_; }; } // namespace sessions
diff --git a/components/sessions/ios/ios_restore_live_tab.mm b/components/sessions/ios/ios_restore_live_tab.mm index f26fa555..125356d 100644 --- a/components/sessions/ios/ios_restore_live_tab.mm +++ b/components/sessions/ios/ios_restore_live_tab.mm
@@ -43,9 +43,9 @@ return session_.itemStorages.count; } -const std::string& RestoreIOSLiveTab::GetUserAgentOverride() { - // Dynamic user agent overrides are not supported on iOS. - return user_agent_override_; +sessions::SerializedUserAgentOverride +RestoreIOSLiveTab::GetUserAgentOverride() { + return sessions::SerializedUserAgentOverride(); } } // namespace sessions
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 3b21204..1587f44 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -1603,7 +1603,7 @@ <translation id="777702478322588152">المديرية</translation> <translation id="7791196057686275387">حزمة</translation> <translation id="7791543448312431591">إضافة</translation> -<translation id="7798389633136518089">تم التجاهل بسبب إعداد السياسة من خلال مصدر سحابة إلكترونية.</translation> +<translation id="7798389633136518089">تم التجاهل لعدم إعداد السياسة من خلال أحد مصادر السحابة الإلكترونية.</translation> <translation id="7800304661137206267">تم ترميز الاتصال باستخدام <ph name="CIPHER" />، مع <ph name="MAC" /> لمصادقة الرسالة و<ph name="KX" /> كآلية التبادل الرئيسية.</translation> <translation id="7802523362929240268">موقع الويب مشروع</translation> <translation id="780301667611848630">لا، شكرًا</translation> @@ -1739,7 +1739,7 @@ <translation id="8371889962595521444">شهادات الجذر المُخصَّصة</translation> <translation id="8380941800586852976">ضارة</translation> <translation id="8381674639488873545">قد يتم تحصيل هذه الرسوم لمرة واحدة أو بشكل متكرِّر، وقد تكون غير واضحة. <ph name="BEGIN_LINK" />عرض على أي حال<ph name="END_LINK" /></translation> -<translation id="8405166164747488837">إنّ موقع <ph name="ENROLLMENT_DOMAIN" /> فعَّل Chrome Enterprise Connectorsعلى المتصفّح الخاص بك. لدى هذه الموصلات إذن بالوصول إلى بعض بياناتك.</translation> +<translation id="8405166164747488837">فعَّل <ph name="ENROLLMENT_DOMAIN" /> Chrome Enterprise Connectors على متصفّحك. لدى هذه الموصلات إذن بالوصول إلى بعض بياناتك.</translation> <translation id="8412145213513410671">الأعطال (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">يجب إدخال عبارة المرور نفسها مرتين.</translation> <translation id="8416694386774425977">تهيئة الشبكة غير صالحة ويتعذّر استيرادها.
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 8a5b0cfc..97fee770 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -876,7 +876,7 @@ <translation id="4731967714531604179">Prc2 (Envelope)</translation> <translation id="4733082559415072992"><ph name="URL" /> আপনার ডিভাইসের লোকেশন ব্যবহার করতে চায়</translation> <translation id="4736825316280949806">Chromium পুনরায় চালু করুন</translation> -<translation id="4737121147659370456">আপনার অ্যাডমিনিস্ট্রেটর Chrome Enterprise-এর কানেক্টরগুলিকে আপনার ব্রাউজারে চালু করেছে। এই কানেক্টরগুলি আপনার কিছু ডেটা অ্যাক্সেস করতে পারবে।</translation> +<translation id="4737121147659370456">আপনার অ্যাডমিনিস্ট্রেটর Chrome Enterprise কানেক্টরগুলিকে আপনার ব্রাউজারে চালু করেছে। এই কানেক্টরগুলি আপনার কিছু ডেটা অ্যাক্সেস করতে পারবে।</translation> <translation id="473775607612524610">আপডেট করুন</translation> <translation id="4738601419177586157"><ph name="TEXT" /> সার্চ সাজেশন</translation> <translation id="4742407542027196863">পাসওয়ার্ডগুলি পরিচালনা করুন…</translation> @@ -1216,7 +1216,7 @@ <translation id="610911394827799129"><ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" />-এ আপনার Google অ্যাকাউন্টের অন্যান্য ধরনের ব্রাউজিংয়ের ইতিহাস থাকতে পারে</translation> <translation id="6116338172782435947">ক্লিপবোর্ডে কপি করা টেক্সট এবং ছবি দেখতে</translation> <translation id="6120179357481664955">আপনার UPI আইডি মনে আছে?</translation> -<translation id="6124432979022149706">Chrome Enterprise-এর কানেক্টরগুলি</translation> +<translation id="6124432979022149706">Chrome Enterprise কানেক্টর</translation> <translation id="6135641591018127088">আপনার Google অ্যাকাউন্ট ব্যবহার করে একটি শক্তিশালী পাসওয়ার্ড তৈরি করুন</translation> <translation id="6146055958333702838">সব কেবল পরীক্ষা করুন এবং আপনি ব্যবহার করছেন এমন যেকোনো রাউটার, মডেম বা অন্যান্য নেটওয়ার্ক ডিভাইসগুলি আবার চালু করুন।</translation> <translation id="614940544461990577">এটি করে দেখুন:</translation> @@ -1308,7 +1308,7 @@ <translation id="6521745193039995384">অ্যাক্টিভ নয়</translation> <translation id="6529602333819889595">&মুছে ফেলাকে আবার করুন</translation> <translation id="6534179046333460208">বাস্তবিক ওয়েব প্রস্তাবনাগুলি</translation> -<translation id="6543609420755597723">সেই সব নিরাপত্তা সংক্রান্ত গতিবিধির সম্বন্ধে ডেটা শেয়ার করুন যেগুলির ব্যাপারে Chrome Enterprise-এর কানেক্টরগুলি আপনার অ্যাডমিনিস্ট্রেটরকে ফ্ল্যাগ করে জানিয়েছে। আপনার দেখা পৃষ্ঠাগুলির ইউআরএল, ফাইলের নাম বা মেটাডেটা এবং আপনি যে ইউজারনেম ব্যবহার করে ডিভাইস ও Chrome-এ সাইন-ইন করেন, সেই সব তথ্য এতে অন্তর্ভুক্ত থাকতে পারে।</translation> +<translation id="6543609420755597723">সেই সব নিরাপত্তা সংক্রান্ত গতিবিধির সম্বন্ধে ডেটা শেয়ার করুন যেগুলির ব্যাপারে Chrome Enterprise কানেক্টরগুলি আপনার অ্যাডমিনিস্ট্রেটরকে ফ্ল্যাগ করে জানিয়েছে। আপনার ব্রাউজ করা পৃষ্ঠাগুলির ইউআরএল, ফাইলের নাম বা মেটাডেটা এবং আপনি যে ইউজারনেম ব্যবহার করে ডিভাইস ও Chrome-এ সাইন-ইন করেন, সেই সব তথ্য এতে অন্তর্ভুক্ত থাকতে পারে।</translation> <translation id="6545864417968258051">ব্লুটুথ স্ক্যানিং</translation> <translation id="6547208576736763147">বাঁদিকে ডুয়াল পাঞ্চ</translation> <translation id="6554795675067793129">আপনার অ্যাকাউন্ট <ph name="ENROLLMENT_DOMAIN" /> ম্যানেজ করে।</translation> @@ -1603,7 +1603,7 @@ <translation id="777702478322588152">জেলা</translation> <translation id="7791196057686275387">বেল</translation> <translation id="7791543448312431591">জুড়ুন</translation> -<translation id="7798389633136518089">এই নীতিটি এড়িয়ে যান, কারণ এটি ক্লাউড সোর্সের মাধ্যমে সেট করা হয়নি।</translation> +<translation id="7798389633136518089">এই নীতিটি এড়িয়ে যাওয়া হয়েছে, কারণ এটি ক্লাউড সোর্সের মাধ্যমে সেট করা হয়নি।</translation> <translation id="7800304661137206267">মেসেজ যাচাইকরণ এবং <ph name="KX" />-কে কী এক্সচেঞ্জ নির্মাণকৌশল হিসাবে কানেকশন <ph name="CIPHER" /> ব্যবহার করে <ph name="MAC" />-এর সাথে এনক্রিপ্ট হয়েছে৷</translation> <translation id="7802523362929240268">সাইটটি বৈধ</translation> <translation id="780301667611848630">না থাক</translation> @@ -1739,7 +1739,7 @@ <translation id="8371889962595521444">কাস্টম রুট সার্টিফিকেট</translation> <translation id="8380941800586852976">বিপজ্জনক</translation> <translation id="8381674639488873545">এই চার্জ এককালীন হতে পারে বা তার পুনরাবৃত্তি হতে পারে এবং তা স্পষ্ট করে বোঝা নাও যেতে পারে। <ph name="BEGIN_LINK" />তবুও দেখান<ph name="END_LINK" /></translation> -<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> Chrome Enterprise-এর কানেক্টরগুলিকে আপনার ব্রাউজারে চালু করেছে। এই কানেক্টরগুলি আপনার কিছু ডেটা অ্যাক্সেস করতে পারবে।</translation> +<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> Chrome Enterprise কানেক্টরগুলিকে আপনার ব্রাউজারে চালু করেছে। এই কানেক্টরগুলি আপনার কিছু ডেটা অ্যাক্সেস করতে পারবে।</translation> <translation id="8412145213513410671">ক্র্যাশ (<ph name="CRASH_COUNT" />টি)</translation> <translation id="8412392972487953978">আপনাকে একই পাসফ্রেজ অবশ্যই দু'বার প্রবেশ করাতে হবে৷</translation> <translation id="8416694386774425977">নেটওয়ার্ক কনফিগারেশনটি সঠিক নয় এবং ইমপোর্ট করা যায়নি৷
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index 63015807..c6303a6 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -1262,7 +1262,7 @@ <translation id="6328639280570009161">Pokušajte onemogućiti predviđanje mreže</translation> <translation id="6328784461820205019">"Vaša veza nije privatna" ili "<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>" ili "<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>" ili "<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>" ili "<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>" ili "SSL certificate error"</translation> <translation id="6328786501058569169">Ova web lokacija vas obmanjuje</translation> -<translation id="6333334544069706521">Koristi lozinke pohranjene na Google računu</translation> +<translation id="6333334544069706521">Koristite lozinke pohranjene na Google računu</translation> <translation id="6337133576188860026">Oslobodit će se manje od <ph name="SIZE" />. Neke web lokacije će se prilikom sljedeće posjete možda sporije učitavati.</translation> <translation id="6337534724793800597">Filtriraj pravila po nazivu</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ništa}=1{1 lozinka (za <ph name="DOMAIN_LIST" />, sinhronizirano)}=2{2 lozinke (za <ph name="DOMAIN_LIST" />, sinhronizirano)}one{# lozinka (za <ph name="DOMAIN_LIST" />, sinhronizirano)}few{# lozinke (za <ph name="DOMAIN_LIST" />, sinhronizirano)}other{# lozinki (za <ph name="DOMAIN_LIST" />, sinhronizirano)}}</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index f69eb61..304f7f1a 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -1602,7 +1602,7 @@ <translation id="777702478322588152">Prefectura</translation> <translation id="7791196057686275387">Embalaje</translation> <translation id="7791543448312431591">Agregar</translation> -<translation id="7798389633136518089">Se ignoró porque la política no se estableció desde una nube.</translation> +<translation id="7798389633136518089">Se ignoró porque la política no se estableció desde un origen de la nube.</translation> <translation id="7800304661137206267">La conexión está encriptada mediante <ph name="CIPHER" />, con <ph name="MAC" /> para la autenticación de mensajes y <ph name="KX" /> como mecanismo de intercambio clave.</translation> <translation id="7802523362929240268">El sitio es legítimo</translation> <translation id="780301667611848630">No, gracias</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index aab8458..0bd09686 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -1205,7 +1205,7 @@ <translation id="6116338172782435947">Voir le texte et les images copiés dans le presse-papiers</translation> <translation id="6120179357481664955">Souhaitez-vous mémoriser votre ID UPI ?</translation> <translation id="6124432979022149706">Connecteurs Chrome Enterprise</translation> -<translation id="6135641591018127088">Utiliser votre compte Google pour générer un mot de passe fort</translation> +<translation id="6135641591018127088">Utiliser votre compte Google pour générer un mot de passe sécurisé</translation> <translation id="6146055958333702838">Vérifiez les câbles et redémarrez votre routeur, votre modem ou tout autre périphérique réseau utilisé.</translation> <translation id="614940544461990577">Voici quelques conseils :</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 17885bae..af35acf 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -873,7 +873,7 @@ <translation id="4731967714531604179">Prc2 (sobre)</translation> <translation id="4733082559415072992">O URL <ph name="URL" /> quere utilizar a localización do teu dispositivo</translation> <translation id="4736825316280949806">Reinicia Chromium</translation> -<translation id="4737121147659370456">O teu administrador activou os conectores de Chrome Enterprise no navegador. Estes conectores teñen acceso a algúns dos teus datos.</translation> +<translation id="4737121147659370456">O teu administrador che activou os conectores de Chrome Enterprise no navegador. Estes conectores teñen acceso a algúns dos teus datos.</translation> <translation id="473775607612524610">Actualizar</translation> <translation id="4738601419177586157">Suxestión de busca de "<ph name="TEXT" />"</translation> <translation id="4742407542027196863">Xestionar contrasinais…</translation> @@ -1597,7 +1597,7 @@ <translation id="777702478322588152">Prefectura</translation> <translation id="7791196057686275387">Bala</translation> <translation id="7791543448312431591">Engadir</translation> -<translation id="7798389633136518089">Ignorouse porque a política non está establecida por unha fonte da nube.</translation> +<translation id="7798389633136518089">Ignorouse porque a política non se estableceu desde a nube.</translation> <translation id="7800304661137206267">A conexión cifrouse mediante <ph name="CIPHER" /> con <ph name="MAC" /> para a autenticación da mensaxe e con <ph name="KX" /> como mecanismo de intercambio de claves.</translation> <translation id="7802523362929240268">O sitio é lexítimo</translation> <translation id="780301667611848630">Non, grazas</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index c043f12..7d3603b 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -169,7 +169,7 @@ <translation id="1644574205037202324">इतिहास</translation> <translation id="1645368109819982629">असमर्थित प्रोटोकॉल</translation> <translation id="1652415888492971589">JIS B8</translation> -<translation id="1656024727720460136">Chrome ने इस पेज को आसान बना दिया है, ताकि इसे आसानी से पढ़ा जा सके. Chrome ने सुरक्षित कनेक्शन का इस्तेमाल करके, मूल पेज काे फिर से पा लिया गया है.</translation> +<translation id="1656024727720460136">Chrome इस पेज को रीडर मोड में दिखा रहा है, ताकि इसे आसानी से पढ़ा जा सके. Chrome ने सुरक्षित कनेक्शन का इस्तेमाल करके मूल पेज काे फिर से पा लिया है.</translation> <translation id="1656489000284462475">पिकअप</translation> <translation id="1662550410081243962">भुगतान के तरीके सेव करें और जानकारी भरें</translation> <translation id="1663943134801823270">कार्ड और पते Chrome से मिलते हैं. आप उन्हें <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में प्रबंधित कर सकते हैं.</translation> @@ -872,7 +872,7 @@ <translation id="4731967714531604179">पीआरसी2 (एन्वेलप)</translation> <translation id="4733082559415072992"><ph name="URL" /> वेबसाइट आपके डिवाइस के स्थान की जानकारी का इस्तेमाल करना चाहती है</translation> <translation id="4736825316280949806">क्रोमियम को फिर से शुरू करें</translation> -<translation id="4737121147659370456">आपके एडमिन ने ब्राउज़र पर Chrome Enterprise Connectors चालू कर दिए हैं. ये कनेक्टर आपके कुछ डेटा को ऐक्सेस कर सकते हैं.</translation> +<translation id="4737121147659370456">आपके एडमिन ने ब्राउज़र पर Chrome Enterprise Connectors नाम की सेटिंग को चालू कर दिया है. इस सेटिंग की मदद से आपके कुछ डेटा को ऐक्सेस किया जा सकता है.</translation> <translation id="473775607612524610">अपडेट करें</translation> <translation id="4738601419177586157"><ph name="TEXT" /> खोज सुझाव</translation> <translation id="4742407542027196863">पासवर्ड प्रबंधित करें…</translation> @@ -1209,7 +1209,7 @@ <translation id="6116338172782435947">क्लिपबोर्ड पर कॉपी किए गए लेख और इमेज देखें</translation> <translation id="6120179357481664955">क्या आप चाहते हैं कि हम आपका UPI आईडी रखें?</translation> <translation id="6124432979022149706">Chrome Enterprise Connectors</translation> -<translation id="6135641591018127088">एक मज़बूत पासवर्ड बनाने के लिए अपने Google खाते का इस्तेमाल करें</translation> +<translation id="6135641591018127088">मज़बूत पासवर्ड बनाने के लिए अपने Google खाते का इस्तेमाल करें</translation> <translation id="6146055958333702838">सभी केबल जांचें और आपके उपयोग किए जा रहे सभी राउटर, मॉडेम या अन्य नेटवर्क डिवाइस को 'फिर चालू करें'.</translation> <translation id="614940544461990577">यह आज़माकर देखें:</translation> @@ -1367,7 +1367,7 @@ <translation id="6874604403660855544">&जोड़ना फिर से करें</translation> <translation id="6884662655240309489">आकार 1</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> -<translation id="6888584790432772780">Chrome ने इस पेज को आसान बना दिया है, ताकि इसे आसानी से पढ़ा जा सके. Chrome ने एक असुरक्षित कनेक्शन पर मूल पेज काे फिर से पा लिया है.</translation> +<translation id="6888584790432772780">Chrome इस पेज को रीडर मोड में दिखा रहा है, ताकि इसे आसानी से पढ़ा जा सके. Chrome ने एक असुरक्षित कनेक्शन पर मूल पेज काे फिर से पा लिया है.</translation> <translation id="6891596781022320156">नीति स्तर समर्थित नहीं है.</translation> <translation id="6895330447102777224">आपके कार्ड की पुष्टि हो गई है</translation> <translation id="6897140037006041989">उपयोगकर्ता एजेंट</translation> @@ -1596,7 +1596,7 @@ <translation id="777702478322588152">प्रांत</translation> <translation id="7791196057686275387">बेल</translation> <translation id="7791543448312431591">जोड़ें</translation> -<translation id="7798389633136518089">नीति, क्लाउड स्रोत से सेट नहीं की गई है, इसलिए स्वीकार नहीं की गई.</translation> +<translation id="7798389633136518089">नीति को किसी क्लाउड स्रोत के ज़रिए सेट नहीं किया गया है। इसलिए, इसे स्वीकार नहीं किया गया.</translation> <translation id="7800304661137206267">कनेक्शन को <ph name="MAC" /> का इस्तेमाल करके मैसेज की पुष्टि के लिए <ph name="KX" /> के साथ सुरक्षित किया गया है और यह मुख्य एक्सचेंज तकनीक के तौर पर <ph name="CIPHER" /> का इस्तेमाल करता है.</translation> <translation id="7802523362929240268">साइट वैध है</translation> <translation id="780301667611848630">नहीं, रहने दें</translation> @@ -1732,7 +1732,7 @@ <translation id="8371889962595521444">कस्टम रूट सर्टिफ़िकेट</translation> <translation id="8380941800586852976">खतरनाक</translation> <translation id="8381674639488873545">ये शुल्क एक बार लगने वाले या बार-बार लगने वाले हो सकते हैं और हो सकता है कि इनके बारे में साफ़ तौर पर न बताया जाए. <ph name="BEGIN_LINK" />फिर भी दिखाएं<ph name="END_LINK" /></translation> -<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> ने आपके ब्राउज़र पर Chrome Enterprise Connectors चालू किए हैं. ये कनेक्टर आपके कुछ डेटा को ऐक्सेस कर सकते हैं.</translation> +<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> ने आपके ब्राउज़र पर Chrome Enterprise Connectors नाम की सेटिंग को चालू किया है. इस सेटिंग की मदद से आपके कुछ डेटा को ऐक्सेस किया जा सकता है.</translation> <translation id="8412145213513410671">क्रैश (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">आपको वही 'पासफ़्रेज़' दोबारा दर्ज करना होगा.</translation> <translation id="8416694386774425977">नेटवर्क कॉन्फ़िगरेशन गलत है और उसे लाया नहीं जा सका.
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 8663367e..98a9901f8 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -1307,7 +1307,7 @@ <translation id="6521745193039995384">Nije aktivno</translation> <translation id="6529602333819889595">&Ponovi brisanje</translation> <translation id="6534179046333460208">Prijedlozi Fizičkog weba</translation> -<translation id="6543609420755597723">Podatke o sigurnosnim događajima koje su označili Priključci za Chrome za poduzeća podijelite s administratorom. To može uključivati URL-ove stranica koje posjetite, nazive ili metapodatke datoteka i korisničko ime koje koristite za prijavu na svoj uređaj i Chrome.</translation> +<translation id="6543609420755597723">Podatke o sigurnosnim događajima koje su označili priključci za Chrome za poduzeća podijelite s administratorom. To može uključivati URL-ove stranica koje posjetite, nazive ili metapodatke datoteka i korisničko ime koje koristite za prijavu na svoj uređaj i Chrome.</translation> <translation id="6545864417968258051">Traženje Bluetootha</translation> <translation id="6547208576736763147">Dvostruko bušenje s lijeve strane</translation> <translation id="6554795675067793129">Vašim računom upravlja <ph name="ENROLLMENT_DOMAIN" />.</translation> @@ -1738,7 +1738,7 @@ <translation id="8371889962595521444">Prilagođeni korijenski certifikati</translation> <translation id="8380941800586852976">Opasno</translation> <translation id="8381674639488873545">Ta terećenja mogu biti jednokratna ili ponavljajuća i možda nisu vidljiva odmah. <ph name="BEGIN_LINK" />Ipak prikaži<ph name="END_LINK" /></translation> -<translation id="8405166164747488837">Domena <ph name="ENROLLMENT_DOMAIN" /> omogućila je Priključke za Chrome za poduzeća u vašem pregledniku. Ti priključci imaju pristup nekim vašim podacima.</translation> +<translation id="8405166164747488837">Domena <ph name="ENROLLMENT_DOMAIN" /> omogućila je priključke za Chrome za poduzeća u vašem pregledniku. Ti priključci imaju pristup nekim vašim podacima.</translation> <translation id="8412145213513410671">Padovi (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Morate dvaput unijeti istu zaporku.</translation> <translation id="8416694386774425977">Konfiguracija mreže nije važeća i nije se mogla uvesti.
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index bd02068f..e72af47 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -1603,7 +1603,7 @@ <translation id="777702478322588152">Պրեֆեկտուրա</translation> <translation id="7791196057686275387">Սեղմում</translation> <translation id="7791543448312431591">Ավելացնել</translation> -<translation id="7798389633136518089">Անտեսվել է, քանի որ կանոնը չի սահմանվել ամպային աղբյուրի կողմից։</translation> +<translation id="7798389633136518089">Անտեսվում է, քանի որ կանոնը չի սահմանվել ամպային աղբյուրի կողմից։</translation> <translation id="7800304661137206267">Հաղորդագրությունների իսկորոշման համար օգտագործվում է <ph name="CIPHER" />՝ <ph name="MAC" />-ով, բանալիների փոխանակման համար օգտագործվում է <ph name="KX" />:</translation> <translation id="7802523362929240268">Կայքը անվտանգ է</translation> <translation id="780301667611848630">Ոչ</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index 9ff7ad6..0cb3e505 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -1215,7 +1215,7 @@ <translation id="6116338172782435947">Melihat teks dan gambar yang disalin ke papan klip</translation> <translation id="6120179357481664955">Ingat ID UPI Anda?</translation> <translation id="6124432979022149706">Chrome Enterprise Connectors</translation> -<translation id="6135641591018127088">Gunakan Akun Google Anda untuk membuat sandi kuat</translation> +<translation id="6135641591018127088">Gunakan Akun Google Anda untuk membuat sandi yang kuat</translation> <translation id="6146055958333702838">Periksa semua kabel dan boot ulang router, modem, atau perangkat jaringan lain yang mungkin Anda gunakan.</translation> <translation id="614940544461990577">Coba:</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 1a0b1d6..038a3c3 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -169,7 +169,7 @@ <translation id="1644574205037202324">Ferill</translation> <translation id="1645368109819982629">Óstuddar samskiptareglur</translation> <translation id="1652415888492971589">JIS B8</translation> -<translation id="1656024727720460136">Chrome einfaldaði þessa síðu svo það yrði auðveldara að lesa hana. Chrome sótti upprunalegu síðuna yfir örugga tengingu.</translation> +<translation id="1656024727720460136">Chrome einfaldaði þessa síðu svo það yrði auðveldara að lesa hana. Chrome sótti upprunalegu síðuna um örugga tengingu.</translation> <translation id="1656489000284462475">Afhending</translation> <translation id="1662550410081243962">Vista og fylla út greiðslumáta</translation> <translation id="1663943134801823270">Spjöld og heimilisföng eru úr Chrome. Þú getur haft umsjón með þeim í <ph name="BEGIN_LINK" />stillingunum<ph name="END_LINK" />.</translation> @@ -1375,7 +1375,7 @@ <translation id="6874604403660855544">Endu&rtaka nýtt bókamerki</translation> <translation id="6884662655240309489">Stærð 1</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> -<translation id="6888584790432772780">Chrome einfaldaði þessa síðu svo það yrði auðveldara að lesa hana. Chrome sótti upprunalega síðuna um ótrausta tengingu.</translation> +<translation id="6888584790432772780">Chrome einfaldaði þessa síðu svo það yrði auðveldara að lesa hana. Chrome sótti upprunalegu síðuna um ótrausta tengingu.</translation> <translation id="6891596781022320156">Stig stefnunnar er óstutt.</translation> <translation id="6895330447102777224">Kortið er staðfest</translation> <translation id="6897140037006041989">Vafraupplýsingar</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 12f1aa5..ac875ed3 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -1599,7 +1599,7 @@ <translation id="777702478322588152">Prefettura</translation> <translation id="7791196057686275387">Rilegatura</translation> <translation id="7791543448312431591">Aggiungi</translation> -<translation id="7798389633136518089">Ignorata perché il criterio non è stato impostato da un'origine cloud.</translation> +<translation id="7798389633136518089">Ignorato perché il criterio non è stato impostato da un'origine cloud.</translation> <translation id="7800304661137206267">La connessione è stata criptata utilizzando <ph name="CIPHER" />, con <ph name="MAC" /> per l'autenticazione dei messaggi e <ph name="KX" /> come meccanismo principale di scambio delle chiavi.</translation> <translation id="7802523362929240268">Il sito è legittimo</translation> <translation id="780301667611848630">No grazie</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 35a1ca6..571955a 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -1311,7 +1311,7 @@ <translation id="6521745193039995384">לא פעילה</translation> <translation id="6529602333819889595">&ביצוע מחדש של מחיקה</translation> <translation id="6534179046333460208">הצעות לאינטרנט הפיזי</translation> -<translation id="6543609420755597723">שיתוף עם מנהל המערכת נתונים לגבי פעולות שמשפיעות על אבטחת החשבון שסומנו על-ידי מחברי Chrome Enterprise. נתונים אלה עשויים לכלול כתובות URL של דפים שבהם ביקרת, שמות קבצים או מטא-נתונים, ואת שם המשתמש שלך לכניסה אל המכשיר ואל Chrome.</translation> +<translation id="6543609420755597723">שיתוף נתונים עם מנהל המערכת לגבי פעולות שמשפיעות על אבטחת החשבון וסומנו על-ידי מחברי Chrome Enterprise. נתונים אלה עשויים לכלול כתובות URL של דפים שבהם ביקרת, שמות קבצים או מטא-נתונים, ואת שם המשתמש שלך לכניסה אל המכשיר ואל Chrome.</translation> <translation id="6545864417968258051">סריקת Bluetooth</translation> <translation id="6547208576736763147">שני ניקובים בצד שמאל</translation> <translation id="6554795675067793129">החשבון שלך מנוהל על-ידי <ph name="ENROLLMENT_DOMAIN" />.</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index e0cb7197..523ba86 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -1373,7 +1373,7 @@ <translation id="6874604403660855544">&Қайта қосу</translation> <translation id="6884662655240309489">Өлшемі: 1</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> -<translation id="6888584790432772780">Chrome бұл режимде беттің оқылуын жеңілдетті. Chrome бастапқы бетті қауіпті байланыс арқылы алды.</translation> +<translation id="6888584790432772780">Chrome бұл режимде беттің оқылуын жеңілдетті. Chrome браузерінде бастапқы бет қорғалмаған байланыс арқылы алынды.</translation> <translation id="6891596781022320156">Саясат деңгейіне қолдау көрсетілмеген.</translation> <translation id="6895330447102777224">Картаңыз расталды</translation> <translation id="6897140037006041989">Пайдаланушы агенті</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 9833ed0..51cb668 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -874,7 +874,7 @@ <translation id="4731967714531604179">Prc2 (Конверт)</translation> <translation id="4733082559415072992"><ph name="URL" /> түзмөгүңүздүн жайгашкан жерин пайдаланганы жатат</translation> <translation id="4736825316280949806">Chromium’ду өчүрүп-күйгүзүңүз</translation> -<translation id="4737121147659370456">Администраторуңуз серепчиңизде Chrome Enterprise туташтыргычтарын иштетип койду. Бул туташтыргычтардын айрым маалыматыңызга кирүү мүмкүнчүлүктөрү бар.</translation> +<translation id="4737121147659370456">Администраторуңуз серепчиңизде Chrome Enterprise туташтыргычтарын иштетти. Бул туташтыргычтардын айрым маалыматыңызга кирүү мүмкүнчүлүктөрү бар.</translation> <translation id="473775607612524610">Жаңыртуу</translation> <translation id="4738601419177586157"><ph name="TEXT" /> издөө сунушу</translation> <translation id="4742407542027196863">Сырсөздөрдү башкаруу…</translation> @@ -1373,7 +1373,7 @@ <translation id="6874604403660855544">Кошууну &кайталоо</translation> <translation id="6884662655240309489">Өлчөмү: 1</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> -<translation id="6888584790432772780">Chrome бул баракты окууну жеңилдетүү үчүн жөнөкөйлөттү Chrome коопсуз туташуу аркылуу түпнуска баракты алды.</translation> +<translation id="6888584790432772780">Chrome бул баракты окууну жеңилдетүү үчүн жөнөкөйлөттү Chrome кооптуу туташуу аркылуу түпнуска баракты алды.</translation> <translation id="6891596781022320156">Саясат деңгээли колдоого алынбайт.</translation> <translation id="6895330447102777224">Карточкаңыз текшерилди</translation> <translation id="6897140037006041989">Колдонуучунун агенти</translation> @@ -1738,7 +1738,7 @@ <translation id="8371889962595521444">Ыңгайлаштырылган негизги тастыктамалар</translation> <translation id="8380941800586852976">Коркунучтуу</translation> <translation id="8381674639488873545">Алар бир жолу төлөнүүчү же кайталануучу төлөмдөр болушу мүмкүн, бирок алар ачык көрүнбөйт. <ph name="BEGIN_LINK" />Баары бир көрсөтүү<ph name="END_LINK" /></translation> -<translation id="8405166164747488837">Серепчиңизде <ph name="ENROLLMENT_DOMAIN" /> доменинин Chrome Enterprise туташтыргычтары бар. Бул туташтыргычтардын айрым маалыматыңызга кирүү мүмкүнчүлүктөрү бар.</translation> +<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> серепчиңизде Chrome Enterprise туташтыргычтарын иштетти. Бул туташтыргычтардын айрым маалыматыңызга кирүү мүмкүнчүлүктөрү бар.</translation> <translation id="8412145213513410671">Кыйроолор (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Бир купуя сөз айкашын эки жолу киргизишиңиз керек.</translation> <translation id="8416694386774425977">Тармак конфигурациясы жараксыз болгондуктан, импорттоо мүмкүн эмес.
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 7d135d85..8283b2b 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -1603,7 +1603,7 @@ <translation id="777702478322588152">Префектура</translation> <translation id="7791196057686275387">Бала</translation> <translation id="7791543448312431591">Додај</translation> -<translation id="7798389633136518089">Игнорирано бидејќи правилотот не е поставено од извор во облак.</translation> +<translation id="7798389633136518089">Игнорирано бидејќи правилото не е поставено од извор во облак.</translation> <translation id="7800304661137206267">Врската е шифрирана со употреба на <ph name="CIPHER" />, со <ph name="MAC" /> за автентикација на пораките и <ph name="KX" /> како механизам за размена на клучевите.</translation> <translation id="7802523362929240268">Сајтот е легитимен</translation> <translation id="780301667611848630">Не, фала</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 9392dd1a..fa8a140 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -867,7 +867,7 @@ <translation id="4731967714531604179">Prc2 (എൻവലപ്പ്)</translation> <translation id="4733082559415072992">നിങ്ങളുടെ ഉപകരണത്തിന്റെ ലൊക്കേഷൻ ഉപയോഗിക്കാൻ <ph name="URL" /> ആഗ്രഹിക്കുന്നു</translation> <translation id="4736825316280949806">Chromium റീസ്റ്റാർട്ടുചെയ്യുക</translation> -<translation id="4737121147659370456">നിങ്ങളുടെ അഡ്മിൻ നിങ്ങളുടെ ബ്രൗസറിൽ Chrome എന്റർപ്രൈസ് കണക്റ്ററുകൾ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു. ഈ കണക്റ്ററുകൾക്ക് നിങ്ങളുടെ ചില ഡാറ്റയിലേക്ക് ആക്സസ് ഉണ്ട്.</translation> +<translation id="4737121147659370456">അഡ്മിൻ നിങ്ങളുടെ ബ്രൗസറിൽ Chrome എന്റർപ്രൈസ് കണക്റ്ററുകൾ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്നു. ഈ കണക്റ്ററുകൾക്ക് നിങ്ങളുടെ ചില ഡാറ്റയിലേക്ക് ആക്സസ് ഉണ്ട്.</translation> <translation id="473775607612524610">അപ്ഡേറ്റ് ചെയ്യുക</translation> <translation id="4738601419177586157"><ph name="TEXT" /> തിരയൽ നിർദ്ദേശം</translation> <translation id="4742407542027196863">പാസ്വേഡുകൾ മാനേജ് ചെയ്യുക…</translation> @@ -1591,7 +1591,7 @@ <translation id="777702478322588152">പ്രിഫെക്ച്വര്</translation> <translation id="7791196057686275387">ബെയ്ൽ</translation> <translation id="7791543448312431591">ചേര്ക്കൂ</translation> -<translation id="7798389633136518089">ക്ലൗഡ് ഉറവിടം ഒരു നയം സജ്ജീകരിച്ചിട്ടില്ലാത്തതിനാൽ അവഗണിച്ചു.</translation> +<translation id="7798389633136518089">നയം സജ്ജീകരിച്ചത് ക്ലൗഡിൽ നിന്ന് അല്ലാത്തതിനാൽ അവഗണിച്ചു.</translation> <translation id="7800304661137206267">സന്ദേശ പരിശോധിച്ചുറപ്പിക്കലിനായി <ph name="KX" /> കീ എക്സേഞ്ച് മെക്കാനിസമായി <ph name="CIPHER" /> ഉപയോഗിച്ച് ഈ കണക്ഷനെ <ph name="MAC" /> എന്നതുമായി എന്ക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു.</translation> <translation id="7802523362929240268">സൈറ്റ് നിയമാനുസൃതമാണ്</translation> <translation id="780301667611848630">വേണ്ട നന്ദി</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index b15ff0620..49604807 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -867,7 +867,7 @@ <translation id="4731967714531604179">Prc2 (Envelope)</translation> <translation id="4733082559415072992"><ph name="URL" /> तपाईंको यन्त्रको स्थान प्रयोग गर्न चाहन्छ</translation> <translation id="4736825316280949806">Chromium लाई पुनः सुरु गर्नुहोस्</translation> -<translation id="4737121147659370456">तपाईंका प्रशासकले तपाईंको ब्राउजरमा Chrome Enterprise का कनेक्टरहरू समक्ष पार्नुभएको छ। यी कनेक्टरहरूले तपाईंका केही डेटा प्रयोग गर्न सक्छन्।</translation> +<translation id="4737121147659370456">तपाईंका प्रशासकले तपाईंको ब्राउजरमा Chrome Enterprise का कनेक्टरहरू सक्षम पार्नुभएको छ। यी कनेक्टरहरूले तपाईंका केही डेटा प्रयोग गर्न सक्छन्।</translation> <translation id="473775607612524610">अद्यावधिक गर्नुहोस्</translation> <translation id="4738601419177586157"><ph name="TEXT" /> को खोजसम्बन्धी सुझाव</translation> <translation id="4742407542027196863">पासवर्डहरूको व्यवस्थापन गर्नुहोस्…</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index cfc3517..ca1d8f6 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -863,7 +863,7 @@ <translation id="4731967714531604179">Prc2 (envelop)</translation> <translation id="4733082559415072992"><ph name="URL" /> wil de locatie van je apparaat gebruiken</translation> <translation id="4736825316280949806">Chromium opnieuw starten</translation> -<translation id="4737121147659370456">Je beheerder heeft Chrome Enterprise-connectors voor je browser ingeschakeld. Deze connectors hebben toegang tot sommige van je gegevens</translation> +<translation id="4737121147659370456">Je beheerder heeft Chrome Enterprise-connectors voor je browser ingeschakeld. Deze connectors hebben toegang tot sommige van je gegevens.</translation> <translation id="473775607612524610">Updaten</translation> <translation id="4738601419177586157">Zoeksuggestie: <ph name="TEXT" /></translation> <translation id="4742407542027196863">Wachtwoorden beheren…</translation> @@ -1722,7 +1722,7 @@ <translation id="8371889962595521444">Custom rootcertificaten</translation> <translation id="8380941800586852976">Gevaarlijk</translation> <translation id="8381674639488873545">Deze kosten kunnen eenmalig of terugkerend zijn en zijn mogelijk niet duidelijk aangegeven. <ph name="BEGIN_LINK" />Toch weergeven<ph name="END_LINK" /></translation> -<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> heeft Chrome Enterprise-connectors voor je browser ingesteld. Deze connectors hebben toegang tot sommige van je gegevens</translation> +<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> heeft Chrome Enterprise-connectors voor je browser ingesteld. Deze connectors hebben toegang tot sommige van je gegevens.</translation> <translation id="8412145213513410671">Crashes (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">Je moet twee keer dezelfde wachtwoordzin opgeven.</translation> <translation id="8416694386774425977">De netwerkconfiguratie is ongeldig en kan niet worden geïmporteerd.
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 8a29f13..470293c 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -169,7 +169,7 @@ <translation id="1644574205037202324">ଇତିବୃତ୍ତି</translation> <translation id="1645368109819982629">ଅସମର୍ଥିତ ପ୍ରୋଟୋକଲ୍</translation> <translation id="1652415888492971589">JIS B8</translation> -<translation id="1656024727720460136">ଏହି ପୃଷ୍ଠାଟି ପଢ଼ିବାକୁ ସହଜ କରିବା ପାଇଁ Chrome ଏହାକୁ ସରଳୀକୃତ କରିଛି। ଏକ ସୁରକ୍ଷିତ ସଂଯୋଗ ମାଧ୍ୟମରେ Chrome ମୂଳ ପୃଷ୍ଠାକୁ ପୁନରୁଦ୍ଧାର କରିଛି।</translation> +<translation id="1656024727720460136">ଏହି ପୃଷ୍ଠାଟି ପଢ଼ିବାକୁ ସହଜ କରିବା ପାଇଁ Chrome ଏହାକୁ ସରଳୀକୃତ କରିଛି। ଏକ ସୁରକ୍ଷିତ ସଂଯୋଗ ମାଧ୍ୟମରେ Chrome ଅରିଜିନାଲ ପୃଷ୍ଠାକୁ ପୁନରୁଦ୍ଧାର କରିଛି।</translation> <translation id="1656489000284462475">ପିକଅପ୍:</translation> <translation id="1662550410081243962">ଠିକଣାଗୁଡ଼ିକ ସେଭ୍ କରି ପୂରଣ କରନ୍ତୁ</translation> <translation id="1663943134801823270">କାର୍ଡ ଓ ଠିକଣାଗୁଡ଼ିକ ଆପଣଙ୍କର Chromeରୁ ଆସିଛି। ଆପଣ ସେଗୁଡ଼ିକୁ <ph name="BEGIN_LINK" />ସେଟିଂସ୍<ph name="END_LINK" />ରେ ପରିଚାଳନ କରିପାରିବେ।</translation> @@ -1359,7 +1359,7 @@ <translation id="6874604403660855544">&ଯୋଗ କରିବା ପୁନଃବତ୍ କରନ୍ତୁ</translation> <translation id="6884662655240309489">ଆକାର 1</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /><ph name="SHORT_URL" /></translation> -<translation id="6888584790432772780">ଏହି ପୃଷ୍ଠାଟି ପଢ଼ିବାକୁ ସହଜ କରିବା ପାଇଁ Chrome ଏହାକୁ ସରଳୀକୃତ କରିଛି। Chrome ଏକ ଅସୁରକ୍ଷିତ ସଂଯୋଗ ମାଧ୍ୟମରେ ମୂଳ ପୃଷ୍ଠାକୁ ପୁନରୁଦ୍ଧାର କରିଛି।</translation> +<translation id="6888584790432772780">ଏହି ପୃଷ୍ଠାଟି ପଢ଼ିବାକୁ ସହଜ କରିବା ପାଇଁ Chrome ଏହାକୁ ସରଳୀକୃତ କରିଛି। Chrome ଏକ ଅସୁରକ୍ଷିତ ସଂଯୋଗ ମାଧ୍ୟମରେ ଅରିଜିନାଲ ପୃଷ୍ଠାକୁ ପୁନରୁଦ୍ଧାର କରିଛି।</translation> <translation id="6891596781022320156">ନୀତି ସ୍ତର ସମର୍ଥିତ ନୁହେଁ।</translation> <translation id="6895330447102777224">ଆପଣଙ୍କ କାର୍ଡ ସୁନିଶ୍ଚିତ କରାଯାଇଛି</translation> <translation id="6897140037006041989">ଉପଯୋଗକର୍ତ୍ତା ଏଜେଣ୍ଟ</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 3dee22e..ec33da43 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -1216,7 +1216,7 @@ <translation id="6116338172782435947">da vidi tekst i slike koji su kopirani u privremenu memoriju</translation> <translation id="6120179357481664955">Želite da sačuvate ID za UPI?</translation> <translation id="6124432979022149706">Priključci za Chrome za preduzeća</translation> -<translation id="6135641591018127088">Koristite Google nalog da biste generisali jaku lozinku</translation> +<translation id="6135641591018127088">Upotrebite Google nalog da biste generisali jaku lozinku</translation> <translation id="6146055958333702838">Proverite sve kablove i restartujte sve rutere, modeme ili druge mrežne uređaje koje možda koristite.</translation> <translation id="614940544461990577">Pokušajte:</translation> <translation id="6150036310511284407">Trostruko bušenje na levoj strani</translation> @@ -1261,7 +1261,7 @@ <translation id="6328639280570009161">Pokušajte da onemogućite predviđanje mreže</translation> <translation id="6328784461820205019">„Veza nije privatna“ ili „<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>“ ili „<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>“ ili „<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>“ ili „<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>“ ili „Greška u vezi sa SSL sertifikatom“</translation> <translation id="6328786501058569169">Ovaj sajt je obmanjujuć</translation> -<translation id="6333334544069706521">Koristite lozinku koja se čuva na Google nalogu</translation> +<translation id="6333334544069706521">Koristite lozinke koje se čuvaju na Google nalogu</translation> <translation id="6337133576188860026">Oslobađa manje od <ph name="SIZE" />. Neki sajtovi će se možda sporije učitavati kad ih sledeći put posetite.</translation> <translation id="6337534724793800597">Filtriraj smernice prema nazivu</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Nijedna}=1{1 lozinka (za <ph name="DOMAIN_LIST" />, sinhronizovano)}=2{2 lozinke (za <ph name="DOMAIN_LIST" />, sinhronizovano)}one{# lozinka (za <ph name="DOMAIN_LIST" />, sinhronizovano)}few{# lozinke (za <ph name="DOMAIN_LIST" />, sinhronizovano)}other{# lozinki (za <ph name="DOMAIN_LIST" />, sinhronizovano)}}</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index a770911..0d9b90eb 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -1216,7 +1216,7 @@ <translation id="6116338172782435947">да види текст и слике који су копирани у привремену меморију</translation> <translation id="6120179357481664955">Желите да сачувате ИД за UPI?</translation> <translation id="6124432979022149706">Прикључци за Chrome за предузећа</translation> -<translation id="6135641591018127088">Користите Google налог да бисте генерисали јаку лозинку</translation> +<translation id="6135641591018127088">Употребите Google налог да бисте генерисали јаку лозинку</translation> <translation id="6146055958333702838">Проверите све каблове и рестартујте све рутере, модеме или друге мрежне уређаје које можда користите.</translation> <translation id="614940544461990577">Покушајте:</translation> <translation id="6150036310511284407">Троструко бушење на левој страни</translation> @@ -1261,7 +1261,7 @@ <translation id="6328639280570009161">Покушајте да онемогућите предвиђање мреже</translation> <translation id="6328784461820205019">„Веза није приватна“ или „<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>“ или „<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>“ или „<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>“ или „<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>“ или „Грешка у вези са SSL сертификатом“</translation> <translation id="6328786501058569169">Овај сајт је обмањујућ</translation> -<translation id="6333334544069706521">Користите лозинку која се чува на Google налогу</translation> +<translation id="6333334544069706521">Користите лозинке које се чувају на Google налогу</translation> <translation id="6337133576188860026">Ослобађа мање од <ph name="SIZE" />. Неки сајтови ће се можда спорије учитавати кад их следећи пут посетите.</translation> <translation id="6337534724793800597">Филтрирај смернице према називу</translation> <translation id="6353505687280762741">{COUNT,plural, =0{Ниједна}=1{1 лозинка (за <ph name="DOMAIN_LIST" />, синхронизовано)}=2{2 лозинке (за <ph name="DOMAIN_LIST" />, синхронизовано)}one{# лозинка (за <ph name="DOMAIN_LIST" />, синхронизовано)}few{# лозинке (за <ph name="DOMAIN_LIST" />, синхронизовано)}other{# лозинки (за <ph name="DOMAIN_LIST" />, синхронизовано)}}</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index d58d43f..3228e51 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -1304,7 +1304,7 @@ <translation id="6521745193039995384">Haitumiki</translation> <translation id="6529602333819889595">Rudia Kufuta</translation> <translation id="6534179046333460208">Mapendekezo ya Wavuti kila Mahali</translation> -<translation id="6543609420755597723">Shiriki data kuhusu matukio ya usalama ambayo yameripotiwa na Viunganishi vya Chrome Enterprise na msimamizi wako. Data hii inaweza kujumuisha URL za kurasa ambazo umetembelea, majina ya faili au metadata na jina la mtumiaji unalotumia kuingia katika kifaa chako na Chrome.</translation> +<translation id="6543609420755597723">Shiriki na msimamizi wako data kuhusu matukio ya usalama ambayo yameripotiwa na Viunganishi vya Chrome Enterprise. Data hii inaweza kujumuisha URL za kurasa ambazo umetembelea, majina ya faili au metadata na jina la mtumiaji unalotumia kuingia katika kifaa chako na Chrome.</translation> <translation id="6545864417968258051">Kutafuta Bluetooth</translation> <translation id="6547208576736763147">Toboa mara mbili kushoto</translation> <translation id="6554795675067793129">Akaunti yako inadhibitiwa na <ph name="ENROLLMENT_DOMAIN" />.</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 446fcac..a80d9a0 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -316,6 +316,7 @@ <translation id="2288422996159078444">நீங்கள் தட்டச்சு செய்பவை, பார்வையிடும் பக்கங்கள், இணையத்தில் செய்யும் பிற நடவடிக்கைகள் கண்காணிக்கப்படுகின்றன. மேலும் உங்களுக்குத் தெரியாமலேயே தளங்களில் உள்ள உள்ளடக்கம் மாற்றப்படலாம்.</translation> <translation id="2289385804009217824">டிரிம்</translation> <translation id="2292556288342944218">உங்கள் இணைய அணுகல் தடுக்கப்பட்டது</translation> +<translation id="2293443924986248631">இது இயக்கப்பட்டிருக்கும்போது உங்கள் இணைய நடவடிக்கைகளைக் கண்காணிக்கும் குக்கீகளைத் தளங்களால் பயன்படுத்த முடியாது. சில வலைதளங்களிலுள்ள அம்சங்கள் சிதைவடையக்கூடும்.</translation> <translation id="2297722699537546652">B5 (என்வலப்)</translation> <translation id="2300306941146563769">பதிவேற்றப்படவில்லை</translation> <translation id="2310021320168182093">Chou2 (என்வலப்)</translation> @@ -1022,6 +1023,11 @@ <translation id="536296301121032821">கொள்கை அமைப்புகளைச் சேமிப்பதில் தோல்வி</translation> <translation id="5371425731340848620">கார்டை மாற்றவும்</translation> <translation id="5377026284221673050">"நேரம் பின்தங்கியுள்ளது" அல்லது "நேரம் கூடுதலாக அமைக்கப்பட்டுள்ளது" அல்லது "<span class="error-code">NET::ERR_CERT_DATE_INVALID</span>"</translation> +<translation id="5380442954567233718">மேற்குறிப்பு ஒன்றை நீங்கள் செல்லவிருக்கும் சேவையகமான <ph name="ORIGIN" /> அமைத்துள்ளது + இதனால் கோரிக்கைகள் அனைத்திற்கும் அசல் கொள்கை பொருந்துவது அவசியமாகிறது. ஆனால் + மேற்குறிப்பு நிலைமாறி உள்ளதால் + <ph name="SITE" /> இணையதளத்திற்கான உங்கள் கோரிக்கையை நிறைவுசெய்ய முடியாத வகையில் உலாவி தடுக்கப்பட்டுள்ளது. இணையதள ஆப்ரேட்டர்கள் இணையதளத்திற்கான பாதுகாப்பையும் மற்ற பண்புகளையும் உள்ளமைக்க + அசல் கொள்கைகளைப் பயன்படுத்தலாம்.</translation> <translation id="5386426401304769735">இந்தச் சான்றிதழ் சங்கிலியில், SHA-1ஐப் பயன்படுத்தி கையொப்பமிடப்பட்ட சான்றிதழ் உள்ளது.</translation> <translation id="538659543871111977">A4-Tab</translation> <translation id="5396631636586785122">எட்ஜ் ஸ்டிட்ச் ரைட்</translation> @@ -1567,6 +1573,7 @@ <translation id="7757555340166475417">Dai-Pa-Kai</translation> <translation id="7758069387465995638">ஃபயர்வால் அல்லது வைரஸ்தடுப்பு மென்பொருள் உங்கள் இணைப்பைத் தடுத்திருக்கலாம்.</translation> <translation id="7759163816903619567">காட்சி டொமைன்:</translation> +<translation id="776110834126722255">நிறுத்தப்பட்டது</translation> <translation id="7761701407923456692">சேவையகச் சான்றிதழ் URL உடன் பொருந்தவில்லை.</translation> <translation id="7763386264682878361">பேமெண்ட் மெனிஃபெஸ்ட் பாகுபடுத்தி</translation> <translation id="7764225426217299476">முகவரியைச் சேர்</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 47ef1c52..fc10384b 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -1604,7 +1604,7 @@ <translation id="777702478322588152">انتظامی حلقہ</translation> <translation id="7791196057686275387">گانٹھ باندھیں</translation> <translation id="7791543448312431591">شامل کریں</translation> -<translation id="7798389633136518089">نظر انداز کیا گیا کیونکہ پالیسی کلاؤڈ سورس کے ذریعے سیٹ نہیں کی گئی ہے۔</translation> +<translation id="7798389633136518089">نظر انداز کی گئی کیونکہ پالیسی کلاؤڈ سورس کے ذریعے سیٹ نہیں کی گئی ہے۔</translation> <translation id="7800304661137206267">یہ کنکشن پیغام کی توثیق کیلئے <ph name="MAC" /> اور کلید کے تبادلے کے میکانزم کے بطور <ph name="KX" /> کے ساتھ، <ph name="CIPHER" /> کا استعمال کرتے ہوئے مرموز کیا گیا ہے۔</translation> <translation id="7802523362929240268">سائٹ جائز ہے</translation> <translation id="780301667611848630">نہیں شکریہ</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 0424c06..32424e2b 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -169,7 +169,7 @@ <translation id="1644574205037202324">記錄</translation> <translation id="1645368109819982629">不支援的通訊協定</translation> <translation id="1652415888492971589">JIS B8</translation> -<translation id="1656024727720460136">Chrome 已簡化此頁面,讓您更輕易閱讀。Chrome 已透過安全連線擷取原始網頁。</translation> +<translation id="1656024727720460136">Chrome 已簡化此頁面,方便您閱讀。Chrome 已透過安全連線擷取原始網頁。</translation> <translation id="1656489000284462475">取貨</translation> <translation id="1662550410081243962">儲存和填入付款方法</translation> <translation id="1663943134801823270">信用卡和地址選項均來自 Chrome。您可在「<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />」中管理這些選項。</translation> @@ -866,7 +866,7 @@ <translation id="4731967714531604179">Prc2 (信封)</translation> <translation id="4733082559415072992"><ph name="URL" /> 要求使用裝置的位置資料</translation> <translation id="4736825316280949806">重新啟動 Chromium</translation> -<translation id="4737121147659370456">管理員已在您的瀏覽器上啟用「Chrome Enterprise 連接器」。這些連接器可存取您的部分資料。</translation> +<translation id="4737121147659370456">管理員已在您的瀏覽器上啟用 Chrome Enterprise Connectors。這些連接器可存取您的部分資料。</translation> <translation id="473775607612524610">更新</translation> <translation id="4738601419177586157">「<ph name="TEXT" />」搜尋建議</translation> <translation id="4742407542027196863">管理密碼…</translation> @@ -1202,7 +1202,7 @@ <translation id="610911394827799129">您的 Google 帳戶在 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 上可能有其他形式的瀏覽記錄</translation> <translation id="6116338172782435947">查看複製到剪貼簿的文字和圖片</translation> <translation id="6120179357481664955">要記住您的 UPI ID 嗎?</translation> -<translation id="6124432979022149706">Chrome Enterprise 連接器</translation> +<translation id="6124432979022149706">Chrome Enterprise Connectors</translation> <translation id="6135641591018127088">使用 Google 帳戶產生安全性強的密碼</translation> <translation id="6146055958333702838">檢查連接線,或重新啟動路由器、數據機或其他使用中的 網絡裝置。</translation> @@ -1295,7 +1295,7 @@ <translation id="6521745193039995384">未啟用</translation> <translation id="6529602333819889595">重做刪除(&R)</translation> <translation id="6534179046333460208">實體網絡建議</translation> -<translation id="6543609420755597723">與管理員分享「Chrome Enterprise 連接器」所標記的安全性事件相關資料。這些資料可能包括您瀏覽的網址、檔案名稱或元數據,以及用於登入裝置和 Chrome 的使用者名稱。</translation> +<translation id="6543609420755597723">與管理員分享 Chrome Enterprise Connectors 所標記的安全性事件相關資料。這些資料可能包括您瀏覽的網址、檔案名稱或元數據,以及用於登入裝置和 Chrome 的使用者名稱。</translation> <translation id="6545864417968258051">藍牙掃瞄</translation> <translation id="6547208576736763147">雙孔 (左側)</translation> <translation id="6554795675067793129">您的帳戶由 <ph name="ENROLLMENT_DOMAIN" /> 管理。</translation> @@ -1361,7 +1361,7 @@ <translation id="6874604403660855544">重做新增(&R)</translation> <translation id="6884662655240309489">粗幼:1</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> -<translation id="6888584790432772780">Chrome 已簡化此頁面,讓您更輕易閱讀。Chrome 已透過不安全連線擷取原始網頁。</translation> +<translation id="6888584790432772780">Chrome 已簡化此頁面,方便您閱讀。Chrome 已透過不安全連線擷取原始網頁。</translation> <translation id="6891596781022320156">系統不支援這項政策的層級。</translation> <translation id="6895330447102777224">您的信用卡已完成驗證</translation> <translation id="6897140037006041989">使用者代理程式</translation> @@ -1726,7 +1726,7 @@ <translation id="8371889962595521444">自訂根憑證</translation> <translation id="8380941800586852976">不安全</translation> <translation id="8381674639488873545">這些費用可能是一次性或會重複收取,而收費時亦可能難以察覺。<ph name="BEGIN_LINK" />仍要顯示<ph name="END_LINK" /></translation> -<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> 已在您的瀏覽器上啟用「Chrome Enterprise 連接器」。這些連接器可存取您的部分資料。</translation> +<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> 已在您的瀏覽器上啟用 Chrome Enterprise Connectors。這些連接器可存取您的部分資料。</translation> <translation id="8412145213513410671">當機次數 (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">您必須輸入兩次相同的複雜密碼。</translation> <translation id="8416694386774425977">網絡設定無效,無法匯入。
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index b35bc4a..14cb223 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -169,6 +169,7 @@ <translation id="1644574205037202324">歷史記錄</translation> <translation id="1645368109819982629">不支援的通訊協定</translation> <translation id="1652415888492971589">JIS B8</translation> +<translation id="1656024727720460136">Chrome 已簡化這個頁面,讓內容更易於閱讀。Chrome 透過安全連線擷取原始頁面。</translation> <translation id="1656489000284462475">取件</translation> <translation id="1662550410081243962">儲存及填入付款方式</translation> <translation id="1663943134801823270">信用卡和地址資訊皆來自 Chrome。你可以在<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />頁面管理這些資訊。</translation> @@ -561,6 +562,7 @@ <translation id="342781501876943858">如果你在其他網站上重複使用過你的密碼,Chromium 會建議你重設密碼。</translation> <translation id="3428151540071562330">一或多個 DnsOverHttpsTemplates 伺服器範本 URI 無效,因此系統不會採用這些伺服器範本 URI。</translation> <translation id="3431636764301398940">將這張信用卡儲存到這個裝置</translation> +<translation id="3432601291244612633">關閉頁面</translation> <translation id="3443726618221119081">Juuro-Ku-Kai</translation> <translation id="3447661539832366887">這個裝置的擁有者已關閉恐龍遊戲。</translation> <translation id="3447884698081792621">顯示憑證 (核發者:<ph name="ISSUER" />)</translation> @@ -866,6 +868,7 @@ <translation id="4731967714531604179">Prc2 (信封)</translation> <translation id="4733082559415072992"><ph name="URL" /> 要求使用裝置的位置資訊</translation> <translation id="4736825316280949806">重新啟動 Chromium</translation> +<translation id="4737121147659370456">系統管理員已為你的瀏覽器啟用 Chrome Enterprise 連接器。這些連接器可以存取你的部分資料。</translation> <translation id="473775607612524610">更新</translation> <translation id="4738601419177586157">「<ph name="TEXT" />」搜尋建議</translation> <translation id="4742407542027196863">管理密碼…</translation> @@ -1201,6 +1204,8 @@ <translation id="610911394827799129">你的 Google 帳戶仍可能保留了其他類型的瀏覽記錄 (可前往 <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> 查詢)。</translation> <translation id="6116338172782435947">讀取已複製到剪貼簿的文字和圖片</translation> <translation id="6120179357481664955">還記得你的 UPI ID 嗎?</translation> +<translation id="6124432979022149706">Chrome Enterprise 連接器</translation> +<translation id="6135641591018127088">使用 Google 帳戶產生高強度密碼</translation> <translation id="6146055958333702838">檢查您的網路線是否穩固連接。重新啟動您可能正在使用的任何路由器、 數據機或其他網路裝置。</translation> <translation id="614940544461990577">建議做法:</translation> @@ -1246,6 +1251,7 @@ <translation id="6328639280570009161">建議停用網路預測功能</translation> <translation id="6328784461820205019">「你的連線不是私人連線」、「<span class="error-code">NET::ERR_CERT_AUTHORITY_INVALID</span>」、「<span class="error-code">ERR_CERT_COMMON_NAME_INVALID</span>」、「<span class="error-code">NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM</span>」、「<span class="error-code">ERR_CERT_SYMANTEC_LEGACY</span>」或「SSL 憑證錯誤」</translation> <translation id="6328786501058569169">這是詐欺網站</translation> +<translation id="6333334544069706521">使用儲存在 Google 帳戶中的密碼</translation> <translation id="6337133576188860026">釋出不到 <ph name="SIZE" />。下次造訪部分網站時,載入速度可能會變慢。</translation> <translation id="6337534724793800597">依名稱篩選政策</translation> <translation id="6353505687280762741">{COUNT,plural, =0{無}=1{有 1 組密碼 (<ph name="DOMAIN_LIST" />,已同步處理)}=2{有 2 組密碼 (<ph name="DOMAIN_LIST" />,已同步處理)}other{有 # 組密碼 (<ph name="DOMAIN_LIST" />,已同步處理)}}</translation> @@ -1291,6 +1297,7 @@ <translation id="6521745193039995384">未啟用</translation> <translation id="6529602333819889595">重做刪除(&R)</translation> <translation id="6534179046333460208">實體化網路建議</translation> +<translation id="6543609420755597723">將 Chrome Enterprise 連接器標記的安全性事件相關資料提供給系統管理員。這些資料可能包括你造訪的網頁網址、檔案名稱或中繼資料,以及用於登入裝置和 Chrome 的使用者名稱。</translation> <translation id="6545864417968258051">藍牙掃描</translation> <translation id="6547208576736763147">雙孔 (左側)</translation> <translation id="6554795675067793129">你的帳戶是由 <ph name="ENROLLMENT_DOMAIN" /> 管理。</translation> @@ -1356,6 +1363,7 @@ <translation id="6874604403660855544">重做新增(&R)</translation> <translation id="6884662655240309489">粗細:1</translation> <translation id="6886577214605505410"><ph name="LOCATION_TITLE" /> <ph name="SHORT_URL" /></translation> +<translation id="6888584790432772780">Chrome 已簡化這個頁面,讓內容更易於閱讀。Chrome 透過不安全的連線擷取原始頁面。</translation> <translation id="6891596781022320156">系統不支援這項政策的層級。</translation> <translation id="6895330447102777224">您的信用卡已通過驗證</translation> <translation id="6897140037006041989">使用者代理程式</translation> @@ -1584,6 +1592,7 @@ <translation id="777702478322588152">縣</translation> <translation id="7791196057686275387">綑綁式裝訂</translation> <translation id="7791543448312431591">新增</translation> +<translation id="7798389633136518089">由於這個政策並非透過雲端來源設定,因此遭到忽略。</translation> <translation id="7800304661137206267">連線採用 <ph name="CIPHER" /> 加密,並設有 <ph name="MAC" /> 訊息驗證及 <ph name="KX" /> 金鑰交換機制。</translation> <translation id="7802523362929240268">網站合法</translation> <translation id="780301667611848630">不用了,謝謝</translation> @@ -1719,6 +1728,7 @@ <translation id="8371889962595521444">自訂根憑證</translation> <translation id="8380941800586852976">不安全</translation> <translation id="8381674639488873545">這些費用可能是一次性或週期性的費用,而且可能難以察覺。<ph name="BEGIN_LINK" />仍要顯示<ph name="END_LINK" /></translation> +<translation id="8405166164747488837"><ph name="ENROLLMENT_DOMAIN" /> 已在你的瀏覽器上啟用 Chrome Enterprise 連接器。這些連接器可以存取你的部分資料。</translation> <translation id="8412145213513410671">當機次數 (<ph name="CRASH_COUNT" />)</translation> <translation id="8412392972487953978">你必須輸入兩次相同的通關密語。</translation> <translation id="8416694386774425977">網路設定無效,無法匯入。
diff --git a/components/subresource_filter/FILTER_LIST_GENERATION.md b/components/subresource_filter/FILTER_LIST_GENERATION.md index 5a8f8c9..cef20f07 100644 --- a/components/subresource_filter/FILTER_LIST_GENERATION.md +++ b/components/subresource_filter/FILTER_LIST_GENERATION.md
@@ -91,8 +91,8 @@ Appends whitelist rules and also deduplicates rules which only differ by their set of affected domains. ```sh 1. grep ^@@ easylist.txt >> smaller_list.txt -2. awk -F,domain= '{ if(!length($2)) table[$1] = ""; else table[$1 FS] = length(table[$1 FS]) ? table[$1 FS] "|" $2 : $2; } END{ for (key in table) print key table[key] }' smaller_list.txt > smaller_list_deduped.tmp && mv smaller_test_deduped.tmp smaller_list.txt -3. sort smaller_list.txt | uniq > final_list.txt +2. sort smaller_list.txt | uniq > deduped_smaller_list.txt +3. awk -F,domain= '{ if(!length($2)) table[$1] = ""; else table[$1 FS] = length(table[$1 FS]) ? table[$1 FS] "|" $2 : $2; } END{ for (key in table) print key table[key] }' deduped_smaller_list.txt > final_list.txt ``` ## 5. Turn the final list into a form usable by Chromium tools
diff --git a/components/sync_sessions/synced_session.cc b/components/sync_sessions/synced_session.cc index 95995d59..cd0d0ac 100644 --- a/components/sync_sessions/synced_session.cc +++ b/components/sync_sessions/synced_session.cc
@@ -296,7 +296,7 @@ tab->current_navigation_index = sync_data.current_navigation_index(); tab->pinned = sync_data.pinned(); tab->extension_app_id = sync_data.extension_app_id(); - tab->user_agent_override.clear(); + tab->user_agent_override = sessions::SerializedUserAgentOverride(); tab->timestamp = timestamp; tab->navigations.clear(); for (int i = 0; i < sync_data.navigation_size(); ++i) {
diff --git a/components/sync_sessions/synced_session_unittest.cc b/components/sync_sessions/synced_session_unittest.cc index bfa1a39f..6315c92f 100644 --- a/components/sync_sessions/synced_session_unittest.cc +++ b/components/sync_sessions/synced_session_unittest.cc
@@ -215,7 +215,7 @@ tab.current_navigation_index = 1000; tab.pinned = false; tab.extension_app_id = "fake"; - tab.user_agent_override = "fake"; + tab.user_agent_override.ua_string_override = "fake"; tab.timestamp = base::Time::FromInternalValue(100); tab.navigations.resize(100); tab.session_storage_persistent_id = "fake"; @@ -227,7 +227,7 @@ EXPECT_EQ(3, tab.current_navigation_index); EXPECT_TRUE(tab.pinned); EXPECT_EQ("app_id", tab.extension_app_id); - EXPECT_TRUE(tab.user_agent_override.empty()); + EXPECT_TRUE(tab.user_agent_override.ua_string_override.empty()); EXPECT_EQ(5u, tab.timestamp.ToInternalValue()); ASSERT_EQ(5u, tab.navigations.size()); for (int i = 0; i < 5; ++i) { @@ -250,7 +250,7 @@ tab.current_navigation_index = 3; tab.pinned = true; tab.extension_app_id = "app_id"; - tab.user_agent_override = "fake"; + tab.user_agent_override.ua_string_override = "fake"; tab.timestamp = base::Time::FromInternalValue(100); for (int i = 0; i < 5; ++i) { sessions::SerializedNavigationEntry entry =
diff --git a/components/url_formatter/spoof_checks/idn_spoof_checker_unittest.cc b/components/url_formatter/spoof_checks/idn_spoof_checker_unittest.cc index 44f2963..f9821773 100644 --- a/components/url_formatter/spoof_checks/idn_spoof_checker_unittest.cc +++ b/components/url_formatter/spoof_checks/idn_spoof_checker_unittest.cc
@@ -70,6 +70,8 @@ {"www.google.com.", L"www.google.com.", kSafe}, {".", L".", kSafe}, {"", L"", kSafe}, + // Invalid IDN + {"xn--example-.com", L"xn--example-.com", kInvalid}, // IDN // Hanzi (Traditional Chinese) {"xn--1lq90ic7f1rc.cn", L"\x5317\x4eac\x5927\x5b78.cn", kSafe},
diff --git a/components/url_formatter/url_formatter.cc b/components/url_formatter/url_formatter.cc index 58cadb9..d7cc2ea 100644 --- a/components/url_formatter/url_formatter.cc +++ b/components/url_formatter/url_formatter.cc
@@ -408,9 +408,11 @@ return false; // Early return if the input cannot be an IDN component. + // Valid punycode must not end with a dash. static const base::char16 kIdnPrefix[] = {'x', 'n', '-', '-'}; if (comp_len <= base::size(kIdnPrefix) || - memcmp(comp, kIdnPrefix, sizeof(kIdnPrefix)) != 0) { + memcmp(comp, kIdnPrefix, sizeof(kIdnPrefix)) != 0 || + comp[comp_len - 1] == '-') { out->append(comp, comp_len); return false; }
diff --git a/components/viz/service/display_embedder/skia_output_device_vulkan.cc b/components/viz/service/display_embedder/skia_output_device_vulkan.cc index d533647f..f8bd34a6 100644 --- a/components/viz/service/display_embedder/skia_output_device_vulkan.cc +++ b/components/viz/service/display_embedder/skia_output_device_vulkan.cc
@@ -6,12 +6,10 @@ #include <utility> -#include "base/system/sys_info.h" #include "build/build_config.h" #include "components/viz/common/gpu/vulkan_context_provider.h" #include "gpu/command_buffer/service/memory_tracking.h" #include "gpu/ipc/common/gpu_surface_lookup.h" -#include "gpu/vulkan/vulkan_fence_helper.h" #include "gpu/vulkan/vulkan_function_pointers.h" #include "gpu/vulkan/vulkan_implementation.h" #include "gpu/vulkan/vulkan_surface.h" @@ -58,23 +56,8 @@ if (!vulkan_surface_) return; -#if defined(OS_ANDROID) - if (base::SysInfo::IsLowEndDevice()) { - // For low end device, output surface will be destroyed when chrome goes - // into background. And a new output surface will be created when chrome - // goes to foreground again. The vulkan surface cannot be created - // successfully, if the old vulkan surface is not destroyed. To avoid the - // problem, we sync the device queue, and destroy the vulkan surface - // synchronously. vkQueueWaitIdle(context_provider_->GetDeviceQueue()->GetVulkanQueue()); vulkan_surface_->Destroy(); - return; - } -#endif - - auto* fence_helper = context_provider_->GetDeviceQueue()->GetFenceHelper(); - fence_helper->EnqueueVulkanObjectCleanupForSubmittedWork( - std::move(vulkan_surface_)); } bool SkiaOutputDeviceVulkan::Reshape(const gfx::Size& size,
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 3a74b077..6707ea5 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -682,8 +682,9 @@ "content_service_delegate_impl.h", "conversions/conversion_host.cc", "conversions/conversion_host.h", - "conversions/conversion_manager.cc", "conversions/conversion_manager.h", + "conversions/conversion_manager_impl.cc", + "conversions/conversion_manager_impl.h", "conversions/conversion_policy.cc", "conversions/conversion_policy.h", "conversions/conversion_report.cc",
diff --git a/content/browser/accessibility/hit_testing_browsertest.cc b/content/browser/accessibility/hit_testing_browsertest.cc index 4fe50c0..d8971de3f 100644 --- a/content/browser/accessibility/hit_testing_browsertest.cc +++ b/content/browser/accessibility/hit_testing_browsertest.cc
@@ -26,12 +26,47 @@ namespace content { +// First parameter of the tuple = device scale factor +// Second parameter = whether use-zoom-for-dsf is enabled +using AccessibilityZoomTestParam = std::tuple<double, bool>; + class AccessibilityHitTestingBrowserTest - : public AccessibilityContentBrowserTest { + : public AccessibilityContentBrowserTest, + public ::testing::WithParamInterface<AccessibilityZoomTestParam> { public: AccessibilityHitTestingBrowserTest() = default; ~AccessibilityHitTestingBrowserTest() override = default; + void SetUpCommandLine(base::CommandLine* command_line) override { + double device_scale_factor; + bool use_zoom_for_dsf; + std::tie(device_scale_factor, use_zoom_for_dsf) = GetParam(); + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kForceDeviceScaleFactor, + base::StringPrintf("%.2f", device_scale_factor)); + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kEnableUseZoomForDSF, use_zoom_for_dsf ? "true" : "false"); + } + + struct TestPassToString { + std::string operator()( + const ::testing::TestParamInfo<AccessibilityZoomTestParam>& info) + const { + double device_scale_factor; + bool use_zoom_for_dsf; + std::tie(device_scale_factor, use_zoom_for_dsf) = info.param; + std::string name = base::StringPrintf("ZoomFactor%g_UseZoomForDSF%s", + device_scale_factor, + use_zoom_for_dsf ? "On" : "Off"); + + // The test harness only allows alphanumeric characters and underscores + // in param names. + std::string sanitized_name; + base::ReplaceChars(name, ".", "_", &sanitized_name); + return sanitized_name; + } + }; + BrowserAccessibilityManager* GetRootBrowserAccessibilityManager() { WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(shell()->web_contents()); @@ -180,6 +215,7 @@ void SetUpCommandLine(base::CommandLine* command_line) override { IsolateAllSitesForTesting(command_line); + AccessibilityHitTestingBrowserTest::SetUpCommandLine(command_line); } void SetUpOnMainThread() override { @@ -189,47 +225,19 @@ } }; -using AccessibilityZoomTestParam = std::tuple<double, bool>; - -class AccessibilityHitTestingZoomBrowserTest - : public AccessibilityHitTestingBrowserTest, - public ::testing::WithParamInterface<AccessibilityZoomTestParam> { - public: - AccessibilityHitTestingZoomBrowserTest() = default; - ~AccessibilityHitTestingZoomBrowserTest() override = default; - - void SetUpCommandLine(base::CommandLine* command_line) override { - double device_scale_factor; - bool use_zoom_for_dsf; - std::tie(device_scale_factor, use_zoom_for_dsf) = GetParam(); - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - switches::kForceDeviceScaleFactor, - base::StringPrintf("%.2f", device_scale_factor)); - base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( - switches::kEnableUseZoomForDSF, use_zoom_for_dsf ? "true" : "false"); - } - - struct TestPassToString { - std::string operator()( - const ::testing::TestParamInfo<AccessibilityZoomTestParam>& info) - const { - double device_scale_factor; - bool use_zoom_for_dsf; - std::tie(device_scale_factor, use_zoom_for_dsf) = info.param; - return base::StringPrintf("ZoomFactor%g_UseZoomForDSF%s", - device_scale_factor, - use_zoom_for_dsf ? "On" : "Off"); - } - }; -}; +INSTANTIATE_TEST_SUITE_P( + All, + AccessibilityHitTestingBrowserTest, + ::testing::Combine(::testing::Values(1, 1.25), ::testing::Bool()), + AccessibilityHitTestingBrowserTest::TestPassToString()); INSTANTIATE_TEST_SUITE_P( All, - AccessibilityHitTestingZoomBrowserTest, - ::testing::Combine(::testing::Values(1, 2), ::testing::Bool()), - AccessibilityHitTestingZoomBrowserTest::TestPassToString()); + AccessibilityHitTestingCrossProcessBrowserTest, + ::testing::Combine(::testing::Values(1, 1.25), ::testing::Bool()), + AccessibilityHitTestingBrowserTest::TestPassToString()); -IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingZoomBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, CachingAsyncHitTest) { ASSERT_TRUE(embedded_test_server()->Start()); @@ -272,7 +280,7 @@ hit_node->GetClippedScreenBoundsRect()); } -IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingZoomBrowserTest, HitTest) { +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, HitTest) { ASSERT_TRUE(embedded_test_server()->Start()); EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL))); @@ -314,7 +322,7 @@ hit_node->GetClippedScreenBoundsRect()); } -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, HitTestOutsideDocumentBoundsReturnsRoot) { EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL))); @@ -340,7 +348,7 @@ ASSERT_EQ(ax::mojom::Role::kRootWebArea, hit_node->GetRole()); } -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, HitTestingInIframes) { ASSERT_TRUE(embedded_test_server()->Start()); @@ -397,20 +405,20 @@ ASSERT_EQ("Scrolled Button", hit_node->GetStringAttribute(ax::mojom::StringAttribute::kName)); - // (50, 505) -> div in second iframe - hit_node = HitTestAndWaitForResult(gfx::Point(50, 505)); + // (50, 478) -> div in second iframe + hit_node = HitTestAndWaitForResult(gfx::Point(50, 478)); ASSERT_TRUE(hit_node != nullptr); ASSERT_EQ(ax::mojom::Role::kGenericContainer, hit_node->GetRole()); - // (50, 505) -> div in second iframe + // (50, 478) -> div in second iframe // but with a different event - hit_node = HitTestAndWaitForResultWithEvent(gfx::Point(50, 505), + hit_node = HitTestAndWaitForResultWithEvent(gfx::Point(50, 478), ax::mojom::Event::kAlert); ASSERT_NE(hit_node, nullptr); ASSERT_EQ(ax::mojom::Role::kGenericContainer, hit_node->GetRole()); } -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingCrossProcessBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingCrossProcessBrowserTest, HitTestingInCrossProcessIframes) { GURL url_a(embedded_test_server()->GetURL( "a.com", "/accessibility/hit_testing/hit_testing_a.html")); @@ -489,7 +497,7 @@ } } -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingCrossProcessBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingCrossProcessBrowserTest, HitTestingInScrolledCrossProcessIframe) { GURL url_a(embedded_test_server()->GetURL( "a.com", "/accessibility/hit_testing/hit_testing_a.html")); @@ -555,7 +563,7 @@ } } -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, CachingAsyncHitTestingInIframes) { ASSERT_TRUE(embedded_test_server()->Start()); @@ -615,16 +623,16 @@ EXPECT_EQ("Scrolled Button", hit_node->GetStringAttribute(ax::mojom::StringAttribute::kName)); - // (50, 505) -> div in second iframe - hit_node = CallCachingAsyncHitTest(gfx::Point(50, 505)); + // (50, 478) -> div in second iframe + hit_node = CallCachingAsyncHitTest(gfx::Point(50, 478)); ASSERT_TRUE(hit_node != nullptr); EXPECT_NE(ax::mojom::Role::kGenericContainer, hit_node->GetRole()); - hit_node = CallCachingAsyncHitTest(gfx::Point(50, 505)); + hit_node = CallCachingAsyncHitTest(gfx::Point(50, 478)); EXPECT_EQ(ax::mojom::Role::kGenericContainer, hit_node->GetRole()); } #if !defined(OS_ANDROID) && !defined(OS_MACOSX) -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, HitTestingWithPinchZoom) { ASSERT_TRUE(embedded_test_server()->Start()); @@ -722,7 +730,7 @@ hit_node->GetStringAttribute(ax::mojom::StringAttribute::kName)); } -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, HitTestingWithPinchZoomAndIframes) { ASSERT_TRUE(embedded_test_server()->Start()); @@ -786,7 +794,7 @@ // Chrome OS or Chromecast) #if defined(OS_WIN) || \ (defined(OS_LINUX) && !defined(OS_CHROMEOS) && !BUILDFLAG(IS_CHROMECAST)) -IN_PROC_BROWSER_TEST_F(AccessibilityHitTestingBrowserTest, +IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingBrowserTest, NearestLeafInIframes) { ASSERT_TRUE(embedded_test_server()->Start()); @@ -858,11 +866,11 @@ EXPECT_EQ("Scrolled Button", hit_node->GetStringAttribute(ax::mojom::StringAttribute::kName)); - // (50, 505) -> "Scrolled Button" - hit_node = CallNearestLeafNode(gfx::Point(50, 505)); + // (50, 478) -> "Scrolled Button" + hit_node = CallNearestLeafNode(gfx::Point(50, 478)); ASSERT_TRUE(hit_node != nullptr); EXPECT_NE(ax::mojom::Role::kButton, hit_node->GetData().role); - hit_node = CallNearestLeafNode(gfx::Point(50, 505)); + hit_node = CallNearestLeafNode(gfx::Point(50, 478)); ASSERT_TRUE(hit_node != nullptr); EXPECT_EQ(ax::mojom::Role::kButton, hit_node->GetData().role); EXPECT_EQ("Scrolled Button",
diff --git a/content/browser/conversions/conversion_host.cc b/content/browser/conversions/conversion_host.cc index ec917fa..ce5f352 100644 --- a/content/browser/conversions/conversion_host.cc +++ b/content/browser/conversions/conversion_host.cc
@@ -7,6 +7,7 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "content/browser/conversions/conversion_manager.h" +#include "content/browser/conversions/conversion_manager_impl.h" #include "content/browser/conversions/conversion_policy.h" #include "content/browser/conversions/storable_conversion.h" #include "content/browser/storage_partition_impl.h" @@ -19,8 +20,43 @@ namespace content { -ConversionHost::ConversionHost(WebContents* contents) - : web_contents_(contents), receiver_(contents, this) {} +namespace { + +// Provides access to the manager owned by the default storage partition. +class ConversionManagerProviderImpl : public ConversionManager::Provider { + public: + ConversionManagerProviderImpl() = default; + ConversionManagerProviderImpl(const ConversionManagerProviderImpl& other) = + delete; + ConversionManagerProviderImpl& operator=( + const ConversionManagerProviderImpl& other) = delete; + ~ConversionManagerProviderImpl() override = default; + + // ConversionManagerProvider: + ConversionManager* GetManager(WebContents* web_contents) const override { + return static_cast<StoragePartitionImpl*>( + BrowserContext::GetDefaultStoragePartition( + web_contents->GetBrowserContext())) + ->GetConversionManager(); + } +}; + +} // namespace + +// static +std::unique_ptr<ConversionHost> ConversionHost::CreateForTesting( + WebContents* web_contents, + std::unique_ptr<ConversionManager::Provider> conversion_manager_provider) { + auto host = std::make_unique<ConversionHost>(web_contents); + host->conversion_manager_provider_ = std::move(conversion_manager_provider); + return host; +} + +ConversionHost::ConversionHost(WebContents* web_contents) + : conversion_manager_provider_( + std::make_unique<ConversionManagerProviderImpl>()), + web_contents_(web_contents), + receiver_(web_contents, this) {} ConversionHost::~ConversionHost() = default; @@ -28,10 +64,6 @@ // page-load to a reasonable number. void ConversionHost::RegisterConversion( blink::mojom::ConversionPtr conversion) { - // If there is no conversion manager available, ignore any conversion - // registrations. - if (!GetManager()) - return; content::RenderFrameHost* render_frame_host = receiver_.GetCurrentTargetFrame(); @@ -42,6 +74,13 @@ return; } + // If there is no conversion manager available, ignore any conversion + // registrations. + ConversionManager* conversion_manager = + conversion_manager_provider_->GetManager(web_contents_); + if (!conversion_manager) + return; + // Only allow conversion registration on secure pages with a secure conversion // redirects. if (!network::IsOriginPotentiallyTrustworthy( @@ -54,12 +93,12 @@ } StorableConversion storable_conversion( - GetManager()->GetConversionPolicy().GetSanitizedConversionData( + conversion_manager->GetConversionPolicy().GetSanitizedConversionData( conversion->conversion_data), render_frame_host->GetLastCommittedOrigin(), conversion->reporting_origin); - GetManager()->HandleConversion(storable_conversion); + conversion_manager->HandleConversion(storable_conversion); } void ConversionHost::SetCurrentTargetFrameForTesting( @@ -67,11 +106,4 @@ receiver_.SetCurrentTargetFrameForTesting(render_frame_host); } -ConversionManager* ConversionHost::GetManager() { - return static_cast<StoragePartitionImpl*>( - BrowserContext::GetDefaultStoragePartition( - web_contents_->GetBrowserContext())) - ->GetConversionManager(); -} - } // namespace content
diff --git a/content/browser/conversions/conversion_host.h b/content/browser/conversions/conversion_host.h index 468fa6b5..2538b1a8 100644 --- a/content/browser/conversions/conversion_host.h +++ b/content/browser/conversions/conversion_host.h
@@ -6,12 +6,13 @@ #define CONTENT_BROWSER_CONVERSIONS_CONVERSION_HOST_H_ #include "base/gtest_prod_util.h" +#include "content/browser/conversions/conversion_manager.h" +#include "content/common/content_export.h" #include "content/public/browser/web_contents_receiver_set.h" #include "third_party/blink/public/mojom/conversions/conversions.mojom.h" namespace content { -class ConversionManager; class RenderFrameHost; class WebContents; @@ -20,6 +21,10 @@ // bound to lifetime of the WebContents. class CONTENT_EXPORT ConversionHost : public blink::mojom::ConversionHost { public: + static std::unique_ptr<ConversionHost> CreateForTesting( + WebContents* web_contents, + std::unique_ptr<ConversionManager::Provider> conversion_manager_provider); + explicit ConversionHost(WebContents* web_contents); ConversionHost(const ConversionHost& other) = delete; ConversionHost& operator=(const ConversionHost& other) = delete; @@ -39,8 +44,9 @@ // Sets the target frame on |receiver_|. void SetCurrentTargetFrameForTesting(RenderFrameHost* render_frame_host); - // Gets the manager for this web contents. Can be null. - ConversionManager* GetManager(); + // Gives access to a ConversionManager implementation to forward impressions + // and conversion registrations to. + std::unique_ptr<ConversionManager::Provider> conversion_manager_provider_; WebContents* web_contents_;
diff --git a/content/browser/conversions/conversion_host_unittest.cc b/content/browser/conversions/conversion_host_unittest.cc index 255587e9..5c3bb91 100644 --- a/content/browser/conversions/conversion_host_unittest.cc +++ b/content/browser/conversions/conversion_host_unittest.cc
@@ -7,10 +7,12 @@ #include <memory> #include "base/test/scoped_feature_list.h" +#include "content/browser/conversions/conversion_manager.h" #include "content/browser/web_contents/web_contents_impl.h" #include "content/public/common/content_features.h" #include "content/public/test/test_renderer_host.h" #include "content/test/fake_mojo_message_dispatch_context.h" +#include "content/test/navigation_simulator_impl.h" #include "content/test/test_render_frame_host.h" #include "content/test/test_web_contents.h" #include "mojo/public/cpp/test_support/test_utils.h" @@ -20,17 +22,57 @@ namespace content { +class TestConversionManager : public ConversionManager { + public: + TestConversionManager() = default; + ~TestConversionManager() override = default; + + void HandleConversion(const StorableConversion& impression) override { + num_conversions_++; + } + + const ConversionPolicy& GetConversionPolicy() const override { + return policy; + } + + size_t num_impressions() const { return num_impressions_; } + + void Reset() { + num_impressions_ = 0u; + num_conversions_ = 0u; + } + + private: + ConversionPolicy policy; + size_t num_impressions_ = 0u; + size_t num_conversions_ = 0u; +}; + +class TestManagerProvider : public ConversionManager::Provider { + public: + explicit TestManagerProvider(ConversionManager* manager) + : manager_(manager) {} + ~TestManagerProvider() override = default; + + ConversionManager* GetManager(WebContents* web_contents) const override { + return manager_; + } + + private: + ConversionManager* manager_ = nullptr; +}; + class ConversionHostTest : public RenderViewHostTestHarness { public: - ConversionHostTest() { - feature_list_.InitAndEnableFeature(features::kConversionMeasurement); - } + ConversionHostTest() = default; void SetUp() override { RenderViewHostTestHarness::SetUp(); static_cast<WebContentsImpl*>(web_contents()) ->RemoveReceiverSetForTesting(blink::mojom::ConversionHost::Name_); - conversion_host_ = std::make_unique<ConversionHost>(web_contents()); + + conversion_host_ = ConversionHost::CreateForTesting( + web_contents(), std::make_unique<TestManagerProvider>(&test_manager_)); contents()->GetMainFrame()->InitializeRenderFrameIfNeeded(); } @@ -40,8 +82,10 @@ ConversionHost* conversion_host() { return conversion_host_.get(); } + protected: + TestConversionManager test_manager_; + private: - base::test::ScopedFeatureList feature_list_; std::unique_ptr<ConversionHost> conversion_host_; };
diff --git a/content/browser/conversions/conversion_manager.h b/content/browser/conversions/conversion_manager.h index a94ab13..33193ae 100644 --- a/content/browser/conversions/conversion_manager.h +++ b/content/browser/conversions/conversion_manager.h
@@ -5,63 +5,41 @@ #ifndef CONTENT_BROWSER_CONVERSIONS_CONVERSION_MANAGER_H_ #define CONTENT_BROWSER_CONVERSIONS_CONVERSION_MANAGER_H_ -#include <memory> - -#include "base/files/file_path.h" -#include "base/macros.h" -#include "base/memory/scoped_refptr.h" -#include "base/memory/weak_ptr.h" -#include "base/sequenced_task_runner.h" #include "content/browser/conversions/conversion_policy.h" -#include "content/browser/conversions/conversion_storage.h" #include "content/browser/conversions/storable_conversion.h" - -namespace base { -class Clock; -} // namespace base +#include "content/browser/conversions/storable_impression.h" +#include "content/common/content_export.h" namespace content { -class ConversionStorage; +class WebContents; -// UI thread class that manages the lifetime of the underlying conversion -// storage. Owned by the storage partition. -class ConversionManager { +// Interface that mediates data flow between the network, storage layer, and +// blink. +class CONTENT_EXPORT ConversionManager { public: - // |storage_task_runner| should run with base::TaskPriority::BEST_EFFORT. - ConversionManager( - const base::FilePath& user_data_directory, - scoped_refptr<base::SequencedTaskRunner> storage_task_runner); - ConversionManager(const ConversionManager& other) = delete; - ConversionManager& operator=(const ConversionManager& other) = delete; - ~ConversionManager(); + // Provides access to a ConversionManager implementation. This layer of + // abstraction is to allow tests to mock out the ConversionManager without + // injecting a manager explicitly. + class Provider { + public: + virtual ~Provider() = default; + + // Gets the ConversionManager that should be used for handling conversions + // that occur in the given |web_contents|. Returns nullptr if conversion + // measurement is not enabled in the given |web_contents|, e.g. when the + // browser context is off the record. + virtual ConversionManager* GetManager(WebContents* web_contents) const = 0; + }; + virtual ~ConversionManager() = default; // Process a newly registered conversion. Will create and log any new // conversion reports to storage. - void HandleConversion(const StorableConversion& conversion); + virtual void HandleConversion(const StorableConversion& conversion) = 0; - const ConversionPolicy& GetConversionPolicy() const; - - private: - void OnInitCompleted(bool success); - - // Task runner used to perform operations on |storage_|. Runs with - // base::TaskPriority::BEST_EFFORT. - scoped_refptr<base::SequencedTaskRunner> storage_task_runner_; - - base::Clock* clock_; - - // ConversionStorage instance which is scoped to lifetime of - // |storage_task_runner_|. |storage_| should be accessed by calling - // base::PostTask with |storage_task_runner_|, and should not be accessed - // directly. - std::unique_ptr<ConversionStorage, base::OnTaskRunnerDeleter> storage_; - - // Policy used for controlling API configurations such as reporting and - // attribution models. Unique ptr so it can be overridden for testing. - std::unique_ptr<ConversionPolicy> conversion_policy_; - - base::WeakPtrFactory<ConversionManager> weak_factory_; + // Returns the ConversionPolicy that is used to control API policies such + // as noise. + virtual const ConversionPolicy& GetConversionPolicy() const = 0; }; } // namespace content
diff --git a/content/browser/conversions/conversion_manager.cc b/content/browser/conversions/conversion_manager_impl.cc similarity index 80% rename from content/browser/conversions/conversion_manager.cc rename to content/browser/conversions/conversion_manager_impl.cc index 9b986ec..9ce8981 100644 --- a/content/browser/conversions/conversion_manager.cc +++ b/content/browser/conversions/conversion_manager_impl.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 "content/browser/conversions/conversion_manager.h" +#include "content/browser/conversions/conversion_manager_impl.h" #include <memory> @@ -14,7 +14,7 @@ namespace content { -ConversionManager::ConversionManager( +ConversionManagerImpl::ConversionManagerImpl( const base::FilePath& user_data_directory, scoped_refptr<base::SequencedTaskRunner> task_runner) : storage_task_runner_(std::move(task_runner)), @@ -32,13 +32,14 @@ storage_task_runner_.get(), FROM_HERE, base::BindOnce(&ConversionStorage::Initialize, base::Unretained(storage_.get())), - base::BindOnce(&ConversionManager::OnInitCompleted, + base::BindOnce(&ConversionManagerImpl::OnInitCompleted, weak_factory_.GetWeakPtr())); } -ConversionManager::~ConversionManager() = default; +ConversionManagerImpl::~ConversionManagerImpl() = default; -void ConversionManager::HandleConversion(const StorableConversion& conversion) { +void ConversionManagerImpl::HandleConversion( + const StorableConversion& conversion) { if (!storage_) return; @@ -54,11 +55,11 @@ base::Unretained(storage_.get()), conversion)); } -const ConversionPolicy& ConversionManager::GetConversionPolicy() const { +const ConversionPolicy& ConversionManagerImpl::GetConversionPolicy() const { return *conversion_policy_; } -void ConversionManager::OnInitCompleted(bool success) { +void ConversionManagerImpl::OnInitCompleted(bool success) { if (!success) storage_.reset(); }
diff --git a/content/browser/conversions/conversion_manager_impl.h b/content/browser/conversions/conversion_manager_impl.h new file mode 100644 index 0000000..861de9c --- /dev/null +++ b/content/browser/conversions/conversion_manager_impl.h
@@ -0,0 +1,70 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_CONVERSIONS_CONVERSION_MANAGER_IMPL_H_ +#define CONTENT_BROWSER_CONVERSIONS_CONVERSION_MANAGER_IMPL_H_ + +#include <memory> + +#include "base/files/file_path.h" +#include "base/macros.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "base/sequenced_task_runner.h" +#include "content/browser/conversions/conversion_manager.h" +#include "content/browser/conversions/conversion_policy.h" +#include "content/browser/conversions/conversion_storage.h" + +namespace base { +class Clock; +} // namespace base + +namespace content { + +// UI thread class that manages the lifetime of the underlying conversion +// storage. Owned by the storage partition. +class ConversionManagerImpl : public ConversionManager { + public: + // |storage_task_runner| should run with base::TaskPriority::BEST_EFFORT. + ConversionManagerImpl( + const base::FilePath& user_data_directory, + scoped_refptr<base::SequencedTaskRunner> storage_task_runner); + ConversionManagerImpl(const ConversionManagerImpl& other) = delete; + ConversionManagerImpl& operator=(const ConversionManagerImpl& other) = delete; + ~ConversionManagerImpl() override; + + // ConversionManager: + void HandleConversion(const StorableConversion& conversion) override; + const ConversionPolicy& GetConversionPolicy() const override; + + private: + void OnInitCompleted(bool success); + + // Task runner used to perform operations on |storage_|. Runs with + // base::TaskPriority::BEST_EFFORT. + scoped_refptr<base::SequencedTaskRunner> storage_task_runner_; + + base::Clock* clock_; + + // ConversionStorage instance which is scoped to lifetime of + // |storage_task_runner_|. |storage_| should be accessed by calling + // base::PostTask with |storage_task_runner_|, and should not be accessed + // directly. |storage_| can be null if the storage initialization did not + // succeed. + // + // TODO(https://crbug.com/1066920): This should use base::SequenceBound to + // avoid having to call PostTask manually, as well as use base::Unretained on + // |storage_|. + std::unique_ptr<ConversionStorage, base::OnTaskRunnerDeleter> storage_; + + // Policy used for controlling API configurations such as reporting and + // attribution models. Unique ptr so it can be overridden for testing. + std::unique_ptr<ConversionPolicy> conversion_policy_; + + base::WeakPtrFactory<ConversionManagerImpl> weak_factory_; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_CONVERSIONS_CONVERSION_MANAGER_IMPL_H_
diff --git a/content/browser/loader/prefetch_url_loader_service.cc b/content/browser/loader/prefetch_url_loader_service.cc index 46314386..4d19118 100644 --- a/content/browser/loader/prefetch_url_loader_service.cc +++ b/content/browser/loader/prefetch_url_loader_service.cc
@@ -16,6 +16,7 @@ #include "content/public/browser/content_browser_client.h" #include "content/public/browser/web_contents.h" #include "content/public/common/content_client.h" +#include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "net/base/load_flags.h" @@ -122,7 +123,7 @@ DCHECK_EQ(static_cast<int>(blink::mojom::ResourceType::kPrefetch), resource_request.resource_type); - auto& current_context = *loader_factory_receivers_.current_context(); + BindContext& current_context = *current_bind_context(); if (!current_context.render_frame_host) { mojo::Remote<network::mojom::URLLoaderClient>(std::move(client)) @@ -224,16 +225,33 @@ // renderer, so that it can be cached correctly. bool PrefetchURLLoaderService::IsValidCrossOriginPrefetch( const network::ResourceRequest& resource_request) { + // All fetches need to have an associated request_initiator. + if (!resource_request.request_initiator) { + mojo::ReportBadMessage("Prefetch/IsValidCrossOrigin: no request_initiator"); + return false; + } + // The request is expected to be cross-origin. Same-origin prefetches do not // need a special NetworkIsolationKey, and therefore must not be marked for // restricted use. url::Origin destination_origin = url::Origin::Create(resource_request.url); - // TODO(domfarolino): We want to check that the request's initiator is - // equivalent to the frame's last committed origin. If they are not equal, we - // must cancel the request. - if (!resource_request.request_initiator || - resource_request.request_initiator->IsSameOriginWith( + DCHECK(resource_request.request_initiator.has_value()); // Checked above. + if (resource_request.request_initiator->IsSameOriginWith( destination_origin)) { + mojo::ReportBadMessage("Prefetch/IsValidCrossOrigin: same-origin"); + return false; + } + + // The request initiator has to match the request_initiator_site_lock - it has + // to be the same origin as the last committed origin in the frame. + const BindContext& current_context = *current_bind_context(); + // Presence of |render_frame_host| is guaranteed by the caller - the caller + // calls earlier EnsureCrossOriginFactory which has the same DCHECK. + DCHECK(current_context.render_frame_host); + if (resource_request.request_initiator.value() != + current_context.render_frame_host->GetLastCommittedOrigin()) { + mojo::ReportBadMessage( + "Prefetch/IsValidCrossOrigin: frame origin mismatch"); return false; } @@ -241,6 +259,7 @@ // mode must be |kError|. if (base::FeatureList::IsEnabled(blink::features::kPrefetchPrivacyChanges) && resource_request.redirect_mode != network::mojom::RedirectMode::kError) { + mojo::ReportBadMessage("Prefetch/IsValidCrossOrigin: wrong redirect mode"); return false; } @@ -248,12 +267,17 @@ // the prefetch cache. This is because it is possible that another origin // prefetched the same resource, which should only be reused for top-level // navigations. - if (resource_request.load_flags & net::LOAD_CAN_USE_RESTRICTED_PREFETCH) + if (resource_request.load_flags & net::LOAD_CAN_USE_RESTRICTED_PREFETCH) { + mojo::ReportBadMessage( + "Prefetch/IsValidCrossOrigin: can use restricted prefetch"); return false; + } // The request must not already have its |trusted_params| initialized. - if (resource_request.trusted_params) + if (resource_request.trusted_params) { + mojo::ReportBadMessage("Prefetch/IsValidCrossOrigin: trusted params"); return false; + } return true; } @@ -261,7 +285,7 @@ void PrefetchURLLoaderService::EnsureCrossOriginFactory() { DCHECK(base::FeatureList::IsEnabled( network::features::kPrefetchMainResourceNetworkIsolationKey)); - auto& current_context = *loader_factory_receivers_.current_context(); + BindContext& current_context = *current_bind_context(); // If the factory has already been created, don't re-create it. if (current_context.cross_origin_factory) return;
diff --git a/content/browser/loader/prefetch_url_loader_service.h b/content/browser/loader/prefetch_url_loader_service.h index 6678583..98e29f0 100644 --- a/content/browser/loader/prefetch_url_loader_service.h +++ b/content/browser/loader/prefetch_url_loader_service.h
@@ -106,6 +106,10 @@ CreateURLLoaderThrottles(const network::ResourceRequest& request, int frame_tree_node_id); + const std::unique_ptr<BindContext>& current_bind_context() const { + return loader_factory_receivers_.current_context(); + } + scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_; BrowserContext* browser_context_ = nullptr;
diff --git a/content/browser/media/media_capabilities_browsertest.cc b/content/browser/media/media_capabilities_browsertest.cc index 4452f1c..423b87a 100644 --- a/content/browser/media/media_capabilities_browsertest.cc +++ b/content/browser/media/media_capabilities_browsertest.cc
@@ -34,7 +34,13 @@ const char* kPropSupported = kUnsupported; #endif // USE_PROPRIETARY_CODECS -enum StreamType { kAudio, kVideo, kAudioWithSpatialRendering }; +enum StreamType { + kAudio, + kVideo, + kAudioWithSpatialRendering, + kVideoWithHdrMetadata, + kVideoWithoutHdrMetadata +}; enum ConfigType { kFile, kMediaSource }; @@ -48,9 +54,9 @@ void SetUpCommandLine(base::CommandLine* command_line) override { command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, - "MediaCapabilities"); - command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, "MediaCapabilitiesSpatialAudio"); + command_line->AppendSwitchASCII(switches::kEnableBlinkFeatures, + "MediaCapabilitiesDynamicRange"); } std::string CanDecodeAudio(const std::string& config_type, @@ -71,16 +77,58 @@ StreamType::kAudioWithSpatialRendering, spatial_rendering); } + std::string CanDecodeVideoWithHdrMetadata( + const std::string& config_type, + const std::string& content_type, + const std::string& color_gamut, + const std::string& transfer_function, + const std::string& hdr_metadata_type = "") { + StreamType stream_type = StreamType::kVideoWithHdrMetadata; + if (hdr_metadata_type == "") + stream_type = StreamType::kVideoWithoutHdrMetadata; + + return CanDecode(config_type, content_type, stream_type, + /* spatialRendering */ false, hdr_metadata_type, + color_gamut, transfer_function); + } + std::string CanDecode(const std::string& config_type, const std::string& content_type, StreamType stream_type, - const bool& spatial_rendering = false) { + const bool& spatial_rendering = false, + const std::string& hdr_metadata_type = "", + const std::string& color_gamut = "", + const std::string& transfer_function = "") { std::string command; if (stream_type == StreamType::kAudio) { command.append("testAudioConfig("); } else if (stream_type == StreamType::kAudioWithSpatialRendering) { command.append("testAudioConfigWithSpatialRendering("); command.append(spatial_rendering ? "true, " : "false, "); + } else if (stream_type == StreamType::kVideoWithHdrMetadata) { + command.append("testVideoConfigWithHdrMetadata("); + DCHECK(!hdr_metadata_type.empty()); + DCHECK(!color_gamut.empty()); + DCHECK(!transfer_function.empty()); + command.append("\""); + command.append(hdr_metadata_type); + command.append("\", "); + command.append("\""); + command.append(color_gamut); + command.append("\", "); + command.append("\""); + command.append(transfer_function); + command.append("\", "); + } else if (stream_type == StreamType::kVideoWithoutHdrMetadata) { + command.append("testVideoConfigWithoutHdrMetadata("); + DCHECK(!color_gamut.empty()); + DCHECK(!transfer_function.empty()); + command.append("\""); + command.append(color_gamut); + command.append("\", "); + command.append("\""); + command.append(transfer_function); + command.append("\", "); } else { command.append("testVideoConfig("); } @@ -316,6 +364,66 @@ /*spatial_rendering*/ true)); } +// Cover basic HDR support. +IN_PROC_BROWSER_TEST_P(MediaCapabilitiesTestWithConfigType, + VideoTypesWithDynamicRange) { + base::FilePath file_path = media::GetTestDataFilePath(kDecodeTestFile); + + const std::string& config_type = GetTypeString(); + + EXPECT_TRUE( + NavigateToURL(shell(), content::GetFileUrlWithQuery(file_path, ""))); + + // All color gamuts and transfer functions should be supported. + EXPECT_EQ(kSupported, CanDecodeVideoWithHdrMetadata( + config_type, "'video/webm; codecs=\"vp8\"'", + /* colorGamut */ "srgb", + /* transferFunction */ "srgb")); + EXPECT_EQ(kSupported, CanDecodeVideoWithHdrMetadata( + config_type, "'video/webm; codecs=\"vp8\"'", + /* colorGamut */ "p3", + /* transferFunction */ "pq")); + EXPECT_EQ(kSupported, CanDecodeVideoWithHdrMetadata( + config_type, "'video/webm; codecs=\"vp8\"'", + /* colorGamut */ "rec2020", + /* transferFunction */ "hlg")); + + // No HdrMetadataType is currently supported. + EXPECT_EQ(kUnsupported, CanDecodeVideoWithHdrMetadata( + config_type, "'video/webm; codecs=\"vp8\"'", + /* colorGamut */ "srgb", + /* transferFunction */ "srgb", + /* hdrMetadataType */ "smpteSt2086")); + EXPECT_EQ(kUnsupported, CanDecodeVideoWithHdrMetadata( + config_type, "'video/webm; codecs=\"vp8\"'", + /* colorGamut */ "srgb", + /* transferFunction */ "srgb", + /* hdrMetadataType */ "smpteSt2094-10")); + EXPECT_EQ(kUnsupported, CanDecodeVideoWithHdrMetadata( + config_type, "'video/webm; codecs=\"vp8\"'", + /* colorGamut */ "srgb", + /* transferFunction */ "srgb", + /* hdrMetadataType */ "smpteSt2094-40")); + + // Make sure results are expected with some USE_PROPRIETARY_CODECS + EXPECT_EQ(kPropSupported, + CanDecodeVideoWithHdrMetadata(config_type, + "'video/mp4; codecs=\"avc1.42E01E\"'", + /* colorGamut */ "p3", + /* transferFunction */ "pq")); + EXPECT_EQ(kPropSupported, + CanDecodeVideoWithHdrMetadata(config_type, + "'video/mp4; codecs=\"avc1.42101E\"'", + /* colorGamut */ "srgb", + /* transferFunction */ "srgb")); + EXPECT_EQ(kUnsupported, + CanDecodeVideoWithHdrMetadata(config_type, + "'video/mp4; codecs=\"avc1.42701E\"'", + /* colorGamut */ "srgb", + /* transferFunction */ "srgb", + /* hdrMetadataType */ "smpteSt2086")); +} + INSTANTIATE_TEST_SUITE_P(File, MediaCapabilitiesTestWithConfigType, ::testing::Values(ConfigType::kFile));
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 b92c29d..c64f7441 100644 --- a/content/browser/native_file_system/file_system_chooser_browsertest.cc +++ b/content/browser/native_file_system/file_system_chooser_browsertest.cc
@@ -90,7 +90,7 @@ return result; } - private: + protected: base::test::ScopedFeatureList scoped_feature_list_; base::ScopedTempDir temp_dir_; }; @@ -128,6 +128,38 @@ "return await file.text(); })()")); } +IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, OpenFileNonASCII) { + const std::string file_contents = "hello world!"; + const base::FilePath test_file = + temp_dir_.GetPath().Append(base::FilePath::FromUTF8Unsafe("😋.txt")); + { + base::ScopedAllowBlockingForTesting allow_blocking; + EXPECT_EQ( + int{file_contents.size()}, + base::WriteFile(test_file, file_contents.data(), file_contents.size())); + } + + SelectFileDialogParams dialog_params; + ui::SelectFileDialog::SetFactory( + new FakeSelectFileDialogFactory({test_file}, &dialog_params)); + ASSERT_TRUE( + NavigateToURL(shell(), embedded_test_server()->GetURL("/title1.html"))); + EXPECT_EQ(test_file.BaseName().AsUTF8Unsafe(), + EvalJs(shell(), + "(async () => {" + " let e = await self.chooseFileSystemEntries();" + " self.selected_entry = e;" + " return e.name; })()")); + EXPECT_EQ(ui::SelectFileDialog::SELECT_OPEN_FILE, dialog_params.type); + EXPECT_EQ(shell()->web_contents()->GetTopLevelNativeWindow(), + dialog_params.owning_window); + EXPECT_EQ( + file_contents, + EvalJs(shell(), + "(async () => { const file = await self.selected_entry.getFile(); " + "return await file.text(); })()")); +} + IN_PROC_BROWSER_TEST_F(FileSystemChooserBrowserTest, FullscreenOpenFile) { const std::string file_contents = "hello world!"; const base::FilePath test_file = CreateTestFile(file_contents);
diff --git a/content/browser/native_file_system/native_file_system_manager_impl.cc b/content/browser/native_file_system/native_file_system_manager_impl.cc index f66f994..df7b5b9 100644 --- a/content/browser/native_file_system/native_file_system_manager_impl.cc +++ b/content/browser/native_file_system/native_file_system_manager_impl.cc
@@ -865,7 +865,10 @@ base::FilePath root_path = isolated_context->CreateVirtualRootPath(result.file_system.id()); - base::FilePath isolated_path = root_path.AppendASCII(result.base_name); + // FromUTF8Unsafe in the following line is safe since result.base_name was the + // result of calling AsUTF8Unsafe on a base::FilePath in the first place. + base::FilePath isolated_path = + root_path.Append(base::FilePath::FromUTF8Unsafe(result.base_name)); result.url = context()->CreateCrackedFileSystemURL( origin, storage::kFileSystemTypeIsolated, isolated_path);
diff --git a/content/browser/renderer_host/input/touch_action_filter.cc b/content/browser/renderer_host/input/touch_action_filter.cc index 1682434c..ec68e4b 100644 --- a/content/browser/renderer_host/input/touch_action_filter.cc +++ b/content/browser/renderer_host/input/touch_action_filter.cc
@@ -130,6 +130,13 @@ case WebInputEvent::kGestureScrollBegin: { // In VR or virtual keyboard (https://crbug.com/880701), // GestureScrollBegin could come without GestureTapDown. + // TODO(bokan): This can also happen due to the fling controller + // filtering out the GestureTapDown due to tap suppression (i.e. tapping + // during a fling should stop the fling, not be sent to the page). We + // should not reset the touch action in this case! We currently work + // around this by resetting the whitelisted touch action from the + // compositor in this case as well but we should investigate not + // filtering the TapDown. if (!gesture_sequence_in_progress_) { gesture_sequence_in_progress_ = true; if (allowed_touch_action_.has_value()) {
diff --git a/content/browser/service_worker/service_worker_storage_control_impl.cc b/content/browser/service_worker/service_worker_storage_control_impl.cc index 7615fd7..a1ddd99 100644 --- a/content/browser/service_worker/service_worker_storage_control_impl.cc +++ b/content/browser/service_worker/service_worker_storage_control_impl.cc
@@ -47,6 +47,27 @@ std::move(callback).Run(status, origin_state); } +void DidGetRegistrationsForOrigin( + ServiceWorkerStorageControlImpl::GetRegistrationsForOriginCallback callback, + storage::mojom::ServiceWorkerDatabaseStatus status, + std::unique_ptr<ServiceWorkerStorage::RegistrationList> + registration_data_list, + std::unique_ptr<std::vector<ServiceWorkerStorage::ResourceList>> + resources_list) { + DCHECK_EQ(registration_data_list->size(), resources_list->size()); + + std::vector<storage::mojom::SerializedServiceWorkerRegistrationPtr> + registrations; + for (size_t i = 0; i < registration_data_list->size(); ++i) { + registrations.push_back( + storage::mojom::SerializedServiceWorkerRegistration::New( + std::move((*registration_data_list)[i]), + std::move((*resources_list)[i]))); + } + + std::move(callback).Run(status, std::move(registrations)); +} + } // namespace ServiceWorkerStorageControlImpl::ServiceWorkerStorageControlImpl( @@ -84,6 +105,14 @@ base::BindOnce(&DidFindRegistration, std::move(callback))); } +void ServiceWorkerStorageControlImpl::GetRegistrationsForOrigin( + const GURL& origin, + GetRegistrationsForOriginCallback callback) { + storage_->GetRegistrationsForOrigin( + origin, + base::BindOnce(&DidGetRegistrationsForOrigin, std::move(callback))); +} + void ServiceWorkerStorageControlImpl::StoreRegistration( storage::mojom::ServiceWorkerRegistrationDataPtr registration, std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> resources, @@ -106,6 +135,11 @@ base::BindOnce(&DidDeleteRegistration, std::move(callback))); } +void ServiceWorkerStorageControlImpl::GetNewRegistrationId( + GetNewRegistrationIdCallback callback) { + storage_->GetNewRegistrationId(std::move(callback)); +} + void ServiceWorkerStorageControlImpl::GetNewResourceId( GetNewResourceIdCallback callback) { storage_->GetNewResourceId(std::move(callback));
diff --git a/content/browser/service_worker/service_worker_storage_control_impl.h b/content/browser/service_worker/service_worker_storage_control_impl.h index 7e553860..058180a1 100644 --- a/content/browser/service_worker/service_worker_storage_control_impl.h +++ b/content/browser/service_worker/service_worker_storage_control_impl.h
@@ -45,6 +45,9 @@ void FindRegistrationForId(int64_t registration_id, const GURL& origin, FindRegistrationForIdCallback callback) override; + void GetRegistrationsForOrigin( + const GURL& origin, + GetRegistrationsForOriginCallback callback) override; void StoreRegistration( storage::mojom::ServiceWorkerRegistrationDataPtr registration, std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> resources, @@ -52,6 +55,7 @@ void DeleteRegistration(int64_t registration_id, const GURL& origin, DeleteRegistrationCallback callback) override; + void GetNewRegistrationId(GetNewRegistrationIdCallback callback) override; void GetNewResourceId(GetNewResourceIdCallback callback) override; void CreateResourceReader( int64_t resource_id,
diff --git a/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc b/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc index 9be4e17b..7810f53 100644 --- a/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc +++ b/content/browser/service_worker/service_worker_storage_control_impl_unittest.cc
@@ -135,6 +135,26 @@ return return_value; } + void GetRegistrationsForOrigin( + const GURL& origin, + DatabaseStatus& out_status, + std::vector<storage::mojom::SerializedServiceWorkerRegistrationPtr>& + out_registrations) { + base::RunLoop loop; + storage()->GetRegistrationsForOrigin( + origin, + base::BindLambdaForTesting( + [&](DatabaseStatus status, + std::vector< + storage::mojom::SerializedServiceWorkerRegistrationPtr> + registrations) { + out_status = status; + out_registrations = std::move(registrations); + loop.Quit(); + })); + loop.Run(); + } + void StoreRegistration( storage::mojom::ServiceWorkerRegistrationDataPtr registration, std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> resources, @@ -167,6 +187,18 @@ loop.Run(); } + int64_t GetNewRegistrationId() { + int64_t return_value; + base::RunLoop loop; + storage()->GetNewRegistrationId( + base::BindLambdaForTesting([&](int64_t registration_id) { + return_value = registration_id; + loop.Quit(); + })); + loop.Run(); + return return_value; + } + int64_t GetNewResourceId() { int64_t return_value; base::RunLoop loop; @@ -179,6 +211,33 @@ return return_value; } + // Create a registration with a single resource and stores the registration. + DatabaseStatus CreateAndStoreRegistration(int64_t registration_id, + const GURL& scope, + const GURL& script_url, + int64_t script_size) { + std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> resources; + resources.push_back(storage::mojom::ServiceWorkerResourceRecord::New( + registration_id, script_url, script_size)); + + auto data = storage::mojom::ServiceWorkerRegistrationData::New(); + data->registration_id = registration_id; + data->scope = scope; + data->script = script_url; + data->navigation_preload_state = + blink::mojom::NavigationPreloadState::New(); + + int64_t resources_total_size_bytes = 0; + for (auto& resource : resources) { + resources_total_size_bytes += resource->size_bytes; + } + data->resources_total_size_bytes = resources_total_size_bytes; + + DatabaseStatus status; + StoreRegistration(std::move(data), std::move(resources), status); + return status; + } + mojo::Remote<storage::mojom::ServiceWorkerResourceReader> CreateResourceReader(int64_t resource_id) { mojo::Remote<storage::mojom::ServiceWorkerResourceReader> reader; @@ -301,6 +360,57 @@ } } +// Tests that getting registrations works. +TEST_F(ServiceWorkerStorageControlImplTest, GetRegistrationsForOrigin) { + const GURL kScope1("https://www.example.com/foo/"); + const GURL kScriptUrl1("https://www.example.com/foo/sw.js"); + const GURL kScope2("https://www.example.com/bar/"); + const GURL kScriptUrl2("https://www.example.com/bar/sw.js"); + const int64_t kScriptSize = 10; + + LazyInitializeForTest(); + + // Store two registrations which have the same origin. + DatabaseStatus status; + const int64_t registration_id1 = GetNewRegistrationId(); + status = CreateAndStoreRegistration(registration_id1, kScope1, kScriptUrl1, + kScriptSize); + ASSERT_EQ(status, DatabaseStatus::kOk); + const int64_t registration_id2 = GetNewRegistrationId(); + status = CreateAndStoreRegistration(registration_id2, kScope2, kScriptUrl2, + kScriptSize); + ASSERT_EQ(status, DatabaseStatus::kOk); + + // Get registrations for the origin. + { + const GURL& origin = kScope1.GetOrigin(); + std::vector<storage::mojom::SerializedServiceWorkerRegistrationPtr> + registrations; + + GetRegistrationsForOrigin(origin, status, registrations); + ASSERT_EQ(status, DatabaseStatus::kOk); + EXPECT_EQ(registrations.size(), 2UL); + + for (auto& registration : registrations) { + EXPECT_EQ(registration->registration_data->scope.GetOrigin(), origin); + EXPECT_EQ(registration->registration_data->resources_total_size_bytes, + kScriptSize); + } + } + + // Getting registrations for another origin should succeed but shouldn't find + // anything. + { + const GURL& origin = GURL("https://www.example.test/"); + std::vector<storage::mojom::SerializedServiceWorkerRegistrationPtr> + registrations; + + GetRegistrationsForOrigin(origin, status, registrations); + ASSERT_EQ(status, DatabaseStatus::kOk); + EXPECT_EQ(registrations.size(), 0UL); + } +} + // Tests that writing/reading a service worker script succeed. TEST_F(ServiceWorkerStorageControlImplTest, WriteAndReadResource) { LazyInitializeForTest();
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc index 66a4f7c..a2c3fe53 100644 --- a/content/browser/storage_partition_impl.cc +++ b/content/browser/storage_partition_impl.cc
@@ -44,7 +44,7 @@ #include "content/browser/browsing_data/storage_partition_code_cache_data_remover.h" #include "content/browser/code_cache/generated_code_cache.h" #include "content/browser/code_cache/generated_code_cache_context.h" -#include "content/browser/conversions/conversion_manager.h" +#include "content/browser/conversions/conversion_manager_impl.h" #include "content/browser/cookie_store/cookie_store_context.h" #include "content/browser/devtools/devtools_instrumentation.h" #include "content/browser/devtools/devtools_url_loader_interceptor.h" @@ -1546,7 +1546,7 @@ // The Conversion Measurement API is not available in Incognito mode. if (!is_in_memory_ && base::FeatureList::IsEnabled(features::kConversionMeasurement)) { - conversion_manager_ = std::make_unique<ConversionManager>( + conversion_manager_ = std::make_unique<ConversionManagerImpl>( path, base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::BEST_EFFORT})); } @@ -1830,7 +1830,7 @@ return native_file_system_manager_.get(); } -ConversionManager* StoragePartitionImpl::GetConversionManager() { +ConversionManagerImpl* StoragePartitionImpl::GetConversionManager() { DCHECK(initialized_); return conversion_manager_.get(); }
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h index 310a9a82..93930c1 100644 --- a/content/browser/storage_partition_impl.h +++ b/content/browser/storage_partition_impl.h
@@ -65,7 +65,7 @@ namespace content { class BackgroundFetchContext; -class ConversionManager; +class ConversionManagerImpl; class CookieStoreContext; class BlobRegistryWrapper; class PrefetchURLLoaderService; @@ -196,7 +196,7 @@ CookieStoreContext* GetCookieStoreContext(); NativeFileSystemManagerImpl* GetNativeFileSystemManager(); QuotaContext* GetQuotaContext(); - ConversionManager* GetConversionManager(); + ConversionManagerImpl* GetConversionManager(); NativeIOContext* GetNativeIOContext(); // blink::mojom::DomStorage interface. @@ -495,7 +495,7 @@ std::unique_ptr<leveldb_proto::ProtoDatabaseProvider> proto_database_provider_; scoped_refptr<ContentIndexContextImpl> content_index_context_; - std::unique_ptr<ConversionManager> conversion_manager_; + std::unique_ptr<ConversionManagerImpl> conversion_manager_; std::unique_ptr<NativeIOContext> native_io_context_; // ReceiverSet for DomStorage, using the
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc index 5b791c0..9323cd1 100644 --- a/content/browser/webauth/authenticator_common.cc +++ b/content/browser/webauth/authenticator_common.cc
@@ -562,12 +562,14 @@ } } + make_credential_options_->allow_skipping_pin_touch = allow_skipping_pin_touch; + request_ = std::make_unique<device::MakeCredentialRequestHandler>( discovery_factory_, GetAvailableTransports(render_frame_host_, request_delegate_.get(), caller_origin_), *ctap_make_credential_request_, *authenticator_selection_criteria_, - allow_skipping_pin_touch, + *make_credential_options_, base::BindOnce(&AuthenticatorCommon::OnRegisterResponse, weak_factory_.GetWeakPtr())); @@ -797,12 +799,31 @@ return; } - if (options->protection_policy == - blink::mojom::ProtectionPolicy::UNSPECIFIED && - resident_key) { - // If not specified, UV_OR_CRED_ID_REQUIRED is made the default. - options->protection_policy = - blink::mojom::ProtectionPolicy::UV_OR_CRED_ID_REQUIRED; + base::Optional<device::CredProtectRequest> cred_protect_request; + switch (options->protection_policy) { + case blink::mojom::ProtectionPolicy::UNSPECIFIED: + if (resident_key) { + // If not specified, kUVOrCredIDRequired is made the default unless the + // authenticator defaults to something better. + cred_protect_request = + device::CredProtectRequest::kUVOrCredIDRequiredOrBetter; + } + break; + case blink::mojom::ProtectionPolicy::NONE: + cred_protect_request = device::CredProtectRequest::kUVOptional; + break; + case blink::mojom::ProtectionPolicy::UV_OR_CRED_ID_REQUIRED: + cred_protect_request = device::CredProtectRequest::kUVOrCredIDRequired; + break; + case blink::mojom::ProtectionPolicy::UV_REQUIRED: + cred_protect_request = device::CredProtectRequest::kUVRequired; + break; + } + + make_credential_options_.emplace(); + if (cred_protect_request) { + make_credential_options_->cred_protect_request.emplace( + *cred_protect_request, options->enforce_protection_policy); } DCHECK(make_credential_response_callback_.is_null()); @@ -855,7 +876,7 @@ // NOTE: Because Android has no way of building a clientDataJSON for // cross-origin requests, we don't create the extension for those. This // problem will go away once we add clientDataHash inputs to Android. - ctap_make_credential_request_->android_client_data_ext.emplace( + make_credential_options_->android_client_data_ext.emplace( client_data::kCreateType, caller_origin_, options->challenge); } @@ -871,21 +892,6 @@ attestation_requested_ = attestation != ::device::AttestationConveyancePreference::kNone; - switch (options->protection_policy) { - case blink::mojom::ProtectionPolicy::UNSPECIFIED: - case blink::mojom::ProtectionPolicy::NONE: - break; - case blink::mojom::ProtectionPolicy::UV_OR_CRED_ID_REQUIRED: - ctap_make_credential_request_->cred_protect = - std::make_pair(device::CredProtect::kUVOrCredIDRequired, - options->enforce_protection_policy); - break; - case blink::mojom::ProtectionPolicy::UV_REQUIRED: - ctap_make_credential_request_->cred_protect = std::make_pair( - device::CredProtect::kUVRequired, options->enforce_protection_policy); - break; - } - StartMakeCredentialRequest(/*allow_skipping_pin_touch=*/true); } @@ -1491,6 +1497,8 @@ discovery_factory_->ResetRequestState(); discovery_factory_ = nullptr; } + ctap_make_credential_request_.reset(); + make_credential_options_.reset(); request_delegate_.reset(); make_credential_response_callback_.Reset(); get_assertion_response_callback_.Reset();
diff --git a/content/browser/webauth/authenticator_common.h b/content/browser/webauth/authenticator_common.h index c6f9c05..61631ac 100644 --- a/content/browser/webauth/authenticator_common.h +++ b/content/browser/webauth/authenticator_common.h
@@ -27,6 +27,7 @@ #include "device/fido/ctap_make_credential_request.h" #include "device/fido/fido_constants.h" #include "device/fido/fido_transport_protocol.h" +#include "device/fido/make_credential_request_handler.h" #include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h" #include "url/origin.h" @@ -189,6 +190,8 @@ base::Optional<std::string> app_id_; base::Optional<device::CtapMakeCredentialRequest> ctap_make_credential_request_; + base::Optional<device::MakeCredentialRequestHandler::Options> + make_credential_options_; base::Optional<device::CtapGetAssertionRequest> ctap_get_assertion_request_; // awaiting_attestation_response_ is true if the embedder has been queried // about an attestsation decision and the response is still pending.
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc index 80520d6..b4bf04e4 100644 --- a/content/browser/webauth/authenticator_impl_unittest.cc +++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -4665,6 +4665,17 @@ } } +static const char* CredProtectDescription(device::CredProtect cred_protect) { + switch (cred_protect) { + case device::CredProtect::kUVOptional: + return "UV optional"; + case device::CredProtect::kUVOrCredIDRequired: + return "UV or cred ID required"; + case device::CredProtect::kUVRequired: + return "UV required"; + } +} + TEST_F(ResidentKeyAuthenticatorImplTest, CredProtectRegistration) { mojo::Remote<blink::mojom::Authenticator> authenticator = ConnectToAuthenticator(); @@ -4767,7 +4778,7 @@ EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status()); ASSERT_EQ( 1u, virtual_device_factory_->mutable_state()->registrations.size()); - const base::Optional<device::CredProtect> result = + const device::CredProtect result = virtual_device_factory_->mutable_state() ->registrations.begin() ->second.protection; @@ -4777,15 +4788,13 @@ NOTREACHED(); break; case NONE: - EXPECT_FALSE(result); + EXPECT_EQ(device::CredProtect::kUVOptional, result); break; case UV_OR_CRED: - ASSERT_TRUE(result); - EXPECT_EQ(device::CredProtect::kUVOrCredIDRequired, *result); + EXPECT_EQ(device::CredProtect::kUVOrCredIDRequired, result); break; case UV_REQ: - ASSERT_TRUE(result); - EXPECT_EQ(device::CredProtect::kUVRequired, *result); + EXPECT_EQ(device::CredProtect::kUVRequired, result); break; } break; @@ -4817,7 +4826,7 @@ blink::mojom::ProtectionPolicy::UV_REQUIRED, }; constexpr device::CredProtect kDeviceLevels[] = { - device::CredProtect::kUVOrCredIDRequired, // dummy entry. + device::CredProtect::kUVOptional, device::CredProtect::kUVOrCredIDRequired, device::CredProtect::kUVRequired, }; @@ -4863,6 +4872,95 @@ } } +TEST_F(ResidentKeyAuthenticatorImplTest, AuthenticatorDefaultCredProtect) { + // Some authenticators may have a default credProtect level that isn't + // kUVOptional. This has complex interactions that are tested here. + mojo::Remote<blink::mojom::Authenticator> authenticator = + ConnectToAuthenticator(); + + constexpr struct { + blink::mojom::ProtectionPolicy requested_level; + device::CredProtect authenticator_default; + device::CredProtect result; + } kExpectations[] = { + // Standard case: normal authenticator and nothing specified. Chrome sets + // a default of kUVOrCredIDRequired for discoverable credentials. + { + blink::mojom::ProtectionPolicy::UNSPECIFIED, + device::CredProtect::kUVOptional, + device::CredProtect::kUVOrCredIDRequired, + }, + // Chrome's default of |kUVOrCredIDRequired| should not prevent a site + // from requesting |kUVRequired| from a normal authenticator. + { + blink::mojom::ProtectionPolicy::UV_REQUIRED, + device::CredProtect::kUVOptional, + device::CredProtect::kUVRequired, + }, + // Authenticator has a non-standard default, which should work fine. + { + blink::mojom::ProtectionPolicy::UNSPECIFIED, + device::CredProtect::kUVOrCredIDRequired, + device::CredProtect::kUVOrCredIDRequired, + }, + // Authenticators can have a default of kUVRequired, but Chrome has a + // default of kUVOrCredIDRequired for discoverable credentials. We should + // not get a lesser protection level because of that. + { + blink::mojom::ProtectionPolicy::UNSPECIFIED, + device::CredProtect::kUVRequired, + device::CredProtect::kUVRequired, + }, + // Site should be able to explicitly set credProtect kUVOptional despite + // an authenticator default. + { + blink::mojom::ProtectionPolicy::NONE, + device::CredProtect::kUVOrCredIDRequired, + device::CredProtect::kUVOptional, + }, + }; + + device::VirtualCtap2Device::Config config; + config.pin_support = true; + config.resident_key_support = true; + config.cred_protect_support = true; + + for (const auto& test : kExpectations) { + config.default_cred_protect = test.authenticator_default; + virtual_device_factory_->SetCtap2Config(config); + virtual_device_factory_->mutable_state()->registrations.clear(); + + SCOPED_TRACE(::testing::Message() + << "result=" << CredProtectDescription(test.result)); + SCOPED_TRACE(::testing::Message() + << "default=" + << CredProtectDescription(test.authenticator_default)); + SCOPED_TRACE(::testing::Message() + << "request=" + << ProtectionPolicyDescription(test.requested_level)); + + PublicKeyCredentialCreationOptionsPtr options = make_credential_options(); + options->authenticator_selection->SetRequireResidentKeyForTesting(true); + options->protection_policy = test.requested_level; + options->authenticator_selection->SetUserVerificationRequirementForTesting( + device::UserVerificationRequirement::kRequired); + + TestMakeCredentialCallback callback_receiver; + authenticator->MakeCredential(std::move(options), + callback_receiver.callback()); + callback_receiver.WaitForCallback(); + + EXPECT_EQ(AuthenticatorStatus::SUCCESS, callback_receiver.status()); + ASSERT_EQ(1u, + virtual_device_factory_->mutable_state()->registrations.size()); + const device::CredProtect result = virtual_device_factory_->mutable_state() + ->registrations.begin() + ->second.protection; + + EXPECT_EQ(result, test.result) << CredProtectDescription(result); + } +} + TEST_F(ResidentKeyAuthenticatorImplTest, ProtectedNonResidentCreds) { // Until we have UVToken, there's a danger that we'll preflight UV-required // credential IDs such that the authenticator denies knowledge of all of them
diff --git a/content/browser/xr/service/vr_service_impl.cc b/content/browser/xr/service/vr_service_impl.cc index 03615858..45a9353 100644 --- a/content/browser/xr/service/vr_service_impl.cc +++ b/content/browser/xr/service/vr_service_impl.cc
@@ -507,7 +507,7 @@ if (!runtime || runtime->GetId() != request.runtime_id) { std::move(request.callback) .Run(device::mojom::RequestSessionResult::NewFailureReason( - device::mojom::RequestSessionError::UNKNOWN_RUNTIME_ERROR)); + device::mojom::RequestSessionError::RUNTIMES_CHANGED)); return; }
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 32fc54e7..9a3f0c2 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -191,6 +191,8 @@ "media/inspector_media_event_handler.h", "media/media_factory.cc", "media/media_factory.h", + "media/media_interface_factory.cc", + "media/media_interface_factory.h", "media/media_permission_dispatcher.cc", "media/media_permission_dispatcher.h", "media/power_status_helper_impl.cc", @@ -659,13 +661,6 @@ deps += [ "//printing" ] } - if (enable_mojo_media) { - sources += [ - "media/media_interface_factory.cc", - "media/media_interface_factory.h", - ] - } - if (is_linux || is_android) { deps += [ "//sandbox:sandbox_buildflags" ] }
diff --git a/content/renderer/input/main_thread_event_queue.cc b/content/renderer/input/main_thread_event_queue.cc index 1f979e5a..0e75119 100644 --- a/content/renderer/input/main_thread_event_queue.cc +++ b/content/renderer/input/main_thread_event_queue.cc
@@ -301,7 +301,7 @@ HandledEventCallback event_callback; if (!non_blocking) { - TRACE_EVENT_INSTANT0("input", "NonBlocking", TRACE_EVENT_SCOPE_THREAD); + TRACE_EVENT_INSTANT0("input", "Blocking", TRACE_EVENT_SCOPE_THREAD); event_callback = std::move(callback); }
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc index 4e30dd3..b6931db 100644 --- a/content/renderer/media/media_factory.cc +++ b/content/renderer/media/media_factory.cc
@@ -21,6 +21,7 @@ #include "content/renderer/media/audio/audio_device_factory.h" #include "content/renderer/media/batching_media_log.h" #include "content/renderer/media/inspector_media_event_handler.h" +#include "content/renderer/media/media_interface_factory.h" #include "content/renderer/media/power_status_helper_impl.h" #include "content/renderer/media/render_media_event_handler.h" #include "content/renderer/media/renderer_webmediaplayer_delegate.h" @@ -71,10 +72,6 @@ #include "content/renderer/media/cast_renderer_client_factory.h" #endif -#if BUILDFLAG(ENABLE_MOJO_MEDIA) -#include "content/renderer/media/media_interface_factory.h" -#endif - #if defined(OS_FUCHSIA) #include "content/renderer/media/fuchsia_renderer_factory.h" #include "media/fuchsia/cdm/client/fuchsia_cdm_util.h" @@ -695,7 +692,6 @@ return cdm_factory_.get(); } -#if BUILDFLAG(ENABLE_MOJO_MEDIA) media::mojom::InterfaceFactory* MediaFactory::GetMediaInterfaceFactory() { DCHECK(interface_broker_); @@ -712,6 +708,5 @@ return std::make_unique<media::MojoRendererFactory>( GetMediaInterfaceFactory()); } -#endif // BUILDFLAG(ENABLE_MOJO_MEDIA) } // namespace content
diff --git a/content/renderer/media/media_factory.h b/content/renderer/media/media_factory.h index 0c656589..da0ff571 100644 --- a/content/renderer/media/media_factory.h +++ b/content/renderer/media/media_factory.h
@@ -16,6 +16,8 @@ #include "media/blink/webmediaplayer_params.h" #include "media/media_buildflags.h" #include "media/mojo/buildflags.h" +#include "media/mojo/clients/mojo_renderer_factory.h" +#include "media/mojo/mojom/interface_factory.mojom.h" #include "media/mojo/mojom/remoting.mojom.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/platform/web_media_player_source.h" @@ -24,11 +26,6 @@ #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/web/web_media_inspector.h" -#if BUILDFLAG(ENABLE_MOJO_MEDIA) -#include "media/mojo/clients/mojo_renderer_factory.h" // nogncheck -#include "media/mojo/mojom/interface_factory.mojom.h" // nogncheck -#endif - namespace blink { class BrowserInterfaceBrokerProxy; class WebContentDecryptionModule; @@ -142,19 +139,17 @@ media::CdmFactory* GetCdmFactory(); -#if BUILDFLAG(ENABLE_MOJO_MEDIA) media::mojom::InterfaceFactory* GetMediaInterfaceFactory(); std::unique_ptr<media::MojoRendererFactory> CreateMojoRendererFactory(); - // The media interface provider attached to this frame, lazily initialized. - std::unique_ptr<MediaInterfaceFactory> media_interface_factory_; -#endif - // The render frame we're helping. RenderFrameImpl owns this factory, so the // pointer will always be valid. RenderFrameImpl* render_frame_; + // The media interface provider attached to this frame, lazily initialized. + std::unique_ptr<MediaInterfaceFactory> media_interface_factory_; + // Injected callback for requesting overlay routing tokens. media::RequestRoutingTokenCallback request_routing_token_cb_;
diff --git a/content/test/data/accessibility/html/portal-expected-blink.txt b/content/test/data/accessibility/html/portal-expected-blink.txt index efabb3c1..e65e79ad 100644 --- a/content/test/data/accessibility/html/portal-expected-blink.txt +++ b/content/test/data/accessibility/html/portal-expected-blink.txt
@@ -5,6 +5,7 @@ ++++++++inlineTextBox name='Before portal' ++++portal focusable name='portal' ++++++rootWebArea name='Text in iframe' +++++++++genericContainer ignored ++++paragraph ++++++staticText name='After portal' ++++++++inlineTextBox name='After portal'
diff --git a/content/test/data/accessibility/html/portal-name-from-text-expected-blink.txt b/content/test/data/accessibility/html/portal-name-from-text-expected-blink.txt index 405b4c4..e4147eaa 100644 --- a/content/test/data/accessibility/html/portal-name-from-text-expected-blink.txt +++ b/content/test/data/accessibility/html/portal-name-from-text-expected-blink.txt
@@ -2,3 +2,4 @@ ++genericContainer ++++portal ++++++rootWebArea name='Text in iframe' +++++++++genericContainer ignored
diff --git a/content/test/data/accessibility/html/portal-name-from-visible-text-expected-blink.txt b/content/test/data/accessibility/html/portal-name-from-visible-text-expected-blink.txt index 5ff2a3d1..0dae2e0 100644 --- a/content/test/data/accessibility/html/portal-name-from-visible-text-expected-blink.txt +++ b/content/test/data/accessibility/html/portal-name-from-visible-text-expected-blink.txt
@@ -2,3 +2,7 @@ ++genericContainer ++++portal ++++++rootWebArea name='visible text' +++++++++genericContainer ignored +++++++++++genericContainer ignored +++++++++++genericContainer ignored +++++++++++genericContainer ignored
diff --git a/device/fido/authenticator_supported_options.cc b/device/fido/authenticator_supported_options.cc index 006b17cf..27b266e 100644 --- a/device/fido/authenticator_supported_options.cc +++ b/device/fido/authenticator_supported_options.cc
@@ -87,6 +87,11 @@ option_map.emplace(kUvTokenMapKey, true); } + if (options.default_cred_protect != CredProtect::kUVOptional) { + option_map.emplace(kDefaultCredProtectKey, + static_cast<int64_t>(options.default_cred_protect)); + } + return cbor::Value(std::move(option_map)); }
diff --git a/device/fido/authenticator_supported_options.h b/device/fido/authenticator_supported_options.h index 6396ef8..8ef2db63 100644 --- a/device/fido/authenticator_supported_options.h +++ b/device/fido/authenticator_supported_options.h
@@ -9,6 +9,7 @@ #include "base/macros.h" #include "base/optional.h" #include "components/cbor/values.h" +#include "device/fido/fido_constants.h" namespace device { @@ -77,6 +78,9 @@ // supports_cred_protect is true if the authenticator supports the // `credProtect` extension. See CTAP2 draft for details. bool supports_cred_protect = false; + // default_cred_protect specifies the default credProtect level applied by + // this authenticator. + CredProtect default_cred_protect = CredProtect::kUVOptional; // Represents whether client pin is set and stored in authenticator. Set as // null optional if client pin capability is not supported by the // authenticator.
diff --git a/device/fido/ctap_make_credential_request.cc b/device/fido/ctap_make_credential_request.cc index 8c92c10..58470f0 100644 --- a/device/fido/ctap_make_credential_request.cc +++ b/device/fido/ctap_make_credential_request.cc
@@ -130,15 +130,13 @@ } switch (cred_protect_it->second.GetUnsigned()) { case 1: - // Default behaviour. + request.cred_protect = device::CredProtect::kUVOptional; break; case 2: - request.cred_protect = - std::make_pair(device::CredProtect::kUVOrCredIDRequired, false); + request.cred_protect = device::CredProtect::kUVOrCredIDRequired; break; case 3: - request.cred_protect = - std::make_pair(device::CredProtect::kUVRequired, false); + request.cred_protect = device::CredProtect::kUVRequired; break; default: return base::nullopt; @@ -253,7 +251,7 @@ if (request.cred_protect) { extensions.emplace(kExtensionCredProtect, - static_cast<uint8_t>(request.cred_protect->first)); + static_cast<int64_t>(*request.cred_protect)); } if (request.android_client_data_ext) {
diff --git a/device/fido/ctap_make_credential_request.h b/device/fido/ctap_make_credential_request.h index 0dd6c28..9777ff30 100644 --- a/device/fido/ctap_make_credential_request.h +++ b/device/fido/ctap_make_credential_request.h
@@ -80,10 +80,13 @@ // cred_protect indicates the level of protection afforded to a credential. // This depends on a CTAP2 extension that not all authenticators will support. - // The second element is true if the indicated protection level must be - // provided by the target authenticator for the MakeCredential request to be - // sent. - base::Optional<std::pair<CredProtect, bool>> cred_protect; + // This is filled out by |MakeCredentialRequestHandler|. + base::Optional<CredProtect> cred_protect; + // If |cred_protect| is not |nullopt|, this is true if the credProtect level + // must be provided by the target authenticator for the MakeCredential request + // to be sent. This only makes sense when there is a collection of + // authenticators to consider, i.e. for the Windows API. + bool cred_protect_enforce = false; base::Optional<AndroidClientDataExtensionInput> android_client_data_ext; };
diff --git a/device/fido/device_response_converter.cc b/device/fido/device_response_converter.cc index 2355b0a..a394c21 100644 --- a/device/fido/device_response_converter.cc +++ b/device/fido/device_response_converter.cc
@@ -366,6 +366,19 @@ options.supports_uv_token = option_map_it->second.GetBool(); } + option_map_it = option_map.find(CBOR(kDefaultCredProtectKey)); + if (option_map_it != option_map.end()) { + if (!option_map_it->second.is_unsigned()) { + return base::nullopt; + } + const int64_t value = option_map_it->second.GetInteger(); + if (value != static_cast<uint8_t>(CredProtect::kUVOrCredIDRequired) && + value != static_cast<uint8_t>(CredProtect::kUVRequired)) { + return base::nullopt; + } + options.default_cred_protect = static_cast<CredProtect>(value); + } + response.options = std::move(options); }
diff --git a/device/fido/fido_authenticator.cc b/device/fido/fido_authenticator.cc index 4a5ac12..42d41c5b 100644 --- a/device/fido/fido_authenticator.cc +++ b/device/fido/fido_authenticator.cc
@@ -130,4 +130,8 @@ return ProtocolVersion::kUnknown; } +bool FidoAuthenticator::SupportsCredProtectExtension() const { + return Options() && Options()->supports_cred_protect; +} + } // namespace device
diff --git a/device/fido/fido_authenticator.h b/device/fido/fido_authenticator.h index 9302c11..dde7bc6b 100644 --- a/device/fido/fido_authenticator.h +++ b/device/fido/fido_authenticator.h
@@ -194,6 +194,7 @@ virtual std::string GetId() const = 0; virtual base::string16 GetDisplayName() const = 0; virtual ProtocolVersion SupportedProtocol() const; + virtual bool SupportsCredProtectExtension() const; virtual const base::Optional<AuthenticatorSupportedOptions>& Options() const = 0; virtual base::Optional<FidoTransportProtocol> AuthenticatorTransport()
diff --git a/device/fido/fido_constants.cc b/device/fido/fido_constants.cc index 04c5af25..27786e7 100644 --- a/device/fido/fido_constants.cc +++ b/device/fido/fido_constants.cc
@@ -32,6 +32,7 @@ const char kBioEnrollmentMapKey[] = "bioEnroll"; const char kBioEnrollmentPreviewMapKey[] = "userVerificationMgmtPreview"; const char kUvTokenMapKey[] = "uvToken"; +const char kDefaultCredProtectKey[] = "defaultCredProtect"; const base::TimeDelta kDeviceTimeout = base::TimeDelta::FromSeconds(20); const base::TimeDelta kU2fRetryDelay = base::TimeDelta::FromMilliseconds(200);
diff --git a/device/fido/fido_constants.h b/device/fido/fido_constants.h index 137fda0..63e95d1 100644 --- a/device/fido/fido_constants.h +++ b/device/fido/fido_constants.h
@@ -283,6 +283,7 @@ COMPONENT_EXPORT(DEVICE_FIDO) extern const char kBioEnrollmentMapKey[]; COMPONENT_EXPORT(DEVICE_FIDO) extern const char kBioEnrollmentPreviewMapKey[]; COMPONENT_EXPORT(DEVICE_FIDO) extern const char kUvTokenMapKey[]; +extern const char kDefaultCredProtectKey[]; // HID transport specific constants. constexpr uint32_t kHidBroadcastChannel = 0xffffffff; @@ -365,10 +366,21 @@ // CredProtect enumerates the levels of credential protection specified by the // `credProtect` CTAP2 extension. enum class CredProtect : uint8_t { + kUVOptional = 1, kUVOrCredIDRequired = 2, kUVRequired = 3, }; +// CredProtectRequest extends |CredProtect| with an additional value that +// represents a request for |kUVOrCredIDRequired|, unless the default is +// higher. +enum class CredProtectRequest : uint8_t { + kUVOptional = 1, + kUVOrCredIDRequired = 2, + kUVRequired = 3, + kUVOrCredIDRequiredOrBetter = 255, +}; + // The map key for inserting the googleAndroidClientDataExtension output into a // CTAP2 makeCredential or getAssertion response. constexpr int kAndroidClientDataExtOutputKey = 0xf0;
diff --git a/device/fido/make_credential_handler_unittest.cc b/device/fido/make_credential_handler_unittest.cc index 14b03619..25507ea 100644 --- a/device/fido/make_credential_handler_unittest.cc +++ b/device/fido/make_credential_handler_unittest.cc
@@ -83,11 +83,13 @@ test_data::kClientDataJson, std::move(rp), std::move(user), std::move(credential_params)); + MakeCredentialRequestHandler::Options options; + options.allow_skipping_pin_touch = true; + auto handler = std::make_unique<MakeCredentialRequestHandler>( fake_discovery_factory_.get(), supported_transports_, std::move(request_parameter), - std::move(authenticator_selection_criteria), - /*allow_skipping_pin_touch=*/true, cb_.callback()); + std::move(authenticator_selection_criteria), options, cb_.callback()); if (pending_mock_platform_device_) { platform_discovery_->AddDevice(std::move(pending_mock_platform_device_)); platform_discovery_->WaitForCallToStartAndSimulateSuccess();
diff --git a/device/fido/make_credential_request_handler.cc b/device/fido/make_credential_request_handler.cc index 1083a8a..03ce6b8 100644 --- a/device/fido/make_credential_request_handler.cc +++ b/device/fido/make_credential_request_handler.cc
@@ -97,35 +97,24 @@ MakeCredentialStatus IsCandidateAuthenticatorPostTouch( const CtapMakeCredentialRequest& request, FidoAuthenticator* authenticator, + const MakeCredentialRequestHandler::Options& options, const AuthenticatorSelectionCriteria& authenticator_selection_criteria, const FidoRequestHandlerBase::Observer* observer) { - const auto& opt_options = authenticator->Options(); -#if defined(OS_WIN) - if (authenticator->IsWinNativeApiAuthenticator()) { - // This authenticator doesn't know its capabilities yet, so we need - // to assume it can handle the request. This is the case for Windows, - // where we proxy the request to the native API. - DCHECK(!opt_options); - - if (request.cred_protect && request.cred_protect->second && - !static_cast<WinWebAuthnApiAuthenticator*>(authenticator) - ->SupportsCredProtectExtension()) { - return MakeCredentialStatus::kAuthenticatorMissingResidentKeys; - } - - return MakeCredentialStatus::kSuccess; - } -#endif // defined(OS_WIN) - - DCHECK(opt_options); - - if (authenticator_selection_criteria.require_resident_key() && - !opt_options->supports_resident_key) { + if (options.cred_protect_request && options.cred_protect_request->second && + !authenticator->SupportsCredProtectExtension()) { return MakeCredentialStatus::kAuthenticatorMissingResidentKeys; } - if (request.cred_protect && request.cred_protect->second && - !authenticator->Options()->supports_cred_protect) { + const auto& auth_options = authenticator->Options(); + if (!auth_options) { + // This authenticator doesn't know its capabilities yet, so we need + // to assume it can handle the request. This is the case for Windows, + // where we proxy the request to the native API. + return MakeCredentialStatus::kSuccess; + } + + if (authenticator_selection_criteria.require_resident_key() && + !auth_options->supports_resident_key) { return MakeCredentialStatus::kAuthenticatorMissingResidentKeys; } @@ -169,12 +158,36 @@ } } +// CredProtectForAuthenticator translates a |CredProtectRequest| to a +// |CredProtect| value given the capabilities of a specific authenticator. +CredProtect CredProtectForAuthenticator( + CredProtectRequest request, + const FidoAuthenticator* authenticator) { + switch (request) { + case CredProtectRequest::kUVOptional: + return CredProtect::kUVOptional; + case CredProtectRequest::kUVOrCredIDRequired: + return CredProtect::kUVOrCredIDRequired; + case CredProtectRequest::kUVRequired: + return CredProtect::kUVRequired; + case CredProtectRequest::kUVOrCredIDRequiredOrBetter: + if (authenticator->Options() && + authenticator->Options()->default_cred_protect == + CredProtect::kUVRequired) { + return CredProtect::kUVRequired; + } + return CredProtect::kUVOrCredIDRequired; + } +} + // ValidateResponseExtensions returns true iff |extensions| is valid as a // response to |request| from an authenticator that reports that it supports // |options|. -bool ValidateResponseExtensions(const CtapMakeCredentialRequest& request, - const AuthenticatorSupportedOptions& options, - const cbor::Value& extensions) { +bool ValidateResponseExtensions( + const CtapMakeCredentialRequest& request, + const MakeCredentialRequestHandler::Options& options, + const FidoAuthenticator* authenticator, + const cbor::Value& extensions) { if (!extensions.is_map()) { return false; } @@ -186,7 +199,8 @@ const std::string& ext_name = it.first.GetString(); if (ext_name == kExtensionCredProtect) { - if (!options.supports_cred_protect || !it.second.is_integer()) { + if (!authenticator->SupportsCredProtectExtension() || + !it.second.is_integer()) { return false; } @@ -194,8 +208,9 @@ // equal to, or greater than, what was requested, including when // nothing was requested. const int64_t requested_level = - request.cred_protect - ? base::strict_cast<int64_t>(request.cred_protect->first) + options.cred_protect_request + ? static_cast<int64_t>(CredProtectForAuthenticator( + options.cred_protect_request->first, authenticator)) : 1; const int64_t returned_level = it.second.GetInteger(); @@ -222,12 +237,16 @@ } // namespace +MakeCredentialRequestHandler::Options::Options() = default; +MakeCredentialRequestHandler::Options::~Options() = default; +MakeCredentialRequestHandler::Options::Options(const Options&) = default; + MakeCredentialRequestHandler::MakeCredentialRequestHandler( FidoDiscoveryFactory* fido_discovery_factory, const base::flat_set<FidoTransportProtocol>& supported_transports, CtapMakeCredentialRequest request, AuthenticatorSelectionCriteria authenticator_selection_criteria, - bool allow_skipping_pin_touch, + const Options& options, CompletionCallback completion_callback) : FidoRequestHandlerBase( fido_discovery_factory, @@ -238,17 +257,16 @@ request_(std::move(request)), authenticator_selection_criteria_( std::move(authenticator_selection_criteria)), - allow_skipping_pin_touch_(allow_skipping_pin_touch) { + options_(options) { + // These parts of the request should be filled in by + // |SpecializeRequestForAuthenticator|. + DCHECK(!request_.cred_protect); + DCHECK(!request_.android_client_data_ext); + DCHECK(!request_.cred_protect_enforce); + transport_availability_info().request_type = FidoRequestHandlerBase::RequestType::kMakeCredential; - // Only send the googleAndroidClientData extension to authenticators that - // support it. - if (request_.android_client_data_ext) { - android_client_data_ext_ = *request_.android_client_data_ext; - request_.android_client_data_ext.reset(); - } - // Set the rk, uv and attachment fields, which were only initialized to // default values up to here. TODO(martinkr): Initialize these fields earlier // (in AuthenticatorImpl) and get rid of the separate @@ -280,7 +298,7 @@ } if (IsCandidateAuthenticatorPostTouch( - request_, authenticator, authenticator_selection_criteria_, + request_, authenticator, options_, authenticator_selection_criteria_, observer()) != MakeCredentialStatus::kSuccess) { #if defined(OS_WIN) // If the Windows API cannot handle a request, just reject the request @@ -310,7 +328,8 @@ switch (authenticator->WillNeedPINToMakeCredential(request_, observer())) { case MakeCredentialPINDisposition::kUsePIN: // Skip asking for touch if this is the only available authenticator. - if (active_authenticators().size() == 1 && allow_skipping_pin_touch_) { + if (active_authenticators().size() == 1 && + options_.allow_skipping_pin_touch) { CollectPINThenSendRequest(authenticator); return; } @@ -323,7 +342,8 @@ case MakeCredentialPINDisposition::kSetPIN: // Skip asking for touch if this is the only available authenticator. - if (active_authenticators().size() == 1 && allow_skipping_pin_touch_) { + if (active_authenticators().size() == 1 && + options_.allow_skipping_pin_touch) { SetPINThenSendRequest(authenticator); return; } @@ -369,14 +389,7 @@ request.user_verification = UserVerificationRequirement::kDiscouraged; } - if (request.cred_protect && - !authenticator->Options()->supports_cred_protect) { - request.cred_protect.reset(); - } - if (android_client_data_ext_ && authenticator->Options() && - authenticator->Options()->supports_android_client_data_ext) { - request.android_client_data_ext = *android_client_data_ext_; - } + SpecializeRequestForAuthenticator(&request, authenticator); } ReportMakeCredentialRequestTransport(authenticator); @@ -491,8 +504,8 @@ const base::Optional<cbor::Value>& extensions = response->attestation_object().authenticator_data().extensions(); - if (extensions && !ValidateResponseExtensions( - request_, *authenticator->Options(), *extensions)) { + if (extensions && !ValidateResponseExtensions(request_, options_, + authenticator, *extensions)) { FIDO_LOG(ERROR) << "Failing make credential request due to extensions block: " << cbor::DiagnosticWriter::Write(*extensions); @@ -503,10 +516,10 @@ } if (response->android_client_data_ext() && - (!android_client_data_ext_ || !authenticator->Options() || + (options_.android_client_data_ext || !authenticator->Options() || !authenticator->Options()->supports_android_client_data_ext || !IsValidAndroidClientDataJSON( - *android_client_data_ext_, + *options_.android_client_data_ext, base::StringPiece(reinterpret_cast<const char*>( response->android_client_data_ext()->data()), response->android_client_data_ext()->size())))) { @@ -579,7 +592,7 @@ state_ = State::kFinished; CancelActiveAuthenticators(authenticator->GetId()); const MakeCredentialStatus capability_error = - IsCandidateAuthenticatorPostTouch(request_, authenticator, + IsCandidateAuthenticatorPostTouch(request_, authenticator, options_, authenticator_selection_criteria_, observer()); DCHECK_NE(capability_error, MakeCredentialStatus::kSuccess); @@ -787,14 +800,7 @@ request.pin_protocol = pin::kProtocolVersion; // Do not do internal UV again. request.user_verification = UserVerificationRequirement::kDiscouraged; - if (request.cred_protect && authenticator_->Options() && - !authenticator_->Options()->supports_cred_protect) { - request.cred_protect.reset(); - } - if (android_client_data_ext_ && authenticator_->Options() && - authenticator_->Options()->supports_android_client_data_ext) { - request.android_client_data_ext = *android_client_data_ext_; - } + SpecializeRequestForAuthenticator(&request, authenticator_); ReportMakeCredentialRequestTransport(authenticator_); @@ -804,4 +810,20 @@ weak_factory_.GetWeakPtr(), authenticator_)); } +void MakeCredentialRequestHandler::SpecializeRequestForAuthenticator( + CtapMakeCredentialRequest* request, + const FidoAuthenticator* authenticator) { + if (options_.cred_protect_request && + authenticator->SupportsCredProtectExtension()) { + request->cred_protect = CredProtectForAuthenticator( + options_.cred_protect_request->first, authenticator); + request->cred_protect_enforce = options_.cred_protect_request->second; + } + + if (options_.android_client_data_ext && authenticator->Options() && + authenticator->Options()->supports_android_client_data_ext) { + request->android_client_data_ext = *options_.android_client_data_ext; + } +} + } // namespace device
diff --git a/device/fido/make_credential_request_handler.h b/device/fido/make_credential_request_handler.h index 459a4c0c..754d5b6f 100644 --- a/device/fido/make_credential_request_handler.h +++ b/device/fido/make_credential_request_handler.h
@@ -60,12 +60,31 @@ base::Optional<AuthenticatorMakeCredentialResponse>, const FidoAuthenticator*)>; + // Options contains higher-level request parameters that aren't part of the + // makeCredential request itself, or that need to be combined with knowledge + // of the specific authenticator, thus don't live in + // |CtapMakeCredentialRequest|. + struct COMPONENT_EXPORT(DEVICE_FIDO) Options { + Options(); + ~Options(); + Options(const Options&); + + bool allow_skipping_pin_touch = false; + base::Optional<AndroidClientDataExtensionInput> android_client_data_ext; + + // cred_protect_request extends |CredProtect| to include information that + // applies at request-routing time. The second element is true if the + // indicated protection level must be provided by the target authenticator + // for the MakeCredential request to be sent. + base::Optional<std::pair<CredProtectRequest, bool>> cred_protect_request; + }; + MakeCredentialRequestHandler( FidoDiscoveryFactory* fido_discovery_factory, const base::flat_set<FidoTransportProtocol>& supported_transports, CtapMakeCredentialRequest request_parameter, AuthenticatorSelectionCriteria authenticator_criteria, - bool allow_skipping_pin_touch, + const Options& options, CompletionCallback completion_callback); ~MakeCredentialRequestHandler() override; @@ -110,15 +129,16 @@ base::Optional<pin::TokenResponse> response); void DispatchRequestWithToken(pin::TokenResponse token); + void SpecializeRequestForAuthenticator( + CtapMakeCredentialRequest* request, + const FidoAuthenticator* authenticator); + CompletionCallback completion_callback_; State state_ = State::kWaitingForTouch; CtapMakeCredentialRequest request_; AuthenticatorSelectionCriteria authenticator_selection_criteria_; - base::Optional<AndroidClientDataExtensionInput> android_client_data_ext_; + const Options options_; - // If true, the request handler may skip the first touch to select a device - // that will require a PIN. - bool allow_skipping_pin_touch_; // authenticator_ points to the authenticator that will be used for this // operation. It's only set after the user touches an authenticator to select // it, after which point that authenticator will be used exclusively through
diff --git a/device/fido/virtual_ctap2_device.cc b/device/fido/virtual_ctap2_device.cc index eb8095e7..ef562180 100644 --- a/device/fido/virtual_ctap2_device.cc +++ b/device/fido/virtual_ctap2_device.cc
@@ -465,6 +465,11 @@ options.is_platform_device = true; } + if (config.cred_protect_support) { + options_updated = true; + options.default_cred_protect = config.default_cred_protect; + } + if (options_updated) { device_info_->options = std::move(options); } @@ -763,18 +768,18 @@ cbor::Value(true)); } - base::Optional<CredProtect> cred_protect; + CredProtect cred_protect = config_.default_cred_protect; if (request.cred_protect) { - cred_protect = request.cred_protect->first; + cred_protect = *request.cred_protect; } if (config_.force_cred_protect) { - cred_protect = config_.force_cred_protect; + cred_protect = *config_.force_cred_protect; } - if (cred_protect) { - extensions_map.emplace( - cbor::Value(kExtensionCredProtect), - cbor::Value(cred_protect == CredProtect::kUVRequired ? 3 : 2)); + if (request.cred_protect || + cred_protect != device::CredProtect::kUVOptional) { + extensions_map.emplace(cbor::Value(kExtensionCredProtect), + cbor::Value(static_cast<int64_t>(cred_protect))); } if (config_.add_extra_extension) { @@ -934,10 +939,9 @@ [user_verified, &request]( const std::pair<base::span<const uint8_t>, RegistrationData*>& candidate) -> bool { - if (!candidate.second->protection) { - return false; - } - switch (*candidate.second->protection) { + switch (candidate.second->protection) { + case CredProtect::kUVOptional: + return false; case CredProtect::kUVOrCredIDRequired: return request.allow_list.empty() && !user_verified; case CredProtect::kUVRequired:
diff --git a/device/fido/virtual_ctap2_device.h b/device/fido/virtual_ctap2_device.h index 8eabebb..4929b25 100644 --- a/device/fido/virtual_ctap2_device.h +++ b/device/fido/virtual_ctap2_device.h
@@ -58,6 +58,11 @@ // overrides any level requested in the makeCredential. base::Optional<device::CredProtect> force_cred_protect; + // default_cred_protect, if |cred_protect_support| is true, is the + // credProtect level that will be set for makeCredential requests that do + // not specify one. + device::CredProtect default_cred_protect = device::CredProtect::kUVOptional; + // max_credential_count_in_list, if non-zero, is the value to return for // maxCredentialCountInList in the authenticatorGetInfo reponse. // CTAP2_ERR_LIMIT_EXCEEDED will be returned for requests with an allow or
diff --git a/device/fido/virtual_fido_device.h b/device/fido/virtual_fido_device.h index 13c8ab9a..1a50863 100644 --- a/device/fido/virtual_fido_device.h +++ b/device/fido/virtual_fido_device.h
@@ -59,7 +59,7 @@ bool is_resident = false; // is_u2f is true if the credential was created via a U2F interface. bool is_u2f = false; - base::Optional<device::CredProtect> protection; + device::CredProtect protection = device::CredProtect::kUVOptional; // user is only valid if |is_resident| is true. base::Optional<device::PublicKeyCredentialUserEntity> user;
diff --git a/device/fido/win/authenticator.cc b/device/fido/win/authenticator.cc index 40eae96..7fe389e 100644 --- a/device/fido/win/authenticator.cc +++ b/device/fido/win/authenticator.cc
@@ -183,6 +183,10 @@ return true; } +bool WinWebAuthnApiAuthenticator::SupportsCredProtectExtension() const { + return win_api_->Version() >= WEBAUTHN_API_VERSION_2; +} + const base::Optional<AuthenticatorSupportedOptions>& WinWebAuthnApiAuthenticator::Options() const { // The request can potentially be fulfilled by any device that Windows @@ -197,10 +201,6 @@ return weak_factory_.GetWeakPtr(); } -bool WinWebAuthnApiAuthenticator::SupportsCredProtectExtension() const { - return win_api_->Version() >= WEBAUTHN_API_VERSION_2; -} - bool WinWebAuthnApiAuthenticator::ShowsPrivacyNotice() const { return win_api_->Version() >= WEBAUTHN_API_VERSION_2; }
diff --git a/device/fido/win/authenticator.h b/device/fido/win/authenticator.h index 3eccf8c..fd66a029 100644 --- a/device/fido/win/authenticator.h +++ b/device/fido/win/authenticator.h
@@ -41,10 +41,6 @@ WinWebAuthnApiAuthenticator(HWND current_window, WinWebAuthnApi* win_api_); ~WinWebAuthnApiAuthenticator() override; - // SupportsCredProtectExtension returns whether the native API supports the - // credProtect CTAP extension. - bool SupportsCredProtectExtension() const; - // ShowsPrivacyNotice returns true if the Windows native UI will show a // privacy notice dialog before a MakeCredential request that might create // a resident key or that requests attestation. @@ -64,6 +60,9 @@ bool IsInPairingMode() const override; bool IsPaired() const override; bool RequiresBlePairingPin() const override; + // SupportsCredProtectExtension returns whether the native API supports the + // credProtect CTAP extension. + bool SupportsCredProtectExtension() const override; const base::Optional<AuthenticatorSupportedOptions>& Options() const override; base::Optional<FidoTransportProtocol> AuthenticatorTransport() const override; bool IsWinNativeApiAuthenticator() const override;
diff --git a/device/fido/win/webauthn_api.cc b/device/fido/win/webauthn_api.cc index c8b35e21..5f17312 100644 --- a/device/fido/win/webauthn_api.cc +++ b/device/fido/win/webauthn_api.cc
@@ -235,14 +235,18 @@ if (request.cred_protect) { // MakeCredentialRequestHandler rejects a request with credProtect // enforced=true if webauthn.dll does not support credProtect. - if (request.cred_protect->second && + if (request.cred_protect_enforce && webauthn_api->Version() < WEBAUTHN_API_VERSION_2) { NOTREACHED(); return {CtapDeviceResponseCode::kCtap2ErrNotAllowed, base::nullopt}; } + // Windows doesn't support the concept of + // CredProtectRequest::kUVOrCredIDRequiredOrBetter. So an authenticators + // that defaults to credProtect level three will only use level two when + // Chrome is setting the credProtect level for discoverable credentials. maybe_cred_protect_extension = WEBAUTHN_CRED_PROTECT_EXTENSION_IN{ - /*dwCredProtect=*/static_cast<uint8_t>(request.cred_protect->first), - /*bRequireCredProtect=*/request.cred_protect->second, + /*dwCredProtect=*/static_cast<uint8_t>(*request.cred_protect), + /*bRequireCredProtect=*/request.cred_protect_enforce, }; extensions.emplace_back(WEBAUTHN_EXTENSION{ /*pwszExtensionIdentifier=*/WEBAUTHN_EXTENSIONS_IDENTIFIER_CRED_PROTECT,
diff --git a/device/vr/public/mojom/vr_service.mojom b/device/vr/public/mojom/vr_service.mojom index c883af28..c02550e 100644 --- a/device/vr/public/mojom/vr_service.mojom +++ b/device/vr/public/mojom/vr_service.mojom
@@ -603,15 +603,38 @@ XRHitTestSubscriptionResultsData? hit_test_subscription_results; }; +// Used primarily in logging to indicate why a session was rejecting to aid +// developer debuggability. To this end, rather than re-using an existing enum +// value, if it doesn't match your error case, a new value should be added. +// Note that this is converted to a console log, and thus the numbers can still +// be re-arranged as needed (e.g. if a value should be removed). enum RequestSessionError { - ORIGIN_NOT_SECURE = 1, - EXISTING_IMMERSIVE_SESSION = 2, - INVALID_CLIENT = 3, - USER_DENIED_CONSENT = 4, - NO_RUNTIME_FOUND = 5, - UNKNOWN_RUNTIME_ERROR = 6, - RUNTIME_INSTALL_FAILURE = 7, - UNKNOWN_FAILURE = 8, + // Indicates that another session is already using the hardware that a new + // session would need exclusive control over. + EXISTING_IMMERSIVE_SESSION = 1, + // Used to indicate that something happened to the connection between either + // renderer and browser or browser and device processes, and thus a session + // could not be brokered. + INVALID_CLIENT = 2, + // The user denied consent for one or more required features in the session + // configuration (or the mode). + USER_DENIED_CONSENT = 3, + // No runtime was present which supported both the requested mode and all + // required features. + NO_RUNTIME_FOUND = 4, + // The runtime could not successfully create a session. + UNKNOWN_RUNTIME_ERROR = 5, + // The runtime requires additional installation which could not be completed. + RUNTIME_INSTALL_FAILURE = 6, + // While processing/creating a session the "best fit" runtime changed (either + // a better runtime was added or the only supported runtime was removed). + RUNTIMES_CHANGED = 7, + // Something prevented the session from entering fullscreen, which was + // required by part of the session configuration. + FULLSCREEN_ERROR = 8, + // We are unable to determine why the request failed. This should be used very + // sparingly, (e.g. Crashes, destructors, etc.) + UNKNOWN_FAILURE = 9, }; struct RequestSessionSuccess {
diff --git a/docs/security/faq.md b/docs/security/faq.md index f6a491c1..2a937d8 100644 --- a/docs/security/faq.md +++ b/docs/security/faq.md
@@ -158,15 +158,15 @@ People sometimes report that they can compromise Chrome by installing a malicious DLL in a place where Chrome will load it, by hooking APIs (e.g. [Issue 130284](https://crbug.com/130284)), or by otherwise altering the configuration -of the PC. +of the device. We consider these attacks outside Chrome's threat model, because there is no way for Chrome (or any application) to defend against a malicious user who has -managed to log into your computer as you, or who can run software with the +managed to log into your device as you, or who can run software with the privileges of your operating system user account. Such an attacker can modify executables and DLLs, change environment variables like `PATH`, change configuration files, read any data your user account owns, email it to -themselves, and so on. Such an attacker has total control over your computer, +themselves, and so on. Such an attacker has total control over your device, and nothing Chrome can do would provide a serious guarantee of defense. This problem is not special to Chrome — all applications must trust the physically-local user. @@ -245,7 +245,10 @@ but users are otherwise free to invoke script against pages using either the URL bar or the DevTools console. -Similarly, users may create bookmarks pointed at JavaScript URLs that will run +<a name="TOC-Does-executing-JavaScript-from-a-bookmark-mean-there-s-an-XSS-vulnerability-"></a> +## Does executing JavaScript from a bookmark mean there's an XSS vulnerability? + +No. Chromium allows users to create bookmarks to JavaScript URLs that will run on the currently-loaded page when the user clicks the bookmark; these are called [bookmarklets](https://en.wikipedia.org/wiki/Bookmarklet).
diff --git a/docs/threading_and_tasks.md b/docs/threading_and_tasks.md index 5c8f0b3..60d4ddf 100644 --- a/docs/threading_and_tasks.md +++ b/docs/threading_and_tasks.md
@@ -640,6 +640,9 @@ to be fair to multiple same-priority requests and/or ability to request lower priority work to yield when high priority work comes in. +See [`base/task/job_perftest.cc`](https://cs.chromium.org/chromium/src/base/task/job_perftest.cc) +for a complete example. + ```cpp // A canonical implementation of |worker_task|. void WorkerTask(base::JobDelegate* job_delegate) {
diff --git a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h index 3c27a2e..e5c52ed 100644 --- a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h +++ b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_delegate.h
@@ -101,6 +101,9 @@ // whenever the user moves the keyboard around their screen. virtual bool SetAreaToRemainOnScreen(const gfx::Rect& bounds) = 0; + // Sets the bounds of the keyboard window in screen coordinates. + virtual bool SetWindowBoundsInScreen(const gfx::Rect& bounds_in_screen) = 0; + // Restricts the virtual keyboard IME features. // Returns the values which were updated. virtual api::virtual_keyboard::FeatureRestrictions RestrictFeatures(
diff --git a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.cc b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.cc index 52ee868..c72dc217 100644 --- a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.cc +++ b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.cc
@@ -29,6 +29,8 @@ "Setting draggable area of virtual keyboard failed."; const char kSetAreaToRemainOnScreenFailed[] = "Setting area to remain on screen of virtual keyboard failed."; +const char kSetWindowBoundsInScreenFailed[] = + "Setting bounds of the virtual keyboard failed"; const char kUnknownError[] = "Unknown error."; namespace keyboard = api::virtual_keyboard_private; @@ -220,6 +222,21 @@ return RespondNow(NoArguments()); } +ExtensionFunction::ResponseAction +VirtualKeyboardPrivateSetWindowBoundsInScreenFunction::Run() { + std::unique_ptr<keyboard::SetWindowBoundsInScreen::Params> params = + keyboard::SetWindowBoundsInScreen::Params::Create(*args_); + EXTENSION_FUNCTION_VALIDATE(params); + + const gfx::Rect bounds_in_screen = KeyboardBoundsToRect(params->bounds); + if (!delegate()->SetWindowBoundsInScreen(bounds_in_screen)) + return RespondNow(Error(kSetWindowBoundsInScreenFailed)); + return RespondNow(NoArguments()); +} + +VirtualKeyboardPrivateSetWindowBoundsInScreenFunction :: + ~VirtualKeyboardPrivateSetWindowBoundsInScreenFunction() = default; + VirtualKeyboardAPI::VirtualKeyboardAPI(content::BrowserContext* context) { delegate_ = ExtensionsAPIClient::Get()->CreateVirtualKeyboardDelegate(context);
diff --git a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h index c37ea1e..35214b9 100644 --- a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h +++ b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h
@@ -221,6 +221,19 @@ ResponseAction Run() override; }; +class VirtualKeyboardPrivateSetWindowBoundsInScreenFunction + : public VirtualKeyboardPrivateFunction { + public: + DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.setWindowBoundsInScreen", + VIRTUALKEYBOARDPRIVATE_SETWINDOWBOUNDSINSCREEN) + + protected: + ~VirtualKeyboardPrivateSetWindowBoundsInScreenFunction() override; + + // ExtensionFunction: + ResponseAction Run() override; +}; + class VirtualKeyboardDelegate; class VirtualKeyboardAPI : public BrowserContextKeyedAPI {
diff --git a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api_unittest.cc b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api_unittest.cc index 89453134..273deb1 100644 --- a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api_unittest.cc +++ b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api_unittest.cc
@@ -68,6 +68,12 @@ return area_to_remain_on_screen_; } + bool SetWindowBoundsInScreen(const gfx::Rect& bounds_in_screen) override { + window_bounds_ = bounds_in_screen; + return true; + } + const gfx::Rect& GetWindowBounds() { return window_bounds_; } + api::virtual_keyboard::FeatureRestrictions RestrictFeatures( const api::virtual_keyboard::RestrictFeatures::Params& params) override { return api::virtual_keyboard::FeatureRestrictions(); @@ -77,6 +83,7 @@ std::vector<gfx::Rect> occluded_bounds_; std::vector<gfx::Rect> hit_test_bounds_; gfx::Rect area_to_remain_on_screen_; + gfx::Rect window_bounds_; DISALLOW_COPY_AND_ASSIGN(MockVirtualKeyboardDelegate); }; @@ -188,4 +195,14 @@ EXPECT_EQ(gfx::Rect(0, 0, 10, 20), bounds); } +TEST_F(VirtualKeyboardPrivateApiUnittest, SetWindowBoundsInScreenWithBounds) { + RunFunction(new VirtualKeyboardPrivateSetWindowBoundsInScreenFunction(), + R"([{ "left": 120, "top": 300, "width": 400, "height": 250 }])"); + + const gfx::Rect bounds = client() + .GetDelegateForBrowserContext(browser_context()) + ->GetWindowBounds(); + EXPECT_EQ(gfx::Rect(120, 300, 400, 250), bounds); +} + } // namespace extensions
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 90001c2..8c924f3 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1525,6 +1525,7 @@ PASSWORDSPRIVATE_OPTINFORACCOUNTSTORAGE = 1462, CRYPTOTOKENPRIVATE_RECORDREGISTERREQUEST = 1463, CRYPTOTOKENPRIVATE_RECORDSIGNREQUEST = 1464, + VIRTUALKEYBOARDPRIVATE_SETWINDOWBOUNDSINSCREEN = 1465, // Last entry: Add new entries above, then run: // python tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/common/api/virtual_keyboard_private.json b/extensions/common/api/virtual_keyboard_private.json index ec95d7e2..35dcdde 100644 --- a/extensions/common/api/virtual_keyboard_private.json +++ b/extensions/common/api/virtual_keyboard_private.json
@@ -285,6 +285,18 @@ "$ref": "Bounds" } ] + }, + { + "name": "setWindowBoundsInScreen", + "type": "function", + "description": "Sets the bounds of the keyboard window in screen coordinates.", + "parameters": [ + { + "name": "bounds", + "description": "A rectangle defining the new bounds of the window in screen coordinates.", + "$ref": "Bounds" + } + ] } ], "events": [
diff --git a/extensions/common/extension_urls.cc b/extensions/common/extension_urls.cc index 769fbc0..51d2e3c4 100644 --- a/extensions/common/extension_urls.cc +++ b/extensions/common/extension_urls.cc
@@ -16,10 +16,6 @@ namespace extensions { -const char kEventBindings[] = "event_bindings"; - -const char kSchemaUtils[] = "schemaUtils"; - bool IsSourceFromAnExtension(const base::string16& source) { return GURL(source).SchemeIs(kExtensionScheme) || base::StartsWith(source, base::ASCIIToUTF16("extensions::"), @@ -58,19 +54,6 @@ extension_id); } -GURL GetWebstoreJsonSearchUrl(const std::string& query, - const std::string& host_language_code) { - GURL url(GetWebstoreLaunchURL().spec() + "/jsonsearch"); - url = net::AppendQueryParameter(url, "q", query); - url = net::AppendQueryParameter(url, "hl", host_language_code); - return url; -} - -GURL GetWebstoreSearchPageUrl(const std::string& query) { - return GURL(GetWebstoreLaunchURL().spec() + "/search/" + - net::EscapeQueryParamValue(query, false)); -} - GURL GetDefaultWebstoreUpdateUrl() { return GURL(kChromeWebstoreUpdateURL); }
diff --git a/extensions/common/extension_urls.h b/extensions/common/extension_urls.h index 790332b..83ca9f1 100644 --- a/extensions/common/extension_urls.h +++ b/extensions/common/extension_urls.h
@@ -17,12 +17,6 @@ namespace extensions { -// The name of the event_bindings module. -extern const char kEventBindings[]; - -// The name of the schemaUtils module. -extern const char kSchemaUtils[]; - // Determine whether or not a source came from an extension. |source| can link // to a page or a script, and can be external (e.g., "http://www.google.com"), // extension-related (e.g., "chrome-extension://<extension_id>/background.js"), @@ -57,19 +51,6 @@ // etc.) about an extension from the webstore as JSON. GURL GetWebstoreItemJsonDataURL(const std::string& extension_id); -// Returns the URL used to get webstore search results in JSON format. The URL -// returns a JSON dictionary that has the search results (under "results"). -// Each entry in the array is a dictionary as the data returned for -// GetWebstoreItemJsonDataURL above. |query| is the user typed query string. -// |host_language_code| is the host language code, e.g. en_US. Both arguments -// will be escaped and added as a query parameter to the returned web store -// json search URL. -GURL GetWebstoreJsonSearchUrl(const std::string& query, - const std::string& host_language_code); - -// Returns the URL of the web store search results page for |query|. -GURL GetWebstoreSearchPageUrl(const std::string& query); - // Returns the compile-time constant webstore update url specific to // Chrome. Usually you should prefer using GetWebstoreUpdateUrl. GURL GetDefaultWebstoreUpdateUrl();
diff --git a/extensions/shell/browser/shell_virtual_keyboard_delegate.cc b/extensions/shell/browser/shell_virtual_keyboard_delegate.cc index c12e127..c5e8c01 100644 --- a/extensions/shell/browser/shell_virtual_keyboard_delegate.cc +++ b/extensions/shell/browser/shell_virtual_keyboard_delegate.cc
@@ -92,6 +92,11 @@ return false; } +bool ShellVirtualKeyboardDelegate::SetWindowBoundsInScreen( + const gfx::Rect& bounds_in_screen) { + return false; +} + api::virtual_keyboard::FeatureRestrictions ShellVirtualKeyboardDelegate::RestrictFeatures( const api::virtual_keyboard::RestrictFeatures::Params& params) {
diff --git a/extensions/shell/browser/shell_virtual_keyboard_delegate.h b/extensions/shell/browser/shell_virtual_keyboard_delegate.h index 1eaf0dd..bbcbe8d 100644 --- a/extensions/shell/browser/shell_virtual_keyboard_delegate.h +++ b/extensions/shell/browser/shell_virtual_keyboard_delegate.h
@@ -44,6 +44,7 @@ bool SetOccludedBounds(const std::vector<gfx::Rect>& bounds) override; bool SetHitTestBounds(const std::vector<gfx::Rect>& bounds) override; bool SetAreaToRemainOnScreen(const gfx::Rect& bounds) override; + bool SetWindowBoundsInScreen(const gfx::Rect& bounds_in_screen) override; api::virtual_keyboard::FeatureRestrictions RestrictFeatures( const api::virtual_keyboard::RestrictFeatures::Params& params) override;
diff --git a/ios/build/bots/scripts/xcodebuild_runner.py b/ios/build/bots/scripts/xcodebuild_runner.py index ae706815..b212d3bd2 100644 --- a/ios/build/bots/scripts/xcodebuild_runner.py +++ b/ios/build/bots/scripts/xcodebuild_runner.py
@@ -396,8 +396,15 @@ for test_name in launch_command.egtests_app.get_all_tests() ]) - aborted_tests = list(all_tests_to_run - set(self.logs['failed tests']) - - set(self.logs['passed tests'])) + aborted_tests = [] + # TODO(crbug.com/1048758): For device targets, the list of test names parsed + # from otool output is incorrect. For multitasking or any flaky test suite, + # the list contains more tests than what actually runs. + if (self.__class__.__name__ != 'DeviceXcodeTestRunner' and + 'ios_chrome_multitasking_eg' not in self.app_path and + '_flaky_eg' not in self.app_path): + aborted_tests = list(all_tests_to_run - set(self.logs['failed tests']) - + set(self.logs['passed tests'])) aborted_tests.sort() self.logs['aborted tests'] = aborted_tests
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb index aa7efcc..7bb948f 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uz.xtb
@@ -26,7 +26,7 @@ <translation id="5573014823074921752">Chromium maslahati. Ko‘proq varaqlarni tanlash uchun ekranning quyi yoki yuqorisida joylashgan asboblar panelidan Varaqlarni ko‘rsatish tugmasi ustiga bosib turing.</translation> <translation id="5862307444128926510">Chromium brauzeriga xush kelibsiz</translation> <translation id="5945387852661427312"><ph name="DOMAIN" /> domenida boshqariladigan hisobga kirish bilan siz administratorga Chromium ma’lumotlaringizni boshqarishiga rozilik bildirasiz. Barcha Chromium ma’lumotlaringiz bu hisobga butunlay bog‘langan. Agar hisobdan chiqadigan bo‘lsangiz, bu qurilmadagi barcha ma’lumotlaringiz o‘chib ketadi, lekin Google hisobingizda saqlanib qoladi.</translation> -<translation id="602807004951640891">Chromiumdan foydalanish orqali siz <ph name="BEGIN_LINK_TOS" />Xizmat shartlariga<ph name="END_LINK_TOS" /> rozilik bildirgan hisoblanasiz.</translation> +<translation id="602807004951640891">Chromium ishlatish orqali siz <ph name="BEGIN_LINK_TOS" />Xizmat shartlariga<ph name="END_LINK_TOS" /> rozilik bildirgan hisoblanasiz.</translation> <translation id="6068866989048414399">Chromium foydalanish shartlari</translation> <translation id="6268381023930128611">Chromium’dan chiqmoqchimisiz?</translation> <translation id="6424492062988593837">Chromium ancha yaxshilandi! Yangi versiya mavjud.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb index b40042f..af5ac79 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_tr.xtb
@@ -10,7 +10,7 @@ <translation id="2441696206556358796">Resimleri kaydetmek için Ayarlar'a dokunarak Chrome'un fotoğraflarınızı kullanmasına izin verin</translation> <translation id="2576431527583832481">Chrome daha da iyi hale geldi! Yeni bir sürüm var.</translation> <translation id="257708665678654955">Google Chrome'un bir dahaki sefere bu siteden <ph name="LANGUAGE_NAME" /> dilindeki sayfaları çevirmeyi önermesini ister misiniz?</translation> -<translation id="2919738076569633423">Chrom'u kullanarak <ph name="BEGIN_LINK_TOS" />Hizmet Şartları<ph name="END_LINK_TOS" />'nı kabul etmiş sayılırsınız.</translation> +<translation id="2919738076569633423">Chrome'u kullanarak <ph name="BEGIN_LINK_TOS" />Hizmet Şartları<ph name="END_LINK_TOS" />'nı kabul etmiş sayılırsınız.</translation> <translation id="3030414234702425231"><ph name="SIGNOUT_MANAGED_DOMAIN" /> tarafından yönetilen bir hesabın oturumunu kapattığınız için Chrome verileriniz bu cihazdan silinecek. Ancak verileriniz Google Hesabınızda kalmaya devam edecek.</translation> <translation id="3148688391461398285">Konumunuza dayalı olarak Chrome'da daha iyi deneyim elde edin.</translation> <translation id="3167189358072330585">Hesabınız Google Chrome'da kullanılamıyor. Lütfen alan adı yöneticinizle iletişim kurun veya oturum açmak için normal bir Google Hesabı kullanın.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb index 01ea439..b03fc71 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_uz.xtb
@@ -10,7 +10,7 @@ <translation id="2441696206556358796">Chrome’ga rasmlardan foydalanish ruxsatini berish uchun “Sozlamalar” ustiga bosing</translation> <translation id="2576431527583832481">Chrome ancha yaxshilandi! Uning yangi versiyasi chiqdi.</translation> <translation id="257708665678654955">Google Chrome ushbu saytning <ph name="LANGUAGE_NAME" /> tilidagi sahifalarini tarjima qilishni har doim taklif qilsinmi?</translation> -<translation id="2919738076569633423">Chromedan foydalanish orqali siz <ph name="BEGIN_LINK_TOS" />Xizmat shartlariga<ph name="END_LINK_TOS" /> rozilik bildirgan hisoblanasiz.</translation> +<translation id="2919738076569633423">Chrome ishlatish orqali siz <ph name="BEGIN_LINK_TOS" />Xizmat shartlariga<ph name="END_LINK_TOS" /> rozilik bildirgan hisoblanasiz.</translation> <translation id="3030414234702425231">Siz <ph name="SIGNOUT_MANAGED_DOMAIN" /> domenida boshqariladigan hisobdan chiqish arafasidasiz. Barcha Chrome maʼlumotlari ushbu qurilmadan tozalanadi, lekin Google hisobingizda saqlanib qoladi.</translation> <translation id="3148688391461398285">Joylashuv ma’lumotlari bilan Chrome yanada ko‘proq imkoniyatlarga ega bo‘ladi.</translation> <translation id="3167189358072330585">Hisobingiz Google Chrome tizimida ishlamaydi. Domen administratoriga murojaat qiling yoki tizimga oddiy Google hisobidan kiring.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index 7375c89..c37d05f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Merk …</translation> <translation id="3153862085237805241">Stoor kaart</translation> <translation id="3157684681743766797">Merk alles …</translation> +<translation id="3161291298470460782">Dit sal jou afmeld, sinkronisering afskakel en alle Chrome-data op hierdie toestel uitvee. Jou gesinkroniseerde data sal in jou Google-rekening bly.</translation> <translation id="3175081911749765310">Webdienste</translation> <translation id="3178650076442119961">Vandag aktief</translation> <translation id="3207960819495026254">Geboekmerk</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Bevestig die uitvee van blaaierdata</translation> <translation id="35083190962747987">Maak ${url} oop</translation> <translation id="3519193562722059437">Maak 'n oortjie oop om deur die web te blaai.</translation> +<translation id="3523473570015918798">As jy afmeld, sal jou boekmerke, geskiedenis, wagwoorde en ander Chrome-data nie meer met jou Google-rekening gesinkroniseer word nie.</translation> <translation id="3527085408025491307">Vouer</translation> <translation id="3529024052484145543">Nie veilig nie</translation> <translation id="3533202363250687977">Maak alle incognito-oortjies toe</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Bladsy se sekuriteitsinligting</translation> <translation id="5443952882982198570">Kredietkaarte</translation> <translation id="5457907402803865181">Kon nie wagwoorde sinkroniseer nie.</translation> +<translation id="5508435575041083207">Meld af en vee data op hierdie toestel uit</translation> <translation id="5525269841082836315">Skep wagfrase</translation> <translation id="5548760955356983418">Oorgee laat jou toe om op 'n webwerf op hierdie toestel te begin blaai en dan maklik op jou Mac voort te gaan. Die huidige oop webwerf sal in die dok van jou Mac verskyn. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Voeg 'n nuwe oortjie by om privaat deur die web te blaai.</translation> <translation id="7671141431838911305">INSTALLEER</translation> <translation id="7765158879357617694">Skuif</translation> +<translation id="7771470029643830783">As jy afmeld, sal jou boekmerke, geskiedenis, wagwoorde en ander Chrome-data nie meer met jou Google-rekening gesinkroniseer word nie. + +Wanneer jy afmeld, sal jou Chrome-data op hierdie toestel uigevee word omdat jou rekening deur <ph name="HOSTED_DOMAIN" /> bestuur word. Jou gesinkroniseerde data sal in jou Google-rekening bly.</translation> <translation id="7772032839648071052">Bevestig wagfrase</translation> <translation id="7781011649027948662">Vertaal bladsy?</translation> <translation id="7781829728241885113">Gister</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Stoor veranderinge</translation> <translation id="8503813439785031346">Gebruikernaam</translation> <translation id="850600235656508448">Maak in Incognito oop</translation> +<translation id="8510057420705599706">Dit sal jou afmeld en sinkronisering afskakel, maar jou boekmerke, geskiedenis, wagwoorde en ander Chrome-data sal op hierdie toestel bly.</translation> <translation id="8517375800490286174">Oopbronlisensies</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Oortjies <ph name="FIRST_VISIBLE_TAB" /> tot <ph name="LAST_VISIBLE_TAB" /> van <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Nuut</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Dateer wagwoord op</translation> <translation id="9100610230175265781">Wagwoordfrase word vereis</translation> <translation id="9148126808321036104">Meld weer aan …</translation> +<translation id="9152539721251340337">Skep 'n QR-kode</translation> <translation id="9157836665414082580">Onderdruk dialoë</translation> <translation id="9188680907066685419">Meld af uit bestuurde rekening</translation> <translation id="9203116392574189331">Oorgee</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index 0032fffb6..3b8657f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">চিহ্নিত কৰক…</translation> <translation id="3153862085237805241">কাৰ্ড ছেভ কৰক</translation> <translation id="3157684681743766797">সকলো চিহ্নিত কৰক…</translation> +<translation id="3161291298470460782">এই কাৰ্যই আপোনাক ছাইন আউট কৰাব, ছিংক অফ কৰিব আৰু আপোনাৰ ডিভাইচটোৰ পৰা সকলো Chrome ডেটা মচিব। আপোনাৰ ছিংক কৰা ডেটা আপোনাৰ Google একাউণ্টত থাকিব।</translation> <translation id="3175081911749765310">ৱেব সেৱা</translation> <translation id="3178650076442119961">আজি সক্ৰিয় হৈছে</translation> <translation id="3207960819495026254">বুকমার্ক কৰা হৈছে</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">ব্ৰাউজিং ডেটা মচাটো নিশ্চিত কৰক</translation> <translation id="35083190962747987">${url} খোলক</translation> <translation id="3519193562722059437">ৱেব ব্ৰাউজ কৰিবলৈ এটা টেব খোলক।</translation> +<translation id="3523473570015918798">ছাইন আউট কৰাৰ ফলত আপোনাৰ বুকমাৰ্ক, ইতিহাস, পাছৱৰ্ড আৰু অন্য Chrome ডেটা আপোনাৰ Google একাউণ্টত আৰু ছিংক কৰা নহ’ব।</translation> <translation id="3527085408025491307">ফ’ল্ডাৰ</translation> <translation id="3529024052484145543">সুৰক্ষিত নহয়</translation> <translation id="3533202363250687977">সকলো ইনক’গনিট’ টেব বন্ধ কৰক</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">পৃষ্ঠাৰ সুৰক্ষাৰ তথ্য</translation> <translation id="5443952882982198570">ক্ৰেডিট কাৰ্ড</translation> <translation id="5457907402803865181">পাছৱৰ্ডসমূহ ছিংক কৰাত আসোঁৱাহ হৈছে।</translation> +<translation id="5508435575041083207">ছাইন আউট কৰক আৰু এই ডিভাইচটোৰ পৰা ডেটা মচক</translation> <translation id="5525269841082836315">পাছফ্ৰেজ সৃষ্টি কৰক</translation> <translation id="5548760955356983418">Handoff সুবিধাটোৱে এই ডিভাইচটোত এটা ৱেবছাইট ব্ৰাউজ কৰা আৰম্ভ কৰি সেইটো ছাইটৰ বাকীখিনি আপোনাৰ Macত ব্ৰাউজ কৰাৰ সুবিধা আগবঢ়ায়। বৰ্তমান খোল খাই থকা ৱেবছাইটসমূহ আপোনাৰ Macৰ Dockত দেখা পোৱা যাব। @@ -503,6 +506,9 @@ <translation id="766891008101699113">ব্যক্তিগতভাৱে ৱেব ব্ৰাউজ কৰিবলৈ এটা নতুন টেব যোগ কৰক।</translation> <translation id="7671141431838911305">ইনষ্টল কৰক</translation> <translation id="7765158879357617694">আঁতৰাওক</translation> +<translation id="7771470029643830783">ছাইন আউট কৰাৰ ফলত আপোনাৰ বুকমাৰ্ক, ইতিহাস, পাছৱৰ্ড আৰু অন্য Chrome ডেটা আপোনাৰ Google একাউণ্টত আৰু ছিংক কৰা নহ’ব। + +আপুনি যিহেতু আপোনাৰ একাউণ্টটো <ph name="HOSTED_DOMAIN" />এ পৰিচালনা কৰে, ছাইন আউট কৰিলে আপোনাৰ Chrome ডেটা এই ডিভাইচটোৰ পৰা মচা হ’ব। আপোনাৰ ছিংক কৰা ডেটা আপোনাৰ Google একাউণ্টত থাকিব।</translation> <translation id="7772032839648071052">পাছফ্ৰেজ নিশ্চিত কৰক</translation> <translation id="7781011649027948662">পৃষ্ঠাখন অনুবাদ কৰিবনে?</translation> <translation id="7781829728241885113">কালি</translation> @@ -552,6 +558,7 @@ <translation id="8490978609246021741">সালসলনিবোৰ ছেভ কৰক</translation> <translation id="8503813439785031346">ব্যৱহাৰকাৰীৰ নাম</translation> <translation id="850600235656508448">ইনক’গনিট’ত খোলক</translation> +<translation id="8510057420705599706">এই কাৰ্যই আপোনাক ছাইন আউট কৰাব, ছিংক অফ কৰিব, কিন্তু আপোনাৰ বুকমাৰ্ক, ইতিহাস, পাছৱৰ্ড আৰু অন্য Chrome ডেটা এই ডিভাইচটোত থাকিব।</translation> <translation id="8517375800490286174">মুক্ত উৎসৰ অনুজ্ঞাপত্ৰসমূহ</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> টেব <ph name="NUMBER_OF_OPEN_TABS" />টাৰ ভিতৰত <ph name="FIRST_VISIBLE_TAB" />টাৰ পৰা <ph name="LAST_VISIBLE_TAB" />টালৈ</translation> <translation id="8529767659511976195">নতুন</translation> @@ -594,6 +601,7 @@ <translation id="9094033019050270033">পাছৱৰ্ড আপডে’ট কৰক</translation> <translation id="9100610230175265781">পাছফ্ৰেজ আৱশ্যক</translation> <translation id="9148126808321036104">আকৌ ছাইন ইন কৰক</translation> +<translation id="9152539721251340337">এটা কিউআৰ ক’ড সৃষ্টি কৰক</translation> <translation id="9157836665414082580">ডায়ল'গ লুকুৱাওক</translation> <translation id="9188680907066685419">পৰিচালিত একাউণ্টৰ পৰা ছাইন আউট হওক</translation> <translation id="9203116392574189331">হেণ্ডঅফ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index aa7210e..f3e3d035 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Означаване…</translation> <translation id="3153862085237805241">Запазване на картата</translation> <translation id="3157684681743766797">Означаване на всички…</translation> +<translation id="3161291298470460782">Това действие ще прекрати сесията ви, ще изключи синхронизирането и ще изчисти всички данни в Chrome от това устройство. Синхронизираната информация ще остане в профила ви в Google.</translation> <translation id="3175081911749765310">Уеб услуги</translation> <translation id="3178650076442119961">Активно днес</translation> <translation id="3207960819495026254">С отметка</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Потвърждаване на изчистването на данните за сърфирането</translation> <translation id="35083190962747987">Отваряне на ${url}</translation> <translation id="3519193562722059437">Отворете раздел, за да сърфирате в мрежата.</translation> +<translation id="3523473570015918798">Като излезете от профила си в Google, вашите отметки, история, пароли и други данни в Chrome повече няма да се синхронизират с него.</translation> <translation id="3527085408025491307">Папка</translation> <translation id="3529024052484145543">Няма защита</translation> <translation id="3533202363250687977">Затв. на разделите „инкогнито“</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Информация за сигурността на страницата</translation> <translation id="5443952882982198570">Кредитни карти</translation> <translation id="5457907402803865181">Грешка при синхронизирането на паролите.</translation> +<translation id="5508435575041083207">Излизане от профила и изчистване на данните от това устройство</translation> <translation id="5525269841082836315">Създаване на пропуск</translation> <translation id="5548760955356983418">С Handoff можете да започнете да разглеждате уебсайт на това устройство, след което лесно да продължите сърфирането от своя Mac. Отвореният сайт ще се покаже в лентата Dock. @@ -506,6 +509,9 @@ <translation id="766891008101699113">За да сърфирате в мрежата частно, добавете нов раздел.</translation> <translation id="7671141431838911305">INSTALL</translation> <translation id="7765158879357617694">Преместване</translation> +<translation id="7771470029643830783">Като излезете от профила си в Google, вашите отметки, история, пароли и други данни в Chrome повече няма да се синхронизират с него. + +Тъй като профилът ви се управлява от <ph name="HOSTED_DOMAIN" />, данните ви в Chrome ще бъдат изтрити от това устройство при излизане от съответния профил. Синхронизираната информация ще остане в профила ви в Google.</translation> <translation id="7772032839648071052">Потвърдете пропуска</translation> <translation id="7781011649027948662">Да се преведе ли страницата?</translation> <translation id="7781829728241885113">Вчера</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Запазване на промените</translation> <translation id="8503813439785031346">Потребителско име</translation> <translation id="850600235656508448">Отваряне в режим „инкогнито“</translation> +<translation id="8510057420705599706">Това действие ще прекрати сесията ви и ще изключи синхронизирането, но отметките, историята, паролите и другите ви данни в Chrome ще останат на това устройство.</translation> <translation id="8517375800490286174">Лицензи за отворен код</translation> <translation id="8524799873541103884">Раздели в режим „<ph name="INCOGNITO" />“: <ph name="FIRST_VISIBLE_TAB" /> до <ph name="LAST_VISIBLE_TAB" /> от общо <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Ново</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Актуализиране на паролата</translation> <translation id="9100610230175265781">Изисква се пропуск</translation> <translation id="9148126808321036104">Влезте отново</translation> +<translation id="9152539721251340337">Създаване на QR код</translation> <translation id="9157836665414082580">Диалогови прозорци: Блокиране</translation> <translation id="9188680907066685419">Излизане от управляван профил</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index ff2d0d15..2328552 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Označi…</translation> <translation id="3153862085237805241">Sačuvajte karticu</translation> <translation id="3157684681743766797">Označi sve…</translation> +<translation id="3161291298470460782">Ovim ćete se odjaviti, isključiti sinhronizaciju i obrisati Chrome podatke s ovog uređaja. Vaši sinhronizirani podaci će ostati na vašem Google računu.</translation> <translation id="3175081911749765310">Web usluge</translation> <translation id="3178650076442119961">Aktivan danas</translation> <translation id="3207960819495026254">Označeno</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Potvrda brisanja podataka pregledanja</translation> <translation id="35083190962747987">Otvori ${url}</translation> <translation id="3519193562722059437">Otvorite karticu da pregledate web.</translation> +<translation id="3523473570015918798">Ako se odjavite, oznake, historija, lozinke i drugi Chrome podaci više se neće sinhronizirati s vašim Google računom.</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3529024052484145543">Nije sigurno</translation> <translation id="3533202363250687977">Zatvori sve anonimne kartice</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informacije o sigurnosti stranice</translation> <translation id="5443952882982198570">Kreditne kartice</translation> <translation id="5457907402803865181">Greška prilikom sinhroniziranja lozinki.</translation> +<translation id="5508435575041083207">Odjavite se i obrišite podatke s uređaja</translation> <translation id="5525269841082836315">Kreirajte pristupni izraz</translation> <translation id="5548760955356983418">Handoff vam omogućava da počnete pregledati web lokaciju na ovom uređaju i jednostavno nastavite na Macu. Trenutno otvorena web lokacija će se pojaviti na priključnoj stranici na Macu. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Dodajte novu karticu da privatno pretražujete web.</translation> <translation id="7671141431838911305">INSTALIRAJ</translation> <translation id="7765158879357617694">Pomjeri</translation> +<translation id="7771470029643830783">Ako se odjavite, oznake, historija, lozinke i drugi Chrome podaci više se neće sinhronizirati s vašim Google računom. + +S obzirom da vašim računom upravlja domena <ph name="HOSTED_DOMAIN" />, vaši Chrome podaci će se izbrisati s ovog uređaja kada se odjavite. Vaši sinhronizirani podaci će ostati na vašem Google računu.</translation> <translation id="7772032839648071052">Potvrdite pristupni izraz</translation> <translation id="7781011649027948662">Prevesti stranicu?</translation> <translation id="7781829728241885113">Jučer</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Sačuvaj izmjene</translation> <translation id="8503813439785031346">Korisničko ime</translation> <translation id="850600235656508448">Otvori u anonimnom načinu</translation> +<translation id="8510057420705599706">Ovim ćete se odjaviti i isključiti sinhronizaciju, ali vaše oznake, historija, lozinke i drugi Chrome podaci će ostati na ovom uređaju.</translation> <translation id="8517375800490286174">Licence otvorenog koda</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> kartice od <ph name="FIRST_VISIBLE_TAB" /> do <ph name="LAST_VISIBLE_TAB" /> od <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novo</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Ažuriraj lozinku</translation> <translation id="9100610230175265781">Potreban je pristupni izraz</translation> <translation id="9148126808321036104">Prijavi se ponovo</translation> +<translation id="9152539721251340337">Kreirajte QR kôd</translation> <translation id="9157836665414082580">Spriječi dijaloge</translation> <translation id="9188680907066685419">Odjava s upravljanog računa</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 270717d..93d98c3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Marca com a…</translation> <translation id="3153862085237805241">Desa la targeta</translation> <translation id="3157684681743766797">Marca-ho tot com a…</translation> +<translation id="3161291298470460782">Amb aquesta acció es tancarà la sessió, es desactivarà la sincronització i s'esborraran totes les dades de Chrome d'aquest dispositiu. Les dades sincronitzades es conservaran al teu Compte de Google.</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> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Confirma que vols esborrar les dades de navegació</translation> <translation id="35083190962747987">Obre ${url}</translation> <translation id="3519193562722059437">Obriu una pestanya per navegar pel web.</translation> +<translation id="3523473570015918798">En tancar la sessió, les adreces d'interès, l'historial, les contrasenyes i altres dades de Chrome es deixaran de sincronitzar amb el teu Compte de Google</translation> <translation id="3527085408025491307">Carpeta</translation> <translation id="3529024052484145543">No és segur</translation> <translation id="3533202363250687977">Tanca totes les pestanyes d'incògnit</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informació de seguretat de la pàgina</translation> <translation id="5443952882982198570">Targetes de crèdit</translation> <translation id="5457907402803865181">S'ha produït un error en sincronitzar les contrasenyes.</translation> +<translation id="5508435575041083207">Tanca la sessió i esborra les dades d'aquest dispositiu</translation> <translation id="5525269841082836315">Crea una frase de contrasenya</translation> <translation id="5548760955356983418">Handoff us permet començar a navegar per un lloc web en aquest dispositiu i després continuar fàcilment al dispositiu Mac. El lloc web obert actualment apareixerà al Dock de Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Per navegar pel web de manera privada, obre una pestanya nova.</translation> <translation id="7671141431838911305">INSTAL·LA</translation> <translation id="7765158879357617694">Mou</translation> +<translation id="7771470029643830783">En tancar la sessió, les adreces d'interès, l'historial, les contrasenyes i altres dades de Chrome es deixaran de sincronitzar amb el teu Compte de Google + +Com que <ph name="HOSTED_DOMAIN" /> gestiona el teu compte, les dades de Chrome se suprimiran d'aquest dispositiu en tancar la sessió. Les dades sincronitzades es conservaran al teu Compte de Google.</translation> <translation id="7772032839648071052">Confirmeu la frase de contrasenya</translation> <translation id="7781011649027948662">Vols traduir la pàgina?</translation> <translation id="7781829728241885113">Ahir</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Desa els canvis</translation> <translation id="8503813439785031346">Nom d'usuari</translation> <translation id="850600235656508448">Obre en mode d'incògnit</translation> +<translation id="8510057420705599706">Amb aquesta acció es tancarà la sessió i es desactivarà la sincronització, però les adreces d'interès, l'historial, les contrasenyes i altres dades de Chrome es conservaran en aquest dispositiu.</translation> <translation id="8517375800490286174">Llicències de programari lliure</translation> <translation id="8524799873541103884">Pestanyes <ph name="INCOGNITO" />: de <ph name="FIRST_VISIBLE_TAB" /> a <ph name="LAST_VISIBLE_TAB" /> d'un total de <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novetat</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Actualitza la contrasenya</translation> <translation id="9100610230175265781">S'ha d'introduir una frase de contrasenya </translation> <translation id="9148126808321036104">Torna a iniciar la sessió</translation> +<translation id="9152539721251340337">Crea un codi QR</translation> <translation id="9157836665414082580">Suprimeix quadres de diàleg</translation> <translation id="9188680907066685419">Tanqueu la sessió del compte gestionat</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 84a7ed9..f308ef58 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Markér…</translation> <translation id="3153862085237805241">Gem kortet</translation> <translation id="3157684681743766797">Markér alle…</translation> +<translation id="3161291298470460782">Du logges ud, synkronisering deaktiveres, og alle Chrome-data på enheden ryddes. Alle synkroniserede data vil stadig være på din Google-konto.</translation> <translation id="3175081911749765310">Webtjenester</translation> <translation id="3178650076442119961">Aktiv i dag</translation> <translation id="3207960819495026254">Gemt som bogmærke</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Bekræft rydning af browserdata</translation> <translation id="35083190962747987">Åbn ${url}</translation> <translation id="3519193562722059437">Åbn en fane for at søge på nettet.</translation> +<translation id="3523473570015918798">Hvis du logger ud, vil historik, adgangskoder og andre Chrome-data ikke længere blive synkroniseret med din Google-konto.</translation> <translation id="3527085408025491307">Mappe</translation> <translation id="3529024052484145543">Ikke sikker</translation> <translation id="3533202363250687977">Luk alle inkognitofaner</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Oplysninger om sidesikkerhed</translation> <translation id="5443952882982198570">Kreditkort</translation> <translation id="5457907402803865181">Adgangskoderne kunne ikke synkroniseres.</translation> +<translation id="5508435575041083207">Log ud, og ryd data fra denne enhed</translation> <translation id="5525269841082836315">Opret adgangssætning</translation> <translation id="5548760955356983418">Med Handoff kan du begynde at se på et website på denne enhed og derefter nemt fortsætte på din Mac. Det website, du har åbent, vises i docken på din Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Tilføj en ny fane for at surfe privat på nettet.</translation> <translation id="7671141431838911305">INSTALLER</translation> <translation id="7765158879357617694">Flyt</translation> +<translation id="7771470029643830783">Hvis du logger ud, vil historik, adgangskoder og andre Chrome-data ikke længere blive synkroniseret med din Google-konto. + +Eftersom din konto administreres af <ph name="HOSTED_DOMAIN" />, slettes dine Chrome-data fra denne enhed, når du logger ud. Alle synkroniserede data vil stadig være på din Google-konto.</translation> <translation id="7772032839648071052">Bekræft adgangssætning</translation> <translation id="7781011649027948662">Vil du oversætte siden?</translation> <translation id="7781829728241885113">I går</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Gem ændringer</translation> <translation id="8503813439785031346">Brugernavn</translation> <translation id="850600235656508448">Åbn i inkognitotilstand</translation> +<translation id="8510057420705599706">Du logges ud, og synkronisering deaktiveres, men alle dine bogmærker, din historik, dine adgangskoder og øvrige Chrome-data vil stadig være på enheden.</translation> <translation id="8517375800490286174">Open source-licenser</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" />-fane <ph name="FIRST_VISIBLE_TAB" /> til <ph name="LAST_VISIBLE_TAB" /> af <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Ny</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Opdater adgangskoden</translation> <translation id="9100610230175265781">Adgangssætning kræves</translation> <translation id="9148126808321036104">Log ind igen</translation> +<translation id="9152539721251340337">Opret en QR-kode</translation> <translation id="9157836665414082580">Skjul dialogbokse</translation> <translation id="9188680907066685419">Log ud af den administrerede konto</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 6c2cbe8..f81d35d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Επισήμανση…</translation> <translation id="3153862085237805241">Αποθήκευση κάρτας</translation> <translation id="3157684681743766797">Επισήμανση όλων…</translation> +<translation id="3161291298470460782">Με αυτήν την ενέργεια θα αποσυνδεθείτε, θα απενεργοποιηθεί ο συγχρονισμός και θα διαγραφούν όλα τα δεδομένα του Chrome από αυτήν τη συσκευή. Τα συγχρονισμένα δεδομένα θα διατηρηθούν στον Λογαριασμό σας Google.</translation> <translation id="3175081911749765310">Υπηρ.ιστού</translation> <translation id="3178650076442119961">Ενεργή σήμερα</translation> <translation id="3207960819495026254">Προστέθηκε στους σελιδοδείκτες</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Επιβεβαίωση διαγραφής δεδομένων περιήγησης</translation> <translation id="35083190962747987">Άνοιγμα ${url}</translation> <translation id="3519193562722059437">Άνοιγμα καρτέλας για περιήγηση στον ιστό</translation> +<translation id="3523473570015918798">Με την αποσύνδεση, οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλα δεδομένα Chrome δεν θα συγχρονίζονται πλέον με τον Λογαριασμό σας Google</translation> <translation id="3527085408025491307">Φάκελος</translation> <translation id="3529024052484145543">Μη ασφαλής</translation> <translation id="3533202363250687977">Κλείσιμο όλων των καρτελών ανώνυμης περιήγησης</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Πληροφορίες ασφάλειας σελίδας</translation> <translation id="5443952882982198570">Πιστωτικές κάρτες</translation> <translation id="5457907402803865181">Σφάλμα κατά τον συγχρονισμό των κωδικών πρόσβασης.</translation> +<translation id="5508435575041083207">Αποσύνδεση και διαγραφή δεδομένων από αυτήν τη συσκευή</translation> <translation id="5525269841082836315">Δημ. φράσης πρόσβ.</translation> <translation id="5548760955356983418">Το Handoff σάς δίνει τη δυνατότητα να ξεκινήσετε την περιήγηση σε έναν ιστότοπο σε αυτήν τη συσκευή και, στη συνέχεια, να συνεχίσετε εύκολα σε Mac. Ο ιστότοπος που είναι ανοικτός αυτήν τη στιγμή θα εμφανίζεται στο Dock του Mac. @@ -507,6 +510,9 @@ <translation id="766891008101699113">Για να περιηγηθείτε στον ιστό ιδιωτικά, προσθέστε μια νέα καρτέλα.</translation> <translation id="7671141431838911305">ΕΓΚΑΤΑΣΤΑΣΗ</translation> <translation id="7765158879357617694">Μεταφορά</translation> +<translation id="7771470029643830783">Με την αποσύνδεση, οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλα δεδομένα Chrome δεν θα συγχρονίζονται πλέον με τον Λογαριασμό σας Google + +Επειδή η διαχείριση του λογαριασμού σας γίνεται από τον τομέα <ph name="HOSTED_DOMAIN" />, τα δεδομένα σας στο Chrome θα διαγραφούν από αυτήν τη συσκευή κατά την αποσύνδεση. Τα συγχρονισμένα δεδομένα θα διατηρηθούν στον Λογαριασμό σας Google.</translation> <translation id="7772032839648071052">Επιβεβαίωση φράσης πρόσβασης</translation> <translation id="7781011649027948662">Μετάφραση σελίδας;</translation> <translation id="7781829728241885113">Χθες</translation> @@ -556,6 +562,7 @@ <translation id="8490978609246021741">Αποθήκευση αλλαγών</translation> <translation id="8503813439785031346">Όνομα χρήστη</translation> <translation id="850600235656508448">Άνοιγμα σε κατάσταση ανώνυμης περιήγησης</translation> +<translation id="8510057420705599706">Με αυτήν την ενέργεια θα αποσυνδεθείτε και θα απενεργοποιηθεί ο συγχρονισμός, αλλά οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλα δεδομένα του Chrome θα διατηρηθούν σε αυτήν τη συσκευή.</translation> <translation id="8517375800490286174">Άδειες λογισμ. ανοικτού κώδικα</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Καρτέλες <ph name="FIRST_VISIBLE_TAB" /> έως <ph name="LAST_VISIBLE_TAB" /> από <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Νέο</translation> @@ -598,6 +605,7 @@ <translation id="9094033019050270033">Ενημέρωση κωδικού πρόσβασης</translation> <translation id="9100610230175265781">Απαιτείται φράση πρόσβασης</translation> <translation id="9148126808321036104">Συνδεθείτε ξανά</translation> +<translation id="9152539721251340337">Δημιουργία κωδικού QR</translation> <translation id="9157836665414082580">Απόκρυψη παραθύρων διαλόγου</translation> <translation id="9188680907066685419">Αποσύνδεση από διαχειριζόμενο λογαριασμό</translation> <translation id="9203116392574189331">Handoff</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 298ed3d..4d9c4463 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Mark…</translation> <translation id="3153862085237805241">Save Card</translation> <translation id="3157684681743766797">Mark All…</translation> +<translation id="3161291298470460782">This will sign you out, turn off sync and clear all Chrome data from this device. Your synced data will remain in your Google Account.</translation> <translation id="3175081911749765310">Web Services</translation> <translation id="3178650076442119961">Active today</translation> <translation id="3207960819495026254">Bookmarked</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Confirm Clear Browsing Data</translation> <translation id="35083190962747987">Open ${url}</translation> <translation id="3519193562722059437">Open a tab to browse the web.</translation> +<translation id="3523473570015918798">By signing out, your bookmarks, history, passwords and other Chrome data will no longer be synced to your Google Account.</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3529024052484145543">Not secure</translation> <translation id="3533202363250687977">Close all incognito tabs</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Page Security Info</translation> <translation id="5443952882982198570">Credit cards</translation> <translation id="5457907402803865181">Error syncing passwords.</translation> +<translation id="5508435575041083207">Sign out and clear data from this device</translation> <translation id="5525269841082836315">Create a Pass phrase</translation> <translation id="5548760955356983418">Handoff lets you start browsing a website on this device and then easily continue on your Mac. The current open website will appear in the Dock of your Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">To browse the web privately, add a new tab.</translation> <translation id="7671141431838911305">INSTALL</translation> <translation id="7765158879357617694">Move</translation> +<translation id="7771470029643830783">By signing out, your bookmarks, history, passwords and other Chrome data will no longer be synced to your Google Account. + +Because your account is managed by <ph name="HOSTED_DOMAIN" />, your Chrome data will be deleted from this device when signing out. Your synced data will remain in your Google Account.</translation> <translation id="7772032839648071052">Confirm passphrase</translation> <translation id="7781011649027948662">Translate page?</translation> <translation id="7781829728241885113">Yesterday</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Save changes</translation> <translation id="8503813439785031346">Username</translation> <translation id="850600235656508448">Open in Incognito</translation> +<translation id="8510057420705599706">This will sign you out and turn off sync, but your bookmarks, history, passwords and other Chrome data will remain on this device.</translation> <translation id="8517375800490286174">Open-Source Licences</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Tabs <ph name="FIRST_VISIBLE_TAB" /> through <ph name="LAST_VISIBLE_TAB" /> of <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">New</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Update password</translation> <translation id="9100610230175265781">Passphrase required</translation> <translation id="9148126808321036104">Sign in again</translation> +<translation id="9152539721251340337">Create a QR code</translation> <translation id="9157836665414082580">Suppress Dialogues</translation> <translation id="9188680907066685419">Sign out of managed account</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index d3e4d2b2..5be436da 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Označi...</translation> <translation id="3153862085237805241">Spremi karticu</translation> <translation id="3157684681743766797">Označi sve...</translation> +<translation id="3161291298470460782">Time ćete se odjaviti, isključiti sinkronizaciju i izbrisati sve podatke iz Chromea s ovog uređaja. Sinkronizirani podaci ostat će na vašem Google računu.</translation> <translation id="3175081911749765310">Web-usluge</translation> <translation id="3178650076442119961">Aktivan danas</translation> <translation id="3207960819495026254">Označeno</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Potvrdi brisanje podataka o pregledavanju</translation> <translation id="35083190962747987">Otvori ${url}</translation> <translation id="3519193562722059437">Otvorite karticu da biste pregledavali web.</translation> +<translation id="3523473570015918798">Ako se odjavite, vaše oznake, povijest, zaporke i drugi podaci iz Chromea više se neće sinkronizirati s vašim Google računom.</translation> <translation id="3527085408025491307">Mapa</translation> <translation id="3529024052484145543">Nije sigurno</translation> <translation id="3533202363250687977">Zatvori sve anonimne kartice</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informacije o sigurnosti stranice</translation> <translation id="5443952882982198570">Kreditne kartice</translation> <translation id="5457907402803865181">Pogreška prilikom sinkronizacije zaporki.</translation> +<translation id="5508435575041083207">Odjavite se i izbrišite podatke s ovog uređaja</translation> <translation id="5525269841082836315">Stvaranje zaporke</translation> <translation id="5548760955356983418">Handoff vam omogućuje da počnete pregledavati web-lokaciju na ovom uređaju i nastavite na Macu. Trenutačno otvorena web-lokacija pojavit će se u Docku na vašem Macu. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Da biste privatno pregledavali web, dodajte novu karticu.</translation> <translation id="7671141431838911305">INSTALIRANJE</translation> <translation id="7765158879357617694">Pomakni</translation> +<translation id="7771470029643830783">Ako se odjavite, vaše oznake, povijest, zaporke i drugi podaci iz Chromea više se neće sinkronizirati s vašim Google računom. + +Budući da vašim računom upravlja <ph name="HOSTED_DOMAIN" />, vaši podaci iz Chromea izbrisat će se s ovog uređaja kad se odjavite. Sinkronizirani podaci ostat će na vašem Google računu.</translation> <translation id="7772032839648071052">Potvrdi zaporku</translation> <translation id="7781011649027948662">Želite li prevesti stranicu?</translation> <translation id="7781829728241885113">Danas</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Spremi promjene</translation> <translation id="8503813439785031346">Korisničko ime</translation> <translation id="850600235656508448">Otvori u anonimnom načinu</translation> +<translation id="8510057420705599706">Time ćete se odjaviti i isključiti sinkronizaciju, no vaše oznake, povijest, zaporke i drugi podaci iz Chromea ostat će na ovom uređaju.</translation> <translation id="8517375800490286174">Licence otvorenog koda</translation> <translation id="8524799873541103884">Kartice <ph name="INCOGNITO" /> od <ph name="FIRST_VISIBLE_TAB" /> do <ph name="LAST_VISIBLE_TAB" /> od ukupno <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novo</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Ažuriraj zaporku</translation> <translation id="9100610230175265781">Potrebna je zaporka</translation> <translation id="9148126808321036104">Prijavite se ponovno</translation> +<translation id="9152539721251340337">Izradi QR kôd</translation> <translation id="9157836665414082580">Izostavi dijaloge</translation> <translation id="9188680907066685419">Odjava s upravljanog računa</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index 7d0d651..1cb9a639 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Megjelölés…</translation> <translation id="3153862085237805241">Kártya mentése</translation> <translation id="3157684681743766797">Az összes megjelölése…</translation> +<translation id="3161291298470460782">Ezzel kijelentkezik, kikapcsol a szinkronizálás, és minden Chrome-adat törlődik erről az eszközről. Szinkronizált adatai továbbra is megmaradnak Google-fiókjában.</translation> <translation id="3175081911749765310">Webszolgáltató</translation> <translation id="3178650076442119961">Ma volt aktív</translation> <translation id="3207960819495026254">Könyvjelző rögzítve</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Böngészési adatok törlésének megerősítése</translation> <translation id="35083190962747987">${url} megnyitása</translation> <translation id="3519193562722059437">Nyisson meg egy lapot a böngészéshez.</translation> +<translation id="3523473570015918798">A kijelentkezés után könyvjelzői, előzményei, jelszavai és más Chrome-adatai többé nem szinkronizálódnak a Google-fiókjával.</translation> <translation id="3527085408025491307">Mappa</translation> <translation id="3529024052484145543">Nem biztonságos</translation> <translation id="3533202363250687977">Összes inkognitólap bezárása</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Oldal biztonsági információi</translation> <translation id="5443952882982198570">Hitelkártyák</translation> <translation id="5457907402803865181">Hiba a jelszavak szinkronizálása során.</translation> +<translation id="5508435575041083207">Kijelentkezés és adatok törlése erről az eszközről</translation> <translation id="5525269841082836315">Jelszó létrehozása</translation> <translation id="5548760955356983418">Az Átadás segítségével ha ezen az eszközön kezd böngészni egy webhelyet, könnyedén folytathatja azt Mac típusú számítógépén. A jelenleg megnyitott webhely a Mac dokkján jelenik meg. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Ha privát módon szeretne böngészni az interneten, adjon hozzá egy új lapot.</translation> <translation id="7671141431838911305">TELEPÍTÉS</translation> <translation id="7765158879357617694">Áthelyezés</translation> +<translation id="7771470029643830783">A kijelentkezés után könyvjelzői, előzményei, jelszavai és más Chrome-adatai többé nem szinkronizálódnak a Google-fiókjával. + +Mivel fiókját a(z) <ph name="HOSTED_DOMAIN" /> kezeli, Chrome-adatai törölve lesznek erről az eszközről, amikor kijelentkezik. Szinkronizált adatai továbbra is megmaradnak Google-fiókjában.</translation> <translation id="7772032839648071052">Összetett jelszó megerősítése</translation> <translation id="7781011649027948662">Lefordítja az oldalt?</translation> <translation id="7781829728241885113">Tegnap</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Módosítások mentése</translation> <translation id="8503813439785031346">Felhasználónév</translation> <translation id="850600235656508448">Megnyitás inkognitómódban</translation> +<translation id="8510057420705599706">Ezzel kijelentkezik, és kikapcsol a szinkronizálás, de könyvjelzői, előzményei, jelszavai és egyéb Chrome-adatai továbbra is megmaradnak ezen az eszközön.</translation> <translation id="8517375800490286174">Nyílt forráskódú licencek</translation> <translation id="8524799873541103884">Lapok <ph name="INCOGNITO" /> módban: <ph name="FIRST_VISIBLE_TAB" />–<ph name="LAST_VISIBLE_TAB" />/<ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Új</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Jelszó frissítése</translation> <translation id="9100610230175265781">Összetett jelszó szükséges</translation> <translation id="9148126808321036104">Jelentkezzen be újra</translation> +<translation id="9152539721251340337">QR-kód létrehozása</translation> <translation id="9157836665414082580">Párbeszédablakok elrejtése</translation> <translation id="9188680907066685419">Kijelentkezés felügyelt fiókból</translation> <translation id="9203116392574189331">Átadás</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index f6cc45b..9abedc9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Նշել…</translation> <translation id="3153862085237805241">Պահել քարտը</translation> <translation id="3157684681743766797">Նշել բոլորը…</translation> +<translation id="3161291298470460782">Դուք դուրս կգրվեք հաշվից, համաժամացումը կանջատվի, և Chrome-ի բոլոր տվյալները կջնջվեն այս սարքից։ Համաժամացված տվյալները կպահպանվեն ձեր Google հաշվում։</translation> <translation id="3175081911749765310">Համացանցի ծառայություններ</translation> <translation id="3178650076442119961">Այսօր ակտիվ է եղել</translation> <translation id="3207960819495026254">Էջանշված է</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Հաստատել այցելությունների պատմության ջնջումը</translation> <translation id="35083190962747987">Անցնել ${url}</translation> <translation id="3519193562722059437">Բացեք ներդիր՝ համացանցում կայքեր դիտելու համար:</translation> +<translation id="3523473570015918798">Դուրս գրվելու դեպքում էջանիշները, պատմությունը, գաղտնաբառերը և Chrome-ի մյուս տվյալներն այլևս չեն համաժամացվի ձեր Google հաշվի հետ։</translation> <translation id="3527085408025491307">Պանակ</translation> <translation id="3529024052484145543">Անվտանգ չէ</translation> <translation id="3533202363250687977">Փակել բոլոր ինկոգնիտո ներդիրները</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Տեղեկություններ էջի հուսալիության մասին</translation> <translation id="5443952882982198570">Վարկային քարտեր</translation> <translation id="5457907402803865181">Չհաջողվեց համաժամացնել գաղտնաբառերը։</translation> +<translation id="5508435575041083207">Դուրս գրվել և ջնջել տվյալներն այս սարքից</translation> <translation id="5525269841082836315">Ստեղծել անցաբառ</translation> <translation id="5548760955356983418">Handoff-ը թույլ է տալիս ձեզ սկսել որևէ կայքի դիտարկումը այս սարքում, ապա հեշտությամբ շարունակել այն ձեր Mac սարքում: Ներկայումս բաց կայքը կհայտնվի Mac սարքի Միակցիչում: @@ -506,6 +509,9 @@ <translation id="766891008101699113">Համացանցում անանուն կերպով կայքէջեր այցելելու համար ավելացրեք նոր ներդիր:</translation> <translation id="7671141431838911305">ՏԵՂԱԴՐԵԼ</translation> <translation id="7765158879357617694">Տեղափոխել</translation> +<translation id="7771470029643830783">Դուրս գրվելու դեպքում էջանիշները, պատմությունը, գաղտնաբառերը և Chrome-ի մյուս տվյալներն այլևս չեն համաժամացվի ձեր Google հաշվի հետ։ + +Քանի որ ձեր հաշիվը <ph name="HOSTED_DOMAIN" /> տիրույթի կողմից է կառավարվում, դուրս գրվելու դեպքում Chrome-ում պահվող ձեր տվյալները կջնջվեն այս սարքից։ Համաժամացված տվյալները կպահպանվեն ձեր Google հաշվում։</translation> <translation id="7772032839648071052">Հաստատեք անցաբառը</translation> <translation id="7781011649027948662">Թարգմանե՞լ էջը</translation> <translation id="7781829728241885113">Երեկ</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Պահել փոփոխությունները</translation> <translation id="8503813439785031346">Օգտանուն</translation> <translation id="850600235656508448">Բացել ինկոգնիտո ռեժիմում</translation> +<translation id="8510057420705599706">Դուք դուրս կգրվեք հաշվից, և համաժամացումը կանջատվի, սակայն ձեր էջանիշները, պատմությունը, գաղտնաբառերը և Chrome-ի այլ տվյալներ կպահպանվեն այս սարքում։</translation> <translation id="8517375800490286174">Բաց կոդով հավելվածների արտոնագրեր</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Ներդիրներ <ph name="FIRST_VISIBLE_TAB" /> – <ph name="LAST_VISIBLE_TAB" />՝ <ph name="NUMBER_OF_OPEN_TABS" />-ից</translation> <translation id="8529767659511976195">Նոր</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Թարմացնել գաղտնաբառը</translation> <translation id="9100610230175265781">Անհրաժեշտ է անցաբառ</translation> <translation id="9148126808321036104">Նորից մուտք գործել</translation> +<translation id="9152539721251340337">Ստեղծել QR կոդ</translation> <translation id="9157836665414082580">Արգելափակել երկխոսության պատուհանները</translation> <translation id="9188680907066685419">Ելք կառավարվող հաշվից</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index b13ea407..24f8207 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Merkja…</translation> <translation id="3153862085237805241">Vista kort</translation> <translation id="3157684681743766797">Merkja allt…</translation> +<translation id="3161291298470460782">Þetta skráir þig út, slekkur á samstillingu og hreinsar öll Chrome gögn úr þessu tæki. Samstillt gögn verða áfram á Google reikningnum.</translation> <translation id="3175081911749765310">Vefþjónusta</translation> <translation id="3178650076442119961">Virkt í dag</translation> <translation id="3207960819495026254">Í bókamerkjum</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Staðfesta hreinsun vefskoðunargagna</translation> <translation id="35083190962747987">Opna ${url}</translation> <translation id="3519193562722059437">Opnaðu flipa til að vafra.</translation> +<translation id="3523473570015918798">Ef þú skráir þig út verða bókamerkin þín, ferillinn, aðgangsorðin og önnur gögn úr Chrome ekki lengur samstillt við Google reikninginn þinn.</translation> <translation id="3527085408025491307">Mappa</translation> <translation id="3529024052484145543">Ekki öruggt</translation> <translation id="3533202363250687977">Loka öllum huliðsflipum</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Öryggisupplýsingar síðu</translation> <translation id="5443952882982198570">Kreditkort</translation> <translation id="5457907402803865181">Villa við að samstilla aðgangsorð.</translation> +<translation id="5508435575041083207">Skrá þig út og hreinsa gögn úr þessu tæki</translation> <translation id="5525269841082836315">Búa til aðgangsorð</translation> <translation id="5548760955356983418">Handoff gerir þér kleift að byrja að skoða vefsvæði í þessu tæki og halda því síðan áfram á einfaldan hátt í Mac-tölvunni. Vefsvæðið sem er opið birtist í kvínni í Mac-tölvunni. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Opnaðu nýjan flipa til að vafra í einrúmi.</translation> <translation id="7671141431838911305">SETJA UPP</translation> <translation id="7765158879357617694">Færa</translation> +<translation id="7771470029643830783">Ef þú skráir þig út verða bókamerkin þín, ferillinn, aðgangsorðin og önnur gögn úr Chrome ekki lengur samstillt við Google reikninginn þinn. + +Þar sem <ph name="HOSTED_DOMAIN" /> hefur umsjón með reikningnum þínum verður Chrome gögnunum þínum eytt úr þessu tæki þegar þú skráir þig út. Samstillt gögn verða áfram á Google reikningnum.</translation> <translation id="7772032839648071052">Staðfestu aðgangsorðið</translation> <translation id="7781011649027948662">Þýða síðu?</translation> <translation id="7781829728241885113">Í gær</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Vista breytingar</translation> <translation id="8503813439785031346">Notandanafn</translation> <translation id="850600235656508448">Opna í huliðsstillingu</translation> +<translation id="8510057420705599706">Þetta skráir þig út og slekkur á samstillingu en bókamerki, ferill, aðgangsorð og önnur gögn verða áfram í þessu tæki.</translation> <translation id="8517375800490286174">Leyfi opins kóða</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Flipar <ph name="FIRST_VISIBLE_TAB" /> til og með <ph name="LAST_VISIBLE_TAB" /> af <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Nýtt</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Uppfæra aðgangsorð</translation> <translation id="9100610230175265781">Aðgangsorðs krafist</translation> <translation id="9148126808321036104">Skrá inn aftur</translation> +<translation id="9152539721251340337">Búa til QR-kóða</translation> <translation id="9157836665414082580">Hindra nýja glugga</translation> <translation id="9188680907066685419">Skrá út af stýrðum reikningi</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 90068ca..b08d4e6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Segna come…</translation> <translation id="3153862085237805241">Salva carta</translation> <translation id="3157684681743766797">Segna tutti come...</translation> +<translation id="3161291298470460782">In questo modo il tuo account verrà disconnesso, la sincronizzazione verrà disattivata e tutti i dati di Chrome verranno eliminati da questo dispositivo. I tuoi dati sincronizzati rimarranno nel tuo Account Google.</translation> <translation id="3175081911749765310">Servizi web</translation> <translation id="3178650076442119961">Attivo oggi</translation> <translation id="3207960819495026254">Aggiunto ai preferiti</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Conferma cancellazione dati di navigazione</translation> <translation id="35083190962747987">Apri ${url}</translation> <translation id="3519193562722059437">Apri una scheda per navigare sul Web.</translation> +<translation id="3523473570015918798">Se ti disconnetti, i preferiti, la cronologia, le password e altri dati di Chrome non verranno più sincronizzati con il tuo Account Google.</translation> <translation id="3527085408025491307">Cartella</translation> <translation id="3529024052484145543">Non sicuro</translation> <translation id="3533202363250687977">Chiudi tutte le schede in incognito*</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Info sicurezza pagina</translation> <translation id="5443952882982198570">Carte di credito</translation> <translation id="5457907402803865181">Errore durante la sincronizzazione delle password.</translation> +<translation id="5508435575041083207">Esci e cancella i dati da questo dispositivo</translation> <translation id="5525269841082836315">Crea passphrase</translation> <translation id="5548760955356983418">Handoff ti consente di iniziare a consultare un sito web su questo dispositivo per poi continuare facilmente sul Mac. Il sito web attualmente aperto verrà visualizzato nel Dock sul Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Per navigare sul Web in privato, aggiungi una nuova scheda.</translation> <translation id="7671141431838911305">INSTALLA</translation> <translation id="7765158879357617694">Sposta</translation> +<translation id="7771470029643830783">Se ti disconnetti, i preferiti, la cronologia, le password e altri dati di Chrome non verranno più sincronizzati con il tuo Account Google. + +Poiché il tuo account è gestito da <ph name="HOSTED_DOMAIN" />, i tuoi dati di Chrome verranno eliminati da questo dispositivo quando ti disconnetterai. I tuoi dati sincronizzati rimarranno nel tuo Account Google.</translation> <translation id="7772032839648071052">Conferma passphrase</translation> <translation id="7781011649027948662">Tradurre la pagina?</translation> <translation id="7781829728241885113">Ieri</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Salva modifiche</translation> <translation id="8503813439785031346">Nome utente</translation> <translation id="850600235656508448">Apri in modalità di navigazione in incognito</translation> +<translation id="8510057420705599706">In questo modo il tuo account verrà disconnesso e la sincronizzazione verrà disattivata, ma i preferiti, la cronologia, le password e altri dati di Chrome rimarranno salvati nel dispositivo.</translation> <translation id="8517375800490286174">Licenze open source</translation> <translation id="8524799873541103884">Schede <ph name="INCOGNITO" /> dalla <ph name="FIRST_VISIBLE_TAB" /> alla <ph name="LAST_VISIBLE_TAB" /> di <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novità</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Aggiorna password</translation> <translation id="9100610230175265781">Passphrase obbligatoria</translation> <translation id="9148126808321036104">Esegui di nuovo l'accesso</translation> +<translation id="9152539721251340337">Crea un codice QR</translation> <translation id="9157836665414082580">Elimina finestre di dialogo</translation> <translation id="9188680907066685419">Esci dall'account gestito</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index fa0adbf..b5a7e7c9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">סמן…</translation> <translation id="3153862085237805241">שמור כרטיס</translation> <translation id="3157684681743766797">סמן הכול…</translation> +<translation id="3161291298470460782">הפעולה הזו תוציא אותך מהחשבון, תשבית את הסנכרון ותנקה את כל נתוני Chrome מהמכשיר הזה. הנתונים המסונכרנים יישארו בחשבון Google שלך.</translation> <translation id="3175081911749765310">שירותי אינטרנט</translation> <translation id="3178650076442119961">פעילות אחרונה: היום</translation> <translation id="3207960819495026254">מסומן בסימניה</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">אישור הניקוי של נתוני הגלישה</translation> <translation id="35083190962747987">פתיחה של ${url}</translation> <translation id="3519193562722059437">פתח כרטיסייה כדי לגלוש באינטרנט.</translation> +<translation id="3523473570015918798">יציאה תפסיק את הסנכרון של הסימניות, ההיסטוריה, הסיסמאות ונתונים אחרים ב-Chrome עם חשבון Google.</translation> <translation id="3527085408025491307">תיקיה</translation> <translation id="3529024052484145543">לא מאובטח</translation> <translation id="3533202363250687977">סגירה של כל כרטיסיות הגלישה בסתר</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">פרטי אבטחת דף</translation> <translation id="5443952882982198570">כרטיסי אשראי</translation> <translation id="5457907402803865181">אירעה שגיאה בסנכרון הסיסמאות.</translation> +<translation id="5508435575041083207">יציאה וניקוי נתונים מהמכשיר הזה</translation> <translation id="5525269841082836315">צור סיסמה</translation> <translation id="5548760955356983418">Handoff מאפשר לך להתחיל לגלוש באתר מסוים במכשיר הזה ולאחר מכן להמשיך בקלות ב-Mac. האתר הפתוח הנוכחי יופיע ב-Dock של ה-Mac שלך. @@ -506,6 +509,9 @@ <translation id="766891008101699113">כדי לגלוש באינטרנט בפרטיות צריך להוסיף כרטיסייה חדשה.</translation> <translation id="7671141431838911305">התקנה</translation> <translation id="7765158879357617694">העברה</translation> +<translation id="7771470029643830783">יציאה תפסיק את הסנכרון של הסימניות, ההיסטוריה, הסיסמאות ונתונים אחרים ב-Chrome עם חשבון Google. + +החשבון שלך מנוהל על-ידי <ph name="HOSTED_DOMAIN" />, ולכן הנתונים מ-Chrome יימחקו מהמכשיר הזה בעת היציאה מהחשבון. הנתונים המסונכרנים יישארו בחשבון Google שלך.</translation> <translation id="7772032839648071052">אשר משפט-סיסמה</translation> <translation id="7781011649027948662">לתרגם את הדף?</translation> <translation id="7781829728241885113">אתמול</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">שמירת השינויים</translation> <translation id="8503813439785031346">שם משתמש</translation> <translation id="850600235656508448">פתיחה במצב גלישה בסתר</translation> +<translation id="8510057420705599706">הפעולה הזו תוציא אותך מהחשבון ותשבית את הסנכרון, אבל הסימניות, ההיסטוריה, הסיסמאות ונתונים אחרים ב-Chrome יישארו במכשיר הזה.</translation> <translation id="8517375800490286174">רישיונות קוד פתוח</translation> <translation id="8524799873541103884">כרטיסיות <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> עד <ph name="LAST_VISIBLE_TAB" /> מתוך <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">חדש</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">עדכן סיסמה</translation> <translation id="9100610230175265781">יש להזין ביטוי סיסמה</translation> <translation id="9148126808321036104">היכנס שוב</translation> +<translation id="9152539721251340337">יצירת קוד QR</translation> <translation id="9157836665414082580">הסתר תיבות דו-שיח</translation> <translation id="9188680907066685419">צא מהחשבון המנוהל</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 18d899a8..b540fcb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">მონიშვნა…</translation> <translation id="3153862085237805241">ბარათის შენახვა</translation> <translation id="3157684681743766797">ყველას მონიშვნა…</translation> +<translation id="3161291298470460782">ეს მოქმედება გამოგიყვანთ სისტემიდან, გამორთავს სინქრონიზაციას და გაასუფთავებს Chrome-ის ყველა მონაცემს ამ მოწყობილობიდან. თქვენი სინქრონიზებული მონაცემები დარჩება თქვენს Google ანგარიშში.</translation> <translation id="3175081911749765310">ვებ-სერვისები</translation> <translation id="3178650076442119961">აქტიური იყო დღეს</translation> <translation id="3207960819495026254">ჩანიშნულია</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">დათვალიერების მონაცემების გასუფთავების დადასტურება</translation> <translation id="35083190962747987">${url}-ის გახსნა</translation> <translation id="3519193562722059437">ვების დასათვალიერებლად გახსენით ჩანართი.</translation> +<translation id="3523473570015918798">გამოსვლის შემთხვევაში თქვენი სანიშნეები, ისტორია, პაროლები და Chrome-ის სხვა მონაცემები აღარ იქნება სინქრონიზებული თქვენს Google ანგარიშთან.</translation> <translation id="3527085408025491307">საქაღალდე</translation> <translation id="3529024052484145543">დაუცველი</translation> <translation id="3533202363250687977">ყველა ინკოგნიტო ჩანართის დახურვა</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">გვერდის უსაფრთხოების ინფორმაცია</translation> <translation id="5443952882982198570">საკრედიტო ბარათები</translation> <translation id="5457907402803865181">შეცდომა პაროლების სინქრონიზაციისას.</translation> +<translation id="5508435575041083207">გამოსვლა და მონაცემების გასუფთავება ამ მოწყობილობაზე</translation> <translation id="5525269841082836315">საიდუმლო ფრაზის შექმნა</translation> <translation id="5548760955356983418">Handoff საშუალებით შეგიძლიათ დაიწყოთ ვებსაიტის დათვალიერება ამ მოწყობილობაში და ადვილად გააგრძელოთ Mac მოწყობილობაში. მიმდინარე გახსნილი ვებსაიტი გამოჩნდება Mac მოწყობილობის Dock-ში. @@ -506,6 +509,9 @@ <translation id="766891008101699113">ვების კონფიდენციალურად დასათვალიერებლად დაამატეთ ახალი ჩანართი.</translation> <translation id="7671141431838911305">ინსტალაცია</translation> <translation id="7765158879357617694">გადატანა</translation> +<translation id="7771470029643830783">გამოსვლის შემთხვევაში თქვენი სანიშნეები, ისტორია, პაროლები და Chrome-ის სხვა მონაცემები აღარ იქნება სინქრონიზებული თქვენს Google ანგარიშთან. + +ვინაიდან თქვენს ანგარიშს მართავს <ph name="HOSTED_DOMAIN" />, სისტემიდან გასვლისას წაიშლება Chrome-ში არსებული თქვენი მონაცემები. თქვენი სინქრონიზებული მონაცემები დარჩება თქვენს Google ანგარიშში.</translation> <translation id="7772032839648071052">დაადასტურეთ პაროლი</translation> <translation id="7781011649027948662">გსურთ გვერდის თარგმნა?</translation> <translation id="7781829728241885113">გუშინ</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">ცვლილებების შენახვა</translation> <translation id="8503813439785031346">მომხმარებლის სახელი</translation> <translation id="850600235656508448">ინკოგნიტო ფანჯარაში გახსნა</translation> +<translation id="8510057420705599706">ეს მოქმედება გამოგიყვანთ სისტემიდან და გამორთავს სინქრონიზაციას, თუმცა თქვენი სანიშნეები, ისტორია, პაროლები და Chrome-ის სხვა მონაცემი შენარჩუნდება ამ მოწყობილობაზე.</translation> <translation id="8517375800490286174">ღია წყაროს ლიცენზიები</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> ჩანართები <ph name="FIRST_VISIBLE_TAB" /> – <ph name="LAST_VISIBLE_TAB" />, სულ: <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">ახალი</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">პაროლის განახლება</translation> <translation id="9100610230175265781">აუცილებელია კოდური ფრაზის მითითება</translation> <translation id="9148126808321036104">ხელახლა შედით</translation> +<translation id="9152539721251340337">QR კოდის შექმნა</translation> <translation id="9157836665414082580">დიალოგების შეჩერება</translation> <translation id="9188680907066685419">მართული ანგარიშიდან გასვლა</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index a290aac..3d39a71 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">ໝາຍ...</translation> <translation id="3153862085237805241">ບັນທຶກບັດ</translation> <translation id="3157684681743766797">ໝາຍທັງໝົດ…</translation> +<translation id="3161291298470460782">ນີ້ຈະນຳທ່ານອອກຈາກລະບົບ, ປິດການຊິ້ງຂໍ້ມູນ ແລະ ລຶບລ້າງຂໍ້ມູນ Chrome ອອກຈາກອຸປະກອນນີ້. ຂໍ້ມູນທີ່ຊິ້ງແລ້ວຂອງທ່ານຈະຍັງຄົງຢູ່ໃນບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="3175081911749765310">ການບໍລິການເວັບ</translation> <translation id="3178650076442119961">ນຳໃຊ້ມື້ນີ້</translation> <translation id="3207960819495026254">ໃສ່ບຸກມາກ໌ແລ້ວ</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">ຢືນຢັນລຶບລ້າງຂໍ້ມູນການທ່ອງເວັບ</translation> <translation id="35083190962747987">ເປີດ ${url}</translation> <translation id="3519193562722059437">ເປີດແຖບເພື່ອທ່ອງເວັບ.</translation> +<translation id="3523473570015918798">ໂດຍການນຳອອກຈາກລະບົບ, ບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ຂໍ້ມູນອື່ນໆໃນ Chrome ຂອງທ່ານຈະບໍ່ຊິ້ງຂໍ້ມູນກັບບັນຊີ Google ຂອງທ່ານອີກຕໍ່ໄປ.</translation> <translation id="3527085408025491307">ໂຟລເດີ</translation> <translation id="3529024052484145543">ບໍ່ປອດໄພ</translation> <translation id="3533202363250687977">ປິດແຖບທີ່ບໍ່ເຜີຍຕົວຕົນທັງໝົດ</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">ຂໍ້ມູນຄວາມປອດໄພໜ້າ</translation> <translation id="5443952882982198570">ບັດເຄຣດິດ</translation> <translation id="5457907402803865181">ເກີດຄວາມຜິດພາດໃນການຊິ້ງຂໍ້ມູນລະຫັດຜ່ານ.</translation> +<translation id="5508435575041083207">ອອກຈາກລະບົບ ແລະ ລຶບລ້າງຂໍ້ມູນອອກຈາກອຸປະກອນນີ້</translation> <translation id="5525269841082836315">ສ້າງວະລີຜ່ານ</translation> <translation id="5548760955356983418">Handoff ໃຫ້ທ່ານເລີ່ມທ່ອງເວັບໄຊທ໌ຢູ່ໃນອຸປະກອນນີ້ ແລະຈາກນັ້ນສືບຕໍ່ຢູ່ໃນ Mac ຂອງທ່ານໄດ້ຢ່າງງ່າຍດາຍ. ເວັບໄຊທ໌ເປີດປະຈຸບັນຈະປະກົດຂຶ້ນຢູ່ໃນ Dock ຂອງ Mac ຂອງທ່ານ. @@ -506,6 +509,9 @@ <translation id="766891008101699113">ເພື່ອທ່ອງເວັບແບບເປັນສ່ວນຕົວ, ກະລຸນາເພີ່ມແຖບໃໝ່.</translation> <translation id="7671141431838911305">ຕິດຕັ້ງ</translation> <translation id="7765158879357617694">ຍ້າຍ</translation> +<translation id="7771470029643830783">ໂດຍການນຳອອກຈາກລະບົບ, ບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ຂໍ້ມູນອື່ນໆໃນ Chrome ຂອງທ່ານຈະບໍ່ຊິ້ງຂໍ້ມູນກັບບັນຊີ Google ຂອງທ່ານອີກຕໍ່ໄປ. + +ເນື່ອງຈາກບັນຊີຂອງທ່ານຖືກຈັດການໂດຍ <ph name="HOSTED_DOMAIN" />, ຂໍ້ມູນ Chrome ຈະຖືກລຶບອອກຈາກອຸປະກອນນີ້ໃນເວລາອອກຈາກລະບົບ. ຂໍ້ມູນທີ່ຊິ້ງແລ້ວຂອງທ່ານຈະຍັງຄົງຢູ່ໃນບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="7772032839648071052">ຢືນຢັນວະລີຜ່ານ</translation> <translation id="7781011649027948662">ແປໜ້າບໍ?</translation> <translation id="7781829728241885113">ມື້ວານນີ້</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">ບັນທຶກການປ່ຽນແປງ</translation> <translation id="8503813439785031346">ຊື່ຜູ້ໃຊ້</translation> <translation id="850600235656508448">ເປີດໃນໂໝດບໍ່ເຜີຍຕົວຕົນ</translation> +<translation id="8510057420705599706">ນີ້ຈະນຳທ່ານອອກຈາກລະບົບ ແລະ ປິດການຊິ້ງຂໍ້ມູນ, ແຕ່ບຸກມາກ, ປະຫວັດ, ລະຫັດຜ່ານ ແລະ ຂໍ້ມູນ Chrome ອື່ນໆຂອງທ່ານຈະຍັງຄົງຢູ່ໃນອຸປະກອນນີ້.</translation> <translation id="8517375800490286174">ໃບອະນຸຍາດ Open source</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> ແຖບ <ph name="FIRST_VISIBLE_TAB" /> ຜ່ານ <ph name="LAST_VISIBLE_TAB" /> ໃນ <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">ໃໝ່</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">ອັບເດດລະຫັດຜ່ານ</translation> <translation id="9100610230175265781">ຕ້ອງມີລະຫັດຜ່ານ</translation> <translation id="9148126808321036104">ລົງຊື່ເຂົ້າໃຊ້ອີກ</translation> +<translation id="9152539721251340337">ສ້າງລະຫັດ QR</translation> <translation id="9157836665414082580">ປິດກ່ອງໂຕ້ຕອບ</translation> <translation id="9188680907066685419">ອອກຈາກລະບົບບັນຊີທີ່ຖືກຈັດການ</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 1c528a1..b045a042 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Pažymėti…</translation> <translation id="3153862085237805241">Kortelės išsaugojimas</translation> <translation id="3157684681743766797">Pažymėti visus...</translation> +<translation id="3161291298470460782">Būsite atjungti, bus išjungtas sinchronizavimas ir išvalyti visi „Chrome“ duomenys iš šio įrenginio. Sinchronizuojami duomenys liks „Google“ paskyroje.</translation> <translation id="3175081911749765310">Žin. pasl.</translation> <translation id="3178650076442119961">Aktyvus šiandien</translation> <translation id="3207960819495026254">Pažymėta</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Patvirtinti naršymo duomenų išvalymą</translation> <translation id="35083190962747987">Atidaryti ${url}</translation> <translation id="3519193562722059437">Norėdami naršyti žiniatinklį, atidarykite skirtuką.</translation> +<translation id="3523473570015918798">Atsijungus su jūsų „Google“ paskyra nebebus sinchronizuojamos žymės, istorija, slaptažodžiai ir kiti „Chrome“ duomenys.</translation> <translation id="3527085408025491307">Aplankas</translation> <translation id="3529024052484145543">Nesaugu</translation> <translation id="3533202363250687977">Uždaryti visus inkognito skirtukus</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Puslapio saugos informacija</translation> <translation id="5443952882982198570">Kredito kortelės</translation> <translation id="5457907402803865181">Sinchronizuojant slaptažodžius įvyko klaida.</translation> +<translation id="5508435575041083207">Atsijungimas ir duomenų išvalymas iš šio įrenginio</translation> <translation id="5525269841082836315">Kurti slaptafrazę</translation> <translation id="5548760955356983418">Naudodami „Handoff“ galite pradėti naršyti svetainę šiame įrenginyje ir lengvai tęsti darbą „Mac“ įrenginiu. Dabartinė atidaryta svetainė bus rodoma „Mac“ įrenginio doke. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Norėdami privačiai naršyti žiniatinklyje, pridėkite naują skirtuką.</translation> <translation id="7671141431838911305">ĮDIEGTI</translation> <translation id="7765158879357617694">Perkelti</translation> +<translation id="7771470029643830783">Atsijungus su jūsų „Google“ paskyra nebebus sinchronizuojamos žymės, istorija, slaptažodžiai ir kiti „Chrome“ duomenys. + +Kadangi paskyrą tvarko <ph name="HOSTED_DOMAIN" />, atsijungus „Chrome“ duomenys bus ištrinti iš šio įrenginio. Sinchronizuojami duomenys liks „Google“ paskyroje.</translation> <translation id="7772032839648071052">Patvirtinti slaptafrazę</translation> <translation id="7781011649027948662">Versti puslapį?</translation> <translation id="7781829728241885113">Vakar</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Išsaugoti pakeitimus</translation> <translation id="8503813439785031346">Vartotojo vardas</translation> <translation id="850600235656508448">Atidaryti inkognito režimu</translation> +<translation id="8510057420705599706">Būsite atjungti ir bus išjungtas sinchronizavimas, bet žymės, istorija, slaptažodžiai ir kiti „Chrome“ duomenys liks šiame įrenginyje.</translation> <translation id="8517375800490286174">Atvirojo šaltinio licencijos</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> skirtukai: <ph name="FIRST_VISIBLE_TAB" />–<ph name="LAST_VISIBLE_TAB" /> iš <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Nauja</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Atnaujinti slaptažodį</translation> <translation id="9100610230175265781">Būtina slaptafrazė</translation> <translation id="9148126808321036104">Prisijungti dar kartą</translation> +<translation id="9152539721251340337">Kurti QR kodą</translation> <translation id="9157836665414082580">Nerod. dialogo langų</translation> <translation id="9188680907066685419">Atsijungimas nuo valdomos paskyros</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 64ff574..9cf4968 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Означи…</translation> <translation id="3153862085237805241">Зачувај ја картичката</translation> <translation id="3157684681743766797">Означи ги сите…</translation> +<translation id="3161291298470460782">Со ова ќе се одјавите, ќе се исклучи синхронизацијата и сите податоци од Chrome ќе се избришат од уредов. Синхронизираните податоци ќе останат во вашата сметка на Google.</translation> <translation id="3175081911749765310">Веб-услуги</translation> <translation id="3178650076442119961">Активен денес</translation> <translation id="3207960819495026254">Обележано</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Одобри го чистењето на податоците од прелистување</translation> <translation id="35083190962747987">Отвори ${url}</translation> <translation id="3519193562722059437">Отворете картичка за да прелистувате на интернет.</translation> +<translation id="3523473570015918798">Ако се одјавите, обележувачите, историјата, лозинките и другите податоци од Chrome веќе нема да се синхронизираат со вашата сметка на Google.</translation> <translation id="3527085408025491307">Папка</translation> <translation id="3529024052484145543">Небезбедно</translation> <translation id="3533202363250687977">Затвори ги сите инкогнито картички</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Безбедносни информации за страницата</translation> <translation id="5443952882982198570">Кредитни картички</translation> <translation id="5457907402803865181">Грешка при синхронизирање на лозинките.</translation> +<translation id="5508435575041083207">Одјави се и избриши ги податоците од уредов</translation> <translation id="5525269841082836315">Создај пристапна фраза</translation> <translation id="5548760955356983418">Handoff ви овозможува да започнете со прелистување на веб-локација на уредот и потоа лесно да продолжите на Mac. Моментално отворената веб-локација ќе се појави во Dock на Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">За приватно прелистување на интернет, додајте нова картичка.</translation> <translation id="7671141431838911305">ИНСТАЛИРАЈ</translation> <translation id="7765158879357617694">Премести</translation> +<translation id="7771470029643830783">Ако се одјавите, обележувачите, историјата, лозинките и другите податоци од Chrome веќе нема да се синхронизираат со вашата сметка на Google. + +Бидејќи со сметката управува <ph name="HOSTED_DOMAIN" />, вашите податоци од Chrome ќе се избришат од уредов кога ќе се одјавите. Синхронизираните податоци ќе останат во вашата сметка на Google.</translation> <translation id="7772032839648071052">Потврди лозинка</translation> <translation id="7781011649027948662">Да се преведе страницата?</translation> <translation id="7781829728241885113">Вчера</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Зачувај ги промените</translation> <translation id="8503813439785031346">Корисничко име</translation> <translation id="850600235656508448">Отвори во инкогнито</translation> +<translation id="8510057420705599706">Со ова ќе се одјавите и ќе се исклучи синхронизацијата, но обележувачите, историјата, лозинките и другите податоци од Chrome ќе останат на уредов.</translation> <translation id="8517375800490286174">Лиценци со отворен код</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Картички <ph name="FIRST_VISIBLE_TAB" /> до <ph name="LAST_VISIBLE_TAB" /> од <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Ново</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Ажурирај ја лозинката</translation> <translation id="9100610230175265781">Потребна е лозинка-фраза</translation> <translation id="9148126808321036104">Најави се повторно</translation> +<translation id="9152539721251340337">Создај QR-код</translation> <translation id="9157836665414082580">Отстрани дијалози</translation> <translation id="9188680907066685419">Одјавете се од управувана сметка</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 196394a..99ae8b3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Tandakan...</translation> <translation id="3153862085237805241">Simpan Kad</translation> <translation id="3157684681743766797">Tandakan Semua...</translation> +<translation id="3161291298470460782">Tindakan ini akan mengelog anda keluar, mematikan penyegerakan dan memadamkan semua data Chrome daripada peranti ini. Data anda yang disegerakkan akan kekal disimpan dalam Akaun Google anda.</translation> <translation id="3175081911749765310">Prkhdmtn Web</translation> <translation id="3178650076442119961">Aktif Hari Ini</translation> <translation id="3207960819495026254">Ditandai halaman</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Sahkan Kosongkan Data Semakan Imbas.</translation> <translation id="35083190962747987">Buka ${url}</translation> <translation id="3519193562722059437">Buka tab untuk menyemak imbas web.</translation> +<translation id="3523473570015918798">Dengan mengelog keluar, penanda halaman, sejarah, kata laluan dan data Chrome anda yang lain tidak akan disegerakkan ke Akaun Google anda lagi.</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3529024052484145543">Tidak selamat</translation> <translation id="3533202363250687977">Tutup Semua Tab Inkognito</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Maklumat Halaman Keselamatan</translation> <translation id="5443952882982198570">Kad Kredit</translation> <translation id="5457907402803865181">Ralat semasa menyegerakkan kata laluan.</translation> +<translation id="5508435575041083207">Log Keluar dan Kosongkan Data daripada Peranti ini</translation> <translation id="5525269841082836315">Buat Frasa Laluan</translation> <translation id="5548760955356983418">Ciri Serah membolehkan anda mula menyemak imbas tapak web pada peranti ini, kemudian meneruskannya pada Mac anda dengan mudah. Tapak web yang dibuka pada masa ini akan muncul dalam Dock Mac anda. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Untuk menyemak imbas web secara sulit, tambahkan tab baharu.</translation> <translation id="7671141431838911305">PASANG</translation> <translation id="7765158879357617694">Alih</translation> +<translation id="7771470029643830783">Dengan mengelog keluar, penanda halaman, sejarah, kata laluan dan data Chrome anda yang lain tidak akan disegerakkan ke Akaun Google anda lagi. + +Oleh sebab akaun anda diurus oleh <ph name="HOSTED_DOMAIN" />, data Chrome anda akan dipadamkan daripada peranti ini apabila anda log keluar. Data anda yang disegerakkan akan kekal disimpan dalam Akaun Google anda.</translation> <translation id="7772032839648071052">Sahkan frasa laluan</translation> <translation id="7781011649027948662">Terjemahkan Halaman?</translation> <translation id="7781829728241885113">Semalam</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Simpan Perubahan</translation> <translation id="8503813439785031346">Nama pengguna</translation> <translation id="850600235656508448">Buka dalam Inkognito</translation> +<translation id="8510057420705599706">Tindakan ini akan mengelog anda keluar dan mematikan penyegerakan, tetapi penanda halaman, sejarah, kata laluan dan data Chrome anda yang lain akan kekal disimpan pada peranti ini.</translation> <translation id="8517375800490286174">Lesen Sumber Terbuka</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Tab <ph name="FIRST_VISIBLE_TAB" /> melalui <ph name="LAST_VISIBLE_TAB" /> daripada <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Baharu</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Kemaskinikan kata laluan</translation> <translation id="9100610230175265781">Frasa laluan diperlukan</translation> <translation id="9148126808321036104">Log masuk semula</translation> +<translation id="9152539721251340337">Buat Kod QR</translation> <translation id="9157836665414082580">Sekat Dialog</translation> <translation id="9188680907066685419">Log keluar daripada akaun terurus</translation> <translation id="9203116392574189331">Serah</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 430d45a5..43f5329b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">အမှတ်အသားလုပ်ရန်…</translation> <translation id="3153862085237805241">ကတ်ကို သိမ်းရန်</translation> <translation id="3157684681743766797">အားလုံးကို အမှတ်အသားလုပ်ရန်…</translation> +<translation id="3161291298470460782">ယခုလုပ်ဆောင်ချက်က သင့်အကောင့်မှထွက်သွားပြီး စင့်ခ်လုပ်ခြင်းကို ပိတ်လိုက်မည်၊ ထို့နောက် ဤစက်မှ Chrome ဒေတာအားလုံး ဖယ်ရှားလိုက်ပါမည်။ သင်စင့်ခ်လုပ်ထားသော ဒေတာများ သင်၏ Google Account တွင် ကျန်နေပါမည်။</translation> <translation id="3175081911749765310">ဝဘ် ဝန်ဆောင်မှုများ</translation> <translation id="3178650076442119961">ယနေ့ အသုံးပြုထားသည်</translation> <translation id="3207960819495026254">ဘွတ်မက်လုပ်ပြီး၏</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာများကို ရှင်းလင်းလိုကြောင်း အတည်ပြုရန်</translation> <translation id="35083190962747987">${url} ကို ဖွင့်ရန်</translation> <translation id="3519193562722059437">ဝဘ်ကို ကြည့်ရန် တဘ်တစ်ခု ဖွင့်ပါ။</translation> +<translation id="3523473570015918798">အကောင့်မှထွက်ခြင်းဖြင့် သင်၏လိပ်စာများ၊ မှတ်တမ်း၊ စကားဝှက်များနှင့် အခြား Chrome ဒေတာများကို သင့် Google Account သို့ စင့်ခ်လုပ်တော့မည် မဟုတ်ပါ။</translation> <translation id="3527085408025491307">ဖိုင်တွဲ</translation> <translation id="3529024052484145543">လုံခြုံမှုမရှိပါ</translation> <translation id="3533202363250687977">ရုပ်ဖျက်တဘ်များအားလုံး ပိတ်ရန်</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">စာမျက်နှာ လုံခြုံမှု အချက်အလက်</translation> <translation id="5443952882982198570">ခရက်ဒစ်ကတ်များ</translation> <translation id="5457907402803865181">စကားဝှက်များကို စင့်ခ်လုပ်ရာတွင် အမှားအယွင်းရှိနေသည်။</translation> +<translation id="5508435575041083207">ထွက်ပြီး ဤစက်မှဒေတာများ ရှင်းထုတ်ရန်</translation> <translation id="5525269841082836315">စကားစုဝှက် ဖန်တီးမည်</translation> <translation id="5548760955356983418">Handoff သည် သင့်အားဤကိရိယာပေါ်တွင် ဝက်ဆိုက်ရွေးချယ်ခြင်းကို စတင်ခွင့်ပြုမည်ဖြစ်ပြီး သင့် Mac ပေါ်တွင်လွယ်ကူစွာ ဆက်လက်လုပ်ဆောင်နိုင်ပါသည်။ လက်ရှိဖွင့်ထားသော ဝက်ဆိုက်သည် သင့်Mac၏ အထိုင်ပေါ်တွင် ပေါ်လာပါလိမ့်မည်။ Handoff ကို ဆက်တင်များ၏ ယေဘူယျအပိုင်းတွင် ဖွင့်ထားရမည်ဖြစ်ပြီး၊ သင့်ကိရိယာများသည်လည်း တူညီသော iCloud အကောင့်ကို အသုံးပြုရမည်ဖြစ်သည်။</translation> @@ -505,6 +508,9 @@ <translation id="766891008101699113">ဝဘ်ကို သီးသန့်မုဒ်ဖြင့် ကြည့်ရန် တဘ်အသစ်ဖွင့်ပါ။</translation> <translation id="7671141431838911305">တပ်ဆင်မည်</translation> <translation id="7765158879357617694">ရွှေ့ရန်</translation> +<translation id="7771470029643830783">အကောင့်မှထွက်ခြင်းဖြင့် သင်၏လိပ်စာများ၊ မှတ်တမ်း၊ စကားဝှက်များနှင့် အခြား Chrome ဒေတာများကို သင့် Google Account သို့ စင့်ခ်လုပ်တော့မည် မဟုတ်ပါ။ + +သင့်အကောင့်ကို <ph name="HOSTED_DOMAIN" /> က စီမံခန့်ခွဲသဖြင့် အကောင့်မှထွက်သည့်အခါ ဤစက်မှ သင်၏ Chrome ဒေတာများကို ဖျက်ပါမည်။ သင်စင့်ခ်လုပ်ထားသော ဒေတာများ သင်၏ Google Account တွင် ကျန်နေပါမည်။</translation> <translation id="7772032839648071052">စကားစုဝှက်ကို အတည်ပြုရန်</translation> <translation id="7781011649027948662">စာမျက်နှာကို ဘာသာပြန်လိုပါသလား။</translation> <translation id="7781829728241885113">မနေ့က</translation> @@ -554,6 +560,7 @@ <translation id="8490978609246021741">အပြောင်းအလဲများကို သိမ်းရန်</translation> <translation id="8503813439785031346">အသုံးပြုသူအမည်</translation> <translation id="850600235656508448">ရုပ်ဖျက်မုဒ်သုံး၍ ဖွင့်ရန်</translation> +<translation id="8510057420705599706">ယခုလုပ်ဆောင်ချက်က သင့်အကောင့်မှထွက်သွားပြီ စင့်ခ်လုပ်ခြင်းကို ပိတ်လိုက်သော်လည်း သင်၏လိပ်စာများ၊ မှတ်တမ်းနှင့် အခြား Chrome ဒေတာများ ဤစက်ပေါ်တွင် ကျန်နေပါမည်။</translation> <translation id="8517375800490286174">လွပ်လွပ်လပ်လပ်ဖွင့်ပေးထားသော ရင်းမြစ် လိုင်စင်များ</translation> <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" /> ၏<ph name="LAST_VISIBLE_TAB" /> ကိုဖြတ်၍<ph name="FIRST_VISIBLE_TAB" /> <ph name="INCOGNITO" /> တက်များ</translation> <translation id="8529767659511976195">အသစ်</translation> @@ -596,6 +603,7 @@ <translation id="9094033019050270033">စကားဝှက် အပ်ဒိတ် လုပ်ပါ</translation> <translation id="9100610230175265781">စကားဝှက် လိုအပ်</translation> <translation id="9148126808321036104">ထပ်ပြီး လက်မှတ်ထိုး ဝင်ရန်</translation> +<translation id="9152539721251340337">'QR ကုဒ်' ပြုလုပ်ရန်</translation> <translation id="9157836665414082580">သတိပေးချက်များကို ပိတ်ရန်</translation> <translation id="9188680907066685419">စီမံခန့်ခွဲထားသည့် အကောင့်မှထွက်ပါ</translation> <translation id="9203116392574189331">လက်မပါဘဲ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index b71c766..d0031d71 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Markeren…</translation> <translation id="3153862085237805241">Pas opslaan</translation> <translation id="3157684681743766797">Alles markeren…</translation> +<translation id="3161291298470460782">Je wordt hiermee uitgelogd. Ook wordt de synchronisatie stopgezet en worden alle Chrome-gegevens van dit apparaat gewist. Je gesynchroniseerde gegevens blijven in je Google-account staan.</translation> <translation id="3175081911749765310">Webservices</translation> <translation id="3178650076442119961">Vandaag actief</translation> <translation id="3207960819495026254">Toegevoegd aan 'Bladwijzers'</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Wissen van browsegegevens bevestigen</translation> <translation id="35083190962747987">${url} openen</translation> <translation id="3519193562722059437">Open een tabblad om op internet te surfen.</translation> +<translation id="3523473570015918798">Als je uitlogt, worden je bookmarks, geschiedenis, wachtwoorden en andere Chrome-gegevens niet meer gesynchroniseerd met je Google-account</translation> <translation id="3527085408025491307">Map</translation> <translation id="3529024052484145543">Niet beveiligd</translation> <translation id="3533202363250687977">Alle incognitotabbladen sluiten</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Paginabeveiligingsinfo</translation> <translation id="5443952882982198570">Creditcards</translation> <translation id="5457907402803865181">Fout bij synchroniseren van wachtwoorden.</translation> +<translation id="5508435575041083207">Uitloggen en gegevens van dit apparaat wissen</translation> <translation id="5525269841082836315">Wachtwoordzin maken</translation> <translation id="5548760955356983418">Met Handoff kun je een website browsen op dit apparaat en vervolgens gemakkelijk doorgaan op je Mac. De momenteel geopende website wordt weergegeven in het Dock van je Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Voeg een nieuw tabblad toe als je privé wilt browsen.</translation> <translation id="7671141431838911305">INSTALLEER</translation> <translation id="7765158879357617694">Verplaatsen</translation> +<translation id="7771470029643830783">Als je uitlogt, worden je bookmarks, geschiedenis, wachtwoorden en andere Chrome-gegevens niet meer gesynchroniseerd met je Google-account + +Aangezien je account wordt beheerd door <ph name="HOSTED_DOMAIN" />, worden je Chrome-gegevens verwijderd van dit apparaat als je uitlogt. Je gesynchroniseerde gegevens blijven in je Google-account staan.</translation> <translation id="7772032839648071052">Bevestig de wachtwoordzin</translation> <translation id="7781011649027948662">Pagina vertalen?</translation> <translation id="7781829728241885113">Gisteren</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Wijzigingen opslaan</translation> <translation id="8503813439785031346">Gebruikersnaam</translation> <translation id="850600235656508448">Openen in incognitomodus</translation> +<translation id="8510057420705599706">Hiermee word je uitgelogd en wordt de synchronisatie stopgezet. Je bookmarks, geschiedenis, wachtwoorden en andere Chrome-gegevens blijven op dit apparaat staan.</translation> <translation id="8517375800490286174">Open-sourcelicenties</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" />-tabbladen <ph name="FIRST_VISIBLE_TAB" /> tot <ph name="LAST_VISIBLE_TAB" /> van <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Nieuw</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Wachtwoord updaten</translation> <translation id="9100610230175265781">Wachtwoordzin vereist</translation> <translation id="9148126808321036104">Opnieuw inloggen</translation> +<translation id="9152539721251340337">Een QR-code maken</translation> <translation id="9157836665414082580">Dialoogvensters onderdrukken</translation> <translation id="9188680907066685419">Uitloggen van beheerd account</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index b8dc41b5..1d3b81f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Oznacz…</translation> <translation id="3153862085237805241">Zapisz kartę</translation> <translation id="3157684681743766797">Oznacz wszystko…</translation> +<translation id="3161291298470460782">Spowoduje to wylogowanie Cię, wyłączenie synchronizacji i usunięcie wszystkich danych Chrome z tego urządzenia. Zsynchronizowane dane pozostaną na Twoim koncie Google.</translation> <translation id="3175081911749765310">Usługi internetowe</translation> <translation id="3178650076442119961">Aktywność dzisiaj</translation> <translation id="3207960819495026254">Dodano do zakładek</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Potwierdź czyszczenie danych przeglądania</translation> <translation id="35083190962747987">Otwórz ${url}</translation> <translation id="3519193562722059437">Otwórz kartę, by przeglądać strony.</translation> +<translation id="3523473570015918798">Po wylogowaniu Twoje zakładki, historia, hasła i inne dane Chrome nie będą już synchronizowane z Twoim kontem Google.</translation> <translation id="3527085408025491307">Folder</translation> <translation id="3529024052484145543">Niezabezpieczona</translation> <translation id="3533202363250687977">Zamknij karty incognito</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informacje o bezpieczeństwie strony</translation> <translation id="5443952882982198570">Karty kredytowe</translation> <translation id="5457907402803865181">Błąd synchronizowania haseł.</translation> +<translation id="5508435575041083207">Wyloguj i usuń dane z tego urządzenia</translation> <translation id="5525269841082836315">Utwórz hasło</translation> <translation id="5548760955356983418">Dzięki funkcji Handoff możesz rozpocząć przeglądanie strony na tym urządzeniu, a następnie płynnie kontynuować na Macu. Aktualnie otwarta strona internetowa wyświetli się w Docku na Macu. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Aby przeglądać strony internetowe prywatnie, dodaj nową kartę.</translation> <translation id="7671141431838911305">ZAINSTALUJ</translation> <translation id="7765158879357617694">Przenieś</translation> +<translation id="7771470029643830783">Po wylogowaniu Twoje zakładki, historia, hasła i inne dane Chrome nie będą już synchronizowane z Twoim kontem Google. + +Ponieważ Twoim kontem zarządza <ph name="HOSTED_DOMAIN" />, Twoje dane Chrome zostaną usunięte z tego urządzenia, gdy się wylogujesz. Zsynchronizowane dane pozostaną na Twoim koncie Google.</translation> <translation id="7772032839648071052">Potwierdź hasło</translation> <translation id="7781011649027948662">Przetłumaczyć stronę?</translation> <translation id="7781829728241885113">Wczoraj</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Zapisz zmiany</translation> <translation id="8503813439785031346">Nazwa użytkownika</translation> <translation id="850600235656508448">Otwórz w trybie incognito</translation> +<translation id="8510057420705599706">Spowoduje to wylogowanie Cię i wyłączenie synchronizacji, ale Twoje zakładki, historia, hasła i inne dane Chrome pozostaną na tym urządzeniu.</translation> <translation id="8517375800490286174">Licencje typu open source</translation> <translation id="8524799873541103884">Karty <ph name="INCOGNITO" /> od <ph name="FIRST_VISIBLE_TAB" /> do <ph name="LAST_VISIBLE_TAB" /> z <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Nowość</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Aktualizuj hasło</translation> <translation id="9100610230175265781">Wymagane jest hasło</translation> <translation id="9148126808321036104">Zaloguj się ponownie</translation> +<translation id="9152539721251340337">Utwórz kod QR</translation> <translation id="9157836665414082580">Ukryj okna dialogowe</translation> <translation id="9188680907066685419">Wyloguj się z konta zarządzanego</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index 0990acb..b1e484c3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Marcar...</translation> <translation id="3153862085237805241">Salvar cartão</translation> <translation id="3157684681743766797">Marcar tudo...</translation> +<translation id="3161291298470460782">Essa ação desconectará sua conta, desativará a sincronização e apagará todos os dados do Chrome neste dispositivo. Os dados sincronizados permanecerão na sua Conta do Google.</translation> <translation id="3175081911749765310">Serviços da Web</translation> <translation id="3178650076442119961">Ativado hoje</translation> <translation id="3207960819495026254">Adicionado aos favoritos</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Confirmar limpeza de dados de navegação</translation> <translation id="35083190962747987">Abrir ${url}</translation> <translation id="3519193562722059437">Abra uma guia para navegar na Web.</translation> +<translation id="3523473570015918798">Se você sair, seus favoritos, seu histórico, suas senhas e outros dados do Chrome não serão mais sincronizados com sua Conta do Google.</translation> <translation id="3527085408025491307">Pasta</translation> <translation id="3529024052484145543">Não seguro</translation> <translation id="3533202363250687977">Fechar todas as guias anônimas</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informações de segurança</translation> <translation id="5443952882982198570">Cartões de crédito</translation> <translation id="5457907402803865181">Erro na sincronização das senhas.</translation> +<translation id="5508435575041083207">Sair e limpar dados deste dispositivo</translation> <translation id="5525269841082836315">Criar senha</translation> <translation id="5548760955356983418">A "Transição" permite que você comece a navegar por um website neste dispositivo e, em seguida, continue facilmente no seu Mac. O website aberto aparecerá no Dock do Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Para navegar na Web com privacidade, adicione uma nova guia.</translation> <translation id="7671141431838911305">INSTALAR</translation> <translation id="7765158879357617694">Mover</translation> +<translation id="7771470029643830783">Se você sair, seus favoritos, seu histórico, suas senhas e outros dados do Chrome não serão mais sincronizados com sua Conta do Google. + +Como a conta é gerenciada por <ph name="HOSTED_DOMAIN" />, seus dados do Chrome serão excluídos deste dispositivo quando você sair. Os dados sincronizados permanecerão na sua Conta do Google.</translation> <translation id="7772032839648071052">Confirmar senha</translation> <translation id="7781011649027948662">Traduzir página?</translation> <translation id="7781829728241885113">Ontem</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Salvar alterações</translation> <translation id="8503813439785031346">Nome de usuário</translation> <translation id="850600235656508448">Abrir em modo de navegação anônima</translation> +<translation id="8510057420705599706">Essa ação desconectará sua conta e desativará a sincronização, mas os favoritos, o histórico, as senhas e outros dados do Chrome permanecerão neste dispositivo.</translation> <translation id="8517375800490286174">Licenças de código aberto</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Guias <ph name="FIRST_VISIBLE_TAB" /> a <ph name="LAST_VISIBLE_TAB" /> de <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novo</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Atualizar senha</translation> <translation id="9100610230175265781">Senha necessária</translation> <translation id="9148126808321036104">Faça login novamente</translation> +<translation id="9152539721251340337">Criar um código QR</translation> <translation id="9157836665414082580">Bloquear caixas de diálogo</translation> <translation id="9188680907066685419">Sair da conta gerenciada</translation> <translation id="9203116392574189331">Transição</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 f1a09e9..3eae218 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Marcar…</translation> <translation id="3153862085237805241">Guardar cartão</translation> <translation id="3157684681743766797">Marcar tudo…</translation> +<translation id="3161291298470460782">Esta ação termina a sua sessão, desativa a sincronização e limpa todos os dados do Chrome deste dispositivo. Os seus dados sincronizados permanecem na sua Conta Google.</translation> <translation id="3175081911749765310">Serviços Web</translation> <translation id="3178650076442119961">Ativo hoje</translation> <translation id="3207960819495026254">Adicionado aos marcadores</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Confirmar limpeza dos dados de navegação</translation> <translation id="35083190962747987">Abrir ${url}</translation> <translation id="3519193562722059437">Abra um separador para navegar na Web.</translation> +<translation id="3523473570015918798">Ao terminar sessão, os seus marcadores, histórico, palavras-passe e outros dados do Chrome deixarão de ser sincronizados com a sua Conta Google.</translation> <translation id="3527085408025491307">Pasta</translation> <translation id="3529024052484145543">Inseguro</translation> <translation id="3533202363250687977">Fechar todos os separadores de navegação anónima</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informações de Segurança da Página</translation> <translation id="5443952882982198570">Cartões de crédito</translation> <translation id="5457907402803865181">Erro ao sincronizar as palavras-passe.</translation> +<translation id="5508435575041083207">Terminar sessão e limpar dados deste dispositivo</translation> <translation id="5525269841082836315">Criar Frase de Acesso</translation> <translation id="5548760955356983418">A Entrega permite-lhe começar a navegar num Website neste dispositivo e, em seguida, continuar facilmente no seu Mac. O Website atualmente aberto aparece na Dock do seu Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Para navegar na Web em privado, adicione um novo separador.</translation> <translation id="7671141431838911305">INSTALAR</translation> <translation id="7765158879357617694">Mover</translation> +<translation id="7771470029643830783">Ao terminar sessão, os seus marcadores, histórico, palavras-passe e outros dados do Chrome deixarão de ser sincronizados com a sua Conta Google. + +Uma vez que a sua conta é gerida pelo domínio <ph name="HOSTED_DOMAIN" />, os dados do Chrome serão eliminados deste dispositivo quando terminar sessão. Os seus dados sincronizados permanecem na sua Conta Google.</translation> <translation id="7772032839648071052">Confirmar frase de acesso</translation> <translation id="7781011649027948662">Pretende traduzir a página?</translation> <translation id="7781829728241885113">Ontem</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Guardar alterações</translation> <translation id="8503813439785031346">Nome de utilizador</translation> <translation id="850600235656508448">Abrir no modo de navegação anónima</translation> +<translation id="8510057420705599706">Esta ação termina a sua sessão e desativa a sincronização, mas os seus marcadores, histórico, palavras-passe e outros dados do Chrome permanecem neste dispositivo.</translation> <translation id="8517375800490286174">Licenças de Código Aberto</translation> <translation id="8524799873541103884">Separadores <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> a <ph name="LAST_VISIBLE_TAB" /> de <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novo</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Atualizar a palavra-passe</translation> <translation id="9100610230175265781">Frase de acesso obrigatória</translation> <translation id="9148126808321036104">Iniciar sessão novamente</translation> +<translation id="9152539721251340337">Criar um código QR</translation> <translation id="9157836665414082580">Supr. caixas diálogo</translation> <translation id="9188680907066685419">Terminar sessão na conta gerida</translation> <translation id="9203116392574189331">Entrega</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 4e2fd47..4c646aef 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Marchează…</translation> <translation id="3153862085237805241">Salvează cardul</translation> <translation id="3157684681743766797">Marchează-le pe toate…</translation> +<translation id="3161291298470460782">Astfel, te vei deconecta, vei dezactiva sincronizarea și vei șterge toate datele Chrome de pe dispozitiv. Datele sincronizate se vor păstra în Contul Google.</translation> <translation id="3175081911749765310">Servicii web</translation> <translation id="3178650076442119961">Activ astăzi</translation> <translation id="3207960819495026254">Marcată</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Confirmă ștergerea datelor de navigare</translation> <translation id="35083190962747987">Deschide ${url}</translation> <translation id="3519193562722059437">Deschide o filă pentru a naviga pe web.</translation> +<translation id="3523473570015918798">Dacă te deconectezi, marcajele, istoricul, parolele și alte date Chrome nu se vor mai sincroniza cu Contul Google.</translation> <translation id="3527085408025491307">Dosar</translation> <translation id="3529024052484145543">Nesecurizat</translation> <translation id="3533202363250687977">Închide toate filele incognito</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informații privind securitatea paginii</translation> <translation id="5443952882982198570">Carduri de credit</translation> <translation id="5457907402803865181">Eroare la sincronizarea parolelor.</translation> +<translation id="5508435575041083207">Deconectează-te și șterge datele de pe dispozitiv</translation> <translation id="5525269841082836315">Creează o expresie de acces</translation> <translation id="5548760955356983418">Cu Handoff, începi să navighezi pe un site de pe acest dispozitiv, apoi continui cu ușurință de pe Mac. Site-ul deschis actual va apărea în Dock pe Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Pentru a răsfoi în privat pe web, adaugă o filă nouă.</translation> <translation id="7671141431838911305">INSTALEAZĂ</translation> <translation id="7765158879357617694">Mută</translation> +<translation id="7771470029643830783">Dacă te deconectezi, marcajele, istoricul, parolele și alte date Chrome nu se vor mai sincroniza cu Contul Google. + +Deoarece contul tău este gestionat de <ph name="HOSTED_DOMAIN" />, datele Chrome vor fi șterse de pe acest dispozitiv când te deconectezi. Datele sincronizate se vor păstra în Contul Google.</translation> <translation id="7772032839648071052">Confirmă expresia de acces</translation> <translation id="7781011649027948662">Traduci pagina?</translation> <translation id="7781829728241885113">Ieri</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Salvează modificările</translation> <translation id="8503813439785031346">Nume utilizator</translation> <translation id="850600235656508448">Deschide în modul incognito</translation> +<translation id="8510057420705599706">Astfel, te vei deconecta și vei dezactiva sincronizarea, dar marcajele, istoricul, parolele și alte date Chrome vor rămâne pe acest dispozitiv.</translation> <translation id="8517375800490286174">Licențe open source</translation> <translation id="8524799873541103884">Filele <ph name="INCOGNITO" /> de la <ph name="FIRST_VISIBLE_TAB" /> la <ph name="LAST_VISIBLE_TAB" /> din <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Nou</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Actualizează parola</translation> <translation id="9100610230175265781">Este necesară o expresie de acces</translation> <translation id="9148126808321036104">Conectează-te din nou</translation> +<translation id="9152539721251340337">Creează un cod QR</translation> <translation id="9157836665414082580">Închide casetele de dialog</translation> <translation id="9188680907066685419">Deconectează-te de la contul gestionat</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index a5659dcb..5a504c89 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">ලකුණු කරන්න…</translation> <translation id="3153862085237805241">කාඩ්පත සුරකින්න</translation> <translation id="3157684681743766797">සියල්ල ලකුණු කරන්න…</translation> +<translation id="3161291298470460782">මෙය ඔබව වරනය කර, සමමුහුව ක්රියා විරහිත කර මෙම උපාංගයෙන් සියලු Chrome දත්ත හිස් කරනු ඇත. ඔබේ සමමුහුර්ත දත්ත ඔබේ Google ගිණුමේ පවතිනු ඇත.</translation> <translation id="3175081911749765310">වෙබ් සේවා</translation> <translation id="3178650076442119961">අද ක්රියාත්මකයි</translation> <translation id="3207960819495026254">පිටුසලකුණු කළ</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">බ්රවුස් කිරීමේ දත්ත හිස් කිරීම තහවුරු කරන්න</translation> <translation id="35083190962747987">${url} විවෘත කරන්න</translation> <translation id="3519193562722059437">වෙබය බ්රවුස් කිරීමට පටිත්තක් විවෘත කරන්න.</translation> +<translation id="3523473570015918798">වරනය වීමෙන්, ඔබේ පිටුසන්, ඉතිහාසය, මුරපද සහ අනෙකුත් Chrome දත්ත තවදුරටත් ඔබේ Google ගිණුමට සමමුහුර්ත නොවෙයි.</translation> <translation id="3527085408025491307">ෆෝල්ඩරය</translation> <translation id="3529024052484145543">සුරක්ෂිත නැත</translation> <translation id="3533202363250687977">සියලු අප්රසිද්ධ පටිති වසන්න</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">පිටු ආරක්ෂිත තතු</translation> <translation id="5443952882982198570">ණය කාඩ්පත්</translation> <translation id="5457907402803865181">මුරපද සමමුහූර්ත කිරීමේ දෝෂයයි.</translation> +<translation id="5508435575041083207">වරනය වී මෙම උපාංගයෙන් දත්ත හිස් කරන්න</translation> <translation id="5525269841082836315">මුර-වැකිකඩ සාදන්න</translation> <translation id="5548760955356983418">Handoff ඔබට මෙම උපාංගය මත වෙබ් අඩවියක් බ්රවුස් කිරීම ඇරඹීමට ඉඩ දෙන අතර අනතුරුව ඔබේ Mac එකේ දිගටම කරගෙන යාමට ඉඩ දෙයි. වත්මන් විවෘත යෙදුම ඔබේ Mac හි ඩොක් තුළ දිස් වනු ඇත. @@ -506,6 +509,9 @@ <translation id="766891008101699113">වෙබය පෞද්ගලිකව බ්රවුස් කිරීමට, නව පටිත්තක් එක් කරන්න.</translation> <translation id="7671141431838911305">ස්ථාපනය</translation> <translation id="7765158879357617694">චලනය කරන්න</translation> +<translation id="7771470029643830783">වරනය වීමෙන්, ඔබේ පිටුසන්, ඉතිහාසය, මුරපද සහ අනෙකුත් Chrome දත්ත තවදුරටත් ඔබේ Google ගිණුමට සමමුහුර්ත නොවෙයි. + +ඔබේ ගිණුම <ph name="HOSTED_DOMAIN" /> විසින් කළමනාකරණය කර ඇති නිසා, වරනය වන විට ඔබේ Chrome දත්ත මෙම උපාංගයෙන් මැකෙනු ඇත. ඔබේ සමමුහුර්ත දත්ත ඔබේ Google ගිණුමේ පවතිනු ඇත.</translation> <translation id="7772032839648071052">රහස්පදය ස්ථිර කරන්න</translation> <translation id="7781011649027948662">පිටුව පරිවර්තන කරන්නද?</translation> <translation id="7781829728241885113">ඊයේ</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">වෙනස්කම් සුරකින්න</translation> <translation id="8503813439785031346">පරිශීලක නාමය</translation> <translation id="850600235656508448">අප්රසිද්ධියේ විවෘත කරන්න</translation> +<translation id="8510057420705599706">මෙය ඔබව වරනය කර සමමුහුව ක්රියා විරහිත කරනු ඇත, නමුත් ඔබේ පිටුසන්, ඉතිහාසය, මුරපද සහ වෙනත් Chrome දත්ත මෙම උපාංගයෙහි පවතිනු ඇත.</translation> <translation id="8517375800490286174">විවෘත මූලාශ්ර බලපත්ර</translation> <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" /> ක <ph name="FIRST_VISIBLE_TAB" /> හරහා <ph name="LAST_VISIBLE_TAB" /> <ph name="INCOGNITO" /> පටිති</translation> <translation id="8529767659511976195">නව</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">මුරපදය යාවත්කාලීන කරන්න</translation> <translation id="9100610230175265781">රහස් පදය අවශ්යයි</translation> <translation id="9148126808321036104">නැවත පිවිසෙන්න</translation> +<translation id="9152539721251340337">QR කේතයක් සාදන්න</translation> <translation id="9157836665414082580">සංවාද යටපත් කරන්න</translation> <translation id="9188680907066685419">කළමනාකරණය කළ ගිණුමෙන් වරන්න</translation> <translation id="9203116392574189331">භාර දීම</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index c38d81d7..eb77a44 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Označi …</translation> <translation id="3153862085237805241">Shranjevanje kartice</translation> <translation id="3157684681743766797">Označi vse …</translation> +<translation id="3161291298470460782">S tem boste odjavljeni, izklopljena bo sinhronizacija in izbrisani bodo vsi podatki v Chromu v tej napravi. Sinhronizirani podatki bodo ostali v računu Google.</translation> <translation id="3175081911749765310">Spletne storitve</translation> <translation id="3178650076442119961">Aktivna danes</translation> <translation id="3207960819495026254">Dodano med zaznamke</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Potrditev izbrisa podatkov brskanja</translation> <translation id="35083190962747987">Open ${url}</translation> <translation id="3519193562722059437">Open a tab to browse the web.</translation> +<translation id="3523473570015918798">Z odjavo vaši zaznamki, zgodovina, gesla in drugi podatki v Chromu ne bodo več sinhronizirani z računom Google.</translation> <translation id="3527085408025491307">Mapa</translation> <translation id="3529024052484145543">Ni varno</translation> <translation id="3533202363250687977">Zapri vse zavihke brez beleženja zgodovine</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informacije o varnosti strani</translation> <translation id="5443952882982198570">Kreditne kartice</translation> <translation id="5457907402803865181">Napaka pri sinhroniziranju gesel.</translation> +<translation id="5508435575041083207">Odjava in brisanje podatkov iz te naprave</translation> <translation id="5525269841082836315">Ustvarjanje gesla</translation> <translation id="5548760955356983418">Handoff lets you start browsing a website on this device and then easily continue on your Mac. The current open website will appear in the Dock of your Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Če želite zasebno brskati po spletu, dodajte nov zavihek.</translation> <translation id="7671141431838911305">NAMESTI</translation> <translation id="7765158879357617694">Premakni</translation> +<translation id="7771470029643830783">Z odjavo vaši zaznamki, zgodovina, gesla in drugi podatki v Chromu ne bodo več sinhronizirani z računom Google. + +Ker vaš račun upravlja <ph name="HOSTED_DOMAIN" />, bodo podatki v Chromu ob odjavi izbrisani iz te naprave. Sinhronizirani podatki bodo ostali v računu Google.</translation> <translation id="7772032839648071052">Potrdi geslo</translation> <translation id="7781011649027948662">Želite prevod te strani?</translation> <translation id="7781829728241885113">Včeraj</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Shrani spremembe</translation> <translation id="8503813439785031346">Uporabniško ime</translation> <translation id="850600235656508448">Odpri v načinu brez beleženja zgodovine</translation> +<translation id="8510057420705599706">S tem boste odjavljeni in izklopljena bo sinhronizacija, zaznamki, zgodovina, gesla in drugi podatki v Chromu pa bodo ostali v tej napravi.</translation> <translation id="8517375800490286174">Odprtokodne licence</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Tabs <ph name="FIRST_VISIBLE_TAB" /> through <ph name="LAST_VISIBLE_TAB" /> of <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novo</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Posodobi geslo</translation> <translation id="9100610230175265781">Zahtevano je geslo</translation> <translation id="9148126808321036104">Prijavite se znova</translation> +<translation id="9152539721251340337">Ustvari kodo QR</translation> <translation id="9157836665414082580">Onemogoči pogovorna okna</translation> <translation id="9188680907066685419">Odjava iz upravljanega računa</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index 572cd56..f002559 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Označi…</translation> <translation id="3153862085237805241">Sačuvaj karticu</translation> <translation id="3157684681743766797">Označi sve…</translation> +<translation id="3161291298470460782">Time ćete se odjaviti, isključiti sinhronizaciju i obrisati sve Chrome podatke sa ovog uređaja. Sinhronizovani podaci će ostati na Google nalogu.</translation> <translation id="3175081911749765310">Veb-usluge</translation> <translation id="3178650076442119961">Poslednja aktivnost: danas</translation> <translation id="3207960819495026254">Obeleženo</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Potvrdi brisanje podataka pregledanja</translation> <translation id="35083190962747987">Otvori ${url}</translation> <translation id="3519193562722059437">Otvorite karticu da biste pregledali veb.</translation> +<translation id="3523473570015918798">Ako se odjavite, obeleživači, istorija, lozinke i drugi Chrome podaci više se neće sinhronizovati sa Google nalogom.</translation> <translation id="3527085408025491307">Direktorijum</translation> <translation id="3529024052484145543">Nije bezbedno</translation> <translation id="3533202363250687977">Zatvori sve kartice bez arhiviranja</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Informacije o bezbednosti stranice</translation> <translation id="5443952882982198570">Kreditne kartice</translation> <translation id="5457907402803865181">Greška pri sinhronizovanju lozinki.</translation> +<translation id="5508435575041083207">Odjavite se i obrišite podatke sa ovog uređaja</translation> <translation id="5525269841082836315">Pravljenje pristupne fraze</translation> <translation id="5548760955356983418">Handoff vam omogućava da započnete pregledanje veb-sajta na ovom uređaju, pa da jednostavno nastavite na Mac-u. Veb-sajt koji je trenutno otvoren prikazaće se na doku na Mac-u. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Da biste privatno pregledali veb, dodajte novu karticu.</translation> <translation id="7671141431838911305">INSTALIRANJE</translation> <translation id="7765158879357617694">Premesti</translation> +<translation id="7771470029643830783">Ako se odjavite, obeleživači, istorija, lozinke i drugi Chrome podaci više se neće sinhronizovati sa Google nalogom. + +Pošto vašim nalogom upravlja <ph name="HOSTED_DOMAIN" />, Chrome podaci će se izbrisati sa ovog uređaja kada se odjavite. Sinhronizovani podaci će ostati na Google nalogu.</translation> <translation id="7772032839648071052">Potvrdi pristupnu frazu</translation> <translation id="7781011649027948662">Želite da prevedete stranicu?</translation> <translation id="7781829728241885113">Juče</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Sačuvaj promene</translation> <translation id="8503813439785031346">Korisničko ime</translation> <translation id="850600235656508448">Otvori u režimu bez arhiviranja</translation> +<translation id="8510057420705599706">Time ćete se odjaviti i isključiti sinhronizaciju, ali će obeleživači, istorija, lozinke i drugi Chrome podaci ostati na uređaju.</translation> <translation id="8517375800490286174">Licence otvorenog koda</translation> <translation id="8524799873541103884">Kartice <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> do <ph name="LAST_VISIBLE_TAB" /> od <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Novo</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Ažuriraj lozinku</translation> <translation id="9100610230175265781">Potrebna je pristupna fraza</translation> <translation id="9148126808321036104">Prijavi me ponovo</translation> +<translation id="9152539721251340337">Napravite QR kôd</translation> <translation id="9157836665414082580">Spreči dijaloge</translation> <translation id="9188680907066685419">Odjavite se sa naloga kojim se upravlja</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index c5c9973..498ec0f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Означи…</translation> <translation id="3153862085237805241">Сачувај картицу</translation> <translation id="3157684681743766797">Означи све…</translation> +<translation id="3161291298470460782">Тиме ћете се одјавити, искључити синхронизацију и обрисати све Chrome податке са овог уређаја. Синхронизовани подаци ће остати на Google налогу.</translation> <translation id="3175081911749765310">Веб-услуге</translation> <translation id="3178650076442119961">Последња активност: данас</translation> <translation id="3207960819495026254">Обележено</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Потврди брисање података прегледања</translation> <translation id="35083190962747987">Отвори ${url}</translation> <translation id="3519193562722059437">Отворите картицу да бисте прегледали веб.</translation> +<translation id="3523473570015918798">Ако се одјавите, обележивачи, историја, лозинке и други Chrome подаци више се неће синхронизовати са Google налогом.</translation> <translation id="3527085408025491307">Директоријум</translation> <translation id="3529024052484145543">Није безбедно</translation> <translation id="3533202363250687977">Затвори све картице без архивирања</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Информације о безбедности странице</translation> <translation id="5443952882982198570">Кредитне картице</translation> <translation id="5457907402803865181">Грешка при синхронизовању лозинки.</translation> +<translation id="5508435575041083207">Одјавите се и обришите податке са овог уређаја</translation> <translation id="5525269841082836315">Прављење приступне фразе</translation> <translation id="5548760955356983418">Handoff вам омогућава да започнете прегледање веб-сајта на овом уређају, па да једноставно наставите на Mac-у. Веб-сајт који је тренутно отворен приказаће се на доку на Mac-у. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Да бисте приватно прегледали веб, додајте нову картицу.</translation> <translation id="7671141431838911305">ИНСТАЛИРАЊЕ</translation> <translation id="7765158879357617694">Премести</translation> +<translation id="7771470029643830783">Ако се одјавите, обележивачи, историја, лозинке и други Chrome подаци више се неће синхронизовати са Google налогом. + +Пошто вашим налогом управља <ph name="HOSTED_DOMAIN" />, Chrome подаци ће се избрисати са овог уређаја када се одјавите. Синхронизовани подаци ће остати на Google налогу.</translation> <translation id="7772032839648071052">Потврди приступну фразу</translation> <translation id="7781011649027948662">Желите да преведете страницу?</translation> <translation id="7781829728241885113">Јуче</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Сачувај промене</translation> <translation id="8503813439785031346">Корисничко име</translation> <translation id="850600235656508448">Отвори у режиму без архивирања</translation> +<translation id="8510057420705599706">Тиме ћете се одјавити и искључити синхронизацију, али ће обележивачи, историја, лозинке и други Chrome подаци остати на уређају.</translation> <translation id="8517375800490286174">Лиценце отвореног кода</translation> <translation id="8524799873541103884">Картице <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> до <ph name="LAST_VISIBLE_TAB" /> од <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Ново</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Ажурирај лозинку</translation> <translation id="9100610230175265781">Потребна је приступна фраза</translation> <translation id="9148126808321036104">Пријави ме поново</translation> +<translation id="9152539721251340337">Направите QR кôд</translation> <translation id="9157836665414082580">Спречи дијалоге</translation> <translation id="9188680907066685419">Одјавите се са налога којим се управља</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 4ef9fbf..81408dd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Tia alama…</translation> <translation id="3153862085237805241">Hifadhi Kadi</translation> <translation id="3157684681743766797">Tia Zote Alama...</translation> +<translation id="3161291298470460782">Hatua hii itakuondoa katika akaunti, izime usawazishaji na ifute data yote ya Chrome kutoka kwenye kifaa hiki. Data yako iliyosawazishwa itabaki kwenye Akaunti yako ya Google.</translation> <translation id="3175081911749765310">Huduma za Wavuti</translation> <translation id="3178650076442119961">Kimetumika Leo</translation> <translation id="3207960819495026254">Imealamishwa</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Thibitisha Kufuta Data ya Kuvinjari</translation> <translation id="35083190962747987">Fungua ${url}</translation> <translation id="3519193562722059437">Fungua kichupo ili uvinjari wavuti.</translation> +<translation id="3523473570015918798">Kwa kuondoka katika akaunti, alamisho, historia, manenosiri na data yako nyingine ya Chrome hazitasawazishwa tena kwenye Akaunti yako ya Google.</translation> <translation id="3527085408025491307">Folda</translation> <translation id="3529024052484145543">Si salama</translation> <translation id="3533202363250687977">Funga Vichupo Vyote Fiche</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Maelezo ya Usalama wa Ukurasa</translation> <translation id="5443952882982198570">Kadi za Mikopo</translation> <translation id="5457907402803865181">Hitilafu imetokea wakati wa kusawazisha manenosiri.</translation> +<translation id="5508435575041083207">Ondoka katika Akaunti na Ufute Data kwenye Kifaa hiki</translation> <translation id="5525269841082836315">Unda Kaulisiri</translation> <translation id="5548760955356983418">Handoff inakuwezesha kuanza kuvinjari tovuti kwenye kifaa hiki kisha uendelee kwa urahisi kwenye Mac yako. Tovuti ya sasa iliyo wazi itaonekana katika Kituo cha Mac yako. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Ili uvinjari kwenye wavuti kwa faragha, ongeza kichupo kipya.</translation> <translation id="7671141431838911305">SAKINISHA</translation> <translation id="7765158879357617694">Sogeza</translation> +<translation id="7771470029643830783">Kwa kuondoka katika akaunti, alamisho, historia, manenosiri na data yako nyingine ya Chrome hazitasawazishwa tena kwenye Akaunti yako ya Google. + +Kwa sababu akaunti yako inadhibitiwa na <ph name="HOSTED_DOMAIN" />, data yako ya Chrome itafutwa kwenye kifaa hiki ukiondoka katika akaunti. Data yako iliyosawazishwa itabaki kwenye Akaunti yako ya Google.</translation> <translation id="7772032839648071052">Thibitisha kaulisiri</translation> <translation id="7781011649027948662">Ungependa Kutafsiri Ukurasa?</translation> <translation id="7781829728241885113">Jana</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Hifadhi Mabadiliko</translation> <translation id="8503813439785031346">Jina la mtumiaji</translation> <translation id="850600235656508448">Fungua katika dirisha fiche</translation> +<translation id="8510057420705599706">Hatua hii itakuondoa katika akaunti na izime usawazishaji, lakini alamisho, historia, manenosiri na data yako nyingine ya Chrome itabaki kwenye kifaa hiki.</translation> <translation id="8517375800490286174">Leseni za Programu Huria</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Vichupo <ph name="FIRST_VISIBLE_TAB" /> kupitia <ph name="LAST_VISIBLE_TAB" /> kati ya <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Mpya</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Sasisha nenosiri</translation> <translation id="9100610230175265781">Kaulisiri inahitajika</translation> <translation id="9148126808321036104">Ingia tena</translation> +<translation id="9152539721251340337">Tunga Msimbo wa QR</translation> <translation id="9157836665414082580">Zima Vidirisha</translation> <translation id="9188680907066685419">Ondoka kwenye akaunti inayodhibitiwa</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 8fb3e6f4..78b6e6f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -160,6 +160,7 @@ <translation id="2923448633003185837">ஒட்டிவிட்டுச் செல்</translation> <translation id="292639812446257861">படிக்காததாகக் குறி</translation> <translation id="2958718410589002129">கடவுச்சொற்கள்</translation> +<translation id="2964349545761222050">மூன்றாம் தரப்புக் குக்கீகளைத் தடுத்தல்</translation> <translation id="2969979262385602596">உள்நுழைவு தோல்வி. பிறகு மீண்டும் முயற்சிக்கவும்.</translation> <translation id="298306318844797842">கட்டண முறையைச் சேர்...</translation> <translation id="2989805286512600854">புதிய தாவலில் திற</translation> @@ -302,6 +303,7 @@ <translation id="4979397965658815378">உங்கள் எல்லா சாதனங்களிலும் புக்மார்க்குகள், கடவுச்சொற்கள், வரலாறு மற்றும் பிற அமைப்புகளைப் பெற, உங்கள் Google கணக்கு மூலம் உள்நுழையவும்</translation> <translation id="5005498671520578047">கடவுச்சொல்லை நகலெடு</translation> <translation id="5010803260590204777">வலையைத் தனிப்பட்ட முறையில் உலாவ ஒரு மறைநிலைத் தாவலைத் திறக்கவும்.</translation> +<translation id="5039020240289137291">மூன்றாம் தரப்பு குக்கீகளைத் தடுக்கிறது</translation> <translation id="5039804452771397117">அனுமதி</translation> <translation id="5059136629401106827">சரி</translation> <translation id="5062321486222145940">Google இயக்ககத்தை நிறுவு</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 8134d13a..4693052 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">ทำเครื่องหมาย…</translation> <translation id="3153862085237805241">บันทึกบัตร</translation> <translation id="3157684681743766797">ทำเครื่องหมายทั้งหมด…</translation> +<translation id="3161291298470460782">การดำเนินการนี้จะนำคุณออกจากระบบ ปิดการซิงค์ และล้างข้อมูล Chrome ทั้งหมดในอุปกรณ์นี้ แต่ข้อมูลที่ซิงค์ไว้จะยังอยู่ในบัญชี Google</translation> <translation id="3175081911749765310">บริการทางเว็บ</translation> <translation id="3178650076442119961">ใช้งานวันนี้</translation> <translation id="3207960819495026254">บุ๊กมาร์กแล้ว</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">ยืนยันการล้างข้อมูลการท่องเว็บ</translation> <translation id="35083190962747987">เปิด ${url}</translation> <translation id="3519193562722059437">เปิดแท็บเพื่อท่องเว็บ</translation> +<translation id="3523473570015918798">การออกจากระบบจะทำให้บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และข้อมูลอื่นๆ ใน Chrome ไม่ซิงค์กับบัญชี Google อีกต่อไป</translation> <translation id="3527085408025491307">โฟลเดอร์</translation> <translation id="3529024052484145543">ไม่ปลอดภัย</translation> <translation id="3533202363250687977">ปิดแท็บไม่ระบุตัวตนทั้งหมด</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">ข้อมูลเกี่ยวกับการรักษาความปลอดภัยของหน้าเว็บ</translation> <translation id="5443952882982198570">บัตรเครดิต</translation> <translation id="5457907402803865181">เกิดข้อผิดพลาดในการซิงค์รหัสผ่าน</translation> +<translation id="5508435575041083207">ออกจากระบบและล้างข้อมูลในอุปกรณ์นี้</translation> <translation id="5525269841082836315">สร้างข้อความรหัสผ่าน</translation> <translation id="5548760955356983418">Handoff ช่วยให้คุณสามารถเริ่มการท่องเว็บไซต์บนอุปกรณ์นี้และใช้งานต่อบน Mac ได้อย่างง่ายดาย เว็บไซต์ที่เปิดอยู่ในปัจจุบันจะปรากฏในแท่นชาร์จของ Mac @@ -506,6 +509,9 @@ <translation id="766891008101699113">หากต้องการท่องเว็บแบบเป็นส่วนตัว ให้เพิ่มแท็บใหม่</translation> <translation id="7671141431838911305">ติดตั้ง</translation> <translation id="7765158879357617694">ย้าย</translation> +<translation id="7771470029643830783">การออกจากระบบจะทำให้บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และข้อมูลอื่นๆ ใน Chrome ไม่ซิงค์กับบัญชี Google อีกต่อไป + +เนื่องจากบัญชีของคุณจัดการโดย <ph name="HOSTED_DOMAIN" /> ระบบจึงจะลบข้อมูล Chrome ในอุปกรณ์นี้เมื่อคุณออกจากระบบ แต่ข้อมูลที่ซิงค์ไว้จะยังอยู่ในบัญชี Google</translation> <translation id="7772032839648071052">ยืนยันข้อความรหัสผ่าน</translation> <translation id="7781011649027948662">แปลหน้าเว็บไหม</translation> <translation id="7781829728241885113">เมื่อวานนี้</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">บันทึกการเปลี่ยนแปลง</translation> <translation id="8503813439785031346">ชื่อผู้ใช้</translation> <translation id="850600235656508448">เปิดในโหมดไม่ระบุตัวตน</translation> +<translation id="8510057420705599706">การดำเนินการนี้จะนำคุณออกจากระบบและปิดการซิงค์ แต่บุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และข้อมูลอื่นๆ ใน Chrome จะยังอยู่ในอุปกรณ์นี้</translation> <translation id="8517375800490286174">ใบอนุญาตโอเพนซอร์ส</translation> <translation id="8524799873541103884">แท็บ <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> ถึง <ph name="LAST_VISIBLE_TAB" /> จาก <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">ใหม่</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">อัปเดตรหัสผ่าน</translation> <translation id="9100610230175265781">ต้องระบุรหัสผ่าน</translation> <translation id="9148126808321036104">ลงชื่อเข้าใช้อีกครั้ง</translation> +<translation id="9152539721251340337">สร้างคิวอาร์โค้ด</translation> <translation id="9157836665414082580">ระงับกล่องโต้ตอบ</translation> <translation id="9188680907066685419">ออกจากระบบบัญชีที่มีการจัดการ</translation> <translation id="9203116392574189331">แฮนด์ออฟ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index b4780a6..6dd65e1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Позначити…</translation> <translation id="3153862085237805241">Зберегти картку</translation> <translation id="3157684681743766797">Позначити всі…</translation> +<translation id="3161291298470460782">Ваш сеанс в обліковому записі буде завершено, синхронізацію – вимкнено, а всі дані Chrome на пристрої – видалено. Синхронізовані дані залишаться у вашому обліковому записі Google.</translation> <translation id="3175081911749765310">Веб-служби</translation> <translation id="3178650076442119961">У мережі сьогодні</translation> <translation id="3207960819495026254">Створено закладку</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Підтвердити очищення даних веб-перегляду</translation> <translation id="35083190962747987">Відкрити ${url}</translation> <translation id="3519193562722059437">Щоб переглядати веб-сторінки, відкрийте вкладку.</translation> +<translation id="3523473570015918798">Якщо ви вийдете, дані Chrome (зокрема закладки, історія та паролі) більше не синхронізуватимуться з вашим обліковим записом Google.</translation> <translation id="3527085408025491307">Папка</translation> <translation id="3529024052484145543">Небезпечно</translation> <translation id="3533202363250687977">Закрити всі анонімні вкладки</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Відомості про безпеку сторінки</translation> <translation id="5443952882982198570">Кредитні картки</translation> <translation id="5457907402803865181">Не вдалося синхронізувати паролі.</translation> +<translation id="5508435575041083207">Вийти й видалити дані з цього пристрою</translation> <translation id="5525269841082836315">Створити парол.фразу</translation> <translation id="5548760955356983418">За допомогою Handoff можна почати переглядати веб-сайт на цьому пристрої, а потім легко продовжити на пристрої Mac. Відкритий веб-сайт з’явиться на панелі Dock на пристрої Mac. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Щоб переглядати веб-сторінки конфіденційно, додайте нову вкладку.</translation> <translation id="7671141431838911305">INSTALL</translation> <translation id="7765158879357617694">Перемістити</translation> +<translation id="7771470029643830783">Якщо ви вийдете, дані Chrome (зокрема закладки, історія та паролі) більше не синхронізуватимуться з вашим обліковим записом Google. + +Оскільки ваш обліковий запис зареєстровано в домені <ph name="HOSTED_DOMAIN" />, коли ви вийдете з нього, ваші дані Chrome буде видалено з цього пристрою. Синхронізовані дані залишаться у вашому обліковому записі Google.</translation> <translation id="7772032839648071052">Підтвердити парольну фразу</translation> <translation id="7781011649027948662">Перекласти сторінку?</translation> <translation id="7781829728241885113">Учора</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Зберегти зміни</translation> <translation id="8503813439785031346">Ім’я користувача</translation> <translation id="850600235656508448">Відкрити в режимі анонімного перегляду</translation> +<translation id="8510057420705599706">Ваш сеанс в обліковому записі буде завершено, а синхронізацію – вимкнено. Ваші дані Chrome (зокрема закладки, історія та паролі) залишаться на пристрої.</translation> <translation id="8517375800490286174">Ліцензії ПЗ з відкритим кодом</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" />: вкладки <ph name="FIRST_VISIBLE_TAB" />–<ph name="LAST_VISIBLE_TAB" /> з <ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Нове</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Оновити пароль</translation> <translation id="9100610230175265781">Потрібно вказати парольну фразу</translation> <translation id="9148126808321036104">Увійти знову</translation> +<translation id="9152539721251340337">Створити QR-код</translation> <translation id="9157836665414082580">Заблокувати діалогові вікна</translation> <translation id="9188680907066685419">Вийти з керованого облікового запису</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index d3afe72..0f98c20 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Belgilash…</translation> <translation id="3153862085237805241">Bildirgini saqlash</translation> <translation id="3157684681743766797">Hammasini belgilash…</translation> +<translation id="3161291298470460782">Bu hisobingizdan chiqarib, sinxronizatsiyani faolsizlantiradi va bu qurilmadagi barcha Chrome maʼlumotlaringizni tozalab tashlaydi. Google hisobingizga sinxronlangan maʼlumotlaringiz joyida qoladi.</translation> <translation id="3175081911749765310">Veb-xizmatlar</translation> <translation id="3178650076442119961">Bugun onlayn edi</translation> <translation id="3207960819495026254">Xatcho‘plarga qo‘shildi</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Brauzer tarixini tozalashni tasdiqlash</translation> <translation id="35083190962747987">${url} sahifasini ochish</translation> <translation id="3519193562722059437">Veb-sahifalarni ko‘rish uchun yangi tab oching.</translation> +<translation id="3523473570015918798">Hisobingizdan chiqsangiz, bukmarklar, tarix, parollar va boshqa Chrome maʼlumotlaringiz bilan Google hisobingiz sinxronizatsiyasi uziladi.</translation> <translation id="3527085408025491307">Jild</translation> <translation id="3529024052484145543">Xavfsiz emas</translation> <translation id="3533202363250687977">Inkognito sahifalarni yopish</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Sahifa xavfsizligi haqida ma’lumot</translation> <translation id="5443952882982198570">Bank kartalari</translation> <translation id="5457907402803865181">Parollar sinxronlanmadi</translation> +<translation id="5508435575041083207">Hisobdan chiqish va bu qurilmadagi maʼlumotlarni tozalash</translation> <translation id="5525269841082836315">Kodli ibora yaratish</translation> <translation id="5548760955356983418">Handoff funksiyasi veb-saytni bir qurilmada ochib, boshqasida davom etish imkoniyatini beradi. Ochilgan sayt Mac kompyuteringizning Dock panelida paydo bo‘ladi. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Internetni pinhona kezish uchun yangi varaq oching.</translation> <translation id="7671141431838911305">O‘RNATISH</translation> <translation id="7765158879357617694">Ko‘chirib o‘tkazish</translation> +<translation id="7771470029643830783">Hisobingizdan chiqsangiz, bukmarklar, tarix, parollar va boshqa Chrome maʼlumotlaringiz bilan Google hisobingiz sinxronizatsiyasi uziladi. + +Hisobingiz <ph name="HOSTED_DOMAIN" /> domenida boshqariladi, undan chiqsangiz, bu qurilmadagi Chrome maʼlumotlaringiz tozalanadi. Google hisobingizga sinxronlangan maʼlumotlaringiz joyida qoladi.</translation> <translation id="7772032839648071052">Kodli iborani tasdiqlang</translation> <translation id="7781011649027948662">Sahifa tarjima qilinsinmi?</translation> <translation id="7781829728241885113">Kecha</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Oʻzgarishlarni saqlash</translation> <translation id="8503813439785031346">Foydalanuvchi nomi</translation> <translation id="850600235656508448">Inkognito rejimida ochish</translation> +<translation id="8510057420705599706">Bu hisobingizdan chiqarib, sinxronizatsiyani faolsizlantiradi, lekin bu qurilmadagi bukmarklar, tarix, parollar va boshqa Chrome maʼlumotlaringiz saqlanib qoladi.</translation> <translation id="8517375800490286174">Ochiq kodli DT litsenziyalari</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> tablar soni <ph name="FIRST_VISIBLE_TAB" /> va <ph name="LAST_VISIBLE_TAB" /> orasida, jami <ph name="NUMBER_OF_OPEN_TABS" /> ta</translation> <translation id="8529767659511976195">Yangi</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Parolni yangilash</translation> <translation id="9100610230175265781">Kodli ibora zarur</translation> <translation id="9148126808321036104">Qaytadan kiring</translation> +<translation id="9152539721251340337">QR kod yaratish</translation> <translation id="9157836665414082580">Muloqot oynalarini bloklash</translation> <translation id="9188680907066685419">Boshqariladigan hisobdan chiqish</translation> <translation id="9203116392574189331">Handoff</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 5284f71..1cab724b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -168,6 +168,7 @@ <translation id="3112556859945124369">Maka...</translation> <translation id="3153862085237805241">Londoloza ikhadi</translation> <translation id="3157684681743766797">Maka konke...</translation> +<translation id="3161291298470460782">Lokhu kuzokukhipha ngemvume, kuvale ukuvumelanisa, futhi kusule yonke idatha ye-Chrome kule divayisi. Idatha yakho evunyelanisiwe izohlala ku-Akhawunti yakho ye-Google.</translation> <translation id="3175081911749765310">Amasevisi wewebhu</translation> <translation id="3178650076442119961">Isebenza namhlanje</translation> <translation id="3207960819495026254">Kubekwe uphawu lokubekisa</translation> @@ -200,6 +201,7 @@ <translation id="3494788280727468875">Qinisekisa ukusula idatha yokuphequlula</translation> <translation id="35083190962747987">Vula ${url}</translation> <translation id="3519193562722059437">Vula ithebhu ukuze uphequlule iwebhu.</translation> +<translation id="3523473570015918798">Ngokuphuma ngemvume, amabhukhimakhi akho, umlando, amaphasiwedi, nenye idatha ye-Chrome ngeke isavunyelaniswa ku-Akhawunti yakho ye-Google.</translation> <translation id="3527085408025491307">Ifolda</translation> <translation id="3529024052484145543">Akuphephile</translation> <translation id="3533202363250687977">Vala wonke amathebhu e-incognito</translation> @@ -333,6 +335,7 @@ <translation id="54401264925851789">Ulwazi lekhasi lokuvikela</translation> <translation id="5443952882982198570">Amakhadi wesikweletu</translation> <translation id="5457907402803865181">Iphutha lokuvumelanisa amaphasiwedi.</translation> +<translation id="5508435575041083207">Phuma Ngemvume futhi Usule Idatha kusukela kule Divayisi</translation> <translation id="5525269841082836315">Dala umushwana wokungena</translation> <translation id="5548760955356983418">I-Handoff ikuvumela ukuthi uqale ukuphequlula iwebhusayithi kule divayisi bese uqhubeke kalula ku-Mac yakho. Iwebhusayithi evulekile yamanje izobonakala kudokhu ye-Mac yakho. @@ -506,6 +509,9 @@ <translation id="766891008101699113">Ukuze uphequlule iwebhu ngobumfihlo, engeza ithebhu entsha.</translation> <translation id="7671141431838911305">FAKA</translation> <translation id="7765158879357617694">Hambisa</translation> +<translation id="7771470029643830783">Ngokuphuma ngemvume, amabhukhimakhi akho, umlando, amaphasiwedi, nenye idatha ye-Chrome ngeke isavunyelaniswa ku-Akhawunti yakho ye-Google. + +Ngoba i-akhawunti yakho iphethwe yi-<ph name="HOSTED_DOMAIN" />, idatha yakho ye-Chrome izosuswa kule divayisi uma uphuma ngemvume. Idatha yakho evunyelanisiwe izohlala ku-Akhawunti yakho ye-Google.</translation> <translation id="7772032839648071052">Qinisekisa umushwana wokungena</translation> <translation id="7781011649027948662">Humusha ikhasi?</translation> <translation id="7781829728241885113">Izolo</translation> @@ -555,6 +561,7 @@ <translation id="8490978609246021741">Londoloza izinguquko</translation> <translation id="8503813439785031346">Igama lomsebenzisi</translation> <translation id="850600235656508448">Vula ku-incognito</translation> +<translation id="8510057420705599706">Lokhu kuzokukhipha ngemvume futhi kuvale ukuvumelanisa, kodwa amabhukhimakhi akho, umlando, amaphasiwedi nenye idatha ye-Chrome kuzohlala kuledivayisi.</translation> <translation id="8517375800490286174">Amalayisense womthombo ovulekile</translation> <translation id="8524799873541103884"><ph name="INCOGNITO" /> Amathebhu <ph name="FIRST_VISIBLE_TAB" /> nge-<ph name="LAST_VISIBLE_TAB" /> kwangu-<ph name="NUMBER_OF_OPEN_TABS" /></translation> <translation id="8529767659511976195">Okusha</translation> @@ -597,6 +604,7 @@ <translation id="9094033019050270033">Buyekeza iphasiwedi</translation> <translation id="9100610230175265781">Kudingeka umushwana wokungena</translation> <translation id="9148126808321036104">Phinda ungene ngemvume</translation> +<translation id="9152539721251340337">Dala Ikhodi ye-QR</translation> <translation id="9157836665414082580">Cindezela amabhokisi</translation> <translation id="9188680907066685419">Phuma ngemvume ku-akhawunti ephethwe</translation> <translation id="9203116392574189331">I-Handoff</translation>
diff --git a/ios/chrome/browser/sessions/live_tab_context_browser_agent.h b/ios/chrome/browser/sessions/live_tab_context_browser_agent.h index 792ffd3..e8d37ac 100644 --- a/ios/chrome/browser/sessions/live_tab_context_browser_agent.h +++ b/ios/chrome/browser/sessions/live_tab_context_browser_agent.h
@@ -57,7 +57,8 @@ bool pin, bool from_last_session, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& user_agent_override) + override; sessions::LiveTab* ReplaceRestoredTab( const std::vector<sessions::SerializedNavigationEntry>& navigations, base::Optional<tab_groups::TabGroupId> group, @@ -65,7 +66,8 @@ bool from_last_session, const std::string& extension_app_id, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& user_agent_override) + override; void CloseTab() override; private:
diff --git a/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm b/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm index 4123db6..c9289f5 100644 --- a/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm +++ b/ios/chrome/browser/sessions/live_tab_context_browser_agent.mm
@@ -113,7 +113,7 @@ bool pin, bool from_last_session, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { // TODO(crbug.com/661636): Handle tab-switch animation somehow... web_state_list_->InsertWebState( tab_index, @@ -131,7 +131,7 @@ bool from_last_session, const std::string& extension_app_id, const sessions::PlatformSpecificTabData* tab_platform_data, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { web_state_list_->ReplaceWebStateAt( web_state_list_->active_index(), session_util::CreateWebStateWithNavigationEntries(
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 2ce20373..6d8b603 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -2704,7 +2704,7 @@ ios::GetChromeBrowserProvider()->GetVoiceSearchProvider(); if (provider) { _voiceSearchController = - provider->CreateVoiceSearchController(self.browser); + provider->CreateVoiceSearchController(self.browserState); if (self.primaryToolbarCoordinator) { _voiceSearchController->SetDispatcher( static_cast<id<LoadQueryCommands>>(self.commandDispatcher));
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb index e078543..63e8f491 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_af.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Kry toegang tot al die wagwoorde wat jy in Chrome stoor. In enige program. Enige tyd.</translation> <translation id="3660601625129812825">Vul Chrome-wagwoorde outomaties in</translation> <translation id="4695654165345019650">Kry toegang tot wagwoorde …</translation> +<translation id="5178539339249989017">Geen soekresultate gevind nie</translation> <translation id="5313485577007399362">Aktiveer outovul …</translation> <translation id="6494101196118320406">Geen Chrome-wagwoorde nie</translation> <translation id="6846906712230932330">Om wagwoorde te gebruik, moet jy eers 'n wagkode op jou toestel stel.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Geen Chrome-wagwoorde nie</translation> +<translation id="8208791657167738630">Alle wagwoorde</translation> <translation id="8602573493531049509">Vind uit hoe</translation> +<translation id="8982444110803529242">Voorgestelde wagwoorde</translation> <translation id="9087836967653912639">Kanselleer</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb index fbd9bb2f..178cd14 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">আপুনি Chromeত ছেভ কৰা সকলো পাছৱৰ্ডৰ এক্সেছ পাওক। যিকোনো এপতে। যিকোনো সময়তে।</translation> <translation id="3660601625129812825">স্বয়ংক্রিয়ভাৱে পূৰ হোৱা Chromeৰ পাছৱৰ্ডসমূহ</translation> <translation id="4695654165345019650">পাছৱৰ্ডসমূহ এক্সেছ কৰক...</translation> +<translation id="5178539339249989017">সন্ধানৰ কোনো ফলাফল পোৱা নগ’ল</translation> <translation id="5313485577007399362">স্বয়ংক্রিয়ভাৱে পূৰ হোৱা সুবিধাটো সক্ষম কৰক...</translation> <translation id="6494101196118320406">কোনো Chrome পাছৱৰ্ড নাই</translation> <translation id="6846906712230932330">পাছৱৰ্ডসমূহ ব্যৱহাৰ কৰিবলৈ আপুনি প্ৰথমে নিজৰ ডিভাইচত এটা পাছক’ড ছেট কৰিবই লাগিব।</translation> <translation id="6965382102122355670">ঠিক আছে</translation> <translation id="7870350829250847712">কোনো Chrome পাছৱৰ্ড নাই</translation> +<translation id="8208791657167738630">সকলো পাছৱৰ্ড</translation> <translation id="8602573493531049509">কেনেকৈ কৰিব জানক</translation> +<translation id="8982444110803529242">পৰামৰ্শ দিয়া পাছৱৰ্ডসমূহ</translation> <translation id="9087836967653912639">বাতিল কৰক</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb index 6d222df..c4ffb38 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bg.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Получете достъп до всички пароли, които запазвате в Chrome. Във всяко приложение и по всяко време.</translation> <translation id="3660601625129812825">Автоматично попълване на пароли в Chrome</translation> <translation id="4695654165345019650">Осъществяване на достъп до паролите...</translation> +<translation id="5178539339249989017">Няма намерени резултати от търсенето</translation> <translation id="5313485577007399362">Активиране на автоматичното попълване...</translation> <translation id="6494101196118320406">Няма пароли в Chrome</translation> <translation id="6846906712230932330">За да използвате паролите, трябва първо да зададете код за достъп на устройството си.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Няма пароли в Chrome</translation> +<translation id="8208791657167738630">Всички пароли</translation> <translation id="8602573493531049509">Научете как</translation> +<translation id="8982444110803529242">Предложени пароли</translation> <translation id="9087836967653912639">Отказ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb index 1bab586..75c3339 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_bs.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Dobijte pristup svim lozinkama koje sačuvate u Chromeu. U bilo kojoj aplikaciji. Bilo kada.</translation> <translation id="3660601625129812825">Automatsko popunjavanje lozinki u Chromeu</translation> <translation id="4695654165345019650">Pristup lozinkama...</translation> +<translation id="5178539339249989017">Nije pronađen nijedan rezultat pretraživanja</translation> <translation id="5313485577007399362">Omogući automatsko popunjavanje...</translation> <translation id="6494101196118320406">Nema Chrome lozinki</translation> <translation id="6846906712230932330">Postavite šifru na uređaju da koristite lozinke.</translation> <translation id="6965382102122355670">Uredu</translation> <translation id="7870350829250847712">Nema Chrome lozinki</translation> +<translation id="8208791657167738630">Sve lozinke</translation> <translation id="8602573493531049509">Saznajte kako</translation> +<translation id="8982444110803529242">Predložene lozinke</translation> <translation id="9087836967653912639">Otkaži</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb index b730d54..e8ff930 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ca.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Obtén accés a totes les contrasenyes que desis a Chrome. En qualsevol aplicació. En qualsevol moment.</translation> <translation id="3660601625129812825">Autocompleta les contrasenyes de Chrome</translation> <translation id="4695654165345019650">Accedir a les contrasenyes...</translation> +<translation id="5178539339249989017">No s'ha trobat cap resultat de la cerca</translation> <translation id="5313485577007399362">Activa Autocompletar...</translation> <translation id="6494101196118320406">No hi ha cap contrasenya de Chrome</translation> <translation id="6846906712230932330">Per utilitzar les contrasenyes, primer has d'establir una contrasenya al dispositiu.</translation> <translation id="6965382102122355670">D'acord</translation> <translation id="7870350829250847712">No hi ha cap contrasenya de Chrome</translation> +<translation id="8208791657167738630">Totes les contrasenyes</translation> <translation id="8602573493531049509">Més informació</translation> +<translation id="8982444110803529242">Contrasenyes suggerides</translation> <translation id="9087836967653912639">Cancel·la</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb index 9e04ed5..7130cab 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_da.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Få adgang til alle de adgangskoder, du har gemt i Chrome. I enhver app og til enhver tid.</translation> <translation id="3660601625129812825">Udfyld Chrome-adgangskoder automatisk</translation> <translation id="4695654165345019650">Adgang til adgangskoder…</translation> +<translation id="5178539339249989017">Der blev ikke fundet nogen søgeresultater</translation> <translation id="5313485577007399362">Aktivér autofyld...</translation> <translation id="6494101196118320406">Ingen Chrome-adgangskoder</translation> <translation id="6846906712230932330">Før du kan bruge adgangskoder, skal du angive en adgangskode på din enhed.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Ingen Chrome-adgangskoder</translation> +<translation id="8208791657167738630">Alle adgangskoder</translation> <translation id="8602573493531049509">Se hvordan</translation> +<translation id="8982444110803529242">Forslag til adgangskoder</translation> <translation id="9087836967653912639">Annuller</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb index 5c57e0fb..ff9ef42 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Αποκτήστε πρόσβαση σε όλους τους κωδικούς πρόσβασης που αποθηκεύετε στο Chrome. Σε οποιαδήποτε εφαρμογή ανά πάσα στιγμή.</translation> <translation id="3660601625129812825">Κωδικοί πρόσβασης αυτόματης συμπλήρωσης Chrome</translation> <translation id="4695654165345019650">Πρόσβαση σε κωδικούς πρόσβασης…</translation> +<translation id="5178539339249989017">Δεν βρέθηκαν αποτελέσματα αναζήτησης</translation> <translation id="5313485577007399362">Ενεργοποίηση Αυτόματης συμπλήρωσης…</translation> <translation id="6494101196118320406">Δεν υπάρχουν κωδικοί πρόσβασης Chrome</translation> <translation id="6846906712230932330">Για να χρησιμοποιήσετε κωδικούς πρόσβασης, θα πρέπει πρώτα να ορίσετε έναν κωδικό πρόσβασης στη συσκευή σας.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Δεν υπάρχουν κωδικοί πρόσβασης Chrome</translation> +<translation id="8208791657167738630">Όλοι οι κωδικοί πρόσβασης</translation> <translation id="8602573493531049509">Μάθετε πώς</translation> +<translation id="8982444110803529242">Προτεινόμενοι κωδικοί πρόσβασης</translation> <translation id="9087836967653912639">Ακύρωση</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb index 7178c52..27b66e9 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_en-GB.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Get access to all of the passwords that you save in Chrome. In any app. At any time.</translation> <translation id="3660601625129812825">Auto-fill Chrome passwords</translation> <translation id="4695654165345019650">Access passwords…</translation> +<translation id="5178539339249989017">No search results found</translation> <translation id="5313485577007399362">Enable auto-fill…</translation> <translation id="6494101196118320406">No Chrome Passwords</translation> <translation id="6846906712230932330">To use passwords, you must first set a passcode on your device.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">No Chrome Passwords</translation> +<translation id="8208791657167738630">All passwords</translation> <translation id="8602573493531049509">Learn how</translation> +<translation id="8982444110803529242">Suggested passwords</translation> <translation id="9087836967653912639">Cancel</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb index 176e9b8..f7724cc 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Pristupajte svim zaporkama koje spremate u Chromeu. U bilo kojoj aplikaciji. U bilo kojem trenutku.</translation> <translation id="3660601625129812825">Automatsko popunjavanje zaporki u Chromeu</translation> <translation id="4695654165345019650">Pristupite zaporkama…</translation> +<translation id="5178539339249989017">Nema rezultata pretraživanja</translation> <translation id="5313485577007399362">Omogući automatsko popunjavanje...</translation> <translation id="6494101196118320406">Nema zaporki za Chrome</translation> <translation id="6846906712230932330">Da biste koristili zaporke, najprije morate postaviti šifru na uređaju.</translation> <translation id="6965382102122355670">U redu</translation> <translation id="7870350829250847712">Nema zaporki za Chrome</translation> +<translation id="8208791657167738630">Sve zaporke</translation> <translation id="8602573493531049509">Saznajte kako</translation> +<translation id="8982444110803529242">Predložene zaporke</translation> <translation id="9087836967653912639">Otkaži</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb index de2ce49..710ddaa 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hu.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Hozzáférhet a Chrome böngészőben mentett összes jelszavához. Bármelyik alkalmazásban, bármikor.</translation> <translation id="3660601625129812825">Chrome-jelszavak automatikus kitöltése</translation> <translation id="4695654165345019650">Hozzáférés a jelszavakhoz…</translation> +<translation id="5178539339249989017">Nincs találat</translation> <translation id="5313485577007399362">Automatikus kitöltés engedélyezése…</translation> <translation id="6494101196118320406">Nincsenek Chrome-jelszavak</translation> <translation id="6846906712230932330">A jelszavak használatához előbb be kell állítania az eszközön a biztonsági kódot.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Nincsenek Chrome-jelszavak</translation> +<translation id="8208791657167738630">Az összes jelszó</translation> <translation id="8602573493531049509">További információ</translation> +<translation id="8982444110803529242">Javasolt jelszavak</translation> <translation id="9087836967653912639">Mégse</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb index 0b52df8..1f0209f7 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hy.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Դուք կկարողանաք օգտագործել Chrome-ում պահված բոլոր գաղտնաբառերը՝ ցանկացած ժամանակ, ցանկացած հավելվածում։</translation> <translation id="3660601625129812825">Chrome-ի գաղտնաբառերի ինքնալրացում</translation> <translation id="4695654165345019650">Հասանելիություն գաղտնաբառերին...</translation> +<translation id="5178539339249989017">Որոնման արդյունքներ չկան</translation> <translation id="5313485577007399362">Միացնել ինքնալրացնումը</translation> <translation id="6494101196118320406">Chrome-ի գաղտնաբառեր չկան</translation> <translation id="6846906712230932330">Գաղտնաբառերն օգտագործելու համար ձեր սարքում նախ պետք է անցակոդ սահմանեք։</translation> <translation id="6965382102122355670">Եղավ</translation> <translation id="7870350829250847712">Chrome-ի գաղտնաբառեր չկան</translation> +<translation id="8208791657167738630">Բոլոր գաղտնաբառերը</translation> <translation id="8602573493531049509">Իմանալ ավելին</translation> +<translation id="8982444110803529242">Առաջարկվող գաղտնաբառեր</translation> <translation id="9087836967653912639">Չեղարկել</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb index 4731f15..ce0fd06 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_is.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Fáðu aðgang að öllum aðgangsorðum sem þú vistar í Chrome. Í hvaða forriti sem er. Hvenær sem er.</translation> <translation id="3660601625129812825">Sjálfvirk útfylling aðgangsorða í Chrome</translation> <translation id="4695654165345019650">Aðgangur að aðgangsorðum...</translation> +<translation id="5178539339249989017">Engar leitarniðurstöður fundust</translation> <translation id="5313485577007399362">Kveikja á sjálfvirkri útfyllingu...</translation> <translation id="6494101196118320406">Engin aðgangsorð í Chrome</translation> <translation id="6846906712230932330">Til að nota aðgangsorð þarftu fyrst að stilla aðgangskóða í tækinu þínu.</translation> <translation id="6965382102122355670">Í lagi</translation> <translation id="7870350829250847712">Engin aðgangsorð í Chrome</translation> +<translation id="8208791657167738630">Öll aðgangsorð</translation> <translation id="8602573493531049509">Kynntu þér hvernig</translation> +<translation id="8982444110803529242">Uppástungur um aðgangsorð</translation> <translation id="9087836967653912639">Hætta</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb index 1ac2b93..494affc 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Accedi a tutte le password che salvi in Chrome, in qualsiasi app e in qualsiasi momento.</translation> <translation id="3660601625129812825">Usa Riempimento automatico per password di Chrome</translation> <translation id="4695654165345019650">Accesso password…</translation> +<translation id="5178539339249989017">Nessun risultato di ricerca trovato</translation> <translation id="5313485577007399362">Attiva Riempimento automatico…</translation> <translation id="6494101196118320406">Nessuna password di Chrome</translation> <translation id="6846906712230932330">Per utilizzare le password, devi innanzitutto impostare un passcode sul dispositivo.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Nessuna password di Chrome</translation> +<translation id="8208791657167738630">Tutte le password</translation> <translation id="8602573493531049509">Ulteriori informazioni</translation> +<translation id="8982444110803529242">Password suggerite</translation> <translation id="9087836967653912639">Annulla</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb index 003389f9..eaff624a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_iw.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">גישה לכל הסיסמאות ששמרת ב-Chrome. בכל האפליקציות, ללא הגבלה.</translation> <translation id="3660601625129812825">מילוי אוטומטי של סיסמאות ב-Chrome</translation> <translation id="4695654165345019650">גישה לסיסמאות...</translation> +<translation id="5178539339249989017">לא נמצאו תוצאות חיפוש</translation> <translation id="5313485577007399362">הפעלת המילוי האוטומטי…</translation> <translation id="6494101196118320406">אין סיסמאות של Chrome</translation> <translation id="6846906712230932330">כדי שניתן יהיה להשתמש בסיסמאות, יש להגדיר קוד גישה במכשיר.</translation> <translation id="6965382102122355670">אישור</translation> <translation id="7870350829250847712">אין סיסמאות של Chrome</translation> +<translation id="8208791657167738630">כל הסיסמאות</translation> <translation id="8602573493531049509">איך עושים זאת?</translation> +<translation id="8982444110803529242">הצעות לסיסמאות</translation> <translation id="9087836967653912639">ביטול</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb index 1a81706..82dfdf7 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ka.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">იქონიეთ წვდომა თქვენ მიერ Chrome-ში შენახულ ყველა პაროლზე. ნებისმიერი აპიდან, ნებისმიერ დროს.</translation> <translation id="3660601625129812825">Chrome-ის პაროლების ავტომატური შევსება</translation> <translation id="4695654165345019650">პაროლებზე წვდომა...</translation> +<translation id="5178539339249989017">ძიების შედეგები არ არის</translation> <translation id="5313485577007399362">ავტომატური შევსების ჩართვა...</translation> <translation id="6494101196118320406">Chrome-ის პაროლები არ არის</translation> <translation id="6846906712230932330">პაროლების გამოსაყენებლად, პირველ რიგში, საჭიროა თქვენს მოწყობილობაზე საიდუმლო კოდის დაყენება.</translation> <translation id="6965382102122355670">კარგი</translation> <translation id="7870350829250847712">Chrome-ის პაროლები არ არის</translation> +<translation id="8208791657167738630">ყველა პაროლი</translation> <translation id="8602573493531049509">ინსტრუქცია</translation> +<translation id="8982444110803529242">შემოთავაზებული პაროლები</translation> <translation id="9087836967653912639">გაუქმება</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb index c6181444..aede18e1 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lo.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">ຮັບສິດເຂົ້າເຖິງລະຫັດຜ່ານທັງໝົດທີ່ທ່ານບັນທຶກໄວ້ໃນ Chrome. ໃນແອັບໃດໆກໍໄດ້. ໃນທຸກເວລາ.</translation> <translation id="3660601625129812825">ລະຫັດຜ່ານການຕື່ມຂໍ້ມູນອັດຕະໂນມັດໃນ Chrome</translation> <translation id="4695654165345019650">ເຂົ້າເຖິງລະຫັດຜ່ານ...</translation> +<translation id="5178539339249989017">ບໍ່ພົບຜົນການຊອກຫາໃດໆ</translation> <translation id="5313485577007399362">ເປີດການນຳໃຊ້ການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ...</translation> <translation id="6494101196118320406">ບໍ່ມີລະຫັດຜ່ານ Chrome</translation> <translation id="6846906712230932330">ເພື່ອໃຊ້ລະຫັດຜ່ານ, ທ່ານຕ້ອງຕັ້ງລະຫັດຜ່ານໃນອຸປະກອນຂອງທ່ານກ່ອນ.</translation> <translation id="6965382102122355670">ຕົກລົງ</translation> <translation id="7870350829250847712">ບໍ່ມີລະຫັດຜ່ານ Chrome</translation> +<translation id="8208791657167738630">ລະຫັດຜ່ານທັງໝົດ</translation> <translation id="8602573493531049509">ສຶກສາວິທີການ</translation> +<translation id="8982444110803529242">ລະຫັດຜ່ານທີ່ແນະນຳ</translation> <translation id="9087836967653912639">ຍົກເລີກ</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb index 83607c0..ca15b08 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_lt.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Gaukite prieigą prie visų naršyklėje „Chrome“ išsaugotų slaptažodžių. Bet kurioje programoje. Bet kuriuo metu.</translation> <translation id="3660601625129812825">Automatinis „Chrome“ slaptažodžių pildymas</translation> <translation id="4695654165345019650">Pasiekti slaptažodžius...</translation> +<translation id="5178539339249989017">Nerasta jokių paieškos rezultatų</translation> <translation id="5313485577007399362">Įgalinti automatinį pildymą...</translation> <translation id="6494101196118320406">„Chrome“ slaptažodžių nėra</translation> <translation id="6846906712230932330">Jei norite naudoti slaptažodžius, pirmiausia turite nustatyti įrenginio slaptažodį.</translation> <translation id="6965382102122355670">Gerai</translation> <translation id="7870350829250847712">„Chrome“ slaptažodžių nėra</translation> +<translation id="8208791657167738630">Visi slaptažodžiai</translation> <translation id="8602573493531049509">Sužinoti, kaip tai padaryti</translation> +<translation id="8982444110803529242">Siūlomi slaptažodžiai</translation> <translation id="9087836967653912639">Atšaukti</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb index 36a9faea..c7d1837c 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mk.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Добијте пристап до сите лозинки што ги зачувувате во Chrome. Во секоја апликација. Во секое време.</translation> <translation id="3660601625129812825">Автоматско пополнување лозинки на Chrome</translation> <translation id="4695654165345019650">Пристап до лозинките…</translation> +<translation id="5178539339249989017">Не се пронајдени резултати од пребарувањето</translation> <translation id="5313485577007399362">Овозможи автоматско пополнување…</translation> <translation id="6494101196118320406">Нема лозинки за Chrome</translation> <translation id="6846906712230932330">За да ги користите лозинките, прво мора да поставите лозинка на вашиот уред.</translation> <translation id="6965382102122355670">Во ред</translation> <translation id="7870350829250847712">Нема лозинки за Chrome</translation> +<translation id="8208791657167738630">Сите лозинки</translation> <translation id="8602573493531049509">Дознајте како</translation> +<translation id="8982444110803529242">Предложени лозинки</translation> <translation id="9087836967653912639">Откажи</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb index de72ec7..424d3f7 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ms.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Dapatkan akses kepada semua kata laluan yang anda simpan dalam Chrome. Dalam mana-mana apl. Pada bila-bila masa.</translation> <translation id="3660601625129812825">Autolengkap Kata Laluan Chrome</translation> <translation id="4695654165345019650">Akses Kata Laluan...</translation> +<translation id="5178539339249989017">Tiada hasil carian dijumpai</translation> <translation id="5313485577007399362">Dayakan Autolengkap...</translation> <translation id="6494101196118320406">Tiada Kata Laluan Chrome</translation> <translation id="6846906712230932330">Untuk menggunakan kata laluan, anda mesti menetapkan kod laluan pada peranti anda dahulu.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Tiada Kata Laluan Chrome</translation> +<translation id="8208791657167738630">Semua Kata Laluan</translation> <translation id="8602573493531049509">Ketahui Caranya</translation> +<translation id="8982444110803529242">Kata Laluan yang Dicadangkan</translation> <translation id="9087836967653912639">Batal</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb index f79ca7a..7062c63 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_my.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Chrome တွင် သင်သိမ်းထားသော စကားဝှက်အားလုံးကို ကြည့်ခွင့်ရယူပါ။ နှစ်သက်ရာအက်ပ်တွင်။ အချိန်မရွေး။</translation> <translation id="3660601625129812825">Chrome စကားဝှက်များ အော်တိုဖြည့်ခြင်း</translation> <translation id="4695654165345019650">စကားဝှက်များ သုံးရန်...</translation> +<translation id="5178539339249989017">ရှာဖွေမှု ရလဒ်များ မရှိပါ</translation> <translation id="5313485577007399362">အော်တိုဖြည့် ဖွင့်ရန်...</translation> <translation id="6494101196118320406">Chrome စကားဝှက်များ မရှိပါ</translation> <translation id="6846906712230932330">စကားဝှက်များသုံးရန် သင့်စက်တွင် လျှို့ဝှက်ကုဒ်တစ်ခုကို ဦးစွာ သတ်မှတ်ရပါမည်။</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Chrome စကားဝှက်များ မရှိပါ</translation> +<translation id="8208791657167738630">စကားဝှက်အားလုံး</translation> <translation id="8602573493531049509">လုပ်ဆောင်ပုံ လေ့လာရန်</translation> +<translation id="8982444110803529242">အကြံပြုထားသော စကားဝှက်များ</translation> <translation id="9087836967653912639">ပယ်ရန်</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb index 790d3a0e..48ef3b4 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_nl.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Krijg toegang tot alle wachtwoorden die je in Chrome hebt opgeslagen, in elke app en op elk moment.</translation> <translation id="3660601625129812825">Chrome-wachtwoorden automatisch aanvullen</translation> <translation id="4695654165345019650">Toegang krijgen tot wachtwoorden...</translation> +<translation id="5178539339249989017">Geen zoekresultaten gevonden</translation> <translation id="5313485577007399362">Automatisch aanvullen inschakelen…</translation> <translation id="6494101196118320406">Geen Chrome-wachtwoorden</translation> <translation id="6846906712230932330">Als je wachtwoorden wilt exporteren, moet je eerst een toegangscode instellen op je apparaat.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Geen Chrome-wachtwoorden</translation> +<translation id="8208791657167738630">Alle wachtwoorden</translation> <translation id="8602573493531049509">Meer informatie</translation> +<translation id="8982444110803529242">Voorgestelde wachtwoorden</translation> <translation id="9087836967653912639">Annuleren</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb index f9b0f6a..013bd7c6 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pl.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Korzystaj ze wszystkich haseł zapisanych w Chrome – w dowolnej aplikacji i w dowolnym momencie.</translation> <translation id="3660601625129812825">Wypełniaj hasła w Chrome</translation> <translation id="4695654165345019650">Dostęp do haseł…</translation> +<translation id="5178539339249989017">Brak wyników wyszukiwania</translation> <translation id="5313485577007399362">Włącz Wypełnianie…</translation> <translation id="6494101196118320406">Brak haseł w Chrome</translation> <translation id="6846906712230932330">Aby użyć haseł, musisz najpierw ustawić kod dostępu na urządzeniu.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Brak haseł w Chrome</translation> +<translation id="8208791657167738630">Wszystkie hasła</translation> <translation id="8602573493531049509">Instrukcje</translation> +<translation id="8982444110803529242">Sugerowane hasła</translation> <translation id="9087836967653912639">Anuluj</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb index 7b9d627..b13c698 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-BR.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Tenha acesso a todas as senhas que você salvou no Chrome. Em qualquer app, sempre que quiser.</translation> <translation id="3660601625129812825">Preenchimento automático de senhas do Chrome</translation> <translation id="4695654165345019650">Acessar senhas…</translation> +<translation id="5178539339249989017">Nenhum resultado da pesquisa encontrado</translation> <translation id="5313485577007399362">Ativar o preenchimento automático…</translation> <translation id="6494101196118320406">Não há nenhuma senha no Chrome</translation> <translation id="6846906712230932330">Para usar senhas, defina uma no dispositivo primeiro.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Não há nenhuma senha no Chrome</translation> +<translation id="8208791657167738630">Todas as senhas</translation> <translation id="8602573493531049509">Saiba como</translation> +<translation id="8982444110803529242">Senhas sugeridas</translation> <translation id="9087836967653912639">Cancelar</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb index df2342e8..486daf95 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pt-PT.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Obtenha acesso a todas as palavras-passe que guardar no Chrome. Em qualquer app. Em qualquer altura.</translation> <translation id="3660601625129812825">Preenchimento automático de palavras-passe do Chrome</translation> <translation id="4695654165345019650">A aceder a palavras-passe…</translation> +<translation id="5178539339249989017">Não foram encontrados resultados da pesquisa.</translation> <translation id="5313485577007399362">Ativar preenchimento automático…</translation> <translation id="6494101196118320406">Sem palavras-passe do Chrome</translation> <translation id="6846906712230932330">Para utilizar palavras-passe, tem de definir primeiro um código secreto no dispositivo.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Sem palavras-passe do Chrome</translation> +<translation id="8208791657167738630">Todas as palavras-passe</translation> <translation id="8602573493531049509">Saber como</translation> +<translation id="8982444110803529242">Palavras-passe sugeridas</translation> <translation id="9087836967653912639">Cancelar</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb index 021ccd3..93fa861 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ro.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Obține acces la toate parolele pe care le salvezi în Chrome. În orice aplicație. Oricând.</translation> <translation id="3660601625129812825">Completează automat parolele Chrome</translation> <translation id="4695654165345019650">Accesează parolele...</translation> +<translation id="5178539339249989017">Nu s-au găsit rezultate de căutare</translation> <translation id="5313485577007399362">Activează completarea automată...</translation> <translation id="6494101196118320406">Nu există parole în Chrome</translation> <translation id="6846906712230932330">Pentru a folosi parolele, trebuie mai întâi să setezi o parolă pe dispozitiv.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Nu există parole în Chrome</translation> +<translation id="8208791657167738630">Toate parolele</translation> <translation id="8602573493531049509">Află cum</translation> +<translation id="8982444110803529242">Parole sugerate</translation> <translation id="9087836967653912639">Anulează</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb index bd02b9e..8a68f1a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_si.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">ඔබ Chrome තුළ සුරකින සියලුම මුරපද වෙත ප්රවේශය ලබා ගන්න. ඕනෑම යෙදුමක් තුළ. ඕනෑම වේලාවක.</translation> <translation id="3660601625129812825">AutoFill Chrome මුරපද</translation> <translation id="4695654165345019650">මුරපද වෙත ප්රවේශ වන්න...</translation> +<translation id="5178539339249989017">සෙවීම් ප්රතිඵල හමු නොවිණි</translation> <translation id="5313485577007399362">AutoFill සබල කරන්න...</translation> <translation id="6494101196118320406">Chrome මුරපද නැත</translation> <translation id="6846906712230932330">මුරපද භාවිත කිරීමට, ඔබ ප්රථමයෙන් ඔබේ උපාංගයේ මුරකේතයක් සැකසිය යුතුය.</translation> <translation id="6965382102122355670">හරි</translation> <translation id="7870350829250847712">Chrome මුරපද නැත</translation> +<translation id="8208791657167738630">සියලු මුරපද</translation> <translation id="8602573493531049509">කෙසේදැයි දැන ගන්න</translation> +<translation id="8982444110803529242">යෝජිත මුරපද</translation> <translation id="9087836967653912639">අවලංගු කරන්න</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb index 4329ce9e..ca9b8f3 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sl.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Imejte dostop do vseh gesel, ki jih shranite v Chromu. V kateri koli aplikaciji. Kadar koli.</translation> <translation id="3660601625129812825">Samodejno izpolnjevanje gesel v Chromu</translation> <translation id="4695654165345019650">Dostop do gesel …</translation> +<translation id="5178539339249989017">Ni rezultatov iskanja</translation> <translation id="5313485577007399362">Omogoči samodejno izpolnjevanje …</translation> <translation id="6494101196118320406">Ni gesel v Chromu</translation> <translation id="6846906712230932330">Če želite uporabiti gesla, morate najprej nastaviti geslo v napravi.</translation> <translation id="6965382102122355670">V redu</translation> <translation id="7870350829250847712">Ni gesel v Chromu</translation> +<translation id="8208791657167738630">Vsa gesla</translation> <translation id="8602573493531049509">Več o tem</translation> +<translation id="8982444110803529242">Predlagana gesla</translation> <translation id="9087836967653912639">Prekliči</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb index af8b0df..18d1449 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Dobijte pristup svim lozinkama koje čuvate u Chrome-u. U bilo kojoj aplikaciji. U bilo kom trenutku.</translation> <translation id="3660601625129812825">Automatsko popunjavanje lozinki za Chrome</translation> <translation id="4695654165345019650">Pristupa se lozinkama...</translation> +<translation id="5178539339249989017">Nije pronađen nijedan rezultat pretrage</translation> <translation id="5313485577007399362">Omogući automatsko popunjavanje...</translation> <translation id="6494101196118320406">Nema lozinki za Chrome</translation> <translation id="6846906712230932330">Da biste koristili lozinke, prvo morate da podesite šifru na uređaju.</translation> <translation id="6965382102122355670">Potvrdi</translation> <translation id="7870350829250847712">Nema lozinki za Chrome</translation> +<translation id="8208791657167738630">Sve lozinke</translation> <translation id="8602573493531049509">Saznajte kako</translation> +<translation id="8982444110803529242">Predložene lozinke</translation> <translation id="9087836967653912639">Otkaži</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb index aa3bd70..b0b21a2 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Добијте приступ свим лозинкама које чувате у Chrome-у. У било којој апликацији. У било ком тренутку.</translation> <translation id="3660601625129812825">Аутоматско попуњавање лозинки за Chrome</translation> <translation id="4695654165345019650">Приступа се лозинкама...</translation> +<translation id="5178539339249989017">Није пронађен ниједан резултат претраге</translation> <translation id="5313485577007399362">Омогући аутоматско попуњавање...</translation> <translation id="6494101196118320406">Нема лозинки за Chrome</translation> <translation id="6846906712230932330">Да бисте користили лозинке, прво морате да подесите шифру на уређају.</translation> <translation id="6965382102122355670">Потврди</translation> <translation id="7870350829250847712">Нема лозинки за Chrome</translation> +<translation id="8208791657167738630">Све лозинке</translation> <translation id="8602573493531049509">Сазнајте како</translation> +<translation id="8982444110803529242">Предложене лозинке</translation> <translation id="9087836967653912639">Откажи</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb index 6a9f226..f489c68 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sw.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Pata uwezo wa kufikia manenosiri yote unayohifadhi kwenye Chrome. Kwenye programu yoyote. Wakati wowote.</translation> <translation id="3660601625129812825">Jaza Kiotomatiki Manenosiri ya Chrome</translation> <translation id="4695654165345019650">Fikia Manenosiri...</translation> +<translation id="5178539339249989017">Hakuna matokeo ya utafutaji yaliyopatikana</translation> <translation id="5313485577007399362">Washa Kipengele cha Kujaza Kiotomatiki...</translation> <translation id="6494101196118320406">Hamna Manenosiri ya Chrome</translation> <translation id="6846906712230932330">Ili utumie manenosiri, ni lazima kwanza uweke nambari ya siri kwenye kifaa chako.</translation> <translation id="6965382102122355670">Sawa</translation> <translation id="7870350829250847712">Hamna Manenosiri ya Chrome</translation> +<translation id="8208791657167738630">Manenosiri Yote</translation> <translation id="8602573493531049509">Pata Maelezo Zaidi</translation> +<translation id="8982444110803529242">Manenosiri Yanayopendekezwa</translation> <translation id="9087836967653912639">Ghairi</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb index be07739..5f8d624 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb
@@ -1,11 +1,17 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ta"> +<translation id="1211920912879022906">சமீபத்தில் Google கணக்கிலிருந்து வெளியேறியதால் நீங்கள் ஒத்திசைத்த கடவுச்சொற்கள் அகற்றப்பட்டன. அவற்றை இங்குப் பார்க்க Chromeமில் உள்நுழைந்து ஒத்திசைவை இயக்கவும்.</translation> +<translation id="2488806977964805203">கடவுக்குறியீட்டை அமைக்கவும்</translation> +<translation id="2492201814011227831">தொடங்க, சில கடவுச்சொற்களை Chromeமில் சேமிக்கவும். உங்கள் Google கணக்கில் ஏற்கெனவே கடவுச்சொற்களைச் சேமித்து வைத்துள்ளீர்கள் எனில் அவற்றை இங்குப் பார்ப்பதற்கு Chromeமில் உள்நுழைந்து ஒத்திசைவை இயக்கவும்.</translation> <translation id="3378542047369517508">Chromeமில் சேமிக்கப்பட்டுள்ள எல்லாக் கடவுச்சொற்களுக்கும் அணுகலைப் பெறுங்கள். எந்த ஆப்ஸிலும். எந்த நேரத்திலும்.</translation> <translation id="3660601625129812825">Chrome கடவுச்சொற்களைத் தன்னிரப்பு</translation> +<translation id="4695654165345019650">கடவுச்சொற்களை அணுகுகிறது...</translation> <translation id="5313485577007399362">தன்னிரப்பியை இயக்கு...</translation> <translation id="6494101196118320406">Chrome கடவுச்சொற்கள் எதுவும் இல்லை</translation> +<translation id="6846906712230932330">கடவுச்சொற்களைப் பயன்படுத்த, முதலில் உங்கள் சாதனத்தில் கடவுக்குறியீட்டை அமைக்க வேண்டும்.</translation> <translation id="6965382102122355670">சரி</translation> <translation id="7870350829250847712">Chrome கடவுச்சொற்கள் எதுவும் இல்லை</translation> +<translation id="8602573493531049509">எப்படி என அறிக</translation> <translation id="9087836967653912639">ரத்துசெய்</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb index 4bed8a9c..200fffd 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_th.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">เข้าถึงรหัสผ่านทั้งหมดที่คุณบันทึกไว้ใน Chrome ได้ทุกเมื่อจากทุกๆ แอป</translation> <translation id="3660601625129812825">ป้อนรหัสผ่านของ Chrome โดยอัตโนมัติ</translation> <translation id="4695654165345019650">เข้าถึงรหัสผ่าน...</translation> +<translation id="5178539339249989017">ไม่พบผลการค้นหา</translation> <translation id="5313485577007399362">เปิดใช้การป้อนข้อความอัตโนมัติ...</translation> <translation id="6494101196118320406">ไม่มีรหัสผ่านของ Chrome</translation> <translation id="6846906712230932330">หากต้องการใช้รหัสผ่าน คุณต้องตั้งรหัสผ่านในอุปกรณ์ก่อน</translation> <translation id="6965382102122355670">ตกลง</translation> <translation id="7870350829250847712">ไม่มีรหัสผ่านของ Chrome</translation> +<translation id="8208791657167738630">รหัสผ่านทั้งหมด</translation> <translation id="8602573493531049509">ดูวิธี</translation> +<translation id="8982444110803529242">รหัสผ่านแนะนำ</translation> <translation id="9087836967653912639">ยกเลิก</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb index 3a3c4a24..2636f82 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uk.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Доступ до всіх паролів, які ви зберегли в Chrome. У будь-якому додатку. Будь-коли.</translation> <translation id="3660601625129812825">Aвтоматично заповнювати паролі в Chrome</translation> <translation id="4695654165345019650">Паролі доступу…</translation> +<translation id="5178539339249989017">Немає результатів пошуку</translation> <translation id="5313485577007399362">Увімкнути автозаповнення…</translation> <translation id="6494101196118320406">Немає паролів Chrome</translation> <translation id="6846906712230932330">Щоб використовувати паролі, спершу потрібно налаштувати код доступу на пристрої.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Немає паролів Chrome</translation> +<translation id="8208791657167738630">Усі паролі</translation> <translation id="8602573493531049509">Докладніше</translation> +<translation id="8982444110803529242">Пропоновані паролі</translation> <translation id="9087836967653912639">Скасувати</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb index 7ff8c559..58e07de 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_uz.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Chromeda saqlangan parollaringizdan istalgan joyda foydalaning. Istalgan ilovada, istalgan vaqtda.</translation> <translation id="3660601625129812825">Chrome parollarning avtomatik kiritilishi</translation> <translation id="4695654165345019650">Parollarga ruxsat...</translation> +<translation id="5178539339249989017">Qidiruv hech qanday natija bermadi</translation> <translation id="5313485577007399362">Avtomatik kiritish funksiyasini yoqish...</translation> <translation id="6494101196118320406">Hech qanday Chrome paroli topilmadi</translation> <translation id="6846906712230932330">Parollarni ishlatish uchun qurilmangizni maxfiy kod bilan qulflang.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Hech qanday Chrome paroli topilmadi</translation> +<translation id="8208791657167738630">Barcha parollar</translation> <translation id="8602573493531049509">Batafsil axborot</translation> +<translation id="8982444110803529242">Tavsiya etilgan parollar</translation> <translation id="9087836967653912639">Bekor qilish</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb index 33516b2..d4cdbd1 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb
@@ -7,11 +7,14 @@ <translation id="3378542047369517508">Thola ukufinyelela kuwo wonke amaphasiwedi owalondoloze ku-Chrome. Kunoma iluphi uhlelo lokusebenza. Noma kunini.</translation> <translation id="3660601625129812825">Gcwalisa Ngokuzenzakalela Amaphasiwedi e-Chrome</translation> <translation id="4695654165345019650">Finyelela kumaphasiwedi...</translation> +<translation id="5178539339249989017">Ayikho imiphumela yosesho etholakele</translation> <translation id="5313485577007399362">Nika amandla Ukugcwalisa Ngokuzenzakalela...</translation> <translation id="6494101196118320406">Awekho amaphasiwedi we-Chrome</translation> <translation id="6846906712230932330">Ukuze usebenzise amaphasiwedi, kuzomele uqale usethe ikhodi yokudlula kudivayisi yakho.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Awekho amaphasiwedi we-Chrome</translation> +<translation id="8208791657167738630">Wonke Amaphasiwedi</translation> <translation id="8602573493531049509">Funda ukuthi kanjani</translation> +<translation id="8982444110803529242">Amaphasiwedi Aphakanyisiwe</translation> <translation id="9087836967653912639">Khansela</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/public/provider/chrome/browser/voice/voice_search_provider.h b/ios/public/provider/chrome/browser/voice/voice_search_provider.h index 1b76506..21de690 100644 --- a/ios/public/provider/chrome/browser/voice/voice_search_provider.h +++ b/ios/public/provider/chrome/browser/voice/voice_search_provider.h
@@ -13,7 +13,7 @@ @protocol ApplicationCommands; class AudioSessionController; -class Browser; +class ChromeBrowserState; class VoiceSearchController; // VoiceSearchProvider allows embedders to provide functionality related to @@ -35,7 +35,7 @@ // Creates a new VoiceSearchController object. virtual scoped_refptr<VoiceSearchController> CreateVoiceSearchController( - Browser* browser) const; + ChromeBrowserState* browser_state) const; private: DISALLOW_COPY_AND_ASSIGN(VoiceSearchProvider);
diff --git a/ios/public/provider/chrome/browser/voice/voice_search_provider.mm b/ios/public/provider/chrome/browser/voice/voice_search_provider.mm index faa2f9c..9f555f43 100644 --- a/ios/public/provider/chrome/browser/voice/voice_search_provider.mm +++ b/ios/public/provider/chrome/browser/voice/voice_search_provider.mm
@@ -23,6 +23,7 @@ } scoped_refptr<VoiceSearchController> -VoiceSearchProvider::CreateVoiceSearchController(Browser* browser) const { +VoiceSearchProvider::CreateVoiceSearchController( + ChromeBrowserState* browser_state) const { return scoped_refptr<VoiceSearchController>(nullptr); }
diff --git a/media/base/hdr_metadata.h b/media/base/hdr_metadata.h index 4846025e..715642d 100644 --- a/media/base/hdr_metadata.h +++ b/media/base/hdr_metadata.h
@@ -52,6 +52,15 @@ } }; +// HDR metadata types as described in +// https://w3c.github.io/media-capabilities/#enumdef-hdrmetadatatype +enum class HdrMetadataType { + kNone, + kSmpteSt2086, + kSmpteSt2094_10, + kSmpteSt2094_40, +}; + } // namespace media #endif // MEDIA_BASE_HDR_METADATA_H_
diff --git a/media/base/media_types.h b/media/base/media_types.h index c7f6f2a5..acffbce 100644 --- a/media/base/media_types.h +++ b/media/base/media_types.h
@@ -33,6 +33,7 @@ VideoCodecProfile profile; int level; VideoColorSpace color_space; + HdrMetadataType hdr_metadata_type; }; MEDIA_EXPORT bool operator==(const AudioType& x, const AudioType& y);
diff --git a/media/base/silent_sink_suspender.cc b/media/base/silent_sink_suspender.cc index abcb48c..db8d1e5 100644 --- a/media/base/silent_sink_suspender.cc +++ b/media/base/silent_sink_suspender.cc
@@ -170,4 +170,4 @@ } } -} // namespace content +} // namespace media
diff --git a/media/base/silent_sink_suspender.h b/media/base/silent_sink_suspender.h index d963865..8feeabc6 100644 --- a/media/base/silent_sink_suspender.h +++ b/media/base/silent_sink_suspender.h
@@ -114,6 +114,6 @@ DISALLOW_COPY_AND_ASSIGN(SilentSinkSuspender); }; -} // namespace content +} // namespace media #endif // MEDIA_BASE_SILENT_SINK_SUSPENDER_H_
diff --git a/media/base/supported_types.cc b/media/base/supported_types.cc index 19266cf96..22266c9 100644 --- a/media/base/supported_types.cc +++ b/media/base/supported_types.cc
@@ -31,6 +31,22 @@ namespace media { +namespace { + +bool IsSupportedHdrMetadata(const HdrMetadataType& hdr_metadata_type) { + switch (hdr_metadata_type) { + case HdrMetadataType::kNone: + return true; + + case HdrMetadataType::kSmpteSt2086: + case HdrMetadataType::kSmpteSt2094_10: + case HdrMetadataType::kSmpteSt2094_40: + return false; + } +} + +} // namespace + bool IsSupportedAudioType(const AudioType& type) { MediaClient* media_client = GetMediaClient(); if (media_client) @@ -257,6 +273,9 @@ // TODO(chcunningham): Add platform specific logic for Android (move from // MimeUtilIntenral). bool IsDefaultSupportedVideoType(const VideoType& type) { + if (!IsSupportedHdrMetadata(type.hdr_metadata_type)) + return false; + #if !BUILDFLAG(USE_PROPRIETARY_CODECS) if (IsVideoCodecProprietary(type.codec)) return false;
diff --git a/media/base/supported_types_unittest.cc b/media/base/supported_types_unittest.cc index 7645614..48013e1 100644 --- a/media/base/supported_types_unittest.cc +++ b/media/base/supported_types_unittest.cc
@@ -240,4 +240,58 @@ #endif } +TEST(SupportedTypesTest, IsSupportedVideoTypeWithHdrMetadataBasics) { + // Default to common 709. + media::VideoColorSpace color_space = media::VideoColorSpace::REC709(); + + // Some codecs do not have a notion of level. + const int kUnspecifiedLevel = 0; + + // Expect support for baseline configuration of known codecs. + EXPECT_TRUE(IsSupportedVideoType({media::kCodecVP8, media::VP8PROFILE_ANY, + kUnspecifiedLevel, color_space})); + EXPECT_TRUE( + IsSupportedVideoType({media::kCodecVP9, media::VP9PROFILE_PROFILE0, + kUnspecifiedLevel, color_space})); + EXPECT_TRUE(IsSupportedVideoType({media::kCodecTheora, + media::VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, color_space})); + + // All combinations of combinations of color gamuts and transfer functions + // should be supported. + color_space.primaries = media::VideoColorSpace::PrimaryID::SMPTEST431_2; + color_space.transfer = media::VideoColorSpace::TransferID::SMPTEST2084; + EXPECT_TRUE(IsSupportedVideoType({media::kCodecVP8, media::VP8PROFILE_ANY, + kUnspecifiedLevel, color_space})); + EXPECT_TRUE( + IsSupportedVideoType({media::kCodecVP9, media::VP9PROFILE_PROFILE0, + kUnspecifiedLevel, color_space})); + EXPECT_TRUE(IsSupportedVideoType({media::kCodecTheora, + media::VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, color_space})); + + color_space.primaries = media::VideoColorSpace::PrimaryID::BT2020; + color_space.transfer = media::VideoColorSpace::TransferID::ARIB_STD_B67; + EXPECT_TRUE(IsSupportedVideoType({media::kCodecVP8, media::VP8PROFILE_ANY, + kUnspecifiedLevel, color_space})); + EXPECT_TRUE( + IsSupportedVideoType({media::kCodecVP9, media::VP9PROFILE_PROFILE0, + kUnspecifiedLevel, color_space})); + EXPECT_TRUE(IsSupportedVideoType({media::kCodecTheora, + media::VIDEO_CODEC_PROFILE_UNKNOWN, + kUnspecifiedLevel, color_space})); + + // No HDR metadata types are supported. + EXPECT_FALSE(IsSupportedVideoType({media::kCodecVP8, media::VP8PROFILE_ANY, + kUnspecifiedLevel, color_space, + media::HdrMetadataType::kSmpteSt2086})); + + EXPECT_FALSE(IsSupportedVideoType({media::kCodecVP8, media::VP8PROFILE_ANY, + kUnspecifiedLevel, color_space, + media::HdrMetadataType::kSmpteSt2094_10})); + + EXPECT_FALSE(IsSupportedVideoType({media::kCodecVP8, media::VP8PROFILE_ANY, + kUnspecifiedLevel, color_space, + media::HdrMetadataType::kSmpteSt2094_40})); +} } // namespace media
diff --git a/media/capture/video/video_capture_buffer_tracker.h b/media/capture/video/video_capture_buffer_tracker.h index 19811b0..6757641 100644 --- a/media/capture/video/video_capture_buffer_tracker.h +++ b/media/capture/video/video_capture_buffer_tracker.h
@@ -62,6 +62,6 @@ int frame_feedback_id_; }; -} // namespace content +} // namespace media #endif // MEDIA_CAPTURE_VIDEO_VIDEO_CAPTURE_BUFFER_TRACKER_H_
diff --git a/media/gpu/test/video_player/test_vda_video_decoder.cc b/media/gpu/test/video_player/test_vda_video_decoder.cc index d09d9dd..ba9fd37 100644 --- a/media/gpu/test/video_player/test_vda_video_decoder.cc +++ b/media/gpu/test/video_player/test_vda_video_decoder.cc
@@ -7,12 +7,16 @@ #include <utility> #include <vector> +#include <GLES2/gl2.h> +#include <GLES2/gl2ext.h> + #include "base/bind.h" #include "base/memory/ptr_util.h" #include "base/task/post_task.h" #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "media/base/video_frame.h" +#include "media/base/video_util.h" #include "media/base/waiting.h" #include "media/gpu/gpu_video_decode_accelerator_factory.h" #include "media/gpu/macros.h" @@ -270,23 +274,29 @@ std::move(handle)); } break; - case VideoDecodeAccelerator::Config::OutputMode::ALLOCATE: + case VideoDecodeAccelerator::Config::OutputMode::ALLOCATE: { // If using allocate mode, request a set of texture-backed video frames // from the renderer. + const gfx::Size texture_dimensions = + texture_target == GL_TEXTURE_EXTERNAL_OES + ? GetRectSizeFromOrigin(visible_rect) + : dimensions; for (uint32_t i = 0; i < requested_num_of_buffers; ++i) { uint32_t texture_id; auto video_frame = frame_renderer_->CreateVideoFrame( - format, dimensions, texture_target, &texture_id); + format, texture_dimensions, texture_target, &texture_id); ASSERT_TRUE(video_frame) << "Failed to create video frame"; int32_t picture_buffer_id = GetNextPictureBufferId(); PictureBuffer::TextureIds texture_ids(1, texture_id); - picture_buffers.emplace_back(picture_buffer_id, dimensions, texture_ids, - texture_ids, texture_target, format); + picture_buffers.emplace_back(picture_buffer_id, texture_dimensions, + texture_ids, texture_ids, texture_target, + format); video_frames_.emplace(picture_buffer_id, std::move(video_frame)); } // The decoder requires an active GL context to allocate memory. decoder_->AssignPictureBuffers(picture_buffers); break; + } default: LOG(ERROR) << "Unsupported output mode " << static_cast<size_t>(output_mode_);
diff --git a/media/gpu/windows/d3d11_copying_texture_wrapper.cc b/media/gpu/windows/d3d11_copying_texture_wrapper.cc index 6b739a8..c919d19 100644 --- a/media/gpu/windows/d3d11_copying_texture_wrapper.cc +++ b/media/gpu/windows/d3d11_copying_texture_wrapper.cc
@@ -8,6 +8,7 @@ #include "gpu/command_buffer/service/mailbox_manager.h" #include "media/gpu/windows/d3d11_com_defs.h" +#include "media/gpu/windows/display_helper.h" namespace media { @@ -88,4 +89,15 @@ return output_texture_wrapper_->Init(std::move(get_helper_cb)); } +void CopyingTexture2DWrapper::SetStreamHDRMetadata( + const HDRMetadata& stream_metadata) { + auto dxgi_stream_metadata = DisplayHelper::HdrMetadataToDXGI(stream_metadata); + video_processor_->SetStreamHDRMetadata(dxgi_stream_metadata); +} + +void CopyingTexture2DWrapper::SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& dxgi_display_metadata) { + video_processor_->SetDisplayHDRMetadata(dxgi_display_metadata); +} + } // namespace media
diff --git a/media/gpu/windows/d3d11_copying_texture_wrapper.h b/media/gpu/windows/d3d11_copying_texture_wrapper.h index 139f318a..12f4d2f 100644 --- a/media/gpu/windows/d3d11_copying_texture_wrapper.h +++ b/media/gpu/windows/d3d11_copying_texture_wrapper.h
@@ -39,6 +39,10 @@ bool Init(GetCommandBufferHelperCB get_helper_cb) override; + void SetStreamHDRMetadata(const HDRMetadata& stream_metadata) override; + void SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& dxgi_display_metadata) override; + private: gfx::Size size_; std::unique_ptr<VideoProcessorProxy> video_processor_;
diff --git a/media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc b/media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc index da1adea3..72da73f 100644 --- a/media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc +++ b/media/gpu/windows/d3d11_copying_texture_wrapper_unittest.cc
@@ -2,12 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <string.h> + #include <utility> #include "base/bind_helpers.h" #include "media/gpu/windows/d3d11_copying_texture_wrapper.h" #include "media/gpu/windows/d3d11_texture_wrapper.h" #include "media/gpu/windows/d3d11_video_processor_proxy.h" +#include "media/gpu/windows/display_helper.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -49,6 +52,16 @@ last_output_color_space_ = color_space; } + void SetStreamHDRMetadata( + const DXGI_HDR_METADATA_HDR10& stream_metadata) override { + last_stream_metadata_ = stream_metadata; + } + + void SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& display_metadata) override { + last_display_metadata_ = display_metadata; + } + HRESULT VideoProcessorBlt(ID3D11VideoProcessorOutputView* output_view, UINT output_frameno, UINT stream_count, @@ -61,9 +74,11 @@ MOCK_METHOD0(MockCreateVideoProcessorInputView, HRESULT()); MOCK_METHOD0(MockVideoProcessorBlt, HRESULT()); - // Most recent arguments to SetStream/OutputColorSpace(). + // Most recent arguments to SetStream/OutputColorSpace()/etc. base::Optional<gfx::ColorSpace> last_stream_color_space_; base::Optional<gfx::ColorSpace> last_output_color_space_; + base::Optional<DXGI_HDR_METADATA_HDR10> last_stream_metadata_; + base::Optional<DXGI_HDR_METADATA_HDR10> last_display_metadata_; }; class MockTexture2DWrapper : public Texture2DWrapper { @@ -87,6 +102,9 @@ MOCK_METHOD0(MockInit, bool()); MOCK_METHOD0(MockProcessTexture, bool()); + MOCK_METHOD1(SetStreamHDRMetadata, void(const HDRMetadata& stream_metadata)); + MOCK_METHOD1(SetDisplayHDRMetadata, + void(const DXGI_HDR_METADATA_HDR10& dxgi_display_metadata)); }; CommandBufferHelperPtr UselessHelper() { @@ -205,4 +223,44 @@ // TODO: verify that these aren't sent multiple times, unless they change. } +TEST_P(D3D11CopyingTexture2DWrapperTest, HDRMetadataIsSentToVideoProcessor) { + HDRMetadata metadata; + metadata.mastering_metadata.primary_r = + MasteringMetadata::Chromaticity(0.1, 0.2); + metadata.mastering_metadata.primary_g = + MasteringMetadata::Chromaticity(0.3, 0.4); + metadata.mastering_metadata.primary_b = + MasteringMetadata::Chromaticity(0.5, 0.6); + metadata.mastering_metadata.white_point = + MasteringMetadata::Chromaticity(0.7, 0.8); + metadata.mastering_metadata.luminance_max = 0.9; + metadata.mastering_metadata.luminance_min = 0.05; + metadata.max_content_light_level = 1000; + metadata.max_frame_average_light_level = 10000; + + auto processor = ExpectProcessorProxy(); + MockVideoProcessorProxy* processor_raw = processor.get(); + auto wrapper = std::make_unique<CopyingTexture2DWrapper>( + gfx::Size(100, 200), ExpectTextureWrapper(), std::move(processor), + nullptr, gfx::ColorSpace::CreateSCRGBLinear()); + + const DXGI_HDR_METADATA_HDR10 dxgi_metadata = + DisplayHelper::HdrMetadataToDXGI(metadata); + + wrapper->SetStreamHDRMetadata(metadata); + EXPECT_TRUE(processor_raw->last_stream_metadata_); + EXPECT_FALSE(processor_raw->last_display_metadata_); + EXPECT_EQ(memcmp(&dxgi_metadata, &(*processor_raw->last_stream_metadata_), + sizeof(dxgi_metadata)), + 0); + processor_raw->last_stream_metadata_.reset(); + + wrapper->SetDisplayHDRMetadata(dxgi_metadata); + EXPECT_FALSE(processor_raw->last_stream_metadata_); + EXPECT_TRUE(processor_raw->last_display_metadata_); + EXPECT_EQ(memcmp(&dxgi_metadata, &(*processor_raw->last_display_metadata_), + sizeof(dxgi_metadata)), + 0); +} + } // namespace media
diff --git a/media/gpu/windows/d3d11_picture_buffer.h b/media/gpu/windows/d3d11_picture_buffer.h index 77c1480..fdc8f6b 100644 --- a/media/gpu/windows/d3d11_picture_buffer.h +++ b/media/gpu/windows/d3d11_picture_buffer.h
@@ -84,6 +84,8 @@ return output_view_; } + Texture2DWrapper* texture_wrapper() const { return texture_wrapper_.get(); } + // Shouldn't be here, but simpler for now. base::TimeDelta timestamp_;
diff --git a/media/gpu/windows/d3d11_texture_wrapper.cc b/media/gpu/windows/d3d11_texture_wrapper.cc index e777c3c..9b5bbaaf 100644 --- a/media/gpu/windows/d3d11_texture_wrapper.cc +++ b/media/gpu/windows/d3d11_texture_wrapper.cc
@@ -127,6 +127,12 @@ textures_per_picture); } +void DefaultTexture2DWrapper::SetStreamHDRMetadata( + const HDRMetadata& stream_metadata) {} + +void DefaultTexture2DWrapper::SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& dxgi_display_metadata) {} + DefaultTexture2DWrapper::GpuResources::GpuResources() {} DefaultTexture2DWrapper::GpuResources::~GpuResources() {
diff --git a/media/gpu/windows/d3d11_texture_wrapper.h b/media/gpu/windows/d3d11_texture_wrapper.h index f7fe065..b321b2d5 100644 --- a/media/gpu/windows/d3d11_texture_wrapper.h +++ b/media/gpu/windows/d3d11_texture_wrapper.h
@@ -12,6 +12,7 @@ #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/texture_manager.h" +#include "media/base/hdr_metadata.h" #include "media/base/status.h" #include "media/base/video_frame.h" #include "media/gpu/command_buffer_helper.h" @@ -50,6 +51,10 @@ const gfx::ColorSpace& input_color_space, MailboxHolderArray* mailbox_dest_out, gfx::ColorSpace* output_color_space) = 0; + + virtual void SetStreamHDRMetadata(const HDRMetadata& stream_metadata) = 0; + virtual void SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& dxgi_display_metadata) = 0; }; // The default texture wrapper that uses GPUResources to talk to hardware @@ -71,6 +76,10 @@ MailboxHolderArray* mailbox_dest, gfx::ColorSpace* output_color_space) override; + void SetStreamHDRMetadata(const HDRMetadata& stream_metadata) override; + void SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& dxgi_display_metadata) override; + private: // Things that are to be accessed / freed only on the main thread. In // addition to setting up the textures to render from a D3D11 texture,
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc index eae07b3..13125176 100644 --- a/media/gpu/windows/d3d11_video_decoder.cc +++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -30,6 +30,7 @@ #include "media/gpu/windows/d3d11_video_context_wrapper.h" #include "media/gpu/windows/d3d11_video_decoder_impl.h" #include "media/gpu/windows/d3d11_video_device_format_support.h" +#include "media/gpu/windows/display_helper.h" #include "media/gpu/windows/supported_profile_helpers.h" #include "media/media_buildflags.h" #include "ui/gl/direct_composition_surface_win.h" @@ -682,6 +683,19 @@ return; } + HDRMetadata stream_metadata; + if (config_.hdr_metadata()) + stream_metadata = *config_.hdr_metadata(); + // else leave |stream_metadata| default-initialized. We might use it anyway. + + base::Optional<DXGI_HDR_METADATA_HDR10> display_metadata; + if (decoder_configurator_->TextureFormat() == DXGI_FORMAT_P010) { + // For HDR formats, try to get the display metadata. This may fail, which + // is okay. We'll just skip sending the metadata. + DisplayHelper display_helper(device_); + display_metadata = display_helper.GetDisplayMetadata(); + } + // Drop any old pictures. for (auto& buffer : picture_buffers_) DCHECK(!buffer->in_picture_use()); @@ -704,6 +718,20 @@ NotifyError("Unable to allocate PictureBuffer"); return; } + + // If we have display metadata, then tell the processor. Note that the + // order of these calls is important, and we must set the display metadata + // if we set the stream metadata, else it can crash on some AMD cards. + if (display_metadata) { + if (config_.hdr_metadata() || + gpu_workarounds_.use_empty_video_hdr_metadata) { + // It's okay if this has an empty-initialized metadata. + picture_buffers_[i]->texture_wrapper()->SetStreamHDRMetadata( + stream_metadata); + } + picture_buffers_[i]->texture_wrapper()->SetDisplayHDRMetadata( + *display_metadata); + } } }
diff --git a/media/gpu/windows/d3d11_video_processor_proxy.cc b/media/gpu/windows/d3d11_video_processor_proxy.cc index 74341290..2799986 100644 --- a/media/gpu/windows/d3d11_video_processor_proxy.cc +++ b/media/gpu/windows/d3d11_video_processor_proxy.cc
@@ -98,6 +98,29 @@ } } +void VideoProcessorProxy::SetStreamHDRMetadata( + const DXGI_HDR_METADATA_HDR10& stream_metadata) { + ComD3D11VideoContext2 video_context2; + if (FAILED(video_context_.As(&video_context2))) + return; + + // TODO: we shouldn't do this unless we also set the display metadata. + video_context2->VideoProcessorSetOutputHDRMetaData( + video_processor_.Get(), DXGI_HDR_METADATA_TYPE_HDR10, + sizeof(stream_metadata), &stream_metadata); +} + +void VideoProcessorProxy::SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& display_metadata) { + ComD3D11VideoContext2 video_context2; + if (FAILED(video_context_.As(&video_context2))) + return; + + video_context2->VideoProcessorSetOutputHDRMetaData( + video_processor_.Get(), DXGI_HDR_METADATA_TYPE_HDR10, + sizeof(display_metadata), &display_metadata); +} + HRESULT VideoProcessorProxy::VideoProcessorBlt( ID3D11VideoProcessorOutputView* output_view, UINT output_frameno,
diff --git a/media/gpu/windows/d3d11_video_processor_proxy.h b/media/gpu/windows/d3d11_video_processor_proxy.h index a6eece0..1e5679a 100644 --- a/media/gpu/windows/d3d11_video_processor_proxy.h +++ b/media/gpu/windows/d3d11_video_processor_proxy.h
@@ -9,6 +9,7 @@ #include <wrl/client.h> #include <cstdint> +#include "media/base/hdr_metadata.h" #include "media/gpu/media_gpu_export.h" #include "media/gpu/windows/d3d11_com_defs.h" #include "ui/gfx/color_space.h" @@ -43,6 +44,13 @@ // Configure the output color space on the video context. virtual void SetOutputColorSpace(const gfx::ColorSpace& color_space); + // Set the stream / display metadata. Optional, and may silently do nothing + // if it's not supported. + virtual void SetStreamHDRMetadata( + const DXGI_HDR_METADATA_HDR10& stream_metadata); + virtual void SetDisplayHDRMetadata( + const DXGI_HDR_METADATA_HDR10& display_metadata); + virtual HRESULT VideoProcessorBlt(ID3D11VideoProcessorOutputView* output_view, UINT output_frameno, UINT stream_count,
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc index 910f378..1628f674 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -756,4 +756,4 @@ output_sample_.Reset(); } -} // namespace content +} // namespace media
diff --git a/media/media_options.gni b/media/media_options.gni index b012730..22494a60 100644 --- a/media/media_options.gni +++ b/media/media_options.gni
@@ -158,16 +158,6 @@ (is_linux && !is_chromecast) || is_mac || is_win || is_fuchsia declare_args() { - # Experiment to enable mojo media services (e.g. "renderer", "cdm", see - # |mojo_media_services|). When enabled, selected mojo paths will be enabled in - # the media pipeline and corresponding services will hosted in the selected - # remote process (e.g. "utility" process, see |mojo_media_host|). - # This is explicitly disabled for Fuchsia. - enable_mojo_media = - !is_fuchsia && - (is_android || is_chromeos || is_mac || is_win || enable_library_cdms || - (is_desktop_linux && use_vaapi) || is_chromecast) - # When enabled, this feature allows developers to use a runtime flag to # choose the implementation of the renderer that is used. On a build which # enables the mojo renderer, if --disable-mojo-renderer is passed at start-up, @@ -196,60 +186,48 @@ enable_cdm_proxy = false } -# This feature can only be enabled when using Mojo media. Furthermore, the -# "renderer" service must be enabled, which is asserted in -# //media/mojo/services/BUILD.gn -assert( - !enable_runtime_media_renderer_selection || enable_mojo_media, - "Runtime media renderer selection only applies when mojo media is enabled.") - assert(!enable_cdm_host_verification || is_mac || is_win, "CDM host verification is only supported on Mac and Windows.") assert(enable_library_cdms || !enable_cdm_proxy, "CDM Proxy should only be enabled when library CDM is enabled.") +# Default |mojo_media_services| and |mojo_media_host| on various platforms. See +# comments below for valid values. Can be overridden by gn build arguments from +# the --args command line flag. _default_mojo_media_services = [] -_default_mojo_media_host = "none" +_default_mojo_media_host = "" -# Default mojo_media_services and mojo_media_host on various platforms. -# Can be overridden by gn build arguments from the --args command line flag -# for local testing. -if (enable_mojo_media) { - if (is_chromecast) { - _default_mojo_media_services = cast_mojo_media_services - _default_mojo_media_host = cast_mojo_media_host - } else if (is_android) { - _default_mojo_media_services = [ - "cdm", - "audio_decoder", - "video_decoder", - ] - _default_mojo_media_host = "gpu" - } else if (is_chromeos || is_mac || is_win || - (is_desktop_linux && use_vaapi)) { - _default_mojo_media_services = [ "video_decoder" ] - _default_mojo_media_host = "gpu" - } - - if (enable_library_cdms) { - _default_mojo_media_services += [ "cdm" ] - - # Having a CDM running means it could require a CdmProxy running in the GPU - # process. - assert( - _default_mojo_media_host == "none" || _default_mojo_media_host == "gpu", - "For now, mojo_media_host should not overwrite it with a different " + - "value if it has been set.") - _default_mojo_media_host = "gpu" - } +if (is_chromecast) { + _default_mojo_media_services = cast_mojo_media_services + _default_mojo_media_host = cast_mojo_media_host +} else if (is_android) { + _default_mojo_media_services = [ + "cdm", + "audio_decoder", + "video_decoder", + ] + _default_mojo_media_host = "gpu" +} else if (is_chromeos || is_mac || is_win || (is_desktop_linux && use_vaapi)) { + _default_mojo_media_services = [ "video_decoder" ] + _default_mojo_media_host = "gpu" } -# Use another declare_args() to pick up possible overrides of enable_mojo_media -# from --args command line flags. See "gn help declare_args". +# On Fuchsia, this is only enabled to build libclearkeycdm.so, the mojo CDM +# service is not used. +if (enable_library_cdms && !is_fuchsia) { + _default_mojo_media_services += [ "cdm" ] + + # Having a CDM running means it could require a CdmProxy running in the GPU + # process. + assert(_default_mojo_media_host == "" || _default_mojo_media_host == "gpu", + "For now, mojo_media_host should not overwrite it with a different " + + "value if it has been set.") + _default_mojo_media_host = "gpu" +} + declare_args() { # A list of mojo media services that should be used in the media pipeline. - # Must not be empty if |enable_mojo_media| is true. # Valid entries in the list are: # - "renderer": Use mojo-based media Renderer service. # - "cdm": Use mojo-based Content Decryption Module. @@ -266,10 +244,10 @@ # |mojo_media_services| still run in the MediaService in the process specified # by "mojo_media_host". # Valid options are: - # - "none": Do not use mojo media service. # - "browser": Use mojo media service hosted in the browser process. # - "gpu": Use mojo media service hosted in the gpu process. # - "utility": Use mojo media service hosted in the utility process. + # - "": Do not use mojo media service. mojo_media_host = _default_mojo_media_host }
diff --git a/media/mojo/BUILD.gn b/media/mojo/BUILD.gn index b46ad33..7005cfb 100644 --- a/media/mojo/BUILD.gn +++ b/media/mojo/BUILD.gn
@@ -18,39 +18,32 @@ enable_mojo_media_in_gpu_process = false enable_mojo_media_in_utility_process = false - if (!enable_mojo_media) { - assert(mojo_media_services == [], "Mojo media is not enabled") - assert(mojo_media_host == "none", "Mojo media is not enabled") - } else { - assert(mojo_media_services != [], "No mojo media service specified") - foreach(service, mojo_media_services) { - if (service == "renderer") { - enable_mojo_renderer = true - } else if (service == "cdm") { - enable_mojo_cdm = true - } else if (service == "audio_decoder") { - enable_mojo_audio_decoder = true - } else if (service == "video_decoder") { - enable_mojo_video_decoder = true - } else { - assert(false, "Invalid mojo media service: $service") - } - } - - if (mojo_media_host == "browser") { - enable_mojo_media_in_browser_process = true - } else if (mojo_media_host == "gpu") { - enable_mojo_media_in_gpu_process = true - } else if (mojo_media_host == "utility") { - enable_mojo_media_in_utility_process = true + foreach(service, mojo_media_services) { + if (service == "renderer") { + enable_mojo_renderer = true + } else if (service == "cdm") { + enable_mojo_cdm = true + } else if (service == "audio_decoder") { + enable_mojo_audio_decoder = true + } else if (service == "video_decoder") { + enable_mojo_video_decoder = true } else { - assert(false, "Invalid mojo media host: $mojo_media_host") + assert(false, "Invalid mojo media service: $service") } } + if (mojo_media_host == "browser") { + enable_mojo_media_in_browser_process = true + } else if (mojo_media_host == "gpu") { + enable_mojo_media_in_gpu_process = true + } else if (mojo_media_host == "utility") { + enable_mojo_media_in_utility_process = true + } else if (mojo_media_host != "") { + assert(false, "Invalid mojo media host: $mojo_media_host") + } + flags = [ "ENABLE_CAST_RENDERER=$enable_cast_renderer", - "ENABLE_MOJO_MEDIA=$enable_mojo_media", "ENABLE_MOJO_RENDERER=$enable_mojo_renderer", "ENABLE_MOJO_CDM=$enable_mojo_cdm", "ENABLE_MOJO_AUDIO_DECODER=$enable_mojo_audio_decoder",
diff --git a/media/mojo/README.md b/media/mojo/README.md index 8ed718d..bf6c42f 100644 --- a/media/mojo/README.md +++ b/media/mojo/README.md
@@ -62,10 +62,8 @@ following gn arguments, the media pipeline will enable `MojoRenderer` and `MojoCdm`: ``` -enable_mojo_media = true mojo_media_services = ["renderer", "cdm"] ``` -Note that you must set `enable_mojo_media` first. ### Media Mojo Interface Factory
diff --git a/media/renderers/yuv_util.cc b/media/renderers/yuv_util.cc index b8f70ee62..b34ad270 100644 --- a/media/renderers/yuv_util.cc +++ b/media/renderers/yuv_util.cc
@@ -31,10 +31,8 @@ gpu::raster::RasterInterface* ri = raster_context_provider->RasterInterface(); DCHECK(ri); - // TODO(bsalomon): Use GL_RGB8 once Skia supports it. - // skbug.com/7533 GrGLenum skia_texture_format = - video_frame->format() == PIXEL_FORMAT_NV12 ? GL_RGBA8 : GL_R8_EXT; + video_frame->format() == PIXEL_FORMAT_NV12 ? GL_RGB8 : GL_R8_EXT; for (size_t i = 0; i < video_frame->NumTextures(); ++i) { // Get the texture from the mailbox and wrap it in a GrTexture. const gpu::MailboxHolder& mailbox_holder = video_frame->mailbox_holder(i);
diff --git a/media/test/data/decode_capabilities_test.html b/media/test/data/decode_capabilities_test.html index b638a6f..34518e85 100644 --- a/media/test/data/decode_capabilities_test.html +++ b/media/test/data/decode_capabilities_test.html
@@ -84,4 +84,64 @@ runTest(configuration); } + + function testVideoConfigWithHdrMetadata(hdrMetadataType, + colorGamut, + transferFunction, + queryType, + contentType) { + // Clear previous test result from title. + document.title = ''; + + log("Testing video content type: " + contentType + + ", HDR metadata type: " + hdrMetadataType + + ", color gamut: " + colorGamut + + ", transfer function: " + transferFunction); + + const configuration = { + type : queryType, + video : { + contentType : contentType, + hdrMetadataType : hdrMetadataType, + colorGamut : colorGamut, + transferFunction : transferFunction, + // Any reasonable value will do. + width : 640, + height : 480, + bitrate : 10000, + framerate : 30 + } + }; + + runTest(configuration); + } + + function testVideoConfigWithoutHdrMetadata(colorGamut, + transferFunction, + queryType, + contentType) { + // Clear previous test result from title. + document.title = ''; + + log("Testing video content type: " + contentType + + ", color gamut: " + colorGamut + + ", transfer function: " + transferFunction); + + const configuration = { + type : queryType, + video : { + contentType : contentType, + colorGamut : colorGamut, + transferFunction : transferFunction, + + // Any reasonable value will do. + width : 640, + height : 480, + bitrate : 10000, + framerate : 30 + } + }; + + runTest(configuration); + } </script>
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni index 38a0b32..414c1d1 100644 --- a/mojo/public/tools/bindings/mojom.gni +++ b/mojo/public/tools/bindings/mojom.gni
@@ -524,12 +524,10 @@ } } - target_sources_list = "$target_gen_dir/$target_name.sources_list" sources_list = [] if (defined(invoker.sources)) { sources_list = invoker.sources } - write_file(target_sources_list, sources_list) # Listed sources may be relative to the current target dir, or they may be # absolute paths, including paths to generated mojom files. While those are @@ -590,16 +588,18 @@ } } - # a target implicitly depends on its own sources - deps_sources = [ rebase_path(target_sources_list, root_build_dir) ] - foreach(d, all_deps) { - dep_dir = get_label_info("$d", "target_gen_dir") - dep_short_name = get_label_info("$d", "name") - deps_sources += - [ rebase_path("$dep_dir/$dep_short_name.sources_list", root_build_dir) ] + build_metadata_filename = "$target_gen_dir/$target_name.build_metadata" + build_metadata = { } - - write_file("$target_gen_dir/$target_name.deps_sources_list", deps_sources) + build_metadata.sources = rebase_path(sources_list) + build_metadata.deps = [] + foreach(dep, all_deps) { + dep_target_gen_dir = get_label_info(dep, "target_gen_dir") + dep_name = get_label_info(dep, "name") + build_metadata.deps += + [ rebase_path("$dep_target_gen_dir/$dep_name.build_metadata") ] + } + write_file(build_metadata_filename, build_metadata, "json") generate_fuzzing = (!defined(invoker.enable_fuzzing) || invoker.enable_fuzzing) && @@ -646,7 +646,7 @@ action(parser_target_name) { script = mojom_parser_script - inputs = mojom_parser_sources + inputs = mojom_parser_sources + [ build_metadata_filename ] sources = sources_list deps = parser_deps outputs = [] @@ -674,6 +674,9 @@ rebase_path(root_gen_dir), "--mojom-file-list={{response_file_name}}", + + "--check-imports", + rebase_path(build_metadata_filename), ] foreach(enabled_feature, enabled_features) { @@ -685,47 +688,6 @@ } } - if (sources_list != []) { - verify_deps_target_names = [] - verify_deps_target_name = "${target_name}__verify_deps" - verify_deps_target_names += [ ":$verify_deps_target_name" ] - mojom_target_name = target_name - - action(verify_deps_target_name) { - script = mojom_generator_script - inputs = mojom_generator_sources + jinja2_sources - sources = sources_list - deps = [ ":$parser_target_name" ] - if (defined(invoker.parser_deps)) { - deps += invoker.parser_deps - } - outputs = [] - filelist = [] - foreach(source, sources_list) { - filelist += [ rebase_path(source, root_build_dir) ] - } - foreach(base_path, output_file_base_paths) { - filename = get_path_info(base_path, "name") - dirname = get_path_info(base_path, "dir") - outputs += [ "$root_gen_dir/$dirname/$filename.v" ] - } - - response_file_contents = filelist - - args = [ - "-o", - rebase_path(root_gen_dir, root_build_dir), - "verify", - "--filelist={{response_file_name}}", - "-f", - rebase_path("$target_gen_dir/$mojom_target_name.deps_sources_list", - root_build_dir), - "--depth", - rebase_path("//", root_build_dir), - ] - } - } - generator_cpp_message_ids_target_name = "${target_name}__generate_message_ids" # Generate code that is shared by different variants. @@ -837,9 +799,9 @@ inputs = mojom_generator_sources + jinja2_sources sources = sources_list deps = [ - ":$parser_target_name", - "//mojo/public/tools/bindings:precompile_templates", - ] + verify_deps_target_names + ":$parser_target_name", + "//mojo/public/tools/bindings:precompile_templates", + ] if (defined(invoker.parser_deps)) { deps += invoker.parser_deps } @@ -1097,10 +1059,10 @@ inputs = mojom_generator_sources + jinja2_sources sources = sources_list deps = [ - ":$parser_target_name", - ":$type_mappings_target_name", - "//mojo/public/tools/bindings:precompile_templates", - ] + verify_deps_target_names + ":$parser_target_name", + ":$type_mappings_target_name", + "//mojo/public/tools/bindings:precompile_templates", + ] if (defined(invoker.parser_deps)) { deps += invoker.parser_deps } @@ -1438,10 +1400,10 @@ inputs = mojom_generator_sources + jinja2_sources sources = sources_list deps = [ - ":$parser_target_name", - ":$type_mappings_target_name", - "//mojo/public/tools/bindings:precompile_templates", - ] + verify_deps_target_names + ":$parser_target_name", + ":$type_mappings_target_name", + "//mojo/public/tools/bindings:precompile_templates", + ] outputs = [] args = common_generator_args filelist = [] @@ -1535,9 +1497,9 @@ inputs = mojom_generator_sources + jinja2_sources sources = sources_list deps = [ - ":$parser_target_name", - "//mojo/public/tools/bindings:precompile_templates", - ] + verify_deps_target_names + ":$parser_target_name", + "//mojo/public/tools/bindings:precompile_templates", + ] if (defined(invoker.parser_deps)) { deps += invoker.parser_deps } @@ -1699,9 +1661,9 @@ inputs = mojom_generator_sources + jinja2_sources sources = sources_list deps = [ - ":$parser_target_name", - "//mojo/public/tools/bindings:precompile_templates", - ] + verify_deps_target_names + ":$parser_target_name", + "//mojo/public/tools/bindings:precompile_templates", + ] outputs = ts_outputs args = common_generator_args response_file_contents = source_filelist
diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py index 212039b1..e63de42 100755 --- a/mojo/public/tools/bindings/mojom_bindings_generator.py +++ b/mojo/public/tools/bindings/mojom_bindings_generator.py
@@ -253,62 +253,6 @@ template_expander.PrecompileTemplates(generator_modules, args.output_dir) return 0 -def GetSourcesList(target_prefix, sources_list, gen_dir): - deps_list_path = target_prefix + ".deps_sources_list" - f_deps_list = open(deps_list_path, 'r') - for deps_sources_path in f_deps_list: - target_name_with_dir = deps_sources_path.split(".sources_list")[0] - if (target_name_with_dir == target_prefix): - # add files from the target itself - deps_sources_path = deps_sources_path.rstrip('\n') - f_sources = open(deps_sources_path, 'r') - for source_file in f_sources: - full_source_path = os.path.dirname(target_name_with_dir.split(gen_dir \ - + "/", 1)[1]) + "/" + source_file - sources_list.add(full_source_path.rstrip('\n')) - else: - # recurse into target's dependencies to get their lists of files - sources_list = GetSourcesList(target_name_with_dir, sources_list, gen_dir) - return sources_list - -def _VerifyImportDeps(args, __): - fileutil.EnsureDirectoryExists(args.output_dir) - - if args.filelist: - with open(args.filelist) as f: - args.filename.extend(f.read().split()) - - for filename in args.filename: - rel_path = RelativePath(filename, args.depth, args.output_dir) - module_path = _GetModulePath(rel_path, args.output_dir) - with open(module_path, 'rb') as f: - module = Module.Load(f) - mojom_imports = set(imp.path for imp in module.imports) - - sources = set() - - target_prefix = args.deps_file.split(".deps_sources_list")[0] - sources = GetSourcesList(target_prefix, sources, args.output_dir) - - if (not sources.issuperset(mojom_imports)): - target_name = target_prefix.rsplit("/", 1)[1] - target_prefix_without_gen_dir = target_prefix.split( - args.output_dir + "/", 1)[1] - full_target_name = "//" + target_prefix_without_gen_dir.rsplit( - "/", 1)[0] + ":" + target_name - - print(">>> File \"%s\"" % filename) - print(">>> from target \"%s\"" % full_target_name) - print(">>> is missing dependencies for the following imports:\n%s" % list( - mojom_imports.difference(sources))) - sys.exit(1) - - source_filename, _ = os.path.splitext(rel_path.relative_path()) - output_file = source_filename + '.v' - output_file_path = os.path.join(args.output_dir, output_file) - WriteFile("", output_file_path) - - return 0 def main(): parser = argparse.ArgumentParser( @@ -426,20 +370,6 @@ description="Precompile templates for the mojom bindings generator.") precompile_parser.set_defaults(func=_Precompile) - verify_parser = subparsers.add_parser("verify", description="Checks " - "the set of imports against the set of dependencies.") - verify_parser.add_argument("filename", nargs="*", - help="mojom input file") - verify_parser.add_argument("--filelist", help="mojom input file list") - verify_parser.add_argument("-f", "--file", dest="deps_file", - help="file containing paths to the sources files for " - "dependencies") - verify_parser.add_argument( - "-d", "--depth", dest="depth", - help="depth from source root") - - verify_parser.set_defaults(func=_VerifyImportDeps) - args, remaining_args = parser.parse_known_args() return args.func(args, remaining_args)
diff --git a/mojo/public/tools/mojom/mojom_parser.py b/mojo/public/tools/mojom/mojom_parser.py index 8895482..9016c71c 100755 --- a/mojo/public/tools/mojom/mojom_parser.py +++ b/mojo/public/tools/mojom/mojom_parser.py
@@ -12,6 +12,7 @@ import argparse import errno +import json import os import os.path import sys @@ -137,8 +138,28 @@ asts[mojom_abspath], module_path, imports) -def ParseMojoms(mojom_files, input_root_paths, output_root_path, - enabled_features): +def _CollectAllowedImportsFromBuildMetadata(build_metadata_filename): + allowed_imports = set() + processed_deps = set() + + def collect(metadata_filename): + processed_deps.add(metadata_filename) + with open(metadata_filename) as f: + metadata = json.load(f) + allowed_imports.update(map(os.path.normpath, metadata['sources'])) + for dep_metadata in metadata['deps']: + if dep_metadata not in processed_deps: + collect(dep_metadata) + + collect(build_metadata_filename) + return allowed_imports + + +def _ParseMojoms(mojom_files, + input_root_paths, + output_root_path, + enabled_features, + allowed_imports=None): """Parses a set of mojom files and produces serialized module outputs. Args: @@ -159,6 +180,9 @@ Upon completion, a mojom-module file will be saved for each input mojom. """ + assert input_root_paths + assert output_root_path + loaded_mojom_asts = {} loaded_modules = {} input_dependencies = defaultdict(set) @@ -172,9 +196,13 @@ ast = parser.Parse(''.join(f.readlines()), mojom_abspath) conditional_features.RemoveDisabledDefinitions(ast, enabled_features) loaded_mojom_asts[mojom_abspath] = ast + invalid_imports = [] for imp in ast.import_list: import_abspath = _ResolveRelativeImportPath(imp.import_filename, input_root_paths) + if allowed_imports and import_abspath not in allowed_imports: + invalid_imports.append(imp.import_filename) + abs_paths[imp.import_filename] = import_abspath if import_abspath in mojom_files_to_parse: # This import is in the input list, so we're going to translate it @@ -193,6 +221,13 @@ with open(module_abspath, 'rb') as module_file: loaded_modules[import_abspath] = module.Module.Load(module_file) + if invalid_imports: + raise ValueError( + '\nThe file %s imports the following files not allowed by build ' + 'dependencies:\n\n%s\n' % (mojom_abspath, + '\n'.join(invalid_imports))) + + # At this point all transitive imports not listed as inputs have been loaded # and we have a complete dependency tree of the unprocessed inputs. Now we can # load all the inputs, resolving dependencies among them recursively as we go. @@ -221,7 +256,7 @@ loaded_modules[mojom_abspath].Dump(f) -def main(): +def Run(command_line): arg_parser = argparse.ArgumentParser( description=""" Parses one or more mojom files and produces corresponding module outputs fully @@ -282,8 +317,22 @@ 'tagged with an [EnableIf=FEATURE] attribute. If this flag is not ' 'provided for a given FEATURE, such tagged elements are discarded by the ' 'parser and will not be present in the compiled output.') + arg_parser.add_argument( + '--check-imports', + dest='build_metadata_filename', + action='store', + metavar='METADATA_FILENAME', + help='Instructs the parser to check imports against a set of allowed ' + 'imports. Allowed imports are based on build metadata within ' + 'METADATA_FILENAME. This is a JSON file with a `sources` key listing ' + 'paths to the set of input mojom files being processed by this parser ' + 'run, and a `deps` key listing paths to metadata files for any ' + 'dependencies of these inputs. This feature can be used to implement ' + 'build-time dependency checking for mojom imports, where each build ' + 'metadata file corresponds to a build target in the dependency graph of ' + 'a typical build system.') - args, _ = arg_parser.parse_known_args() + args, _ = arg_parser.parse_known_args(command_line) if args.mojom_file_list: with open(args.mojom_file_list) as f: args.mojom_files.extend(f.read().split()) @@ -292,11 +341,19 @@ raise ValueError( 'Must list at least one mojom file via --mojoms or --mojom-file-list') - ParseMojoms( - list(map(os.path.abspath, args.mojom_files)), - list(map(os.path.abspath, args.input_root_paths)), - os.path.abspath(args.output_root_path), args.enabled_features) + mojom_files = list(map(os.path.abspath, args.mojom_files)) + input_roots = list(map(os.path.abspath, args.input_root_paths)) + output_root = os.path.abspath(args.output_root_path) + + if args.build_metadata_filename: + allowed_imports = _CollectAllowedImportsFromBuildMetadata( + args.build_metadata_filename) + else: + allowed_imports = None + + _ParseMojoms(mojom_files, input_roots, output_root, args.enabled_features, + allowed_imports) if __name__ == '__main__': - main() + Run(sys.argv[1:])
diff --git a/mojo/public/tools/mojom/mojom_parser_unittest.py b/mojo/public/tools/mojom/mojom_parser_unittest.py index 7a4ea54e6..9aa655d 100755 --- a/mojo/public/tools/mojom/mojom_parser_unittest.py +++ b/mojo/public/tools/mojom/mojom_parser_unittest.py
@@ -3,6 +3,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import json import os import os.path import shutil @@ -50,12 +51,16 @@ with open(self.GetModulePath(mojom_path), 'rb') as f: return module.Module.Load(f) - def ParseMojoms(self, mojoms): + def ParseMojoms(self, mojoms, metadata=None): """Parse all input mojoms relative the temp dir.""" out_dir = self.GetPath('out') - mojom_parser.ParseMojoms( - map(lambda mojom: os.path.join(self._temp_dir, mojom), mojoms), - [self._temp_dir, out_dir], out_dir, []) + args = [ + '--input-root', self._temp_dir, '--input-root', out_dir, + '--output-root', out_dir, '--mojoms' + ] + list(map(lambda mojom: os.path.join(self._temp_dir, mojom), mojoms)) + if metadata: + args.extend(['--check-imports', self.GetPath(metadata)]) + mojom_parser.Run(args) def testBasicParse(self): """Basic test to verify that we can parse a mojom file and get a module.""" @@ -155,3 +160,64 @@ # b.mojom here. with self.assertRaisesRegexp(ValueError, "does not exist"): self.ParseMojoms([b]) + + def testCheckImportsBasic(self): + """Verify that the parser can handle --check-imports with a valid set of + inputs, including support for transitive dependency resolution.""" + a = 'a.mojom' + a_metadata = 'out/a.build_metadata' + b = 'b.mojom' + b_metadata = 'out/b.build_metadata' + c = 'c.mojom' + c_metadata = 'out/c.build_metadata' + self.WriteFile(a_metadata, + '{"sources": ["%s"], "deps": []}\n' % self.GetPath(a)) + self.WriteFile( + b_metadata, + '{"sources": ["%s"], "deps": ["%s"]}\n' % (self.GetPath(b), + self.GetPath(a_metadata))) + self.WriteFile( + c_metadata, + '{"sources": ["%s"], "deps": ["%s"]}\n' % (self.GetPath(c), + self.GetPath(b_metadata))) + self.WriteFile(a, """\ + module a; + struct Bar {};""") + self.WriteFile( + b, """\ + module b; + import "a.mojom"; + struct Foo { a.Bar bar; };""") + self.WriteFile( + c, """\ + module c; + import "a.mojom"; + import "b.mojom"; + struct Baz { b.Foo foo; };""") + self.ParseMojoms([a], metadata=a_metadata) + self.ParseMojoms([b], metadata=b_metadata) + self.ParseMojoms([c], metadata=c_metadata) + + def testCheckImportsMissing(self): + """Verify that the parser rejects valid input mojoms when imports don't + agree with build metadata given via --check-imports.""" + a = 'a.mojom' + a_metadata = 'out/a.build_metadata' + b = 'b.mojom' + b_metadata = 'out/b.build_metadata' + self.WriteFile(a_metadata, + '{"sources": ["%s"], "deps": []}\n' % self.GetPath(a)) + self.WriteFile(b_metadata, + '{"sources": ["%s"], "deps": []}\n' % self.GetPath(b)) + self.WriteFile(a, """\ + module a; + struct Bar {};""") + self.WriteFile( + b, """\ + module b; + import "a.mojom"; + struct Foo { a.Bar bar; };""") + + self.ParseMojoms([a], metadata=a_metadata) + with self.assertRaisesRegexp(ValueError, "not allowed by build"): + self.ParseMojoms([b], metadata=b_metadata)
diff --git a/net/cookies/site_for_cookies.cc b/net/cookies/site_for_cookies.cc index 8c152a6..c9c28c1 100644 --- a/net/cookies/site_for_cookies.cc +++ b/net/cookies/site_for_cookies.cc
@@ -70,7 +70,7 @@ } bool SiteForCookies::IsFirstParty(const GURL& url) const { - if (scheme_.empty() || !url.is_valid()) + if (IsNull() || !url.is_valid()) return false; std::string other_registrable_domain = RegistrableDomainOrHost(url.host()); @@ -82,8 +82,8 @@ } bool SiteForCookies::IsEquivalent(const SiteForCookies& other) const { - if (scheme_.empty()) - return other.scheme_.empty(); + if (IsNull()) + return other.IsNull(); if (registrable_domain_.empty()) return other.registrable_domain_.empty() && (scheme_ == other.scheme_); @@ -92,7 +92,7 @@ } GURL SiteForCookies::RepresentativeUrl() const { - if (scheme_.empty()) + if (IsNull()) return GURL(); GURL result(base::StrCat({scheme_, "://", registrable_domain_, "/"})); DCHECK(result.is_valid());
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 5de114f..9aa418d2 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -10300,7 +10300,6 @@ { "name": "xn--3lqp21gwna.xn--fiqz9s", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xn--79q87uvkclvgd56ahq5a.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xn--pbt947am3ab71g.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "xnode.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xoffy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xrockx.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "xsmobile.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -11703,7 +11702,6 @@ { "name": "hengelsportdeal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "herds.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "herringsresidence.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, - { "name": "hexed.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "heywoodtown.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hiddenrefuge.eu.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, { "name": "hiitcentre.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true }, @@ -78650,7 +78648,6 @@ { "name": "helkyn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hella-secure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "herd-kaufen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hgyoseo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "highclasseducation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "holacannx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "holacbdoils.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -89366,7 +89363,6 @@ { "name": "glosiko.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "glosiko.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goldenyacca.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "gomu.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goodcreds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "goplango.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "gossiplolly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -90869,7 +90865,6 @@ { "name": "66lc8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6lc8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "6thmarch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "70mpg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7139365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "74d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "7ki.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -91449,7 +91444,6 @@ { "name": "iemsamex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ifashionable.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iganesh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ikemedia.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ikhwanto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ilawgix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ilovehoney.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -91472,7 +91466,6 @@ { "name": "inseo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "inzichtmeditatie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ipmscoutek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "ireta.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "islamqa.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "istogether.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "itmix.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -91500,7 +91493,6 @@ { "name": "jewelleryrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jewelryweluv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jg078.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "jkuu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jmussman.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johnbeil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "johnopdenakker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -107421,6 +107413,559 @@ { "name": "zeromoment.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zh.fyi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zz204.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "0x5d.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "166zzz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "1fax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2fdelivery.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "2me.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3commas.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3niu888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "4voip.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "50.gy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "528sss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "557bbb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "722sss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "795sss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "840.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "991ccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aaflalo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abeshultz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "abzarweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "acolicy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advancedroofingmuskoka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ae86m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agasaya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airbnbcupom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akapumkin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akirazu.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aknastore.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alfredetnestor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "altcoinandme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ameri-drain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "americanenergysystemswa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andreae.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "annebacarat.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anteroleppanen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anunciosbolivia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apiida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apimoveisorocaba.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "archeologiegorinchem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "archmacro.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asgardsuper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asttuchaud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atpeacerealty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "austinbestdjs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "automotiveunlimited.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "av-th.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avcilarescort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avoinna24.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "badaa.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bailleux.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baobaoquming.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barzallof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "basanakia.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "basllp.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bccog7.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beaquarium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "berchtesgaden-hilft.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigskywaterheaters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigtexasbeerfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitcoin-youtube.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blackbbwvideos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blueberrywinery.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluheron.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "borza.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bosiquanao.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bostonprocleaning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boticadiservicio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "botikadiservisio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bougerpourmasante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boundless-designs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brazilhealth.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "breteuilcommerceartisanat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brexitmart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bride.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "butlerdisposal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "camshowhive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "camshowplace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "canibeoutside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "capctury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "careersngr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cariocabelos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cass.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cazadordebuenaonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centraldelbebe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centreparkhistoricdistrict.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "centurion-meet.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cesarloaiciga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cetis.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cges.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cgl.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "charlesbordet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "charolopezatelier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chataumateje.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cheng.pet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chiasepremium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chocolatebelga.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "christianvanos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "civil-works-sri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cl-brands.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clevyrcares.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clevyrlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "click4click.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clinicasesteticas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudmyhome.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudmyhome.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudmyhome.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codetrack.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coinnewsspan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coletrain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colorbitor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "commaschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "computersforlearning.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "confirmit.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "confirmit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "connectedbynexus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "covid19resilience.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "covid19scotland.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cp061.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cpanels.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cpshr.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crafterbase.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crossfw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crystalmusic-chat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "csharp.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cuisine-ultime.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dd152.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ddw.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demarit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "den.taxi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dhammacitta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digino.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dimigo.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ditudo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dj-phil.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dlrg-cux-ohz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doctorebonie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dogespeed.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dogespeed.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dogespeed.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dogespeed.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domofon.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dontkeylog.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drawguess.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drone33.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ds-hostingsolutions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dsiteam.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dutchwaredesign.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dwell.property", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecaa.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edufrog.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "egt.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elephantstone.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eletricista.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eliasfox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elliottbernstein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emergenzaduepuntozero.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emilstahl.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "english-biography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enoxhzwh.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ensaladasvinagreta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ephraim-medical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "equipamentosparapostos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erichoins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erkkiaronen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "erulezz.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ethernia.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "etindustries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eve.pub", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exaduosport.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exclusivityglobal.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expectation.management", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "extienso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eyeshield-informatique.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "f1iran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fabian-zoske.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fabricadeobsequiosimpresores.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "facan-godollo.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "faulkner2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "faysalabdi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fcpn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fileho.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "filipposalvioni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fishystuff.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flagipanstw.info.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flexussolucoes.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flubio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fluidbb.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fotopianka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fox-zulu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "friherrsindemarit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fulltextarchive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fusionauth.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fyllehack.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gbsapri.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geekgirltech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gethyas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gilloteaux.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gitgud.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "givemeaverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glitter-graphics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glxnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gmmarine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "godles.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gofobo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "golosinascbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "golternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "govsales.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grast.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greatlms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greekpistols.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greencontrol.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gripcoat.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gruasiturra.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gruasllanos.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guardedbox.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gyengus.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hablemosclaro.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hakon.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hamada-syoji.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hanbin.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hannehovi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hardware.info.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hasilkeluaransgp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heikkileivonen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heleus.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heleus.photo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hesbenergie.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hgyo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hibrid-turf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "highqappliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hillcrestplumber.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "homeostase.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "honey-tr.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "honggian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hoodcouture-shop.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "horstmanshof.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hostatic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "howinsider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hst.tc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "htmtools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hubtrinova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyperaonline.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ibuildings.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "idioumarou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "idstudio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iesucreipi.edu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ilovecheesedip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "impartesco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imprensaglobal.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inquisition.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "internetprofitspro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "interpretacjawynikowbadan.info.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inua.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "investarter.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iranpay.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ircnow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irelandremembers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irelandremembers.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "irelandremembers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isdmgroup.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ivoucher-kuwait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jantari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jgtrainer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jhatpatjobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johannavarmala.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jouons-aux-echecs.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juggo.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juhanihakala.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jukkakivi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jukkakivimaki.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jvianes.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kabodo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaplan.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kapsalondigo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karaokerentalcalgary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karaokerentaledmonton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karaokerentalvancouver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kasettilamerit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keyschip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kigurumi-party.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kingforex.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klute.spdns.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koing.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kommunikation-czw.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ks1athome.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kustom-kitchens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lancea.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lasmoarquitectos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laurabailo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lbpc.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lbph.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lechompenchaine.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leenaluhtanen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lefilradio.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "legoktm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leporem.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lepourvoyeuretfils.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "levellock.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lfnaturopathie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lifebymargot.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "light.blue", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lightbluelearning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lihuenjardin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lillyfox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lionelsfarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "livinglifesecurely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lp177.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lucesledsbaratas.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lucreds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lunaretna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luoli.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luxedentalfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luxuryislandtrips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lvna.capital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lvnacapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lyndaskitchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lynxlab.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malariabehaviorsurvey.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manoek.dynu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manyproservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mappingspaceperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mariouniversalis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marketwau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "markhamfair.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "markkusilvennoinen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "markuslintula.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "martinvolenec.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marybeauty.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matrix.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mattshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mdinstituteplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mdsconcept.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medicano.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medicoway.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meer-der-ideen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mendrala.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mendrala.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mendrala.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mercury.foundation", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metyweb.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "midi-coquillages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miisy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mikeyroxtravels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miratechgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mirumhongkong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "misson.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mlfitnesscenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mmoveisplanejados.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "modamoom.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moncarnetdesante.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "monorthopedagogue.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motoforce.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mphold.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mrssclaus.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mudey.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "munialajuela.go.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "music-store-download.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "musicnotesroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycbils.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycloudhome.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycloudhome.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myriadlex.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myswimmingclub.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nataschaskraamzorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nbsgames.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nectere.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nejrecept.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "networkprosecurity.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newikis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newshour.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ngservers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nhadatpho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ninaafenehjelm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nivalandemarit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "njhq.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "no9vip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noatec.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nogfw.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nogfw.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nogfwsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nomo.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nozier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oetzies-quiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ola-xyma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omniballot.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "omnicourt.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlinepayment.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlyssd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opencovidpledge.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optimism.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orthosportiv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ouvindo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "p10.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paaspasst.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "panamacascoviejo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paradiscapacitados.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pareaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parenttv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paseelite.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "patentmanufaktur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paveltoman.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pedrolamas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pegfer.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peopleorders.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "philippehannes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "philpatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "piezus.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pjdigitalmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "platform-med.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "playorigin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "playstationplus.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "poi-radary.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ponyar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "popkultura.info.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pornhib.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pornhun.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "precisionlender.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pro-dog.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "proficiodigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "proficiodigital.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "proitsecurity.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "protection-plexi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "protection-plexi.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psicologomogidascruzes.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psychologue-grenoble.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ptcmonitoring.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "punjabdirectory.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "punjabitube.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pvpheroes.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "q3jlzwq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qbacano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qjg.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rabec.com.sa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "refansta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "renedekoeijer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reseau-protestant.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ricor.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riley.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rinton.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robin-kusch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rogeriosantos.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rogo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rpi-pihole-mon.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rua.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rueckgr.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rundh-audio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruttenadvocaat.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salutenaturale.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samaresane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sangowen.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sarahjaneethan.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sascha-brockel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schnaube.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scwildflours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sebastian-bravo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seeme.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serptoolsuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serwis-telewizorow.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "serwistomy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sexychatakides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sfiane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shanoviyam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shawclan.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "silensky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "simokala.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slothy.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smartseller.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "socialfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soilegustafsson.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soloroboto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "songlifty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sophi.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soukka-seura.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sozialabstand.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sparqmedia.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "speac.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spinpay.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sshcrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sslmonkey.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "st-jitsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staroch.name", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stocktonengineering.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "straydio.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "styloplumeblog.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supersprowtz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sustcarchive.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "svarta.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swanbitcoin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swayampaaka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taaltaal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tapbutdao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tarihi.ist", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techiecomputers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "technews360.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teknisetdemarit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tepui.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "testowapianka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "texnogu.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thegatewaytoanewworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "themedicalmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "theonlinecentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thetrafficgeek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thevern.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thijmen.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thoughtworthy.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiempoalegria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "top4c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tripartie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tulevaisuusdemarit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tupahost.net.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tupperwaresalamanca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tusconsultorex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uatx.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unataly.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unionvilleheating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uploads.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "urbancoffee.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uslugi-online.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v2xxoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vadasztanyabuk.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "validius.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valkoi-konyvtar.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valkoi-ksk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valuskills.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vapemate.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veikkosimpanen.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "villavasco.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visualiti.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vitalos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "voidge.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vxl.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wawloja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wearedevs.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wearetravellers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webmyhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webteammate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welcome-to-the.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wgrfoods.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wht.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wiadomosci-lodz.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wiberg.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "winterstyle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wpdo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wrkflowmedia.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--fl-mka.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xtensio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xyuya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yolifestylenow.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youngsigncompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zilsoft.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zook.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/reporting/reporting_cache.h b/net/reporting/reporting_cache.h index fb09d71..ab87b7a 100644 --- a/net/reporting/reporting_cache.h +++ b/net/reporting/reporting_cache.h
@@ -128,8 +128,8 @@ // Adds a new client to the cache for |origin|, or updates the existing one // to match the new header. All values are assumed to be valid as they have // passed through the ReportingHeaderParser. - // TODO(chlily): Take NetworkIsolationKey. virtual void OnParsedHeader( + const NetworkIsolationKey& network_isolation_key, const url::Origin& origin, std::vector<ReportingEndpointGroup> parsed_header) = 0;
diff --git a/net/reporting/reporting_cache_impl.cc b/net/reporting/reporting_cache_impl.cc index 82ca2525..429526a7 100644 --- a/net/reporting/reporting_cache_impl.cc +++ b/net/reporting/reporting_cache_impl.cc
@@ -215,12 +215,11 @@ } void ReportingCacheImpl::OnParsedHeader( + const NetworkIsolationKey& network_isolation_key, const url::Origin& origin, std::vector<ReportingEndpointGroup> parsed_header) { SanityCheckClients(); - // TODO(chlily): Respect NetworkIsolationKey. - NetworkIsolationKey network_isolation_key = NetworkIsolationKey::Todo(); Client new_client(network_isolation_key, origin); base::Time now = clock().Now(); new_client.last_used = now; @@ -234,11 +233,8 @@ // Creates an endpoint group and sets its |last_used| to |now|. CachedReportingEndpointGroup new_group(parsed_endpoint_group, now); - // TODO(chlily): This DCHECK passes right now because the groups have their - // NIK set to an empty NIK by the header parser, and we also set the - // client's NIK to an empty NIK above. Eventually it should pass because the - // header parser should provide the NIK it used for the groups so that the - // client can be created using the same NIK. + // Consistency check: the new client should have the same NIK and origin as + // all groups parsed from this header. DCHECK_EQ(new_group.group_key.network_isolation_key, new_client.network_isolation_key); DCHECK_EQ(new_group.group_key.origin, new_client.origin);
diff --git a/net/reporting/reporting_cache_impl.h b/net/reporting/reporting_cache_impl.h index a13623e..4e2e793 100644 --- a/net/reporting/reporting_cache_impl.h +++ b/net/reporting/reporting_cache_impl.h
@@ -65,6 +65,7 @@ bool IsReportPendingForTesting(const ReportingReport* report) const override; bool IsReportDoomedForTesting(const ReportingReport* report) const override; void OnParsedHeader( + const NetworkIsolationKey& network_isolation_key, const url::Origin& origin, std::vector<ReportingEndpointGroup> parsed_header) override; std::set<url::Origin> GetAllOrigins() const override;
diff --git a/net/reporting/reporting_endpoint_manager_unittest.cc b/net/reporting/reporting_endpoint_manager_unittest.cc index d05153d5..69e5f24 100644 --- a/net/reporting/reporting_endpoint_manager_unittest.cc +++ b/net/reporting/reporting_endpoint_manager_unittest.cc
@@ -103,6 +103,7 @@ return false; } void OnParsedHeader( + const NetworkIsolationKey& network_isolation_key, const url::Origin& origin, std::vector<ReportingEndpointGroup> parsed_header) override { NOTREACHED();
diff --git a/net/reporting/reporting_header_parser.cc b/net/reporting/reporting_header_parser.cc index 12f0064a..3701d15 100644 --- a/net/reporting/reporting_header_parser.cc +++ b/net/reporting/reporting_header_parser.cc
@@ -241,9 +241,11 @@ } // static -void ReportingHeaderParser::ParseHeader(ReportingContext* context, - const GURL& url, - std::unique_ptr<base::Value> value) { +void ReportingHeaderParser::ParseHeader( + ReportingContext* context, + const NetworkIsolationKey& network_isolation_key, + const GURL& url, + std::unique_ptr<base::Value> value) { DCHECK(url.SchemeIsCryptographic()); const base::ListValue* group_list = nullptr; @@ -254,7 +256,6 @@ ReportingCache* cache = context->cache(); url::Origin origin = url::Origin::Create(url); - NetworkIsolationKey network_isolation_key = NetworkIsolationKey::Todo(); std::vector<ReportingEndpointGroup> parsed_header; @@ -279,8 +280,8 @@ return; } - // TODO(chlily): Pass NIK to cache. - cache->OnParsedHeader(origin, std::move(parsed_header)); + cache->OnParsedHeader(network_isolation_key, origin, + std::move(parsed_header)); RecordHeaderOutcome(HeaderOutcome::PARSED); }
diff --git a/net/reporting/reporting_header_parser.h b/net/reporting/reporting_header_parser.h index 3556904..adba2047 100644 --- a/net/reporting/reporting_header_parser.h +++ b/net/reporting/reporting_header_parser.h
@@ -17,6 +17,7 @@ namespace net { +class NetworkIsolationKey; class ReportingContext; class NET_EXPORT ReportingHeaderParser { @@ -79,8 +80,8 @@ static void RecordHeaderDiscardedForJsonInvalid(); static void RecordHeaderDiscardedForJsonTooBig(); - // TODO(chlily): Pass in the NetworkIsolationKey. static void ParseHeader(ReportingContext* context, + const NetworkIsolationKey& network_isolation_key, const GURL& url, std::unique_ptr<base::Value> value);
diff --git a/net/reporting/reporting_header_parser_fuzzer.cc b/net/reporting/reporting_header_parser_fuzzer.cc index 58637b8d..d52179f 100644 --- a/net/reporting/reporting_header_parser_fuzzer.cc +++ b/net/reporting/reporting_header_parser_fuzzer.cc
@@ -10,6 +10,7 @@ #include "base/time/default_tick_clock.h" #include "base/time/time.h" #include "base/values.h" +#include "net/base/network_isolation_key.h" #include "net/reporting/reporting_cache.h" #include "net/reporting/reporting_header_parser.h" #include "net/reporting/reporting_policy.pb.h" @@ -38,7 +39,8 @@ // TODO: consider including proto definition for URL after moving that to // testing/libfuzzer/proto and creating a separate converter. - net::ReportingHeaderParser::ParseHeader(&context, GURL("https://origin/path"), + net::ReportingHeaderParser::ParseHeader(&context, net::NetworkIsolationKey(), + GURL("https://origin/path"), std::move(data_value)); if (context.cache()->GetEndpointCount() == 0) { return;
diff --git a/net/reporting/reporting_header_parser_unittest.cc b/net/reporting/reporting_header_parser_unittest.cc index cedaa99..fcedd57 100644 --- a/net/reporting/reporting_header_parser_unittest.cc +++ b/net/reporting/reporting_header_parser_unittest.cc
@@ -66,7 +66,7 @@ OriginSubdomains include_subdomains = OriginSubdomains::DEFAULT, base::TimeDelta ttl = base::TimeDelta::FromDays(1), url::Origin origin = url::Origin()) { - ReportingEndpointGroupKey group_key(NetworkIsolationKey() /* unused */, + ReportingEndpointGroupKey group_key(kNik_ /* unused */, url::Origin() /* unused */, name); ReportingEndpointGroup group; group.group_key = group_key; @@ -127,33 +127,43 @@ return s.str(); } - void ParseHeader(const GURL& url, const std::string& json) { + void ParseHeader(const NetworkIsolationKey& network_isolation_key, + const GURL& url, + const std::string& json) { std::unique_ptr<base::Value> value = base::JSONReader::ReadDeprecated("[" + json + "]"); - if (value) - ReportingHeaderParser::ParseHeader(context(), url, std::move(value)); + if (value) { + ReportingHeaderParser::ParseHeader(context(), network_isolation_key, url, + std::move(value)); + } } - const GURL kUrl_ = GURL("https://origin.test/path"); - const url::Origin kOrigin_ = - url::Origin::Create(GURL("https://origin.test/")); + const GURL kUrl1_ = GURL("https://origin1.test/path"); + const url::Origin kOrigin1_ = url::Origin::Create(kUrl1_); const GURL kUrl2_ = GURL("https://origin2.test/path"); - const url::Origin kOrigin2_ = - url::Origin::Create(GURL("https://origin2.test/")); + const url::Origin kOrigin2_ = url::Origin::Create(kUrl2_); + const NetworkIsolationKey kNik_; + const NetworkIsolationKey kOtherNik_ = + NetworkIsolationKey(kOrigin1_, kOrigin2_); const GURL kUrlEtld_ = GURL("https://co.uk/foo.html/"); const url::Origin kOriginEtld_ = url::Origin::Create(kUrlEtld_); - const GURL kEndpoint_ = GURL("https://endpoint.test/"); + const GURL kEndpoint1_ = GURL("https://endpoint1.test/"); const GURL kEndpoint2_ = GURL("https://endpoint2.test/"); const GURL kEndpoint3_ = GURL("https://endpoint3.test/"); const GURL kEndpointPathAbsolute_ = - GURL("https://origin.test/path-absolute-url"); - const std::string kGroup_ = "group"; + GURL("https://origin1.test/path-absolute-url"); + const std::string kGroup1_ = "group1"; const std::string kGroup2_ = "group2"; - const std::string kType_ = "type"; - const ReportingEndpointGroupKey kGroupKey_ = - ReportingEndpointGroupKey(NetworkIsolationKey(), kOrigin_, kGroup_); - const ReportingEndpointGroupKey kGroupKey2_ = - ReportingEndpointGroupKey(NetworkIsolationKey(), kOrigin_, kGroup2_); + // There are 2^3 = 8 of these to test the different combinations of matching + // vs mismatching NIK, origin, and group. + const ReportingEndpointGroupKey kGroupKey11_ = + ReportingEndpointGroupKey(kNik_, kOrigin1_, kGroup1_); + const ReportingEndpointGroupKey kGroupKey21_ = + ReportingEndpointGroupKey(kNik_, kOrigin2_, kGroup1_); + const ReportingEndpointGroupKey kGroupKey12_ = + ReportingEndpointGroupKey(kNik_, kOrigin1_, kGroup2_); + const ReportingEndpointGroupKey kGroupKey22_ = + ReportingEndpointGroupKey(kNik_, kOrigin2_, kGroup2_); private: std::unique_ptr<MockPersistentReportingStore> store_; @@ -210,7 +220,7 @@ for (size_t i = 0; i < base::size(kInvalidHeaderTestCases); ++i) { auto& test_case = kInvalidHeaderTestCases[i]; - ParseHeader(kUrl_, test_case.header_value); + ParseHeader(kNik_, kUrl1_, test_case.header_value); EXPECT_EQ(0u, cache()->GetEndpointCount()) << "Invalid Report-To header (" << test_case.description << ": \"" @@ -225,22 +235,22 @@ } TEST_P(ReportingHeaderParserTest, Basic) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey_, kEndpoint_); + ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey11_, kEndpoint1_); ASSERT_TRUE(endpoint); - EXPECT_EQ(kOrigin_, endpoint.group_key.origin); - EXPECT_EQ(kGroup_, endpoint.group_key.group_name); - EXPECT_EQ(kEndpoint_, endpoint.info.url); + EXPECT_EQ(kOrigin1_, endpoint.group_key.origin); + EXPECT_EQ(kGroup1_, endpoint.group_key.group_name); + EXPECT_EQ(kEndpoint1_, endpoint.info.url); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint.info.priority); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultWeight, @@ -252,9 +262,9 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -262,20 +272,20 @@ TEST_P(ReportingHeaderParserTest, PathAbsoluteURLEndpoint) { std::string header = - "{\"group\": \"group\", \"max_age\":1, \"endpoints\": " + "{\"group\": \"group1\", \"max_age\":1, \"endpoints\": " "[{\"url\":\"/path-absolute-url\"}]}"; - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(1u, cache()->GetEndpointCount()); ReportingEndpoint endpoint = - FindEndpointInCache(kGroupKey_, kEndpointPathAbsolute_); + FindEndpointInCache(kGroupKey11_, kEndpointPathAbsolute_); ASSERT_TRUE(endpoint); - EXPECT_EQ(kOrigin_, endpoint.group_key.origin); - EXPECT_EQ(kGroup_, endpoint.group_key.group_name); + EXPECT_EQ(kOrigin1_, endpoint.group_key.origin); + EXPECT_EQ(kGroup1_, endpoint.group_key.group_name); EXPECT_EQ(kEndpointPathAbsolute_, endpoint.info.url); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint.info.priority); @@ -289,12 +299,12 @@ MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back( CommandType::ADD_REPORTING_ENDPOINT, - ReportingEndpoint(kGroupKey_, ReportingEndpoint::EndpointInfo{ - kEndpointPathAbsolute_})); + ReportingEndpoint(kGroupKey11_, ReportingEndpoint::EndpointInfo{ + kEndpointPathAbsolute_})); expected_commands.emplace_back( CommandType::ADD_REPORTING_ENDPOINT_GROUP, CachedReportingEndpointGroup( - kGroupKey_, OriginSubdomains::DEFAULT /* irrelevant */, + kGroupKey11_, OriginSubdomains::DEFAULT /* irrelevant */, base::Time() /* irrelevant */, base::Time() /* irrelevant */)); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); @@ -302,22 +312,21 @@ } TEST_P(ReportingHeaderParserTest, OmittedGroupName) { - ReportingEndpointGroupKey kGroupKey(NetworkIsolationKey(), kOrigin_, - "default"); - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + ReportingEndpointGroupKey kGroupKey(kNik_, kOrigin1_, "default"); + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = ConstructHeaderGroupString(MakeEndpointGroup(std::string(), endpoints)); - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE(EndpointGroupExistsInCache(kGroupKey, OriginSubdomains::DEFAULT)); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey, kEndpoint_); + ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey, kEndpoint1_); ASSERT_TRUE(endpoint); - EXPECT_EQ(kOrigin_, endpoint.group_key.origin); + EXPECT_EQ(kOrigin1_, endpoint.group_key.origin); EXPECT_EQ("default", endpoint.group_key.group_name); - EXPECT_EQ(kEndpoint_, endpoint.info.url); + EXPECT_EQ(kEndpoint1_, endpoint.info.url); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint.info.priority); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultWeight, @@ -329,7 +338,7 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey, kEndpoint_); + kGroupKey, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, kGroupKey); EXPECT_THAT(mock_store()->GetAllCommands(), @@ -338,17 +347,17 @@ } TEST_P(ReportingHeaderParserTest, IncludeSubdomainsTrue) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = ConstructHeaderGroupString( - MakeEndpointGroup(kGroup_, endpoints, OriginSubdomains::INCLUDE)); - ParseHeader(kUrl_, header); + MakeEndpointGroup(kGroup1_, endpoints, OriginSubdomains::INCLUDE)); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::INCLUDE)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::INCLUDE)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - EXPECT_TRUE(EndpointExistsInCache(kGroupKey_, kEndpoint_)); + EXPECT_TRUE(EndpointExistsInCache(kGroupKey11_, kEndpoint1_)); if (mock_store()) { mock_store()->Flush(); @@ -356,27 +365,27 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } } TEST_P(ReportingHeaderParserTest, IncludeSubdomainsFalse) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = ConstructHeaderGroupString( - MakeEndpointGroup(kGroup_, endpoints, OriginSubdomains::EXCLUDE), + MakeEndpointGroup(kGroup1_, endpoints, OriginSubdomains::EXCLUDE), false /* omit_defaults */); - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::EXCLUDE)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::EXCLUDE)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - EXPECT_TRUE(EndpointExistsInCache(kGroupKey_, kEndpoint_)); + EXPECT_TRUE(EndpointExistsInCache(kGroupKey11_, kEndpoint1_)); if (mock_store()) { mock_store()->Flush(); @@ -384,59 +393,57 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } } TEST_P(ReportingHeaderParserTest, IncludeSubdomainsEtldRejected) { - ReportingEndpointGroupKey kGroupKey(NetworkIsolationKey(), kOriginEtld_, - kGroup_); - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + ReportingEndpointGroupKey kGroupKey(kNik_, kOriginEtld_, kGroup1_); + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = ConstructHeaderGroupString( - MakeEndpointGroup(kGroup_, endpoints, OriginSubdomains::INCLUDE)); - ParseHeader(kUrlEtld_, header); + MakeEndpointGroup(kGroup1_, endpoints, OriginSubdomains::INCLUDE)); + ParseHeader(kNik_, kUrlEtld_, header); EXPECT_EQ(0u, cache()->GetEndpointGroupCountForTesting()); EXPECT_FALSE( EndpointGroupExistsInCache(kGroupKey, OriginSubdomains::INCLUDE)); EXPECT_EQ(0u, cache()->GetEndpointCount()); - EXPECT_FALSE(EndpointExistsInCache(kGroupKey, kEndpoint_)); + EXPECT_FALSE(EndpointExistsInCache(kGroupKey, kEndpoint1_)); } TEST_P(ReportingHeaderParserTest, NonIncludeSubdomainsEtldAccepted) { - ReportingEndpointGroupKey kGroupKey(NetworkIsolationKey(), kOriginEtld_, - kGroup_); - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + ReportingEndpointGroupKey kGroupKey(kNik_, kOriginEtld_, kGroup1_); + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = ConstructHeaderGroupString( - MakeEndpointGroup(kGroup_, endpoints, OriginSubdomains::EXCLUDE)); - ParseHeader(kUrlEtld_, header); + MakeEndpointGroup(kGroup1_, endpoints, OriginSubdomains::EXCLUDE)); + ParseHeader(kNik_, kUrlEtld_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE(EndpointGroupExistsInCache(kGroupKey, OriginSubdomains::EXCLUDE)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - EXPECT_TRUE(EndpointExistsInCache(kGroupKey, kEndpoint_)); + EXPECT_TRUE(EndpointExistsInCache(kGroupKey, kEndpoint1_)); } TEST_P(ReportingHeaderParserTest, IncludeSubdomainsNotBoolean) { std::string header = - "{\"group\": \"" + kGroup_ + + "{\"group\": \"" + kGroup1_ + "\", " "\"max_age\":86400, \"include_subdomains\": \"NotABoolean\", " "\"endpoints\": [{\"url\":\"" + - kEndpoint_.spec() + "\"}]}"; - ParseHeader(kUrl_, header); + kEndpoint1_.spec() + "\"}]}"; + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - EXPECT_TRUE(EndpointExistsInCache(kGroupKey_, kEndpoint_)); + EXPECT_TRUE(EndpointExistsInCache(kGroupKey11_, kEndpoint1_)); if (mock_store()) { mock_store()->Flush(); @@ -444,9 +451,9 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -455,17 +462,17 @@ TEST_P(ReportingHeaderParserTest, NonDefaultPriority) { const int kNonDefaultPriority = 10; std::vector<ReportingEndpoint::EndpointInfo> endpoints = { - {kEndpoint_, kNonDefaultPriority}}; + {kEndpoint1_, kNonDefaultPriority}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); - ParseHeader(kUrl_, header); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey_, kEndpoint_); + ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey11_, kEndpoint1_); ASSERT_TRUE(endpoint); EXPECT_EQ(kNonDefaultPriority, endpoint.info.priority); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultWeight, @@ -477,9 +484,9 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -488,18 +495,18 @@ TEST_P(ReportingHeaderParserTest, NonDefaultWeight) { const int kNonDefaultWeight = 10; std::vector<ReportingEndpoint::EndpointInfo> endpoints = { - {kEndpoint_, ReportingEndpoint::EndpointInfo::kDefaultPriority, + {kEndpoint1_, ReportingEndpoint::EndpointInfo::kDefaultPriority, kNonDefaultWeight}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); - ParseHeader(kUrl_, header); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointCount()); - ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey_, kEndpoint_); + ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey11_, kEndpoint1_); ASSERT_TRUE(endpoint); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint.info.priority); @@ -511,9 +518,9 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -524,15 +531,15 @@ base::TimeDelta ttl = base::TimeDelta::FromSeconds(kMaxAgeSecs); base::Time expires = clock()->Now() + ttl; - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = ConstructHeaderGroupString( - MakeEndpointGroup(kGroup_, endpoints, OriginSubdomains::DEFAULT, ttl)); + MakeEndpointGroup(kGroup1_, endpoints, OriginSubdomains::DEFAULT, ttl)); - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); - EXPECT_TRUE(EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT, - expires)); + EXPECT_TRUE(EndpointGroupExistsInCache(kGroupKey11_, + OriginSubdomains::DEFAULT, expires)); if (mock_store()) { mock_store()->Flush(); @@ -540,40 +547,40 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } } TEST_P(ReportingHeaderParserTest, MultipleEndpointsSameGroup) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}, + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}, {kEndpoint2_}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(2u, cache()->GetEndpointCount()); - ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey_, kEndpoint_); + ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey11_, kEndpoint1_); ASSERT_TRUE(endpoint); - EXPECT_EQ(kOrigin_, endpoint.group_key.origin); - EXPECT_EQ(kGroup_, endpoint.group_key.group_name); - EXPECT_EQ(kEndpoint_, endpoint.info.url); + EXPECT_EQ(kOrigin1_, endpoint.group_key.origin); + EXPECT_EQ(kGroup1_, endpoint.group_key.group_name); + EXPECT_EQ(kEndpoint1_, endpoint.info.url); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint.info.priority); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultWeight, endpoint.info.weight); - ReportingEndpoint endpoint2 = FindEndpointInCache(kGroupKey_, kEndpoint2_); + ReportingEndpoint endpoint2 = FindEndpointInCache(kGroupKey11_, kEndpoint2_); ASSERT_TRUE(endpoint2); - EXPECT_EQ(kOrigin_, endpoint2.group_key.origin); - EXPECT_EQ(kGroup_, endpoint2.group_key.group_name); + EXPECT_EQ(kOrigin1_, endpoint2.group_key.origin); + EXPECT_EQ(kGroup1_, endpoint2.group_key.group_name); EXPECT_EQ(kEndpoint2_, endpoint2.info.url); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint2.info.priority); @@ -586,47 +593,45 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint2_); + kGroupKey11_, kEndpoint2_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } } TEST_P(ReportingHeaderParserTest, MultipleEndpointsDifferentGroups) { - ReportingEndpointGroupKey kOtherGroupKey(NetworkIsolationKey(), kOrigin_, - kGroup2_); - std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint_}}; - std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint1_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint1_}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints1)) + + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints1)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup(kGroup2_, endpoints2)); - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); EXPECT_EQ(2u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_TRUE( - EndpointGroupExistsInCache(kOtherGroupKey, OriginSubdomains::DEFAULT)); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EndpointGroupExistsInCache(kGroupKey12_, OriginSubdomains::DEFAULT)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(2u, cache()->GetEndpointCount()); - ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey_, kEndpoint_); + ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey11_, kEndpoint1_); ASSERT_TRUE(endpoint); - EXPECT_EQ(kOrigin_, endpoint.group_key.origin); - EXPECT_EQ(kGroup_, endpoint.group_key.group_name); + EXPECT_EQ(kOrigin1_, endpoint.group_key.origin); + EXPECT_EQ(kGroup1_, endpoint.group_key.group_name); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint.info.priority); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultWeight, endpoint.info.weight); - ReportingEndpoint endpoint2 = FindEndpointInCache(kOtherGroupKey, kEndpoint_); + ReportingEndpoint endpoint2 = FindEndpointInCache(kGroupKey12_, kEndpoint1_); ASSERT_TRUE(endpoint2); - EXPECT_EQ(kOrigin_, endpoint2.group_key.origin); + EXPECT_EQ(kOrigin1_, endpoint2.group_key.origin); EXPECT_EQ(kGroup2_, endpoint2.group_key.group_name); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint2.info.priority); @@ -639,13 +644,13 @@ EXPECT_EQ(2, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kOtherGroupKey, kEndpoint_); + kGroupKey12_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kOtherGroupKey); + kGroupKey12_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -653,42 +658,37 @@ TEST_P(ReportingHeaderParserTest, MultipleHeadersFromDifferentOrigins) { // First origin sets a header with two endpoints in the same group. - std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint_}, + std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint1_}, {kEndpoint2_}}; std::string header1 = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints1)); - ParseHeader(kUrl_, header1); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints1)); + ParseHeader(kNik_, kUrl1_, header1); // Second origin has two endpoint groups. - std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint1_}}; std::vector<ReportingEndpoint::EndpointInfo> endpoints3 = {{kEndpoint2_}}; std::string header2 = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints2)) + + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints2)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup(kGroup2_, endpoints3)); - ParseHeader(kUrl2_, header2); + ParseHeader(kNik_, kUrl2_, header2); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin2_)); - ReportingEndpointGroupKey kGroupKey1(NetworkIsolationKey(), kOrigin2_, - kGroup_); - ReportingEndpointGroupKey kGroupKey2(NetworkIsolationKey(), kOrigin2_, - kGroup2_); - EXPECT_EQ(3u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey1, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey21_, OriginSubdomains::DEFAULT)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey2, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey22_, OriginSubdomains::DEFAULT)); EXPECT_EQ(4u, cache()->GetEndpointCount()); - EXPECT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint_)); - EXPECT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint2_)); - EXPECT_TRUE(FindEndpointInCache(kGroupKey1, kEndpoint_)); - EXPECT_TRUE(FindEndpointInCache(kGroupKey2, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey21_, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey22_, kEndpoint2_)); if (mock_store()) { mock_store()->Flush(); @@ -696,54 +696,247 @@ EXPECT_EQ(3, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint2_); + kGroupKey11_, kEndpoint2_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey1, kEndpoint_); + kGroupKey21_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey2, kEndpoint2_); + kGroupKey22_, kEndpoint2_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey1); + kGroupKey21_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey2); + kGroupKey22_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } } +// Test that each combination of NIK, origin, and group name is considered +// distinct. +// See also: ReportingCacheTest.ClientsKeyedByEndpointGroupKey +TEST_P(ReportingHeaderParserTest, EndpointGroupKey) { + // Raise the endpoint limits for this test. + ReportingPolicy policy; + policy.max_endpoints_per_origin = 5; // This test should use 4. + policy.max_endpoint_count = 20; // This test should use 16. + UsePolicy(policy); + + std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint1_}, + {kEndpoint2_}}; + std::string header1 = + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints1)) + + ", " + + ConstructHeaderGroupString(MakeEndpointGroup(kGroup2_, endpoints1)); + + const ReportingEndpointGroupKey kOtherGroupKey11 = + ReportingEndpointGroupKey(kOtherNik_, kOrigin1_, kGroup1_); + const ReportingEndpointGroupKey kOtherGroupKey21 = + ReportingEndpointGroupKey(kOtherNik_, kOrigin2_, kGroup1_); + const ReportingEndpointGroupKey kOtherGroupKey12 = + ReportingEndpointGroupKey(kOtherNik_, kOrigin1_, kGroup2_); + const ReportingEndpointGroupKey kOtherGroupKey22 = + ReportingEndpointGroupKey(kOtherNik_, kOrigin2_, kGroup2_); + + const struct { + NetworkIsolationKey network_isolation_key; + GURL url; + ReportingEndpointGroupKey group1_key; + ReportingEndpointGroupKey group2_key; + } kHeaderSources[] = { + {kNik_, kUrl1_, kGroupKey11_, kGroupKey12_}, + {kNik_, kUrl2_, kGroupKey21_, kGroupKey22_}, + {kOtherNik_, kUrl1_, kOtherGroupKey11, kOtherGroupKey12}, + {kOtherNik_, kUrl2_, kOtherGroupKey21, kOtherGroupKey22}, + }; + + size_t endpoint_group_count = 0u; + size_t endpoint_count = 0u; + MockPersistentReportingStore::CommandList expected_commands; + + // Set 2 endpoints in each of 2 groups for each of 2x2 combinations of + // (NIK, origin). + for (const auto& source : kHeaderSources) { + // Verify pre-parsing state + EXPECT_FALSE(FindEndpointInCache(source.group1_key, kEndpoint1_)); + EXPECT_FALSE(FindEndpointInCache(source.group1_key, kEndpoint2_)); + EXPECT_FALSE(FindEndpointInCache(source.group2_key, kEndpoint1_)); + EXPECT_FALSE(FindEndpointInCache(source.group2_key, kEndpoint2_)); + EXPECT_FALSE(EndpointGroupExistsInCache(source.group1_key, + OriginSubdomains::DEFAULT)); + EXPECT_FALSE(EndpointGroupExistsInCache(source.group2_key, + OriginSubdomains::DEFAULT)); + + ParseHeader(source.network_isolation_key, source.url, header1); + endpoint_group_count += 2u; + endpoint_count += 4u; + EXPECT_EQ(endpoint_group_count, cache()->GetEndpointGroupCountForTesting()); + EXPECT_EQ(endpoint_count, cache()->GetEndpointCount()); + + // Verify post-parsing state + EXPECT_TRUE(FindEndpointInCache(source.group1_key, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(source.group1_key, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint2_)); + EXPECT_TRUE(EndpointGroupExistsInCache(source.group1_key, + OriginSubdomains::DEFAULT)); + EXPECT_TRUE(EndpointGroupExistsInCache(source.group2_key, + OriginSubdomains::DEFAULT)); + + if (mock_store()) { + mock_store()->Flush(); + EXPECT_EQ(static_cast<int>(endpoint_count), + mock_store()->StoredEndpointsCount()); + EXPECT_EQ(static_cast<int>(endpoint_group_count), + mock_store()->StoredEndpointGroupsCount()); + expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, + source.group1_key, kEndpoint1_); + expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, + source.group1_key, kEndpoint2_); + expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, + source.group1_key); + expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, + source.group2_key, kEndpoint1_); + expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, + source.group2_key, kEndpoint2_); + expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, + source.group2_key); + EXPECT_THAT(mock_store()->GetAllCommands(), + testing::IsSupersetOf(expected_commands)); + } + } + + // Check that expected data is present in the ReportingCache at the end. + for (const auto& source : kHeaderSources) { + EXPECT_TRUE(FindEndpointInCache(source.group1_key, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(source.group1_key, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint2_)); + EXPECT_TRUE(EndpointGroupExistsInCache(source.group1_key, + OriginSubdomains::DEFAULT)); + EXPECT_TRUE(EndpointGroupExistsInCache(source.group2_key, + OriginSubdomains::DEFAULT)); + EXPECT_TRUE(cache()->ClientExistsForTesting( + source.network_isolation_key, url::Origin::Create(source.url))); + } + + // Test updating existing configurations + + // This removes endpoint 1, updates the priority of endpoint 2, and adds + // endpoint 3. + std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint2_, 2}, + {kEndpoint3_}}; + // Removes group 1, updates include_subdomains for group 2. + std::string header2 = ConstructHeaderGroupString( + MakeEndpointGroup(kGroup2_, endpoints2, OriginSubdomains::INCLUDE)); + + for (const auto& source : kHeaderSources) { + // Verify pre-update state + EXPECT_TRUE(EndpointGroupExistsInCache(source.group1_key, + OriginSubdomains::DEFAULT)); + EXPECT_TRUE(EndpointGroupExistsInCache(source.group2_key, + OriginSubdomains::DEFAULT)); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint1_)); + ReportingEndpoint endpoint = + FindEndpointInCache(source.group2_key, kEndpoint2_); + EXPECT_TRUE(endpoint); + EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, + endpoint.info.priority); + EXPECT_FALSE(FindEndpointInCache(source.group2_key, kEndpoint3_)); + + ParseHeader(source.network_isolation_key, source.url, header2); + endpoint_group_count--; + endpoint_count -= 2; + EXPECT_EQ(endpoint_group_count, cache()->GetEndpointGroupCountForTesting()); + EXPECT_EQ(endpoint_count, cache()->GetEndpointCount()); + + // Verify post-update state + EXPECT_FALSE(EndpointGroupExistsInCache(source.group1_key, + OriginSubdomains::DEFAULT)); + EXPECT_TRUE(EndpointGroupExistsInCache(source.group2_key, + OriginSubdomains::INCLUDE)); + EXPECT_FALSE(FindEndpointInCache(source.group2_key, kEndpoint1_)); + endpoint = FindEndpointInCache(source.group2_key, kEndpoint2_); + EXPECT_TRUE(endpoint); + EXPECT_EQ(2, endpoint.info.priority); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint3_)); + + if (mock_store()) { + mock_store()->Flush(); + EXPECT_EQ(static_cast<int>(endpoint_count), + mock_store()->StoredEndpointsCount()); + EXPECT_EQ(static_cast<int>(endpoint_group_count), + mock_store()->StoredEndpointGroupsCount()); + expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT, + source.group1_key, kEndpoint1_); + expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT, + source.group1_key, kEndpoint2_); + expected_commands.emplace_back( + CommandType::DELETE_REPORTING_ENDPOINT_GROUP, source.group1_key); + expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT, + source.group2_key, kEndpoint1_); + expected_commands.emplace_back( + CommandType::UPDATE_REPORTING_ENDPOINT_DETAILS, source.group2_key, + kEndpoint2_); + expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, + source.group2_key, kEndpoint3_); + expected_commands.emplace_back( + CommandType::UPDATE_REPORTING_ENDPOINT_GROUP_DETAILS, + source.group2_key); + EXPECT_THAT(mock_store()->GetAllCommands(), + testing::IsSupersetOf(expected_commands)); + } + } + + // Check that expected data is present in the ReportingCache at the end. + for (const auto& source : kHeaderSources) { + EXPECT_FALSE(FindEndpointInCache(source.group1_key, kEndpoint1_)); + EXPECT_FALSE(FindEndpointInCache(source.group1_key, kEndpoint2_)); + EXPECT_FALSE(FindEndpointInCache(source.group2_key, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(source.group2_key, kEndpoint3_)); + EXPECT_FALSE(EndpointGroupExistsInCache(source.group1_key, + OriginSubdomains::DEFAULT)); + EXPECT_TRUE(EndpointGroupExistsInCache(source.group2_key, + OriginSubdomains::INCLUDE)); + EXPECT_TRUE(cache()->ClientExistsForTesting( + source.network_isolation_key, url::Origin::Create(source.url))); + } +} + TEST_P(ReportingHeaderParserTest, HeaderErroneouslyContainsMultipleGroupsOfSameName) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint1_}}; std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint2_}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints1)) + - ", " + ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints2)); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints1)) + + ", " + + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints2)); - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); // Result is as if they set the two groups with the same name as one group. EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(2u, cache()->GetEndpointCount()); - ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey_, kEndpoint_); + ReportingEndpoint endpoint = FindEndpointInCache(kGroupKey11_, kEndpoint1_); ASSERT_TRUE(endpoint); - EXPECT_EQ(kOrigin_, endpoint.group_key.origin); - EXPECT_EQ(kGroup_, endpoint.group_key.group_name); + EXPECT_EQ(kOrigin1_, endpoint.group_key.origin); + EXPECT_EQ(kGroup1_, endpoint.group_key.group_name); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint.info.priority); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultWeight, endpoint.info.weight); - ReportingEndpoint endpoint2 = FindEndpointInCache(kGroupKey_, kEndpoint2_); + ReportingEndpoint endpoint2 = FindEndpointInCache(kGroupKey11_, kEndpoint2_); ASSERT_TRUE(endpoint2); - EXPECT_EQ(kOrigin_, endpoint2.group_key.origin); - EXPECT_EQ(kGroup_, endpoint2.group_key.group_name); + EXPECT_EQ(kOrigin1_, endpoint2.group_key.origin); + EXPECT_EQ(kGroup1_, endpoint2.group_key.group_name); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultPriority, endpoint2.info.priority); EXPECT_EQ(ReportingEndpoint::EndpointInfo::kDefaultWeight, @@ -755,11 +948,11 @@ EXPECT_EQ(1, mock_store()->StoredEndpointGroupsCount()); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint2_); + kGroupKey11_, kEndpoint2_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -767,83 +960,84 @@ TEST_P(ReportingHeaderParserTest, HeaderErroneouslyContainsGroupsWithRedundantEndpoints) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}, - {kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}, + {kEndpoint1_}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); - ParseHeader(kUrl_, header); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); + ParseHeader(kNik_, kUrl1_, header); // We should dedupe the identical endpoint URLs. EXPECT_EQ(1u, cache()->GetEndpointCount()); - ASSERT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint_)); + ASSERT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint1_)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); } TEST_P(ReportingHeaderParserTest, HeaderErroneouslyContainsMultipleGroupsOfSameNameAndEndpoints) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{kEndpoint1_}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)) + ", " + - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); - ParseHeader(kUrl_, header); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)) + + ", " + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); + ParseHeader(kNik_, kUrl1_, header); // We should dedupe the identical endpoint URLs, even when they're in - // different headers. + // different group. EXPECT_EQ(1u, cache()->GetEndpointCount()); - ASSERT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint_)); + ASSERT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint1_)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); } TEST_P(ReportingHeaderParserTest, HeaderErroneouslyContainsGroupsOfSameNameAndOverlappingEndpoints) { - std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint_}, + std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint1_}, {kEndpoint2_}}; - std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint_}, + std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint1_}, {kEndpoint3_}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints1)) + - ", " + ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints2)); - ParseHeader(kUrl_, header); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints1)) + + ", " + + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints2)); + ParseHeader(kNik_, kUrl1_, header); // We should dedupe the identical endpoint URLs, even when they're in - // different headers. + // different group. EXPECT_EQ(3u, cache()->GetEndpointCount()); - ASSERT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint_)); - ASSERT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint2_)); - ASSERT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint3_)); + ASSERT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint1_)); + ASSERT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint2_)); + ASSERT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint3_)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); } TEST_P(ReportingHeaderParserTest, OverwriteOldHeader) { // First, the origin sets a header with two endpoints in the same group. std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = { - {kEndpoint_, 10 /* priority */}, {kEndpoint2_}}; + {kEndpoint1_, 10 /* priority */}, {kEndpoint2_}}; std::string header1 = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints1)); - ParseHeader(kUrl_, header1); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints1)); + ParseHeader(kNik_, kUrl1_, header1); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_EQ(2u, cache()->GetEndpointCount()); - EXPECT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint_)); - EXPECT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint1_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint2_)); if (mock_store()) { mock_store()->Flush(); EXPECT_EQ(2, @@ -852,11 +1046,11 @@ CommandType::ADD_REPORTING_ENDPOINT_GROUP)); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint2_); + kGroupKey11_, kEndpoint2_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -864,28 +1058,28 @@ // Second header from the same origin should overwrite the previous one. std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = { // This endpoint should update the priority of the existing one. - {kEndpoint_, 20 /* priority */}}; + {kEndpoint1_, 20 /* priority */}}; // The second endpoint in this group will be deleted. // This group is new. std::vector<ReportingEndpoint::EndpointInfo> endpoints3 = {{kEndpoint2_}}; std::string header2 = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints2)) + + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints2)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup(kGroup2_, endpoints3)); - ParseHeader(kUrl_, header2); + ParseHeader(kNik_, kUrl1_, header2); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey2_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey12_, OriginSubdomains::DEFAULT)); EXPECT_EQ(2u, cache()->GetEndpointCount()); - EXPECT_TRUE(FindEndpointInCache(kGroupKey_, kEndpoint_)); - EXPECT_EQ(20, FindEndpointInCache(kGroupKey_, kEndpoint_).info.priority); - EXPECT_FALSE(FindEndpointInCache(kGroupKey_, kEndpoint2_)); - EXPECT_TRUE(FindEndpointInCache(kGroupKey2_, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey11_, kEndpoint1_)); + EXPECT_EQ(20, FindEndpointInCache(kGroupKey11_, kEndpoint1_).info.priority); + EXPECT_FALSE(FindEndpointInCache(kGroupKey11_, kEndpoint2_)); + EXPECT_TRUE(FindEndpointInCache(kGroupKey12_, kEndpoint2_)); if (mock_store()) { mock_store()->Flush(); EXPECT_EQ(2 + 1, @@ -896,22 +1090,22 @@ 1, mock_store()->CountCommands(CommandType::DELETE_REPORTING_ENDPOINT)); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey2_, kEndpoint2_); + kGroupKey12_, kEndpoint2_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey2_); + kGroupKey12_); expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint2_); + kGroupKey11_, kEndpoint2_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } } TEST_P(ReportingHeaderParserTest, OverwriteOldHeaderWithCompletelyNew) { - ReportingEndpointGroupKey kGroupKey1(NetworkIsolationKey(), kOrigin_, "1"); - ReportingEndpointGroupKey kGroupKey2(NetworkIsolationKey(), kOrigin_, "2"); - ReportingEndpointGroupKey kGroupKey3(NetworkIsolationKey(), kOrigin_, "3"); - ReportingEndpointGroupKey kGroupKey4(NetworkIsolationKey(), kOrigin_, "4"); - ReportingEndpointGroupKey kGroupKey5(NetworkIsolationKey(), kOrigin_, "5"); + ReportingEndpointGroupKey kGroupKey1(kNik_, kOrigin1_, "1"); + ReportingEndpointGroupKey kGroupKey2(kNik_, kOrigin1_, "2"); + ReportingEndpointGroupKey kGroupKey3(kNik_, kOrigin1_, "3"); + ReportingEndpointGroupKey kGroupKey4(kNik_, kOrigin1_, "4"); + ReportingEndpointGroupKey kGroupKey5(kNik_, kOrigin1_, "5"); std::vector<ReportingEndpoint::EndpointInfo> endpoints1_1 = {{MakeURL(10)}, {MakeURL(11)}}; std::vector<ReportingEndpoint::EndpointInfo> endpoints2_1 = {{MakeURL(20)}, @@ -922,8 +1116,8 @@ ConstructHeaderGroupString(MakeEndpointGroup("1", endpoints1_1)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup("2", endpoints2_1)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup("3", endpoints3_1)); - ParseHeader(kUrl_, header1); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + ParseHeader(kNik_, kUrl1_, header1); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(3u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( EndpointGroupExistsInCache(kGroupKey1, OriginSubdomains::DEFAULT)); @@ -969,8 +1163,8 @@ ConstructHeaderGroupString(MakeEndpointGroup("1", endpoints1_2)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup("2", endpoints2_2)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup("3", endpoints3_2)); - ParseHeader(kUrl_, header2); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + ParseHeader(kNik_, kUrl1_, header2); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(3u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( EndpointGroupExistsInCache(kGroupKey1, OriginSubdomains::DEFAULT)); @@ -1027,8 +1221,8 @@ std::string header3 = ConstructHeaderGroupString(MakeEndpointGroup("4", endpoints4_3)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup("5", endpoints5_3)); - ParseHeader(kUrl_, header3); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + ParseHeader(kNik_, kUrl1_, header3); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(2u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( EndpointGroupExistsInCache(kGroupKey4, OriginSubdomains::DEFAULT)); @@ -1080,8 +1274,9 @@ TEST_P(ReportingHeaderParserTest, ZeroMaxAgeRemovesEndpointGroup) { // Without a pre-existing client, max_age: 0 should do nothing. ASSERT_EQ(0u, cache()->GetEndpointCount()); - ParseHeader(kUrl_, "{\"endpoints\":[{\"url\":\"" + kEndpoint_.spec() + - "\"}],\"max_age\":0}"); + ParseHeader(kNik_, kUrl1_, + "{\"endpoints\":[{\"url\":\"" + kEndpoint1_.spec() + + "\"}],\"max_age\":0}"); EXPECT_EQ(0u, cache()->GetEndpointCount()); if (mock_store()) { mock_store()->Flush(); @@ -1092,20 +1287,20 @@ } // Set a header with two endpoint groups. - std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint_}}; + std::vector<ReportingEndpoint::EndpointInfo> endpoints1 = {{kEndpoint1_}}; std::vector<ReportingEndpoint::EndpointInfo> endpoints2 = {{kEndpoint2_}}; std::string header1 = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints1)) + + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints1)) + ", " + ConstructHeaderGroupString(MakeEndpointGroup(kGroup2_, endpoints2)); - ParseHeader(kUrl_, header1); + ParseHeader(kNik_, kUrl1_, header1); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(2u, cache()->GetEndpointGroupCountForTesting()); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey2_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey12_, OriginSubdomains::DEFAULT)); EXPECT_EQ(2u, cache()->GetEndpointCount()); if (mock_store()) { mock_store()->Flush(); @@ -1115,35 +1310,35 @@ CommandType::ADD_REPORTING_ENDPOINT_GROUP)); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT, - kGroupKey2_, kEndpoint2_); + kGroupKey12_, kEndpoint2_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); expected_commands.emplace_back(CommandType::ADD_REPORTING_ENDPOINT_GROUP, - kGroupKey2_); + kGroupKey12_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } // Set another header with max_age: 0 to delete one of the groups. std::string header2 = ConstructHeaderGroupString(MakeEndpointGroup( - kGroup_, endpoints1, OriginSubdomains::DEFAULT, + kGroup1_, endpoints1, OriginSubdomains::DEFAULT, base::TimeDelta::FromSeconds(0))) + ", " + ConstructHeaderGroupString(MakeEndpointGroup( kGroup2_, endpoints2)); // Other group stays. - ParseHeader(kUrl_, header2); + ParseHeader(kNik_, kUrl1_, header2); - EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_TRUE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(1u, cache()->GetEndpointGroupCountForTesting()); // Group was deleted. EXPECT_FALSE( - EndpointGroupExistsInCache(kGroupKey_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey11_, OriginSubdomains::DEFAULT)); // Other group remains in the cache. EXPECT_TRUE( - EndpointGroupExistsInCache(kGroupKey2_, OriginSubdomains::DEFAULT)); + EndpointGroupExistsInCache(kGroupKey12_, OriginSubdomains::DEFAULT)); EXPECT_EQ(1u, cache()->GetEndpointCount()); if (mock_store()) { mock_store()->Flush(); @@ -1157,9 +1352,9 @@ CommandType::DELETE_REPORTING_ENDPOINT_GROUP)); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT, - kGroupKey_, kEndpoint_); + kGroupKey11_, kEndpoint1_); expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT_GROUP, - kGroupKey_); + kGroupKey11_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -1169,11 +1364,11 @@ std::string header3 = ConstructHeaderGroupString(MakeEndpointGroup( kGroup2_, std::vector<ReportingEndpoint::EndpointInfo>(), OriginSubdomains::DEFAULT, base::TimeDelta::FromSeconds(0))); - ParseHeader(kUrl_, header3); + ParseHeader(kNik_, kUrl1_, header3); // Deletion of the last remaining group also deletes the client for this // origin. - EXPECT_FALSE(ClientExistsInCacheForOrigin(kOrigin_)); + EXPECT_FALSE(ClientExistsInCacheForOrigin(kOrigin1_)); EXPECT_EQ(0u, cache()->GetEndpointGroupCountForTesting()); EXPECT_EQ(0u, cache()->GetEndpointCount()); if (mock_store()) { @@ -1188,9 +1383,9 @@ CommandType::DELETE_REPORTING_ENDPOINT_GROUP)); MockPersistentReportingStore::CommandList expected_commands; expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT, - kGroupKey2_, kEndpoint2_); + kGroupKey12_, kEndpoint2_); expected_commands.emplace_back(CommandType::DELETE_REPORTING_ENDPOINT_GROUP, - kGroupKey2_); + kGroupKey12_); EXPECT_THAT(mock_store()->GetAllCommands(), testing::IsSupersetOf(expected_commands)); } @@ -1203,8 +1398,8 @@ endpoints.push_back({MakeURL(i)}); } std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); - ParseHeader(kUrl_, header); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); + ParseHeader(kNik_, kUrl1_, header); // Endpoint count should be at most the limit. EXPECT_GE(policy().max_endpoints_per_origin, cache()->GetEndpointCount()); @@ -1231,7 +1426,7 @@ if (i != policy().max_endpoints_per_origin) header = header + ", "; } - ParseHeader(kUrl_, header); + ParseHeader(kNik_, kUrl1_, header); // Endpoint count should be at most the limit. EXPECT_GE(policy().max_endpoints_per_origin, cache()->GetEndpointCount()); @@ -1256,14 +1451,15 @@ for (size_t i = 0; i < policy().max_endpoint_count; ++i) { std::vector<ReportingEndpoint::EndpointInfo> endpoints = {{MakeURL(i)}}; std::string header = - ConstructHeaderGroupString(MakeEndpointGroup(kGroup_, endpoints)); - ParseHeader(MakeURL(i), header); + ConstructHeaderGroupString(MakeEndpointGroup(kGroup1_, endpoints)); + ParseHeader(kNik_, MakeURL(i), header); } EXPECT_EQ(policy().max_endpoint_count, cache()->GetEndpointCount()); // Parse one more header to trigger eviction. - ParseHeader(kUrl_, "{\"endpoints\":[{\"url\":\"" + kEndpoint_.spec() + - "\"}],\"max_age\":1}"); + ParseHeader(kNik_, kUrl1_, + "{\"endpoints\":[{\"url\":\"" + kEndpoint1_.spec() + + "\"}],\"max_age\":1}"); // Endpoint count should be at most the limit. EXPECT_GE(policy().max_endpoint_count, cache()->GetEndpointCount());
diff --git a/net/reporting/reporting_service.cc b/net/reporting/reporting_service.cc index a10ca10..2945f53 100644 --- a/net/reporting/reporting_service.cc +++ b/net/reporting/reporting_service.cc
@@ -93,9 +93,10 @@ } DVLOG(1) << "Received Reporting policy for " << url.GetOrigin(); - DoOrBacklogTask(base::BindOnce(&ReportingServiceImpl::DoProcessHeader, - base::Unretained(this), url, - std::move(header_value))); + // TODO(chlily): Get the proper NetworkIsolationKey from the caller. + DoOrBacklogTask(base::BindOnce( + &ReportingServiceImpl::DoProcessHeader, base::Unretained(this), + NetworkIsolationKey::Todo(), url, std::move(header_value))); } void RemoveBrowsingData(int data_type_mask, @@ -161,11 +162,12 @@ 0 /* attempts */); } - void DoProcessHeader(const GURL& url, + void DoProcessHeader(const NetworkIsolationKey& network_isolation_key, + const GURL& url, std::unique_ptr<base::Value> header_value) { DCHECK(initialized_); - ReportingHeaderParser::ParseHeader(context_.get(), url, - std::move(header_value)); + ReportingHeaderParser::ParseHeader(context_.get(), network_isolation_key, + url, std::move(header_value)); } void DoRemoveBrowsingData(
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn index ee5cce19..deb7d6d 100644 --- a/services/network/public/cpp/BUILD.gn +++ b/services/network/public/cpp/BUILD.gn
@@ -17,6 +17,8 @@ output_name = "network_cpp" sources = [ + "client_hints.cc", + "client_hints.h", "constants.cc", "constants.h", "content_security_policy/content_security_policy.cc", @@ -229,6 +231,7 @@ testonly = true sources = [ + "client_hints_unittest.cc", "content_security_policy/content_security_policy_unittest.cc", "content_security_policy/csp_context_unittest.cc", "content_security_policy/csp_source_list_unittest.cc",
diff --git a/services/network/public/cpp/client_hints.cc b/services/network/public/cpp/client_hints.cc new file mode 100644 index 0000000..34e9e0c --- /dev/null +++ b/services/network/public/cpp/client_hints.cc
@@ -0,0 +1,106 @@ +// 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. + +#include "services/network/public/cpp/client_hints.h" + +#include <utility> +#include <vector> + +#include "base/containers/flat_map.h" +#include "base/no_destructor.h" +#include "base/optional.h" +#include "base/stl_util.h" +#include "base/strings/string_tokenizer.h" +#include "base/strings/string_util.h" +#include "net/http/structured_headers.h" + +namespace network { + +const char* const kClientHintsNameMapping[] = {"device-memory", + "dpr", + "width", + "viewport-width", + "rtt", + "downlink", + "ect", + "lang", + "ua", + "ua-arch", + "ua-platform", + "ua-model", + "ua-mobile", + "ua-full-version"}; + +const size_t kClientHintsMappingsCount = base::size(kClientHintsNameMapping); + +static_assert( + base::size(kClientHintsNameMapping) == + (static_cast<int>(network::mojom::WebClientHintsType::kMaxValue) + 1), + "Client Hint name table size must match network::mojom::WebClientHintsType " + "range"); + +namespace { + +struct ClientHintNameCompator { + bool operator()(const std::string& lhs, const std::string& rhs) const { + return base::CompareCaseInsensitiveASCII(lhs, rhs) < 0; + } +}; + +using DecodeMap = base::flat_map<std::string, + network::mojom::WebClientHintsType, + ClientHintNameCompator>; + +DecodeMap MakeDecodeMap() { + DecodeMap result; + for (size_t i = 0; + i < static_cast<int>(network::mojom::WebClientHintsType::kMaxValue) + 1; + ++i) { + result.insert( + std::make_pair(kClientHintsNameMapping[i], + static_cast<network::mojom::WebClientHintsType>(i))); + } + return result; +} + +const DecodeMap& GetDecodeMap() { + static const base::NoDestructor<DecodeMap> decode_map(MakeDecodeMap()); + return *decode_map; +} + +} // namespace + +base::Optional<std::vector<network::mojom::WebClientHintsType>> ParseAcceptCH( + const std::string& header) { + // Accept-CH is an sh-list of tokens; see: + // https://httpwg.org/http-extensions/client-hints.html#rfc.section.3.1 + base::Optional<net::structured_headers::List> maybe_list = + net::structured_headers::ParseList(header); + if (!maybe_list.has_value()) + return base::nullopt; + + // Standard validation rules: we want a list of tokens, so this better + // only have tokens (but params are OK!) + for (const auto& list_item : maybe_list.value()) { + // Make sure not a nested list. + if (list_item.member.size() != 1u) + return base::nullopt; + if (!list_item.member[0].item.is_token()) + return base::nullopt; + } + + std::vector<network::mojom::WebClientHintsType> result; + + // Now convert those to actual hint enums. + const DecodeMap& decode_map = GetDecodeMap(); + for (const auto& list_item : maybe_list.value()) { + const std::string& token_value = list_item.member[0].item.GetString(); + auto iter = decode_map.find(token_value); + if (iter != decode_map.end()) + result.push_back(iter->second); + } // for list_item + return base::make_optional(std::move(result)); +} + +} // namespace network
diff --git a/services/network/public/cpp/client_hints.h b/services/network/public/cpp/client_hints.h new file mode 100644 index 0000000..8f8db954 --- /dev/null +++ b/services/network/public/cpp/client_hints.h
@@ -0,0 +1,32 @@ +// 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 SERVICES_NETWORK_PUBLIC_CPP_CLIENT_HINTS_H_ +#define SERVICES_NETWORK_PUBLIC_CPP_CLIENT_HINTS_H_ + +#include <stddef.h> +#include <string> + +#include "base/component_export.h" +#include "base/optional.h" +#include "services/network/public/mojom/web_client_hints_types.mojom-shared.h" + +namespace network { + +// Mapping from WebClientHintsType to the hint's name in Accept-CH header. +// The ordering matches the ordering of enums in +// services/network/public/mojom/web_client_hints_types.mojom +COMPONENT_EXPORT(NETWORK_CPP) +extern const char* const kClientHintsNameMapping[]; +COMPONENT_EXPORT(NETWORK_CPP) extern const size_t kClientHintsMappingsCount; + +// Tries to parse an Accept-CH header. Returns base::nullopt if parsing +// failed and the header should be ignored; otherwise returns a (possibly +// empty) list of hints to accept. +base::Optional<std::vector<network::mojom::WebClientHintsType>> + COMPONENT_EXPORT(NETWORK_CPP) ParseAcceptCH(const std::string& header); + +} // namespace network + +#endif // SERVICES_NETWORK_PUBLIC_CPP_CLIENT_HINTS_H_
diff --git a/services/network/public/cpp/client_hints_unittest.cc b/services/network/public/cpp/client_hints_unittest.cc new file mode 100644 index 0000000..e1e4d2c --- /dev/null +++ b/services/network/public/cpp/client_hints_unittest.cc
@@ -0,0 +1,70 @@ +// 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/public/cpp/client_hints.h" +#include <iostream> + +#include "services/network/public/mojom/web_client_hints_types.mojom-shared.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::UnorderedElementsAre; + +namespace network { + +TEST(ClientHintsTest, ParseAcceptCH) { + base::Optional<std::vector<network::mojom::WebClientHintsType>> result; + + // Empty is OK. + result = ParseAcceptCH(" "); + ASSERT_TRUE(result.has_value()); + EXPECT_TRUE(result.value().empty()); + + // Normal case. + result = ParseAcceptCH("device-memory, rtt, lang "); + ASSERT_TRUE(result.has_value()); + EXPECT_THAT( + result.value(), + UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, + network::mojom::WebClientHintsType::kRtt, + network::mojom::WebClientHintsType::kLang)); + + // Must be a list of tokens, not other things. + result = ParseAcceptCH("\"device-memory\", \"rtt\", \"lang\""); + EXPECT_FALSE(result.has_value()); + + // Parameters to the tokens are ignored, as encourageed by structured headers + // spec. + result = ParseAcceptCH("device-memory;resolution=GIB, rtt, lang"); + ASSERT_TRUE(result.has_value()); + EXPECT_THAT( + result.value(), + UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, + network::mojom::WebClientHintsType::kRtt, + network::mojom::WebClientHintsType::kLang)); + + // Unknown tokens are fine, since this meant to be extensible. + result = ParseAcceptCH("device-memory, rtt, lang , nosuchtokenwhywhywhy"); + ASSERT_TRUE(result.has_value()); + EXPECT_THAT( + result.value(), + UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, + network::mojom::WebClientHintsType::kRtt, + network::mojom::WebClientHintsType::kLang)); +} + +TEST(ClientHintsTest, ParseAcceptCHCaseInsensitive) { + base::Optional<std::vector<network::mojom::WebClientHintsType>> result; + + // Matching is case-insensitive. + result = ParseAcceptCH("Device-meMory, Rtt, lanG "); + ASSERT_TRUE(result.has_value()); + EXPECT_THAT( + result.value(), + UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, + network::mojom::WebClientHintsType::kRtt, + network::mojom::WebClientHintsType::kLang)); +} + +} // namespace network
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 96389e9..47041706 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -660,24 +660,6 @@ ] } ], - "AutofillEnableLocalCardMigrationForNonSyncUser": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillEnableLocalCardMigrationForNonSyncUser" - ] - } - ] - } - ], "AutofillFieldMetadata": [ { "platforms": [
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn index 7e4a539..c563df9b 100644 --- a/third_party/blink/common/BUILD.gn +++ b/third_party/blink/common/BUILD.gn
@@ -203,6 +203,7 @@ "privacy_budget/identifiability_metrics_unittest.cc", "privacy_budget/identifiable_surface_unittest.cc", "test/run_all_unittests.cc", + "user_agent/user_agent_metadata_unittest.cc", "web_package/web_package_request_matcher_unittest.cc", ]
diff --git a/third_party/blink/common/client_hints/client_hints.cc b/third_party/blink/common/client_hints/client_hints.cc index 16fb5ff..cbd9341 100644 --- a/third_party/blink/common/client_hints/client_hints.cc +++ b/third_party/blink/common/client_hints/client_hints.cc
@@ -7,31 +7,13 @@ #include <utility> #include <vector> -#include "base/containers/flat_map.h" -#include "base/no_destructor.h" #include "base/optional.h" #include "base/stl_util.h" #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" -#include "net/http/structured_headers.h" namespace blink { -const char* const kClientHintsNameMapping[] = {"device-memory", - "dpr", - "width", - "viewport-width", - "rtt", - "downlink", - "ect", - "lang", - "ua", - "ua-arch", - "ua-platform", - "ua-model", - "ua-mobile", - "ua-full-version"}; - const char* const kClientHintsHeaderMapping[] = { "device-memory", "dpr", @@ -49,15 +31,10 @@ "sec-ch-ua-full-version", }; -const size_t kClientHintsMappingsCount = base::size(kClientHintsNameMapping); - -static_assert(base::size(kClientHintsNameMapping) == - base::size(kClientHintsHeaderMapping), - "The Client Hint name and header mappings must contain the same " - "number of entries."); +const size_t kClientHintsMappingsCount = base::size(kClientHintsHeaderMapping); static_assert( - base::size(kClientHintsNameMapping) == + base::size(kClientHintsHeaderMapping) == (static_cast<int>(network::mojom::WebClientHintsType::kMaxValue) + 1), "Client Hint name table size must match network::mojom::WebClientHintsType " "range"); @@ -70,37 +47,6 @@ const size_t kWebEffectiveConnectionTypeMappingCount = base::size(kWebEffectiveConnectionTypeMapping); -namespace { - -struct ClientHintNameCompator { - bool operator()(const std::string& lhs, const std::string& rhs) const { - return base::CompareCaseInsensitiveASCII(lhs, rhs) < 0; - } -}; - -using DecodeMap = base::flat_map<std::string, - network::mojom::WebClientHintsType, - ClientHintNameCompator>; - -DecodeMap MakeDecodeMap() { - DecodeMap result; - for (size_t i = 0; - i < static_cast<int>(network::mojom::WebClientHintsType::kMaxValue) + 1; - ++i) { - result.insert( - std::make_pair(kClientHintsNameMapping[i], - static_cast<network::mojom::WebClientHintsType>(i))); - } - return result; -} - -const DecodeMap& GetDecodeMap() { - static const base::NoDestructor<DecodeMap> decode_map(MakeDecodeMap()); - return *decode_map; -} - -} // namespace - std::string SerializeLangClientHint(const std::string& raw_language_list) { base::StringTokenizer t(raw_language_list, ","); std::string result; @@ -115,58 +61,34 @@ return result; } -base::Optional<std::vector<network::mojom::WebClientHintsType>> ParseAcceptCH( - const std::string& header, +base::Optional<std::vector<network::mojom::WebClientHintsType>> FilterAcceptCH( + base::Optional<std::vector<network::mojom::WebClientHintsType>> in, bool permit_lang_hints, bool permit_ua_hints) { - // Accept-CH is an sh-list of tokens; see: - // https://httpwg.org/http-extensions/client-hints.html#rfc.section.3.1 - base::Optional<net::structured_headers::List> maybe_list = - net::structured_headers::ParseList(header); - if (!maybe_list.has_value()) + if (!in.has_value()) return base::nullopt; - // Standard validation rules: we want a list of tokens, so this better - // only have tokens (but params are OK!) - for (const auto& list_item : maybe_list.value()) { - // Make sure not a nested list. - if (list_item.member.size() != 1u) - return base::nullopt; - if (!list_item.member[0].item.is_token()) - return base::nullopt; - } - std::vector<network::mojom::WebClientHintsType> result; - - // Now convert those to actual hint enums. - const DecodeMap& decode_map = GetDecodeMap(); - for (const auto& list_item : maybe_list.value()) { - const std::string& token_value = list_item.member[0].item.GetString(); - - auto iter = decode_map.find(token_value); - if (iter != decode_map.end()) { - network::mojom::WebClientHintsType hint = iter->second; - - // Some hints are supported only conditionally. - switch (hint) { - case network::mojom::WebClientHintsType::kLang: - if (permit_lang_hints) - result.push_back(hint); - break; - case network::mojom::WebClientHintsType::kUA: - case network::mojom::WebClientHintsType::kUAArch: - case network::mojom::WebClientHintsType::kUAPlatform: - case network::mojom::WebClientHintsType::kUAModel: - case network::mojom::WebClientHintsType::kUAMobile: - case network::mojom::WebClientHintsType::kUAFullVersion: - if (permit_ua_hints) - result.push_back(hint); - break; - default: + for (network::mojom::WebClientHintsType hint : in.value()) { + // Some hints are supported only conditionally. + switch (hint) { + case network::mojom::WebClientHintsType::kLang: + if (permit_lang_hints) result.push_back(hint); - } // switch (hint) - } // if iter != end - } // for list_item + break; + case network::mojom::WebClientHintsType::kUA: + case network::mojom::WebClientHintsType::kUAArch: + case network::mojom::WebClientHintsType::kUAPlatform: + case network::mojom::WebClientHintsType::kUAModel: + case network::mojom::WebClientHintsType::kUAMobile: + case network::mojom::WebClientHintsType::kUAFullVersion: + if (permit_ua_hints) + result.push_back(hint); + break; + default: + result.push_back(hint); + } + } return base::make_optional(std::move(result)); }
diff --git a/third_party/blink/common/client_hints/client_hints_unittest.cc b/third_party/blink/common/client_hints/client_hints_unittest.cc index 25fec1a..6924772 100644 --- a/third_party/blink/common/client_hints/client_hints_unittest.cc +++ b/third_party/blink/common/client_hints/client_hints_unittest.cc
@@ -14,15 +14,6 @@ namespace blink { -namespace mojom { - -void PrintTo(const network::mojom::WebClientHintsType& value, - std::ostream* os) { - *os << ::testing::PrintToString(static_cast<int>(value)); -} - -} // namespace mojom - TEST(ClientHintsTest, SerializeLangClientHint) { std::string header = SerializeLangClientHint(""); EXPECT_TRUE(header.empty()); @@ -38,79 +29,18 @@ header); } -TEST(ClientHintsTest, ParseAcceptCH) { +TEST(ClientHintsTest, FilterAcceptCH) { + EXPECT_FALSE(FilterAcceptCH(base::nullopt, true, true).has_value()); + base::Optional<std::vector<network::mojom::WebClientHintsType>> result; - // Empty is OK. - result = ParseAcceptCH(" ", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ true); - ASSERT_TRUE(result.has_value()); - EXPECT_TRUE(result.value().empty()); - - // Normal case. - result = ParseAcceptCH("device-memory, rtt, lang ", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ true); - ASSERT_TRUE(result.has_value()); - EXPECT_THAT( - result.value(), - UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, - network::mojom::WebClientHintsType::kRtt, - network::mojom::WebClientHintsType::kLang)); - - // Must be a list of tokens, not other things. - result = ParseAcceptCH("\"device-memory\", \"rtt\", \"lang\"", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ true); - EXPECT_FALSE(result.has_value()); - - // Parameters to the tokens are ignored, as encourageed by structured headers - // spec. - result = ParseAcceptCH("device-memory;resolution=GIB, rtt, lang", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ true); - ASSERT_TRUE(result.has_value()); - EXPECT_THAT( - result.value(), - UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, - network::mojom::WebClientHintsType::kRtt, - network::mojom::WebClientHintsType::kLang)); - - // Unknown tokens are fine, since this meant to be extensible. - result = ParseAcceptCH("device-memory, rtt, lang , nosuchtokenwhywhywhy", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ true); - ASSERT_TRUE(result.has_value()); - EXPECT_THAT( - result.value(), - UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, - network::mojom::WebClientHintsType::kRtt, - network::mojom::WebClientHintsType::kLang)); -} - -TEST(ClientHintsTest, ParseAcceptCHCaseInsensitive) { - base::Optional<std::vector<network::mojom::WebClientHintsType>> result; - - // Matching is case-insensitive. - result = ParseAcceptCH("Device-meMory, Rtt, lanG ", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ true); - ASSERT_TRUE(result.has_value()); - EXPECT_THAT( - result.value(), - UnorderedElementsAre(network::mojom::WebClientHintsType::kDeviceMemory, - network::mojom::WebClientHintsType::kRtt, - network::mojom::WebClientHintsType::kLang)); -} - -// Checks to make sure that language-controlled things are filtered. -TEST(ClientHintsTest, ParseAcceptCHFlag) { - base::Optional<std::vector<network::mojom::WebClientHintsType>> result; - - result = ParseAcceptCH("device-memory, rtt, lang, ua", - /* permit_lang_hints = */ false, - /* permit_ua_hints = */ true); + result = + FilterAcceptCH(std::vector<network::mojom::WebClientHintsType>( + {network::mojom::WebClientHintsType::kDeviceMemory, + network::mojom::WebClientHintsType::kRtt, + network::mojom::WebClientHintsType::kUA}), + /* permit_lang_hints = */ false, + /* permit_ua_hints = */ true); ASSERT_TRUE(result.has_value()); EXPECT_THAT( result.value(), @@ -118,18 +48,27 @@ network::mojom::WebClientHintsType::kRtt, network::mojom::WebClientHintsType::kUA)); - result = ParseAcceptCH("rtt, lang, ua, arch, platform, model, mobile", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ false); + std::vector<network::mojom::WebClientHintsType> in{ + network::mojom::WebClientHintsType::kRtt, + network::mojom::WebClientHintsType::kLang, + network::mojom::WebClientHintsType::kUA, + network::mojom::WebClientHintsType::kUAArch, + network::mojom::WebClientHintsType::kUAPlatform, + network::mojom::WebClientHintsType::kUAModel, + network::mojom::WebClientHintsType::kUAMobile, + network::mojom::WebClientHintsType::kUAFullVersion}; + + result = FilterAcceptCH(in, + /* permit_lang_hints = */ true, + /* permit_ua_hints = */ false); ASSERT_TRUE(result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(network::mojom::WebClientHintsType::kRtt, network::mojom::WebClientHintsType::kLang)); - result = - ParseAcceptCH("rtt, lang, ua, ua-arch, ua-platform, ua-model, ua-mobile", - /* permit_lang_hints = */ true, - /* permit_ua_hints = */ true); + result = FilterAcceptCH(in, + /* permit_lang_hints = */ true, + /* permit_ua_hints = */ true); ASSERT_TRUE(result.has_value()); EXPECT_THAT( result.value(), @@ -139,11 +78,12 @@ network::mojom::WebClientHintsType::kUAArch, network::mojom::WebClientHintsType::kUAPlatform, network::mojom::WebClientHintsType::kUAModel, - network::mojom::WebClientHintsType::kUAMobile)); + network::mojom::WebClientHintsType::kUAMobile, + network::mojom::WebClientHintsType::kUAFullVersion)); - result = ParseAcceptCH("rtt, lang, ua, arch, platform, model, mobile", - /* permit_lang_hints = */ false, - /* permit_ua_hints = */ false); + result = FilterAcceptCH(in, + /* permit_lang_hints = */ false, + /* permit_ua_hints = */ false); ASSERT_TRUE(result.has_value()); EXPECT_THAT(result.value(), UnorderedElementsAre(network::mojom::WebClientHintsType::kRtt));
diff --git a/third_party/blink/common/user_agent/user_agent_metadata.cc b/third_party/blink/common/user_agent/user_agent_metadata.cc index fa5fcab0..2235acb 100644 --- a/third_party/blink/common/user_agent/user_agent_metadata.cc +++ b/third_party/blink/common/user_agent/user_agent_metadata.cc
@@ -4,8 +4,64 @@ #include "third_party/blink/public/common/user_agent/user_agent_metadata.h" +#include "base/pickle.h" + namespace blink { +namespace { +constexpr uint32_t kVersion = 1u; +} // namespace + +// static +base::Optional<std::string> UserAgentMetadata::Marshal( + const base::Optional<UserAgentMetadata>& in) { + if (!in) + return base::nullopt; + base::Pickle out; + out.WriteUInt32(kVersion); + out.WriteString(in->brand); + out.WriteString(in->full_version); + out.WriteString(in->major_version); + out.WriteString(in->platform); + out.WriteString(in->platform_version); + out.WriteString(in->architecture); + out.WriteString(in->model); + out.WriteBool(in->mobile); + return std::string(reinterpret_cast<const char*>(out.data()), out.size()); +} + +// static +base::Optional<UserAgentMetadata> UserAgentMetadata::Demarshal( + const base::Optional<std::string>& encoded) { + if (!encoded) + return base::nullopt; + + base::Pickle pickle(encoded->data(), encoded->size()); + base::PickleIterator in(pickle); + + uint32_t version; + UserAgentMetadata out; + if (!in.ReadUInt32(&version) || version != kVersion) + return base::nullopt; + if (!in.ReadString(&out.brand)) + return base::nullopt; + if (!in.ReadString(&out.full_version)) + return base::nullopt; + if (!in.ReadString(&out.major_version)) + return base::nullopt; + if (!in.ReadString(&out.platform)) + return base::nullopt; + if (!in.ReadString(&out.platform_version)) + return base::nullopt; + if (!in.ReadString(&out.architecture)) + return base::nullopt; + if (!in.ReadString(&out.model)) + return base::nullopt; + if (!in.ReadBool(&out.mobile)) + return base::nullopt; + return base::make_optional(std::move(out)); +} + bool operator==(const UserAgentMetadata& a, const UserAgentMetadata& b) { return a.brand == b.brand && a.full_version == b.full_version && a.major_version == b.major_version && a.platform == b.platform &&
diff --git a/third_party/blink/common/user_agent/user_agent_metadata_unittest.cc b/third_party/blink/common/user_agent/user_agent_metadata_unittest.cc new file mode 100644 index 0000000..eff3cca2 --- /dev/null +++ b/third_party/blink/common/user_agent/user_agent_metadata_unittest.cc
@@ -0,0 +1,38 @@ +// 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 "third_party/blink/public/common/user_agent/user_agent_metadata.h" + +#include "base/optional.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace blink { + +TEST(UserAgentMetaDataTest, Boundary) { + EXPECT_EQ(base::nullopt, UserAgentMetadata::Marshal(base::nullopt)); + EXPECT_EQ(base::nullopt, UserAgentMetadata::Demarshal(base::nullopt)); + EXPECT_EQ(base::nullopt, + UserAgentMetadata::Demarshal(std::string("nonsense"))); +} + +TEST(UserAgentMetaDataTest, Basic) { + blink::UserAgentMetadata to_encode; + to_encode.brand = "a"; + to_encode.full_version = "3.14"; + to_encode.major_version = "3"; + to_encode.platform = "TR-DOS"; + to_encode.platform_version = "5.03"; + to_encode.architecture = "Z80"; + to_encode.model = "unofficial"; + to_encode.mobile = false; + + EXPECT_EQ(to_encode, UserAgentMetadata::Demarshal( + UserAgentMetadata::Marshal(to_encode))); + + to_encode.mobile = true; + EXPECT_EQ(to_encode, UserAgentMetadata::Demarshal( + UserAgentMetadata::Marshal(to_encode))); +} + +} // namespace blink
diff --git a/third_party/blink/public/common/client_hints/client_hints.h b/third_party/blink/public/common/client_hints/client_hints.h index f7961a3..560e5bb 100644 --- a/third_party/blink/public/common/client_hints/client_hints.h +++ b/third_party/blink/public/common/client_hints/client_hints.h
@@ -14,11 +14,9 @@ namespace blink { -// Mapping from WebClientHintsType to the hint's name in header values (e.g. -// kLang => "lang"), and to the hint's outgoing header (e.g. kLang => -// "sec-ch-lang"). The ordering matches the ordering of enums in -// third_party/blink/public/platform/web_client_hints_type.h. -BLINK_COMMON_EXPORT extern const char* const kClientHintsNameMapping[]; +// Mapping from WebClientHintsType to the hint's to the hint's outgoing header +// (e.g. kLang => "sec-ch-lang"). The ordering matches the ordering of enums in +// services/network/public/mojom/web_client_hints_types.mojom BLINK_COMMON_EXPORT extern const char* const kClientHintsHeaderMapping[]; BLINK_COMMON_EXPORT extern const size_t kClientHintsMappingsCount; @@ -39,16 +37,15 @@ std::string BLINK_COMMON_EXPORT SerializeLangClientHint(const std::string& raw_language_list); -// Tries to parse an Accept-CH header. Returns base::nullopt if parsing -// failed and the header should be ignored; otherwise returns a (possibly -// empty) list of hints to accept. -// -// Language hints will only be in the result if |permit_lang_hints| is true; +// Filters a parsed accept-CH list to exclude clients hints support for which +// is currently conditional on experiments: +// Language hints will only be kept if |permit_lang_hints| is true; // UA-related ones if |permit_ua_hints| is. -base::Optional<std::vector<network::mojom::WebClientHintsType>> - BLINK_COMMON_EXPORT ParseAcceptCH(const std::string& header, - bool permit_lang_hints, - bool permit_ua_hints); +BLINK_COMMON_EXPORT +base::Optional<std::vector<network::mojom::WebClientHintsType>> FilterAcceptCH( + base::Optional<std::vector<network::mojom::WebClientHintsType>> in, + bool permit_lang_hints, + bool permit_ua_hints); } // namespace blink
diff --git a/third_party/blink/public/common/loader/loading_behavior_flag.h b/third_party/blink/public/common/loader/loading_behavior_flag.h index dfd6735..845f7024 100644 --- a/third_party/blink/public/common/loader/loading_behavior_flag.h +++ b/third_party/blink/public/common/loader/loading_behavior_flag.h
@@ -37,6 +37,10 @@ kLoadingBehaviorSubresourceFilterMatch = 1 << 6, // Indicates that the page is an AMP document, with <html amp> tag. kLoadingBehaviorAmpDocumentLoaded = 1 << 7, + // Indicates that font preloading (via <link rel=preload> or Font JS API) has + // occurred before the first rendering cycle begins. Used to study the + // effects of delaying the first rendering cycle for web font loading. + kLoadingBehaviorFontPreloadStartedBeforeRendering = 1 << 8, }; } // namespace blink
diff --git a/third_party/blink/public/common/user_agent/user_agent_metadata.h b/third_party/blink/public/common/user_agent/user_agent_metadata.h index bb01166..2c62bfdf 100644 --- a/third_party/blink/public/common/user_agent/user_agent_metadata.h +++ b/third_party/blink/public/common/user_agent/user_agent_metadata.h
@@ -23,6 +23,11 @@ std::string architecture; std::string model; bool mobile = false; + + static base::Optional<UserAgentMetadata> Demarshal( + const base::Optional<std::string>& encoded); + static base::Optional<std::string> Marshal( + const base::Optional<UserAgentMetadata>& ua_metadata); }; // Used when customizing the sent User-Agent and Sec-CH-UA-* for
diff --git a/third_party/blink/public/strings/translations/blink_strings_ta.xtb b/third_party/blink/public/strings/translations/blink_strings_ta.xtb index c39c3997..30332332 100644 --- a/third_party/blink/public/strings/translations/blink_strings_ta.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_ta.xtb
@@ -23,6 +23,7 @@ <translation id="1727886345390570319">விரிவான வசனங்கள் மெனுவை மறைக்கும்</translation> <translation id="1729654308190250600">காலி அல்லாத மின்னஞ்சல் முகவரியை உள்ளிடவும்.</translation> <translation id="1758486001363313524">மற்றவை…</translation> +<translation id="1787192514241997742">மொத்த நேரம்: <ph name="REMAINING_TIME" /></translation> <translation id="1806710327868736751">விழிப்பூட்டல்_உரையாடல்</translation> <translation id="1821985195704844674">ட்ரீ கிரிட்</translation> <translation id="1822429046913737220">AM/PM</translation>
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.cc b/third_party/blink/renderer/core/css/css_style_sheet.cc index 096dc27..edb16d23 100644 --- a/third_party/blink/renderer/core/css/css_style_sheet.cc +++ b/third_party/blink/renderer/core/css/css_style_sheet.cc
@@ -40,6 +40,7 @@ #include "third_party/blink/renderer/core/html/html_link_element.h" #include "third_party/blink/renderer/core/html/html_style_element.h" #include "third_party/blink/renderer/core/html_names.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/core/svg/svg_style_element.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" @@ -358,8 +359,8 @@ RuleMutationScope mutation_scope(this); if (rule->IsImportRule() && is_constructed_) { exception_state.ThrowDOMException( - DOMExceptionCode::kNotAllowedError, - "Can't insert @import rules to a constructed stylesheet."); + DOMExceptionCode::kSyntaxError, + "Can't insert @import rules into a constructed stylesheet."); return 0; } bool success = contents_->WrapperInsertRule(rule, index); @@ -460,15 +461,11 @@ DOMExceptionCode::kNotAllowedError, "Can't call replace on non-constructed CSSStyleSheets.")); } - // Parses the text synchronously, loads import rules asynchronously. - SetText(text, true /* allow_import_rules */, nullptr); - if (!IsLoading()) - return ScriptPromise::Cast(script_state, ToV8(this, script_state)); - // We're loading a stylesheet that contains @import rules. This is deprecated. - Deprecation::CountDeprecation(OwnerDocument(), - WebFeature::kCssStyleSheetReplaceWithImport); - resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); - return resolver_->Promise(); + SetText(text, CSSImportRules::kIgnoreWithWarning); + // We currently parse synchronously, and since @import support was removed, + // nothing else happens asynchronously. This API is left as-is, so that future + // async parsing can still be supported here. + return ScriptPromise::Cast(script_state, ToV8(this, script_state)); } void CSSStyleSheet::replaceSync(const String& text, @@ -478,7 +475,7 @@ DOMExceptionCode::kNotAllowedError, "Can't call replaceSync on non-constructed CSSStyleSheets."); } - SetText(text, false /* allow_import_rules */, &exception_state); + SetText(text, CSSImportRules::kIgnoreWithWarning); } void CSSStyleSheet::ResolveReplacePromiseIfNeeded(bool load_error_occured) { @@ -569,19 +566,21 @@ contents_->ClientLoadStarted(this); } -void CSSStyleSheet::SetText(const String& text, - bool allow_import_rules, - ExceptionState* exception_state) { +void CSSStyleSheet::SetText(const String& text, CSSImportRules import_rules) { child_rule_cssom_wrappers_.clear(); CSSStyleSheet::RuleMutationScope mutation_scope(this); contents_->ClearRules(); - if (contents_->ParseString(text, allow_import_rules) == - ParseSheetResult::kHasUnallowedImportRule) { - DCHECK(exception_state); - exception_state->ThrowDOMException(DOMExceptionCode::kNotAllowedError, - "@import rules are not allowed when " - "creating stylesheet synchronously."); + bool allow_imports = import_rules == CSSImportRules::kAllow; + if (contents_->ParseString(text, allow_imports) == + ParseSheetResult::kHasUnallowedImportRule && + import_rules == CSSImportRules::kIgnoreWithWarning) { + OwnerDocument()->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kJavaScript, + mojom::blink::ConsoleMessageLevel::kWarning, + "@import rules are not allowed here. See " + "https://github.com/WICG/construct-stylesheets/issues/" + "119#issuecomment-588352418.")); } }
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.h b/third_party/blink/renderer/core/css/css_style_sheet.h index 84d5355..238b5d2 100644 --- a/third_party/blink/renderer/core/css/css_style_sheet.h +++ b/third_party/blink/renderer/core/css/css_style_sheet.h
@@ -48,6 +48,11 @@ class ScriptState; class StyleSheetContents; +enum class CSSImportRules { + kAllow, + kIgnoreWithWarning, +}; + class CORE_EXPORT CSSStyleSheet final : public StyleSheet { DEFINE_WRAPPERTYPEINFO(); @@ -189,9 +194,7 @@ bool SheetLoaded(); bool LoadCompleted() const { return load_completed_; } void StartLoadingDynamicSheet(); - // If `allow_import_rules` is false, an ExceptionState pointer must be - // provided, otherwise it can be null. - void SetText(const String&, bool allow_import_rules, ExceptionState*); + void SetText(const String&, CSSImportRules); void SetMedia(MediaList*); void SetAlternateFromConstructor(bool); bool CanBeActivated(const String& current_preferrable_name) const;
diff --git a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc index 12ae1c05..9968959 100644 --- a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc +++ b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
@@ -22,57 +22,43 @@ namespace blink { namespace { -const int kFindingTimeoutMS = 100; -constexpr base::TimeDelta kFindTaskTestTimeout = - base::TimeDelta::FromSeconds(10); +constexpr base::TimeDelta kFindTaskTimeAllotment = + base::TimeDelta::FromMilliseconds(10); } // namespace -class FindTaskController::IdleFindTask - : public ScriptedIdleTaskController::IdleTask { +class FindTaskController::FindTask final : public GarbageCollected<FindTask> { public: - IdleFindTask(FindTaskController* controller, - Document* document, - int identifier, - const WebString& search_text, - const mojom::blink::FindOptions& options) + FindTask(FindTaskController* controller, + Document* document, + int identifier, + const WebString& search_text, + const mojom::blink::FindOptions& options) : document_(document), controller_(controller), identifier_(identifier), search_text_(search_text), options_(options.Clone()) { DCHECK(document_); - // We need to add deadline because some webpages might have frames - // that are always busy, resulting in bad experience in find-in-page - // because the scoping tasks are not run. - // See crbug.com/893465. - IdleRequestOptions* request_options = IdleRequestOptions::Create(); - request_options->setTimeout(kFindingTimeoutMS); - callback_handle_ = document_->RequestIdleCallback(this, request_options); + if (options.run_synchronously_for_testing) { + Invoke(); + } else { + controller_->GetLocalFrame() + ->GetTaskRunner(blink::TaskType::kInternalFindInPage) + ->PostTask(FROM_HERE, + WTF::Bind(&FindTask::Invoke, WrapWeakPersistent(this))); + } } - void Dispose() { - DCHECK_GT(callback_handle_, 0); - document_->CancelIdleCallback(callback_handle_); - } - - void ForceInvocationForTesting() { - invoke(MakeGarbageCollected<IdleDeadline>( - base::TimeTicks::Now() + kFindTaskTestTimeout, - IdleDeadline::CallbackType::kCalledWhenIdle)); - } - - void Trace(Visitor* visitor) override { + void Trace(Visitor* visitor) { visitor->Trace(controller_); visitor->Trace(document_); - ScriptedIdleTaskController::IdleTask::Trace(visitor); } - private: - void invoke(IdleDeadline* deadline) override { + void Invoke() { const base::TimeTicks task_start_time = base::TimeTicks::Now(); if (!controller_) return; - if (!controller_->ShouldFindMatches(search_text_, *options_)) { + if (!controller_->ShouldFindMatches(identifier_, search_text_, *options_)) { controller_->DidFinishTask(identifier_, search_text_, *options_, true /* finished_whole_request */, PositionInFlatTree(), 0 /* match_count */, @@ -120,6 +106,7 @@ (options_->forward ? 0 : kBackwards) | (options_->match_case ? 0 : kCaseInsensitive) | (options_->find_next ? 0 : kStartInSelection); + auto start_time = base::TimeTicks::Now(); while (search_start != search_end) { // Find in the whole block. @@ -152,7 +139,8 @@ break; } next_task_start_position = search_start; - if (deadline->timeRemaining() <= 0) + auto time_elapsed = base::TimeTicks::Now() - start_time; + if (time_elapsed > kFindTaskTimeAllotment) break; } controller_->DidFinishTask(identifier_, search_text_, *options_, @@ -163,7 +151,6 @@ Member<Document> document_; Member<FindTaskController> controller_; - int callback_handle_ = 0; const int identifier_; const WebString search_text_; mojom::blink::FindOptionsPtr options_; @@ -179,41 +166,40 @@ int identifier, const WebString& search_text, const mojom::blink::FindOptions& options) { + TRACE_EVENT_ASYNC_BEGIN0("blink", "FindInPageRequest", identifier); current_request_start_time_ = base::TimeTicks::Now(); total_task_duration_for_current_request_ = base::TimeDelta(); task_count_for_current_request_ = 0; DCHECK(!finding_in_progress_); + DCHECK_EQ(current_find_identifier_, kInvalidFindIdentifier); // This is a brand new search, so we need to reset everything. finding_in_progress_ = true; current_match_count_ = 0; - RequestIdleFindTask(identifier, search_text, options); + current_find_identifier_ = identifier; + RequestFindTask(identifier, search_text, options); } void FindTaskController::CancelPendingRequest() { - if (find_task_) { - find_task_->Dispose(); + if (find_task_) find_task_.Clear(); - } if (finding_in_progress_) { RecordRequestMetrics(RequestEndState::ABORTED); last_find_request_completed_with_no_matches_ = false; } finding_in_progress_ = false; resume_finding_from_range_ = nullptr; + current_find_identifier_ = kInvalidFindIdentifier; } -void FindTaskController::RequestIdleFindTask( +void FindTaskController::RequestFindTask( int identifier, const WebString& search_text, const mojom::blink::FindOptions& options) { DCHECK_EQ(find_task_, nullptr); - find_task_ = MakeGarbageCollected<IdleFindTask>( + DCHECK_EQ(identifier, current_find_identifier_); + task_count_for_current_request_++; + find_task_ = MakeGarbageCollected<FindTask>( this, GetLocalFrame()->GetDocument(), identifier, search_text, options); - // If it's for testing, run the task immediately. - // TODO(rakina): Change to use general solution when it's available. - // https://crbug.com/875203 - if (options.run_synchronously_for_testing) - find_task_->ForceInvocationForTesting(); } void FindTaskController::DidFinishTask( @@ -225,10 +211,8 @@ int match_count, bool aborted, base::TimeTicks task_start_time) { - if (find_task_) { - find_task_->Dispose(); - find_task_.Clear(); - } + if (current_find_identifier_ != identifier) + return; total_task_duration_for_current_request_ += base::TimeTicks::Now() - task_start_time; if (find_task_) @@ -251,20 +235,24 @@ if (!finished_whole_request) { // Task ran out of time, request for another one. - RequestIdleFindTask(identifier, search_text, options); + RequestFindTask(identifier, search_text, options); return; // Done for now, resume work later. } text_finder_->FinishCurrentScopingEffort(identifier); RecordRequestMetrics(RequestEndState::ABORTED); - last_find_request_completed_with_no_matches_ = !current_match_count_; + last_find_request_completed_with_no_matches_ = + !aborted && !current_match_count_; finding_in_progress_ = false; + current_find_identifier_ = kInvalidFindIdentifier; } void FindTaskController::RecordRequestMetrics( RequestEndState request_end_state) { bool aborted = (request_end_state == RequestEndState::ABORTED); + TRACE_EVENT_ASYNC_END1("blink", "FindInPageRequest", current_find_identifier_, + "aborted", aborted); if (aborted) { UMA_HISTOGRAM_MEDIUM_TIMES("WebCore.FindInPage.TotalTaskDuration.Aborted", total_task_duration_for_current_request_); @@ -291,8 +279,11 @@ } bool FindTaskController::ShouldFindMatches( + int identifier, const String& search_text, const mojom::blink::FindOptions& options) { + if (identifier != current_find_identifier_) + return false; // Don't scope if we can't find a frame, a document, or a view. // The user may have closed the tab/application, so abort. LocalFrame* frame = GetLocalFrame();
diff --git a/third_party/blink/renderer/core/editing/finder/find_task_controller.h b/third_party/blink/renderer/core/editing/finder/find_task_controller.h index ff28a2d2..9a240d89 100644 --- a/third_party/blink/renderer/core/editing/finder/find_task_controller.h +++ b/third_party/blink/renderer/core/editing/finder/find_task_controller.h
@@ -9,9 +9,16 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/editing/position.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/scheduler/common/throttling/budget_pool.h" +#include "third_party/blink/renderer/platform/scheduler/common/throttling/budget_pool_controller.h" +#include "third_party/blink/renderer/platform/scheduler/common/throttling/cpu_time_budget_pool.h" +#include "third_party/blink/renderer/platform/scheduler/common/tracing_helper.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { +namespace { +const int kInvalidFindIdentifier = -1; +} class LocalFrame; class Range; @@ -45,10 +52,11 @@ // It is not necessary if the frame is invisible, for example, or if this // is a repeat search that already returned nothing last time the same prefix // was searched. - bool ShouldFindMatches(const String& search_text, + bool ShouldFindMatches(int identifier, + const String& search_text, const mojom::blink::FindOptions& options); - // During a run of |find_task|, we found a match. + // During a run of |idle_find_task|, we found a match. // Updates |current_match_count_| and notifies |text_finder_|. void DidFindMatch(int identifier, Range* result_range); @@ -69,16 +77,20 @@ // When invoked this will search for a given text and notify us // whenever a match is found or when it finishes, through FoundMatch and // DidFinishTask. - class IdleFindTask; + class FindTask; void Trace(Visitor* visitor); void ResetLastFindRequestCompletedWithNoMatches(); + void InvokeFind(int identifier, + const WebString& search_text_, + mojom::blink::FindOptionsPtr options_); + private: - void RequestIdleFindTask(int identifier, - const WebString& search_text, - const mojom::blink::FindOptions& options); + void RequestFindTask(int identifier, + const WebString& search_text, + const mojom::blink::FindOptions& options); enum class RequestEndState { // The find-in-page request got aborted before going through every text in @@ -95,7 +107,7 @@ Member<TextFinder> text_finder_; - Member<IdleFindTask> find_task_; + Member<FindTask> find_task_; // Keeps track if there is any ongoing find effort or not. bool finding_in_progress_; @@ -115,6 +127,10 @@ // without finding any matches in this frame. bool last_find_request_completed_with_no_matches_; + // The identifier of the current find request, we should only run FindTasks + // that have the same identifier as this. + int current_find_identifier_ = kInvalidFindIdentifier; + // The start time of the current find-in-page request. base::TimeTicks current_request_start_time_; // The combined duration of all the tasks done for the current request.
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 c8d7b26..a27b383 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -12775,7 +12775,7 @@ // page. EXPECT_EQ(WebNavigationControl::NoLoadInProgress, To<WebLocalFrameImpl>(child)->MaybeRenderFallbackContent( - ResourceError::Failure(request.Url()))); + WebURLError(ResourceError::Failure(request.Url())))); } TEST_F(WebFrameTest, AltTextOnAboutBlankPage) {
diff --git a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc index 5a86406..17aa7a3f 100644 --- a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc +++ b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
@@ -680,7 +680,7 @@ } void WebPluginContainerImpl::DidFailLoading(const ResourceError& error) { - web_plugin_->DidFailLoading(error); + web_plugin_->DidFailLoading(WebURLError(error)); } cc::Layer* WebPluginContainerImpl::CcLayer() const {
diff --git a/third_party/blink/renderer/core/frame/frame_serializer_test.cc b/third_party/blink/renderer/core/frame/frame_serializer_test.cc index 9ba3b657..00c0208 100644 --- a/third_party/blink/renderer/core/frame/frame_serializer_test.cc +++ b/third_party/blink/renderer/core/frame/frame_serializer_test.cc
@@ -100,7 +100,7 @@ response.SetHttpStatusCode(status_code); platform_->GetURLLoaderMockFactory()->RegisterErrorURL( - KURL(base_url_, file), response, error); + KURL(base_url_, file), response, WebURLError(error)); } void RegisterRewriteURL(const char* from_url, const char* to_url) {
diff --git a/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h b/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h index 69168e0..bccebbd 100644 --- a/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h +++ b/third_party/blink/renderer/core/html/forms/color_chooser_ui_controller.h
@@ -74,6 +74,7 @@ private: mojo::Remote<mojom::blink::ColorChooserFactory> color_chooser_factory_; HeapMojoReceiver<mojom::blink::ColorChooserClient, + ColorChooserUIController, HeapMojoWrapperMode::kWithoutContextObserver> receiver_; };
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc index 7769a1aa1..ce12579c 100644 --- a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc +++ b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
@@ -997,7 +997,7 @@ bool InspectorStyleSheet::SetText(const String& text, ExceptionState& exception_state) { InnerSetText(text, true); - page_style_sheet_->SetText(text, true /* allow_import_rules */, nullptr); + page_style_sheet_->SetText(text, CSSImportRules::kAllow); OnStyleSheetTextChanged(); return true; }
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager.cc b/third_party/blink/renderer/core/loader/font_preload_manager.cc index 66ffa3c..babcddb 100644 --- a/third_party/blink/renderer/core/loader/font_preload_manager.cc +++ b/third_party/blink/renderer/core/loader/font_preload_manager.cc
@@ -6,8 +6,10 @@ #include "build/build_config.h" #include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/common/loader/loading_behavior_flag.h" #include "third_party/blink/renderer/core/css/font_face.h" #include "third_party/blink/renderer/core/dom/document.h" +#include "third_party/blink/renderer/core/loader/document_loader.h" #include "third_party/blink/renderer/core/loader/resource/font_resource.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_finish_observer.h" @@ -83,9 +85,6 @@ } void FontPreloadManager::FontPreloadingStarted(FontResource* font_resource) { - if (!base::FeatureList::IsEnabled(features::kFontPreloadingDelaysRendering)) - return; - // The font is either already in the memory cache, or has errored out. In // either case, we don't any further processing. if (font_resource->IsLoaded()) @@ -94,6 +93,12 @@ if (state_ == State::kUnblocked) return; + document_->Loader()->DidObserveLoadingBehavior( + kLoadingBehaviorFontPreloadStartedBeforeRendering); + + if (!base::FeatureList::IsEnabled(features::kFontPreloadingDelaysRendering)) + return; + FontPreloadFinishObserver* observer = MakeGarbageCollected<FontPreloadFinishObserver>(*font_resource, *document_); @@ -105,15 +110,18 @@ } void FontPreloadManager::ImperativeFontLoadingStarted(FontFace* font_face) { - if (!base::FeatureList::IsEnabled(features::kFontPreloadingDelaysRendering)) - return; - if (font_face->LoadStatus() != FontFace::kLoading) return; if (state_ == State::kUnblocked) return; + document_->Loader()->DidObserveLoadingBehavior( + kLoadingBehaviorFontPreloadStartedBeforeRendering); + + if (!base::FeatureList::IsEnabled(features::kFontPreloadingDelaysRendering)) + return; + ImperativeFontLoadFinishedCallback* callback = MakeGarbageCollected<ImperativeFontLoadFinishedCallback>(*document_); font_face->AddCallback(callback); @@ -170,8 +178,6 @@ } void FontPreloadManager::WillBeginRendering() { - if (!base::FeatureList::IsEnabled(features::kFontPreloadingDelaysRendering)) - return; if (state_ == State::kUnblocked) return;
diff --git a/third_party/blink/renderer/core/loader/font_preload_manager_test.cc b/third_party/blink/renderer/core/loader/font_preload_manager_test.cc index 8a25406..a3ce32c 100644 --- a/third_party/blink/renderer/core/loader/font_preload_manager_test.cc +++ b/third_party/blink/renderer/core/loader/font_preload_manager_test.cc
@@ -483,4 +483,103 @@ EXPECT_FALSE(GetTargetFont().ShouldSkipDrawing()); } +class FontPreloadBehaviorObservationTest + : public testing::WithParamInterface<bool>, + public SimTest { + public: + class LoadingBehaviorObserver + : public frame_test_helpers::TestWebFrameClient { + public: + void DidObserveLoadingBehavior(LoadingBehaviorFlag flag) override { + observed_behaviors_ = + static_cast<LoadingBehaviorFlag>(observed_behaviors_ | flag); + } + + LoadingBehaviorFlag ObservedBehaviors() const { + return observed_behaviors_; + } + + private: + LoadingBehaviorFlag observed_behaviors_ = kLoadingBehaviorNone; + }; + + void SetUp() override { + SimTest::SetUp(); + original_web_local_frame_client_ = MainFrame().Client(); + MainFrame().SetClient(&loading_behavior_observer_); + } + + void TearDown() override { + MainFrame().SetClient(original_web_local_frame_client_); + SimTest::TearDown(); + } + + LoadingBehaviorFlag ObservedBehaviors() const { + return loading_behavior_observer_.ObservedBehaviors(); + } + + private: + WebLocalFrameClient* original_web_local_frame_client_; + LoadingBehaviorObserver loading_behavior_observer_; +}; + +INSTANTIATE_TEST_SUITE_P(All, + FontPreloadBehaviorObservationTest, + testing::Bool()); + +TEST_P(FontPreloadBehaviorObservationTest, ObserveBehaviorWithLinkPreload) { + // kLoadingBehaviorFontPreloadStartedBeforeRendering should be observed as + // long as there's font preloading, regardless of the enabled status of the + // feature FontPreloadingDelaysRendering. + base::test::ScopedFeatureList scoped_feature_list; + if (GetParam()) { + scoped_feature_list.InitAndEnableFeature( + features::kFontPreloadingDelaysRendering); + } + + SimRequest main_resource("https://example.com", "text/html"); + SimRequest font_resource("https://example.com/font.woff", "font/woff2"); + + LoadURL("https://example.com"); + main_resource.Complete(R"HTML( + <!doctype html> + <link rel="preload" as="font" type="font/woff2" + href="https://example.com/font.woff" crossorigin> + )HTML"); + + EXPECT_TRUE(ObservedBehaviors() | + kLoadingBehaviorFontPreloadStartedBeforeRendering); + + font_resource.Finish(); + test::RunPendingTasks(); +} + +TEST_P(FontPreloadBehaviorObservationTest, ObserveBehaviorWithImperativeLoad) { + // kLoadingBehaviorFontPreloadStartedBeforeRendering should be observed as + // long as there's an imperative font load, regardless of the enabled status + // of the feature FontPreloadingDelaysRendering. + base::test::ScopedFeatureList scoped_feature_list; + if (GetParam()) { + scoped_feature_list.InitAndEnableFeature( + features::kFontPreloadingDelaysRendering); + } + + SimRequest main_resource("https://example.com", "text/html"); + SimRequest font_resource("https://example.com/font.woff", "font/woff2"); + + LoadURL("https://example.com"); + main_resource.Complete(R"HTML( + <!doctype html> + <script> + new FontFace('custom-font', 'url(https://example.com/font.woff)').load(); + </script> + )HTML"); + + EXPECT_TRUE(ObservedBehaviors() | + kLoadingBehaviorFontPreloadStartedBeforeRendering); + + font_resource.Finish(); + test::RunPendingTasks(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/loader/web_associated_url_loader_impl.cc b/third_party/blink/renderer/core/loader/web_associated_url_loader_impl.cc index bf9f746..2cd1333 100644 --- a/third_party/blink/renderer/core/loader/web_associated_url_loader_impl.cc +++ b/third_party/blink/renderer/core/loader/web_associated_url_loader_impl.cc
@@ -292,7 +292,7 @@ } void WebAssociatedURLLoaderImpl::ClientAdapter::DidFailRedirectCheck() { - DidFail(ResourceError::Failure(NullURL())); + DidFail(WebURLError(ResourceError::Failure(NullURL()))); } void WebAssociatedURLLoaderImpl::ClientAdapter::EnableErrorNotifications() { @@ -453,8 +453,9 @@ } if (!loader_) { - client_adapter_->DidFail(ResourceError::CancelledDueToAccessCheckError( - request.Url(), ResourceRequestBlockedReason::kOther)); + client_adapter_->DidFail( + WebURLError(ResourceError::CancelledDueToAccessCheckError( + request.Url(), ResourceRequestBlockedReason::kOther))); } client_adapter_->EnableErrorNotifications(); } @@ -501,7 +502,7 @@ if (!client_) return; - ReleaseClient()->DidFail(ResourceError::CancelledError(KURL())); + ReleaseClient()->DidFail(WebURLError(ResourceError::CancelledError(KURL()))); // |this| may be dead here. }
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 eea55437..f42fd395 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
@@ -142,11 +142,11 @@ .UpdateLargestContentfulPaintCandidate(); } - if (!records_manager_.HasUnregisteredRecordsInQueued( + if (!records_manager_.HasUnregisteredRecordsInQueue( last_registered_frame_index_)) return; - last_registered_frame_index_ = records_manager_.LastQueuedFrameIndex(); + last_registered_frame_index_ = frame_index_ - 1; RegisterNotifySwapTime(); }
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector.h b/third_party/blink/renderer/core/paint/image_paint_timing_detector.h index 29c490a6..9f0b47b 100644 --- a/third_party/blink/renderer/core/paint/image_paint_timing_detector.h +++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector.h
@@ -122,7 +122,7 @@ // Compare the last frame index in queue with the last frame index that has // registered for assigning paint time. - inline bool HasUnregisteredRecordsInQueued( + inline bool HasUnregisteredRecordsInQueue( unsigned last_registered_frame_index) { while (!images_queued_for_paint_time_.IsEmpty() && !images_queued_for_paint_time_.back()) { @@ -130,7 +130,6 @@ } if (images_queued_for_paint_time_.IsEmpty()) return false; - DCHECK(last_registered_frame_index <= LastQueuedFrameIndex()); return last_registered_frame_index < LastQueuedFrameIndex(); } void AssignPaintTimeToRegisteredQueuedRecords(
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc index 1806def4..110c4e7c 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -189,6 +189,15 @@ return kIgnoreObject; } + // Objects inside a portal should be ignored. Portals don't directly expose + // their contents as the contents are not focusable (portals do not currently + // support input events). Portals do use their contents to compute a default + // accessible name. + if (GetDocument() && GetDocument()->GetPage() && + GetDocument()->GetPage()->InsidePortal()) { + return kIgnoreObject; + } + if (IsTableLikeRole() || IsTableRowLikeRole() || IsTableCellLikeRole()) return kIncludeObject; @@ -2972,12 +2981,6 @@ if (GetNode() && IsA<HTMLMapElement>(GetNode())) return false; // Does not have a role, so check here - // The AXTree of a portal should only have one node: the root document node. - if (GetNode() && GetNode()->IsDocumentNode() && - GetNode()->GetDocument().GetPage() && - GetNode()->GetDocument().GetPage()->InsidePortal()) - return false; - switch (native_role_) { case ax::mojom::Role::kCheckBox: case ax::mojom::Role::kImage:
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 8673b9e1..8982c381 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1346,15 +1346,12 @@ if (IsDetached()) return false; - // NOT focusable: anything inside a <portal> (the portal element itself is). - if (GetDocument() && GetDocument()->GetPage() && - GetDocument()->GetPage()->InsidePortal()) { - return false; - } - - // Focusable: web area -- this is the only focusable non-element. + bool inside_portal = GetDocument() && GetDocument()->GetPage() && + GetDocument()->GetPage()->InsidePortal(); + // Focusable: web area -- this is the only focusable non-element. Web areas + // inside portals are not focusable though (portal contents cannot get focus). if (IsWebArea()) - return true; + return !inside_portal; // NOT focusable: objects with no DOM node, e.g. extra layout blocks inserted // as filler, or objects where the node is not an element, such as a text
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h index 0c1eaa75..5bd7749 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.h
@@ -402,7 +402,7 @@ // The permission service, enabling us to check for event listener // permission. HeapMojoRemote<mojom::blink::PermissionService> permission_service_; - HeapMojoReceiver<mojom::blink::PermissionObserver> + HeapMojoReceiver<mojom::blink::PermissionObserver, AXObjectCacheImpl> permission_observer_receiver_; // The main document, plus any page popups.
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store.h b/third_party/blink/renderer/modules/cookie_store/cookie_store.h index 4d3c596..7cfec4bf 100644 --- a/third_party/blink/renderer/modules/cookie_store/cookie_store.h +++ b/third_party/blink/renderer/modules/cookie_store/cookie_store.h
@@ -140,7 +140,7 @@ // This receiver is set up on-demand, when the cookie store has at least one // change event listener. If all the listeners are unregistered, the receiver // is torn down. - HeapMojoReceiver<network::mojom::blink::CookieChangeListener> + HeapMojoReceiver<network::mojom::blink::CookieChangeListener, CookieStore> change_listener_receiver_; // Default for cookie_url in CookieStoreGetOptions.
diff --git a/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h b/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h index 1248ecef..3663d7239 100644 --- a/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h +++ b/third_party/blink/renderer/modules/gamepad/gamepad_shared_memory_reader.h
@@ -66,6 +66,7 @@ bool ever_interacted_with_ = false; HeapMojoReceiver<device::mojom::blink::GamepadObserver, + GamepadSharedMemoryReader, HeapMojoWrapperMode::kWithoutContextObserver> receiver_; mojo::Remote<device::mojom::blink::GamepadMonitor> gamepad_monitor_remote_;
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc index 717318e..c2f5323c 100644 --- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc +++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
@@ -74,6 +74,15 @@ constexpr const char* kAudioMimeTypePrefix = "audio/"; constexpr const char* kVideoMimeTypePrefix = "video/"; constexpr const char* kCodecsMimeTypeParam = "codecs"; +constexpr const char* kSmpteSt2086HdrMetadataType = "smpteSt2086"; +constexpr const char* kSmpteSt209410HdrMetadataType = "smpteSt2094-10"; +constexpr const char* kSmpteSt209440HdrMetadataType = "smpteSt2094-40"; +constexpr const char* kSrgbColorGamut = "srgb"; +constexpr const char* kP3ColorGamut = "p3"; +constexpr const char* kRec2020ColorGamut = "rec2020"; +constexpr const char* kSrgbTransferFunction = "srgb"; +constexpr const char* kPqTransferFunction = "pq"; +constexpr const char* kHlgTransferFunction = "hlg"; // Gets parameters for kMediaLearningSmoothnessExperiment field trial. Will // provide sane defaults when field trial not enabled. Values of -1 indicate @@ -357,6 +366,57 @@ return true; } +void ParseDynamicRangeConfigurations( + const blink::VideoConfiguration* video_config, + media::VideoColorSpace* color_space, + media::HdrMetadataType* hdr_metadata) { + DCHECK(color_space); + DCHECK(hdr_metadata); + + // TODO(1066628): Follow up on MediaCapabilities spec regarding reconciling + // discrepancies between mime type and colorGamut/transferFunction; for now, + // give precedence to the latter. + + const String& hdr_metadata_type = video_config->hdrMetadataType(); + if (hdr_metadata_type == kSmpteSt2086HdrMetadataType) { + *hdr_metadata = media::HdrMetadataType::kSmpteSt2086; + } else if (hdr_metadata_type == kSmpteSt209410HdrMetadataType) { + *hdr_metadata = media::HdrMetadataType::kSmpteSt2094_10; + } else if (hdr_metadata_type == kSmpteSt209440HdrMetadataType) { + *hdr_metadata = media::HdrMetadataType::kSmpteSt2094_40; + } else if (hdr_metadata_type.IsNull()) { + *hdr_metadata = media::HdrMetadataType::kNone; + } else { + NOTREACHED(); + } + + const String& color_gamut = video_config->colorGamut(); + if (color_gamut == kSrgbColorGamut) { + color_space->primaries = media::VideoColorSpace::PrimaryID::BT709; + } else if (color_gamut == kP3ColorGamut) { + color_space->primaries = media::VideoColorSpace::PrimaryID::SMPTEST431_2; + } else if (color_gamut == kRec2020ColorGamut) { + color_space->primaries = media::VideoColorSpace::PrimaryID::BT2020; + } else if (color_gamut.IsNull()) { + // Leave |color_space->primaries| as-is. + } else { + NOTREACHED(); + } + + const String& transfer_function = video_config->transferFunction(); + if (transfer_function == kSrgbTransferFunction) { + color_space->transfer = media::VideoColorSpace::TransferID::BT709; + } else if (transfer_function == kPqTransferFunction) { + color_space->transfer = media::VideoColorSpace::TransferID::SMPTEST2084; + } else if (transfer_function == kHlgTransferFunction) { + color_space->transfer = media::VideoColorSpace::TransferID::ARIB_STD_B67; + } else if (transfer_function.IsNull()) { + // Leave |color_space->transfer| as-is. + } else { + NOTREACHED(); + } +} + // Returns whether the audio codec associated with the audio configuration is // valid and non-ambiguous. // |console_warning| is an out param containing a message to be printed in the @@ -456,6 +516,7 @@ uint8_t video_level = 0; media::VideoColorSpace video_color_space; bool is_video_codec_ambiguous = true; + media::HdrMetadataType hdr_metadata_type; // Must succeed as IsVideoCodecValid() should have been called before. bool parsed = media::ParseVideoCodecString( @@ -463,8 +524,11 @@ &video_profile, &video_level, &video_color_space); DCHECK(parsed && !is_video_codec_ambiguous); - return media::IsSupportedVideoType( - {video_codec, video_profile, video_level, video_color_space}); + ParseDynamicRangeConfigurations(video_config, &video_color_space, + &hdr_metadata_type); + + return media::IsSupportedVideoType({video_codec, video_profile, video_level, + video_color_space, hdr_metadata_type}); } void OnMediaCapabilitiesEncodingInfo(
diff --git a/third_party/blink/renderer/modules/media_capabilities/video_configuration.idl b/third_party/blink/renderer/modules/media_capabilities/video_configuration.idl index af63d0b..84dc8eff 100644 --- a/third_party/blink/renderer/modules/media_capabilities/video_configuration.idl +++ b/third_party/blink/renderer/modules/media_capabilities/video_configuration.idl
@@ -4,10 +4,17 @@ // https://wicg.github.io/media-capabilities/#dictdef-videoconfiguration +enum HdrMetadataType { "smpteSt2086", "smpteSt2094-10", "smpteSt2094-40" }; +enum ColorGamut { "srgb", "p3", "rec2020" }; +enum TransferFunction { "srgb", "pq", "hlg" }; + dictionary VideoConfiguration { required DOMString contentType; required unsigned long width; required unsigned long height; required unsigned long bitrate; required double framerate; + [RuntimeEnabled=MediaCapabilitiesDynamicRange] HdrMetadataType hdrMetadataType; + [RuntimeEnabled=MediaCapabilitiesDynamicRange] ColorGamut colorGamut; + [RuntimeEnabled=MediaCapabilitiesDynamicRange] TransferFunction transferFunction; };
diff --git a/third_party/blink/renderer/modules/mediasession/media_session.h b/third_party/blink/renderer/modules/mediasession/media_session.h index 6031551..f357ea6 100644 --- a/third_party/blink/renderer/modules/mediasession/media_session.h +++ b/third_party/blink/renderer/modules/mediasession/media_session.h
@@ -31,7 +31,7 @@ class MODULES_EXPORT MediaSession final : public ScriptWrappable, public ExecutionContextClient, - blink::mojom::blink::MediaSessionClient { + public blink::mojom::blink::MediaSessionClient { USING_GARBAGE_COLLECTED_MIXIN(MediaSession); DEFINE_WRAPPERTYPEINFO(); @@ -87,6 +87,7 @@ HeapHashMap<String, Member<V8MediaSessionActionHandler>> action_handlers_; mojo::Remote<mojom::blink::MediaSessionService> service_; HeapMojoReceiver<blink::mojom::blink::MediaSessionClient, + MediaSession, HeapMojoWrapperMode::kWithoutContextObserver> client_receiver_; };
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices.h b/third_party/blink/renderer/modules/mediastream/media_devices.h index 4ebba1a..212f6ef 100644 --- a/third_party/blink/renderer/modules/mediastream/media_devices.h +++ b/third_party/blink/renderer/modules/mediastream/media_devices.h
@@ -121,7 +121,7 @@ TaskHandle dispatch_scheduled_events_task_handle_; HeapVector<Member<Event>> scheduled_events_; mojo::Remote<mojom::blink::MediaDevicesDispatcherHost> dispatcher_host_; - HeapMojoReceiver<mojom::blink::MediaDevicesListener> receiver_; + HeapMojoReceiver<mojom::blink::MediaDevicesListener, MediaDevices> receiver_; HeapHashSet<Member<ScriptPromiseResolver>> requests_; EnumerateDevicesTestCallback enumerate_devices_test_callback_;
diff --git a/third_party/blink/renderer/modules/native_file_system/native_file_system_directory_iterator.h b/third_party/blink/renderer/modules/native_file_system/native_file_system_directory_iterator.h index 6944832..4480443 100644 --- a/third_party/blink/renderer/modules/native_file_system/native_file_system_directory_iterator.h +++ b/third_party/blink/renderer/modules/native_file_system/native_file_system_directory_iterator.h
@@ -46,6 +46,7 @@ Member<ScriptPromiseResolver> pending_next_; Member<NativeFileSystemDirectoryHandle> directory_; HeapMojoReceiver<mojom::blink::NativeFileSystemDirectoryEntriesListener, + NativeFileSystemDirectoryIterator, HeapMojoWrapperMode::kWithoutContextObserver> receiver_; };
diff --git a/third_party/blink/renderer/modules/permissions/permission_status.h b/third_party/blink/renderer/modules/permissions/permission_status.h index 395c5e7..d97de3c 100644 --- a/third_party/blink/renderer/modules/permissions/permission_status.h +++ b/third_party/blink/renderer/modules/permissions/permission_status.h
@@ -72,7 +72,8 @@ MojoPermissionStatus status_; MojoPermissionDescriptor descriptor_; - HeapMojoReceiver<mojom::blink::PermissionObserver> receiver_; + HeapMojoReceiver<mojom::blink::PermissionObserver, PermissionStatus> + receiver_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.cc b/third_party/blink/renderer/modules/presentation/presentation_connection.cc index de49ab2..85905a3 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_connection.cc +++ b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
@@ -240,7 +240,7 @@ DCHECK(request); auto* connection = MakeGarbageCollected<ControllerPresentationConnection>( - *controller->GetFrame(), controller, presentation_info.id, + *controller->GetSupplementable(), controller, presentation_info.id, presentation_info.url); controller->RegisterConnection(connection);
diff --git a/third_party/blink/renderer/modules/presentation/presentation_controller.cc b/third_party/blink/renderer/modules/presentation/presentation_controller.cc index 5dd3bf68..f2e7db76 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_controller.cc +++ b/third_party/blink/renderer/modules/presentation/presentation_controller.cc
@@ -22,7 +22,6 @@ PresentationController::PresentationController(LocalFrame& frame) : Supplement<LocalFrame>(frame), - ExecutionContextLifecycleObserver(frame.GetDocument()), presentation_controller_receiver_(this, frame.DomWindow()) {} PresentationController::~PresentationController() = default; @@ -60,7 +59,6 @@ visitor->Trace(connections_); visitor->Trace(availability_state_); Supplement<LocalFrame>::Trace(visitor); - ExecutionContextLifecycleObserver::Trace(visitor); } void PresentationController::SetPresentation(Presentation* presentation) { @@ -153,10 +151,10 @@ mojo::Remote<mojom::blink::PresentationService>& PresentationController::GetPresentationService() { - if (!presentation_service_remote_ && GetFrame()) { + if (!presentation_service_remote_ && GetSupplementable()) { scoped_refptr<base::SingleThreadTaskRunner> task_runner = - GetFrame()->GetTaskRunner(TaskType::kPresentation); - GetFrame()->GetBrowserInterfaceBroker().GetInterface( + GetSupplementable()->GetTaskRunner(TaskType::kPresentation); + GetSupplementable()->GetBrowserInterfaceBroker().GetInterface( presentation_service_remote_.BindNewPipeAndPassReceiver(task_runner)); presentation_service_remote_->SetController( presentation_controller_receiver_.BindNewPipeAndPassRemote(
diff --git a/third_party/blink/renderer/modules/presentation/presentation_controller.h b/third_party/blink/renderer/modules/presentation/presentation_controller.h index 3eb0dad..a5789e6 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_controller.h +++ b/third_party/blink/renderer/modules/presentation/presentation_controller.h
@@ -8,7 +8,6 @@ #include "base/macros.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/presentation/presentation.mojom-blink.h" -#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/modules/modules_export.h" @@ -31,7 +30,6 @@ class MODULES_EXPORT PresentationController : public GarbageCollected<PresentationController>, public Supplement<LocalFrame>, - public ExecutionContextLifecycleObserver, public mojom::blink::PresentationController { USING_GARBAGE_COLLECTED_MIXIN(PresentationController); @@ -79,9 +77,6 @@ virtual void RemoveAvailabilityObserver(PresentationAvailabilityObserver*); private: - // Implementation of ExecutionContextLifecycleObserver. - void ContextDestroyed() override {} - // mojom::blink::PresentationController implementation. void OnScreenAvailabilityUpdated(const KURL&, mojom::blink::ScreenAvailability) override; @@ -113,7 +108,7 @@ // Lazily-initialized binding for mojom::blink::PresentationController. Sent // to |presentation_service_|'s implementation. - HeapMojoReceiver<mojom::blink::PresentationController> + HeapMojoReceiver<mojom::blink::PresentationController, PresentationController> presentation_controller_receiver_; DISALLOW_COPY_AND_ASSIGN(PresentationController);
diff --git a/third_party/blink/renderer/modules/presentation/presentation_receiver.h b/third_party/blink/renderer/modules/presentation/presentation_receiver.h index 964430b..35c7b70 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_receiver.h +++ b/third_party/blink/renderer/modules/presentation/presentation_receiver.h
@@ -68,7 +68,7 @@ Member<ConnectionListProperty> connection_list_property_; Member<PresentationConnectionList> connection_list_; - HeapMojoReceiver<mojom::blink::PresentationReceiver> + HeapMojoReceiver<mojom::blink::PresentationReceiver, PresentationReceiver> presentation_receiver_receiver_; HeapMojoRemote<mojom::blink::PresentationService> presentation_service_remote_;
diff --git a/third_party/blink/renderer/modules/serial/serial.h b/third_party/blink/renderer/modules/serial/serial.h index 52a4664..7ff8eea 100644 --- a/third_party/blink/renderer/modules/serial/serial.h +++ b/third_party/blink/renderer/modules/serial/serial.h
@@ -75,6 +75,7 @@ HeapMojoWrapperMode::kWithoutContextObserver> service_; HeapMojoReceiver<mojom::blink::SerialServiceClient, + Serial, HeapMojoWrapperMode::kWithoutContextObserver> receiver_; HeapHashSet<Member<ScriptPromiseResolver>> get_ports_promises_;
diff --git a/third_party/blink/renderer/modules/serial/serial_port.h b/third_party/blink/renderer/modules/serial/serial_port.h index a7701f75..ff91601 100644 --- a/third_party/blink/renderer/modules/serial/serial_port.h +++ b/third_party/blink/renderer/modules/serial/serial_port.h
@@ -96,6 +96,7 @@ uint32_t buffer_size_ = 0; HeapMojoRemote<device::mojom::blink::SerialPort> port_; HeapMojoReceiver<device::mojom::blink::SerialPortClient, + SerialPort, HeapMojoWrapperMode::kWithoutContextObserver> client_receiver_;
diff --git a/third_party/blink/renderer/modules/speech/speech_recognition.h b/third_party/blink/renderer/modules/speech/speech_recognition.h index 6663644..bb736ede 100644 --- a/third_party/blink/renderer/modules/speech/speech_recognition.h +++ b/third_party/blink/renderer/modules/speech/speech_recognition.h
@@ -137,7 +137,9 @@ bool started_; bool stopping_; HeapVector<Member<SpeechRecognitionResult>> final_results_; - HeapMojoReceiver<mojom::blink::SpeechRecognitionSessionClient> receiver_; + HeapMojoReceiver<mojom::blink::SpeechRecognitionSessionClient, + SpeechRecognition> + receiver_; HeapMojoRemote<mojom::blink::SpeechRecognitionSession> session_; };
diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis.h b/third_party/blink/renderer/modules/speech/speech_synthesis.h index d605797..a97a5f4 100644 --- a/third_party/blink/renderer/modules/speech/speech_synthesis.h +++ b/third_party/blink/renderer/modules/speech/speech_synthesis.h
@@ -124,6 +124,7 @@ void InitializeMojomSynthesisIfNeeded(); HeapMojoReceiver<mojom::blink::SpeechSynthesisVoiceListObserver, + SpeechSynthesis, HeapMojoWrapperMode::kWithoutContextObserver> receiver_; HeapMojoRemote<mojom::blink::SpeechSynthesis,
diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis_utterance.h b/third_party/blink/renderer/modules/speech/speech_synthesis_utterance.h index ed750eb..eb4942e 100644 --- a/third_party/blink/renderer/modules/speech/speech_synthesis_utterance.h +++ b/third_party/blink/renderer/modules/speech/speech_synthesis_utterance.h
@@ -117,7 +117,9 @@ // EventTarget const AtomicString& InterfaceName() const override; - HeapMojoReceiver<mojom::blink::SpeechSynthesisClient> receiver_; + HeapMojoReceiver<mojom::blink::SpeechSynthesisClient, + SpeechSynthesisUtterance> + receiver_; mojom::blink::SpeechSynthesisUtterancePtr mojom_utterance_; Member<SpeechSynthesis> synthesis_; Member<SpeechSynthesisVoice> voice_;
diff --git a/third_party/blink/renderer/modules/xr/xr_system.cc b/third_party/blink/renderer/modules/xr/xr_system.cc index a941643..d7f3ea06 100644 --- a/third_party/blink/renderer/modules/xr/xr_system.cc +++ b/third_party/blink/renderer/modules/xr/xr_system.cc
@@ -132,7 +132,7 @@ device::mojom::blink::XRSessionMode mode, XRSessionInit* session_init, ExecutionContext* execution_context, - mojom::ConsoleMessageLevel error_level) { + mojom::blink::ConsoleMessageLevel error_level) { switch (feature) { case device::mojom::XRSessionFeature::REF_SPACE_VIEWER: case device::mojom::XRSessionFeature::REF_SPACE_LOCAL: @@ -149,7 +149,7 @@ if (!session_init->hasDomOverlay()) { execution_context->AddConsoleMessage(MakeGarbageCollected< ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, error_level, + mojom::blink::ConsoleMessageSource::kJavaScript, error_level, "Must specify a valid domOverlay.root element in XRSessionInit")); return false; } @@ -197,6 +197,32 @@ return nullptr; } +// Helper method to convert the mojom error code into text for displaying in the +// console. The console message will have the format of: +// "Could not create a session because: <this value>" +const char* GetConsoleMessage(device::mojom::RequestSessionError error) { + switch (error) { + case device::mojom::RequestSessionError::EXISTING_IMMERSIVE_SESSION: + return "There is already an existing immersive session"; + case device::mojom::RequestSessionError::INVALID_CLIENT: + return "An error occurred while querying for runtime support"; + case device::mojom::RequestSessionError::USER_DENIED_CONSENT: + return "The user denied some part of the requested configuration"; + case device::mojom::RequestSessionError::NO_RUNTIME_FOUND: + return "No runtimes supported the requested configuration"; + case device::mojom::RequestSessionError::UNKNOWN_RUNTIME_ERROR: + return "Something went wrong initializing the session in the runtime"; + case device::mojom::RequestSessionError::RUNTIME_INSTALL_FAILURE: + return "The runtime for this configuration could not be installed"; + case device::mojom::RequestSessionError::RUNTIMES_CHANGED: + return "The supported runtimes changed while initializing the session"; + case device::mojom::RequestSessionError::FULLSCREEN_ERROR: + return "An error occurred while initializing fullscreen support"; + case device::mojom::RequestSessionError::UNKNOWN_FAILURE: + return "An unknown error occurred"; + } +} + } // namespace // Ensure that the inline session request is allowed, if not @@ -551,7 +577,7 @@ // Failed, reject the session xr_->OnRequestSessionReturned( query_, device::mojom::blink::RequestSessionResult::NewFailureReason( - device::mojom::RequestSessionError::INVALID_CLIENT)); + device::mojom::RequestSessionError::FULLSCREEN_ERROR)); } } @@ -941,6 +967,7 @@ // Reject session if any of the required features were invalid. if (query->InvalidRequiredFeatures()) { + DVLOG(2) << __func__ << ": rejecting session - invalid required features"; query->RejectWithDOMException(DOMExceptionCode::kNotSupportedError, kSessionNotSupported, exception_state); return; @@ -960,6 +987,7 @@ // If we didn't already create a sensorless session, we can't create a session // without hardware, so just reject now. if (!service_) { + DVLOG(2) << __func__ << ": rejecting session - no service"; query->RejectWithDOMException(DOMExceptionCode::kNotSupportedError, kSessionNotSupported, exception_state); return; @@ -979,7 +1007,7 @@ const HeapVector<ScriptValue>& features, const device::mojom::blink::XRSessionMode& session_mode, XRSessionInit* session_init, - mojom::ConsoleMessageLevel error_level) { + mojom::blink::ConsoleMessageLevel error_level) { RequestedXRSessionFeatureSet result; // Iterate over all requested features, even if intermediate @@ -992,7 +1020,7 @@ if (!feature_enum) { GetExecutionContext()->AddConsoleMessage( MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, error_level, + mojom::blink::ConsoleMessageSource::kJavaScript, error_level, "Unrecognized feature requested: " + feature_string)); result.invalid_features = true; } else if (!IsFeatureValidForMode(feature_enum.value(), session_mode, @@ -1000,14 +1028,14 @@ error_level)) { GetExecutionContext()->AddConsoleMessage( MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, error_level, + mojom::blink::ConsoleMessageSource::kJavaScript, error_level, "Feature '" + feature_string + "' is not supported for mode: " + SessionModeToString(session_mode))); result.invalid_features = true; } else if (!HasRequiredFeaturePolicy(doc, feature_enum.value())) { GetExecutionContext()->AddConsoleMessage( MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, error_level, + mojom::blink::ConsoleMessageSource::kJavaScript, error_level, "Feature '" + feature_string + "' is not permitted by feature policy")); result.invalid_features = true; @@ -1017,7 +1045,7 @@ } else { GetExecutionContext()->AddConsoleMessage( MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, error_level, + mojom::blink::ConsoleMessageSource::kJavaScript, error_level, "Unrecognized feature value")); result.invalid_features = true; } @@ -1068,7 +1096,7 @@ if (session_init && session_init->hasRequiredFeatures()) { required_features = ParseRequestedFeatures( doc, session_init->requiredFeatures(), session_mode, session_init, - mojom::ConsoleMessageLevel::kError); + mojom::blink::ConsoleMessageLevel::kError); } // Parse optional feature strings @@ -1076,7 +1104,7 @@ if (session_init && session_init->hasOptionalFeatures()) { optional_features = ParseRequestedFeatures( doc, session_init->optionalFeatures(), session_mode, session_init, - mojom::ConsoleMessageLevel::kWarning); + mojom::blink::ConsoleMessageLevel::kWarning); } // Certain session modes imply default features. @@ -1178,26 +1206,29 @@ DCHECK(has_outstanding_immersive_request_); has_outstanding_immersive_request_ = false; } + // Clean up the fullscreen event manager which may have been added for // DOM overlay setup. We're done with it, and it contains a reference // to the query and the DOM overlay element. fullscreen_event_manager_ = nullptr; - // TODO(https://crbug.com/872316) Improve the error messaging to indicate why - // a request failed. if (!result->is_success()) { // |service_| does not support the requested mode. Attempt to create a // sensorless session. if (query->GetSensorRequirement() != SensorRequirement::kRequired) { + DVLOG(2) << __func__ << ": session creation failed - creating sensorless"; XRSession* session = CreateSensorlessInlineSession(); query->Resolve(session); return; } - // TODO(http://crbug.com/961960): Report appropriate exception when the user - // denies XR session request on consent dialog - // TODO(https://crbug.com/872316): Improve the error messaging to indicate - // the reason for a request failure. + String error_message = + String::Format("Could not create a session because: %s", + GetConsoleMessage(result->get_failure_reason())); + GetExecutionContext()->AddConsoleMessage( + MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kJavaScript, + mojom::blink::ConsoleMessageLevel::kError, error_message)); query->RejectWithDOMException(DOMExceptionCode::kNotSupportedError, kSessionNotSupported, nullptr); return; @@ -1378,8 +1409,6 @@ HeapHashSet<Member<PendingRequestSessionQuery>> request_queries = outstanding_request_queries_; for (const auto& query : request_queries) { - // TODO(https://crbug.com/962991): The spec should specify - // what is returned here. OnRequestSessionReturned( query, device::mojom::blink::RequestSessionResult::NewFailureReason( device::mojom::RequestSessionError::INVALID_CLIENT));
diff --git a/third_party/blink/renderer/platform/exported/web_failing_url_loader_factory.cc b/third_party/blink/renderer/platform/exported/web_failing_url_loader_factory.cc index e1633da..fce287ff 100644 --- a/third_party/blink/renderer/platform/exported/web_failing_url_loader_factory.cc +++ b/third_party/blink/renderer/platform/exported/web_failing_url_loader_factory.cc
@@ -46,7 +46,7 @@ int64_t& encoded_data_length, int64_t& encoded_body_length, WebBlobInfo& downloaded_blob) override { - error = ResourceError::Failure(KURL(request->url)); + error = WebURLError(ResourceError::Failure(KURL(request->url))); } void LoadAsynchronously( std::unique_ptr<network::ResourceRequest> request, @@ -67,7 +67,7 @@ private: void Fail(const KURL& url, WebURLLoaderClient* client) { - client->DidFail(ResourceError::Failure(url), 0, 0, 0); + client->DidFail(WebURLError(ResourceError::Failure(url)), 0, 0, 0); } const std::unique_ptr<scheduler::WebResourceLoadingTaskRunnerHandle>
diff --git a/third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.cc b/third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.cc index 0412b39..b231b6a7 100644 --- a/third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.cc +++ b/third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.cc
@@ -5,6 +5,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.h" #include "base/macros.h" +#include "services/network/public/cpp/client_hints.h" #include "third_party/blink/public/common/client_hints/client_hints.h" #include "third_party/blink/renderer/platform/network/http_names.h" #include "third_party/blink/renderer/platform/network/http_parsers.h" @@ -51,9 +52,9 @@ // Note: .Ascii() would convert tab to ?, which is undesirable. base::Optional<std::vector<network::mojom::WebClientHintsType>> parsed_ch = - ParseAcceptCH(header_value.Latin1(), - RuntimeEnabledFeatures::LangClientHintHeaderEnabled(), - RuntimeEnabledFeatures::UserAgentClientHintEnabled()); + FilterAcceptCH(network::ParseAcceptCH(header_value.Latin1()), + RuntimeEnabledFeatures::LangClientHintHeaderEnabled(), + RuntimeEnabledFeatures::UserAgentClientHintEnabled()); if (!parsed_ch.has_value()) return;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_error.h b/third_party/blink/renderer/platform/loader/fetch/resource_error.h index 19c60919..7c1e833 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_error.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_error.h
@@ -92,7 +92,7 @@ return cors_error_status_; } - operator WebURLError() const; + explicit operator WebURLError() const; static bool Compare(const ResourceError&, const ResourceError&);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc index 7f1a04c..8c1bac6 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -552,7 +552,7 @@ } void ResourceLoader::DidFailLoadingBody() { - DidFail(ResourceError::Failure(resource_->Url()), 0, 0, 0); + DidFail(WebURLError(ResourceError::Failure(resource_->Url())), 0, 0, 0); } void ResourceLoader::DidCancelLoadingBody() {
diff --git a/third_party/blink/renderer/platform/media_capabilities/web_video_configuration.h b/third_party/blink/renderer/platform/media_capabilities/web_video_configuration.h index 2dbd73c..c172181 100644 --- a/third_party/blink/renderer/platform/media_capabilities/web_video_configuration.h +++ b/third_party/blink/renderer/platform/media_capabilities/web_video_configuration.h
@@ -19,6 +19,9 @@ unsigned height; unsigned bitrate; double framerate; + base::Optional<WebString> hdr_metadata_type; + base::Optional<WebString> color_gamut; + base::Optional<WebString> transfer_function; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h b/third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h index bfc774c..1fe5775 100644 --- a/third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h +++ b/third_party/blink/renderer/platform/mojo/heap_mojo_receiver.h
@@ -22,19 +22,21 @@ // TODO(crbug.com/1058076) HeapMojoWrapperMode should be removed once we ensure // that the interface is not used after ContextDestroyed(). template <typename Interface, + typename Owner, HeapMojoWrapperMode Mode = HeapMojoWrapperMode::kWithContextObserver> class HeapMojoReceiver { DISALLOW_NEW(); public: - using ImplPointerType = typename mojo::Receiver<Interface>::ImplPointerType; - - HeapMojoReceiver(ImplPointerType impl, ContextLifecycleNotifier* context) - : wrapper_(MakeGarbageCollected<Wrapper>(std::move(impl), context)) {} + HeapMojoReceiver(Owner* owner, ContextLifecycleNotifier* context) + : wrapper_(MakeGarbageCollected<Wrapper>(owner, context)) { + static_assert(std::is_base_of<Interface, Owner>::value, + "Owner should implement Interface"); + static_assert(IsGarbageCollectedType<Owner>::value, + "Owner needs to be a garbage collected object"); + } // Methods to redirect to mojo::Receiver: - ImplPointerType operator->() const { return get(); } - ImplPointerType get() { return wrapper_->receiver().get(); } bool is_bound() const { return wrapper_->receiver().is_bound(); } void reset() { wrapper_->receiver().reset(); } void set_disconnect_handler(base::OnceClosure handler) { @@ -56,6 +58,9 @@ void Trace(Visitor* visitor) { visitor->Trace(wrapper_); } private: + FRIEND_TEST_ALL_PREFIXES(HeapMojoReceiverGCWithContextObserverTest, + NoResetOnConservativeGC); + // Garbage collected wrapper class to add a prefinalizer. class Wrapper final : public GarbageCollected<Wrapper>, public ContextLifecycleObserver { @@ -63,12 +68,13 @@ USING_GARBAGE_COLLECTED_MIXIN(Wrapper); public: - Wrapper(ImplPointerType impl, ContextLifecycleNotifier* notifier) - : receiver_(std::move(impl)) { + Wrapper(Owner* owner, ContextLifecycleNotifier* notifier) + : owner_(owner), receiver_(owner) { SetContextLifecycleNotifier(notifier); } void Trace(Visitor* visitor) override { + visitor->Trace(owner_); ContextLifecycleObserver::Trace(visitor); } @@ -83,6 +89,7 @@ } private: + Member<Owner> owner_; mojo::Receiver<Interface> receiver_; };
diff --git a/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_test.cc b/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_test.cc index 2f348ab5..cfa4d59d 100644 --- a/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_test.cc +++ b/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_test.cc
@@ -46,12 +46,28 @@ }; template <HeapMojoWrapperMode Mode> +class HeapMojoReceiverGCBaseTest; + +template <HeapMojoWrapperMode Mode> class ReceiverOwner : public GarbageCollected<ReceiverOwner<Mode>>, public sample::blink::Service { - public: - explicit ReceiverOwner(MockContext* context) : receiver_(this, context) {} + USING_PRE_FINALIZER(ReceiverOwner, Dispose); - HeapMojoReceiver<sample::blink::Service, Mode>& receiver() { + public: + explicit ReceiverOwner(MockContext* context, + HeapMojoReceiverGCBaseTest<Mode>* test = nullptr) + : receiver_(this, context), test_(test) { + if (test_) + test_->set_is_owner_alive(true); + } + + void Dispose() { + if (test_) + test_->set_is_owner_alive(false); + ; + } + + HeapMojoReceiver<sample::blink::Service, ReceiverOwner, Mode>& receiver() { return receiver_; } @@ -65,7 +81,8 @@ sample::blink::Service::FrobinateCallback callback) override {} void GetPort(mojo::PendingReceiver<sample::blink::Port> port) override {} - HeapMojoReceiver<sample::blink::Service, Mode> receiver_; + HeapMojoReceiver<sample::blink::Service, ReceiverOwner, Mode> receiver_; + HeapMojoReceiverGCBaseTest<Mode>* test_; }; template <HeapMojoWrapperMode Mode> @@ -74,13 +91,14 @@ base::RunLoop& run_loop() { return run_loop_; } bool& disconnected() { return disconnected_; } + void set_is_owner_alive(bool alive) { is_owner_alive_ = alive; } void ClearOwner() { owner_ = nullptr; } protected: void SetUp() override { - CHECK(!disconnected_); + disconnected_ = false; context_ = MakeGarbageCollected<MockContext>(); - owner_ = MakeGarbageCollected<ReceiverOwner<Mode>>(context_); + owner_ = MakeGarbageCollected<ReceiverOwner<Mode>>(context_, this); scoped_refptr<base::NullTaskRunner> null_task_runner = base::MakeRefCounted<base::NullTaskRunner>(); remote_ = mojo::Remote<sample::blink::Service>( @@ -92,10 +110,14 @@ }, WTF::Unretained(this))); } - void TearDown() override { CHECK(disconnected_); } + void TearDown() { + owner_ = nullptr; + PreciselyCollectGarbage(); + } Persistent<MockContext> context_; Persistent<ReceiverOwner<Mode>> owner_; + bool is_owner_alive_ = false; base::RunLoop run_loop_; mojo::Remote<sample::blink::Service> remote_; bool disconnected_ = false; @@ -144,6 +166,18 @@ CompleteSweepingIfNeeded(); } +// Check that the owner +TEST_F(HeapMojoReceiverGCWithContextObserverTest, NoResetOnConservativeGC) { + auto* wrapper = owner_->receiver().wrapper_.Get(); + EXPECT_TRUE(owner_->receiver().is_bound()); + ClearOwner(); + EXPECT_TRUE(is_owner_alive_); + // The stack scanning should find |wrapper| and keep the Wrapper alive. + ConservativelyCollectGarbage(); + EXPECT_TRUE(wrapper->receiver().is_bound()); + EXPECT_TRUE(is_owner_alive_); +} + // Make HeapMojoReceiver without context observer garbage collected and check // that the connection is disconnected right after the marking phase. TEST_F(HeapMojoReceiverGCWithoutContextObserverTest, ResetsOnGC) {
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index ab7fcc3..976a0ec 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -991,6 +991,10 @@ status:"experimental", }, { + name: "MediaCapabilitiesDynamicRange", + status: "test", + }, + { name: "MediaCapabilitiesEncodingInfo", status: "experimental", },
diff --git a/third_party/blink/renderer/platform/testing/url_test_helpers.cc b/third_party/blink/renderer/platform/testing/url_test_helpers.cc index e07b21c..c9ad5a44 100644 --- a/third_party/blink/renderer/platform/testing/url_test_helpers.cc +++ b/third_party/blink/renderer/platform/testing/url_test_helpers.cc
@@ -88,7 +88,7 @@ ResourceError error = ResourceError::Failure(full_url); Platform::Current()->GetURLLoaderMockFactory()->RegisterErrorURL( - full_url, response, error); + full_url, response, WebURLError(error)); } void RegisterMockedURLLoadWithCustomResponse(const WebURL& full_url,
diff --git a/third_party/blink/renderer/platform/wtf/vector.h b/third_party/blink/renderer/platform/wtf/vector.h index 632d3088..82aaf96 100644 --- a/third_party/blink/renderer/platform/wtf/vector.h +++ b/third_party/blink/renderer/platform/wtf/vector.h
@@ -205,30 +205,23 @@ } } - template <bool = Allocator::kIsGarbageCollected> - static void MoveOverlappingImpl(const T* src, const T* src_end, T* dst); - template <> - static void MoveOverlappingImpl<false>(const T* src, - const T* src_end, - T* dst) { - memmove(dst, src, - reinterpret_cast<const char*>(src_end) - - reinterpret_cast<const char*>(src)); - } - template <> - static void MoveOverlappingImpl<true>(const T* src, - const T* src_end, - T* dst) { - if (src == dst) - return; - if (dst < src) { - for (; src < src_end; ++src, ++dst) - AtomicWriteMemcpy<sizeof(T)>(dst, src); + static void MoveOverlappingImpl(const T* src, const T* src_end, T* dst) { + if (Allocator::kIsGarbageCollected) { + if (src == dst) + return; + if (dst < src) { + for (; src < src_end; ++src, ++dst) + AtomicWriteMemcpy<sizeof(T)>(dst, src); + } else { + --src_end; + T* dst_end = dst + (src_end - src); + for (; src_end >= src; --src_end, --dst_end) + AtomicWriteMemcpy<sizeof(T)>(dst_end, src_end); + } } else { - --src_end; - T* dst_end = dst + (src_end - src); - for (; src_end >= src; --src_end, --dst_end) - AtomicWriteMemcpy<sizeof(T)>(dst_end, src_end); + memmove(dst, src, + reinterpret_cast<const char*>(src_end) - + reinterpret_cast<const char*>(src)); } }
diff --git a/third_party/blink/web_tests/WebGPUExpectations b/third_party/blink/web_tests/WebGPUExpectations index 4989930..00e37213 100644 --- a/third_party/blink/web_tests/WebGPUExpectations +++ b/third_party/blink/web_tests/WebGPUExpectations
@@ -187,6 +187,9 @@ crbug.com/966582 wpt_internal/webgpu/cts.html?worker=0&q=cts:copyImageBitmapToTexture:from_canvas~ [ Failure ] crbug.com/966582 wpt_internal/webgpu/cts.html?worker=1&q=cts:copyImageBitmapToTexture:from_canvas~ [ Failure ] +crbug.com/dawn/375 wpt_internal/webgpu/cts.html?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1024,"size":0} [ Failure ] +crbug.com/dawn/375 wpt_internal/webgpu/cts.html?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1024,"size":0} [ Failure ] + # # Mac (Metal) specific #
diff --git a/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import-expected.txt b/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import-expected.txt deleted file mode 100644 index 759d43d..0000000 --- a/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -CONSOLE MESSAGE: line 6: Start script - there should be a deprecation message below about replace() and @import. -CONSOLE WARNING: line 9: Support for calls to CSSStyleSheet.replace() with stylesheet text that includes @import has been deprecated, and will be removed in M84, around June 2020. See https://chromestatus.com/feature/4735925877735424 for more details. -CONSOLE MESSAGE: line 15: Finish script -CONSOLE MESSAGE: line 10: Replace resolved -
diff --git a/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import.html b/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import.html deleted file mode 100644 index 4c8adab5..0000000 --- a/third_party/blink/web_tests/cssom/deprecated-stylesheet-replace-import.html +++ /dev/null
@@ -1,16 +0,0 @@ -<!DOCTYPE html> - -<script> -if (window.testRunner) - testRunner.dumpAsText(); -console.log("Start script - there should be a deprecation message below about replace() and @import."); -const sheet = new CSSStyleSheet(); -try { - sheet.replace('@import "resources/import.css";') - .then(() => {console.log("Replace resolved");}); -} catch (e) { - console.log("Replace threw exception"); -} - -console.log("Finish script"); -</script>
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json index 12739622..40c1344 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_7.json
@@ -108395,6 +108395,18 @@ {} ] ], + "css/filter-effects/effect-reference-add-hw-001.html": [ + [ + "css/filter-effects/effect-reference-add-hw-001.html", + [ + [ + "/css/filter-effects/reference/effect-reference-add-hw-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/filter-effects/effect-reference-after-001.html": [ [ "css/filter-effects/effect-reference-after-001.html", @@ -151499,6 +151511,9 @@ "css/css-shadow-parts/META.yml": [ [] ], + "css/css-shadow-parts/host-part-001-expected.txt": [ + [] + ], "css/css-shadow-parts/interaction-with-placeholder-ref.html": [ [] ], @@ -159722,6 +159737,9 @@ "css/filter-effects/reference/dynamic-filter-changes-001-ref.html": [ [] ], + "css/filter-effects/reference/effect-reference-add-hw-001-ref.html": [ + [] + ], "css/filter-effects/reference/effect-reference-after-001-ref.html": [ [] ], @@ -161987,6 +162005,21 @@ "document-policy/echo-policy.py": [ [] ], + "document-policy/experimental-features/layout-animations-disabled-tentative.html.headers": [ + [] + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers": [ + [] + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers": [ + [] + ], + "document-policy/experimental-features/resources/animation-property-height.js": [ + [] + ], + "document-policy/experimental-features/resources/common.js": [ + [] + ], "document-policy/experimental-features/resources/document-policy-image.html": [ [] ], @@ -164117,15 +164150,6 @@ "feature-policy/README.md": [ [] ], - "feature-policy/experimental-features/layout-animations-disabled-tentative.html.headers": [ - [] - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers": [ - [] - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers": [ - [] - ], "feature-policy/experimental-features/lazyload/lazyload-disabled-image-tentative.sub.html.headers": [ [] ], @@ -164138,9 +164162,6 @@ "feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html.headers": [ [] ], - "feature-policy/experimental-features/resources/animation-property-height.js": [ - [] - ], "feature-policy/experimental-features/resources/async-script.js": [ [] ], @@ -226380,6 +226401,12 @@ {} ] ], + "css/css-shadow-parts/host-part-001.html": [ + [ + "css/css-shadow-parts/host-part-001.html", + {} + ] + ], "css/css-shadow-parts/host-stylesheet.html": [ [ "css/css-shadow-parts/host-stylesheet.html", @@ -237638,6 +237665,30 @@ {} ] ], + "document-policy/experimental-features/layout-animations-disabled-tentative.html": [ + [ + "document-policy/experimental-features/layout-animations-disabled-tentative.html", + {} + ] + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html": [ + [ + "document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html", + {} + ] + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html": [ + [ + "document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html", + {} + ] + ], + "document-policy/experimental-features/layout-animations-enabled-tentative.html": [ + [ + "document-policy/experimental-features/layout-animations-enabled-tentative.html", + {} + ] + ], "document-policy/experimental-features/unsized-media.tentative.https.sub.html": [ [ "document-policy/experimental-features/unsized-media.tentative.https.sub.html", @@ -253052,30 +253103,6 @@ {} ] ], - "feature-policy/experimental-features/layout-animations-disabled-tentative.html": [ - [ - "feature-policy/experimental-features/layout-animations-disabled-tentative.html", - {} - ] - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html": [ - [ - "feature-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html", - {} - ] - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html": [ - [ - "feature-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html", - {} - ] - ], - "feature-policy/experimental-features/layout-animations-enabled-tentative.html": [ - [ - "feature-policy/experimental-features/layout-animations-enabled-tentative.html", - {} - ] - ], "feature-policy/experimental-features/lazyload/lazyload-disabled-image-tentative.sub.html": [ [ "feature-policy/experimental-features/lazyload/lazyload-disabled-image-tentative.sub.html", @@ -408615,6 +408642,14 @@ "a6773a8fb654564c4f124541652d2d9413c511cc", "testharness" ], + "css/css-shadow-parts/host-part-001-expected.txt": [ + "eee037eb8ffe8d29bf0902318211e05a7543fba3", + "support" + ], + "css/css-shadow-parts/host-part-001.html": [ + "9004141534f134d85590df3372f83838668a72e7", + "testharness" + ], "css/css-shadow-parts/host-stylesheet.html": [ "2e65c4b1b57bd9959c68e85e11b442c67f2c5a42", "testharness" @@ -440683,6 +440718,10 @@ "e2a28a3fe45ba90ad512e47b8756a01680b36511", "reftest" ], + "css/filter-effects/effect-reference-add-hw-001.html": [ + "78f30c35f47926b63d417c29fc063c96b9171c96", + "reftest" + ], "css/filter-effects/effect-reference-after-001.html": [ "a6de2465027e99ff6239dd45524862465dde847f", "reftest" @@ -441043,6 +441082,10 @@ "699d57c2a8c087c25079232a443a6e2b72c1e79e", "support" ], + "css/filter-effects/reference/effect-reference-add-hw-001-ref.html": [ + "79a15223610df684732b9d6d6f5b59810f79403e", + "support" + ], "css/filter-effects/reference/effect-reference-after-001-ref.html": [ "45192b13451fdfe2f00c17dbc84d30a770426e86", "support" @@ -449783,6 +449826,42 @@ "52a2bf97124f0e6f3ff05fcc693c751f1cd0fca0", "support" ], + "document-policy/experimental-features/layout-animations-disabled-tentative.html": [ + "0190eaa84f75e3097b95f70adde89296d47cc1f3", + "testharness" + ], + "document-policy/experimental-features/layout-animations-disabled-tentative.html.headers": [ + "bebb5d054826ce19d4a0d4f1381deeb5e72f7270", + "support" + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html": [ + "ee7c295156f26733358d62a4046a097450a6b8e2", + "testharness" + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers": [ + "bebb5d054826ce19d4a0d4f1381deeb5e72f7270", + "support" + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html": [ + "cd9210cc1382ee1f6dc892783bd275c1de7ab669", + "testharness" + ], + "document-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers": [ + "bebb5d054826ce19d4a0d4f1381deeb5e72f7270", + "support" + ], + "document-policy/experimental-features/layout-animations-enabled-tentative.html": [ + "19e405496eef72d176d007c93f7262e6a12b3806", + "testharness" + ], + "document-policy/experimental-features/resources/animation-property-height.js": [ + "79316cb488fade6e877c690f90c74961ff944f52", + "support" + ], + "document-policy/experimental-features/resources/common.js": [ + "639847abf36d636e537c081a6afd06a3a8fb7f9f", + "support" + ], "document-policy/experimental-features/resources/document-policy-image.html": [ "4e5b919bd112f044cc3ec9e57afe05ae20f22ece", "support" @@ -456227,34 +456306,6 @@ "ad90864fa472cbaa3f95a3fbc912529f31fb3765", "testharness" ], - "feature-policy/experimental-features/layout-animations-disabled-tentative.html": [ - "0190eaa84f75e3097b95f70adde89296d47cc1f3", - "testharness" - ], - "feature-policy/experimental-features/layout-animations-disabled-tentative.html.headers": [ - "7c441bbba555d9da8c2cfc34de2ddaf2a52074f4", - "support" - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html": [ - "e7150a91e8749473962884727fb59bb3b978bf68", - "testharness" - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-js-tentative.html.headers": [ - "7c441bbba555d9da8c2cfc34de2ddaf2a52074f4", - "support" - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html": [ - "163ccae812f129e6cc338eb548e7ace92dd65b17", - "testharness" - ], - "feature-policy/experimental-features/layout-animations-disabled-violation-report-keyframes-tentative.html.headers": [ - "7c441bbba555d9da8c2cfc34de2ddaf2a52074f4", - "support" - ], - "feature-policy/experimental-features/layout-animations-enabled-tentative.html": [ - "19e405496eef72d176d007c93f7262e6a12b3806", - "testharness" - ], "feature-policy/experimental-features/lazyload/lazyload-disabled-image-tentative.sub.html": [ "5bd9fca2a868197bdcc81486e0a33ce4e3a0659b", "testharness" @@ -456295,10 +456346,6 @@ "8cba4d2df9c22809641984a0071aae947b4f91ae", "support" ], - "feature-policy/experimental-features/resources/animation-property-height.js": [ - "79316cb488fade6e877c690f90c74961ff944f52", - "support" - ], "feature-policy/experimental-features/resources/async-script.js": [ "3c0ee6d02343891b0234f31c0fb229929ae1b24b", "support" @@ -456920,7 +456967,7 @@ "support" ], "feature-policy/resources/feature-policy-screen-wakelock.html": [ - "7d3dab45af1d57c805f14cfdbed142ddb2415eba", + "6feed51d498651c6565517df3afb49076bcb7c57", "support" ], "feature-policy/resources/feature-policy-serial-worker.html": [ @@ -469728,7 +469775,7 @@ "testharness" ], "html/interaction/focus/tabindex-focus-flag.html": [ - "341162f09e79e9aad17769b709f94aeadb8771cc", + "93fdb19a592ff632405c338256082043ae608002", "testharness" ], "html/interaction/focus/the-autofocus-attribute/autofocus-in-not-fully-active-document.html": [ @@ -486664,7 +486711,7 @@ "support" ], "media-capabilities/decodingInfo.any.js": [ - "2d74d30eeb623992f629b6932304c3ee2b89e84f", + "772d47e87295775f207fedd6f3f68681ca32ad79", "testharness" ], "media-capabilities/decodingInfoEncryptedMedia.http.html": [ @@ -523436,11 +523483,11 @@ "support" ], "wake-lock/idlharness-worker.https.window.js": [ - "c747ad6872a91a5ca81fb1e7ca73f72e4e987097", + "76f5352721dfdadca5093b6f08bb648d8b17f93e", "testharness" ], "wake-lock/idlharness.https.window.js": [ - "f9e3c02175d519f454c15109b30fa567709cee2d", + "60c25f3386ea8bd2ce8a5955745f9d1ede580f46", "testharness" ], "wake-lock/resources/idlharness-worker.js": [ @@ -523480,7 +523527,7 @@ "testharness" ], "wake-lock/wakelock-enabled-by-feature-policy.https.sub.html": [ - "376359e888d6191b9eb1241373b3d411bb5bd2d0", + "f908717ff410d736ccb42e89c3e95c4852e82696", "testharness" ], "wake-lock/wakelock-enabled-by-feature-policy.https.sub.html.headers": [ @@ -523488,7 +523535,7 @@ "support" ], "wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html": [ - "a2d3725857be76f33b33257c0c3373edb68396be", + "b15289beff4853765fdc30dfd0a3b35d48fd8619", "testharness" ], "wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html.headers": [ @@ -523500,11 +523547,11 @@ "testharness" ], "wake-lock/wakelock-onrelease.https.html": [ - "3506c8ae82b91178468a7158b9fca6d099a498f6", + "88c0cdb654c8e700195c430aa74fb2238ce9db10", "testharness" ], "wake-lock/wakelock-request-denied.https.html": [ - "8dbe523ed2c5653932a3f6f246d34ada1e4b113f", + "b222ef342a6566a9d424044713b1acf2666679eb", "testharness" ], "wake-lock/wakelock-screen-type-on-worker.https.worker.js": [ @@ -523512,7 +523559,7 @@ "testharness" ], "wake-lock/wakelock-supported-by-feature-policy.html": [ - "e7f9c8cb283c20d72c6d936398b9c352a2a0b88a", + "a55eb54ba1c48ae7d5330ed1281029d71f0a23e9", "testharness" ], "wake-lock/wakelock-type.https.any.js": [ @@ -523520,7 +523567,7 @@ "testharness" ], "wake-lock/wakelockpermissiondescriptor.https.html": [ - "fd7a08a34ba7dfe203c42f4d4f78ae626fbea235", + "88c95987f1ead6d0e194e3d1dcff6d4b5e852778", "testharness" ], "wasm/META.yml": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/host-part-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/host-part-001-expected.txt new file mode 100644 index 0000000..eee037eb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/host-part-001-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL :host::part works assert_equals: :host::part() works expected "rgb(0, 255, 0)" but got "rgb(0, 0, 0)" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/host-part-001.html b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/host-part-001.html new file mode 100644 index 0000000..9004141 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-shadow-parts/host-part-001.html
@@ -0,0 +1,43 @@ +<!doctype html> +<title>CSS Shadow Parts - :host::part()</title> +<link rel="author" title="Mozilla" href="https://mozilla.org"> +<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io"> +<link rel="help" href="https://drafts.csswg.org/css-shadow-parts/#part"> +<link rel="help" href="https://drafts.csswg.org/css-scoping/#host-selector"> +<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1624968"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=980506"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<div id="host"></div> +<script> +test(function() { + let host = document.getElementById("host"); + host.attachShadow({ mode: "open" }).innerHTML = ` + <style> + :host::part(mypart) { + color: lime; + } + :host(.tweak)::part(mypart) { + color: blue; + } + </style> + <div part="mypart"></div> + `; + + let part = host.shadowRoot.querySelector("[part]"); + + assert_equals( + window.getComputedStyle(part).color, + "rgb(0, 255, 0)", + ":host::part() works", + ); + + host.classList.add("tweak"); + + assert_equals( + window.getComputedStyle(part).color, + "rgb(0, 0, 255)", + ":host::part() invalidation works properly", + ); +}, ":host::part works"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable-expected.txt b/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable-expected.txt index 160bd92..2f84a0d5 100644 --- a/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable-expected.txt
@@ -1,8 +1,8 @@ This is a testharness.js-based test. PASS document.adoptedStyleSheets should initially have length 0. -FAIL new CSSStyleSheet produces empty CSSStyleSheet assert_equals: expected (object) null but got (string) "" -FAIL title cannot be set in the CSSStyleSheet constructor assert_equals: expected (object) null but got (string) "something" -FAIL CSSStyleSheet.replace produces Promise<CSSStyleSheet> assert_equals: expected (object) null but got (string) "" +FAIL new CSSStyleSheet produces empty CSSStyleSheet assert_equals: The title attribute must return the title or null if title is the empty string expected (object) null but got (string) "" +FAIL title can be set in the CSSStyleSheet constructor assert_equals: title and alternate are not supported by the constructor. https://github.com/WICG/construct-stylesheets/issues/105 expected (object) null but got (string) "something" +FAIL CSSStyleSheet.replace produces Promise<CSSStyleSheet> assert_equals: The title attribute must return the title or null if title is the empty string expected (object) null but got (string) "" PASS Constructed style sheets can be applied on document PASS Constructed style sheets can be applied on shadow root PASS Re-attaching shadow host with adopted stylesheets work @@ -16,13 +16,14 @@ PASS Adding non-constructed stylesheet to AdoptedStyleSheets is not allowed when the owner document of the stylesheet and the AdoptedStyleSheets are in different document trees PASS CSSStyleSheet.replaceSync replaces stylesheet text synchronously PASS CSSStyleSheet.replaceSync correctly updates the style of its adopters synchronously -FAIL Adopted sheets are ordered after non-adopted sheets in the shadow root assert_equals: expected "rgb(255, 255, 255)" but got "rgb(255, 0, 0)" -FAIL Adopted sheets are ordered after non-adopted sheets in the document assert_equals: expected "rgb(255, 255, 255)" but got "rgb(255, 0, 0)" -PASS CSSStyleSheet.replaceSync throws exception when there is import rule inside +FAIL Adopted sheets are ordered after non-adopted sheets in the shadow root assert_equals: with the adopted sheet disabled, the non-adopted style should take effect expected "rgb(255, 255, 255)" but got "rgb(255, 0, 0)" +FAIL Adopted sheets are ordered after non-adopted sheets in the document assert_equals: with the adopted sheet disabled, the non-adopted style should take effect expected "rgb(255, 255, 255)" but got "rgb(255, 0, 0)" PASS Inserting an @import rule through insertRule on a constructed stylesheet throws an exception PASS CSSStyleSheet.replaceSync should not trigger any loads from @import rules -PASS CSSStyleSheet.replace allows import rule inside -FAIL CSSStyleSheet.replace returns rejected promise on failed imports assert_equals: expected "NetworkError" but got "NotAllowedError" +PASS CSSStyleSheet.replace allows, but ignores, import rule inside +PASS CSSStyleSheet.replace ignores @import rule but still loads other rules +PASS CSSStyleSheet.replaceSync allows, but ignores, import rule inside +PASS CSSStyleSheet.replace does not reject on failed imports PASS Cloning a shadow host will not clone shadow root, and also adoptedStyleSheets PASS Importing a shadow host will not copy shadow root, and also adoptedStyleSheets PASS Adopting a shadow host will empty adoptedStyleSheets if adopting to a different document
diff --git a/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable.html b/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable.html index fbee429..e629390 100644 --- a/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable.html +++ b/third_party/blink/web_tests/external/wpt/css/cssom/CSSStyleSheet-constructable.html
@@ -48,7 +48,7 @@ test(() => { const sheet = new CSSStyleSheet({disabled: true, media: "screen, print"}); - assert_equals(sheet.title, null); + assert_equals(sheet.title, null, "The title attribute must return the title or null if title is the empty string"); assert_equals(sheet.ownerNode, null); assert_equals(sheet.ownerRule, null); assert_equals(sheet.media.length, 2); @@ -66,7 +66,7 @@ assert_equals(sheet.cssRules[0].cssText, redStyleTexts[1]); const sheet2 = new CSSStyleSheet({}); - assert_equals(sheet2.title, null); + assert_equals(sheet2.title, null, "The title attribute must return the title or null if title is the empty string"); assert_equals(sheet2.ownerNode, null); assert_equals(sheet2.ownerRule, null); assert_equals(sheet2.media.length, 0); @@ -81,7 +81,7 @@ assert_equals(sheet2.cssRules.length, 0); const sheet3 = new CSSStyleSheet(); - assert_equals(sheet3.title, null); + assert_equals(sheet3.title, null, "The title attribute must return the title or null if title is the empty string"); assert_equals(sheet3.ownerNode, null); assert_equals(sheet3.ownerRule, null); assert_equals(sheet3.media.length, 0); @@ -98,14 +98,14 @@ test(() => { const sheet = new CSSStyleSheet({title: "something"}); - assert_equals(sheet.title, null); -}, "title cannot be set in the CSSStyleSheet constructor"); + assert_equals(sheet.title, null, "title and alternate are not supported by the constructor. https://github.com/WICG/construct-stylesheets/issues/105"); +}, "title can be set in the CSSStyleSheet constructor"); promise_test(() => { const sheet = new CSSStyleSheet({disabled: true, media: "screen, print"}); const promise_sheet = sheet.replace(redStyleTexts[0]); return promise_sheet.then(function(sheet) { - assert_equals(sheet.title, null); + assert_equals(sheet.title, null, "The title attribute must return the title or null if title is the empty string"); assert_equals(sheet.ownerNode, null); assert_equals(sheet.ownerRule, null); assert_equals(sheet.media.length, 2); @@ -535,24 +535,19 @@ const style = document.createElement("style"); style.textContent = ".target { color: white; }"; span.shadowRoot.appendChild(style) - // non-adopted styles should be ordered before adopted styles - assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 0, 0)", "non-adopted styles should be ordered before adopted styles"); span.shadowRoot.adoptedStyleSheets = []; - // with no adopted styles in conflict, the non-adopted style should take effect - assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 255, 255)"); + assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 255, 255)", "with no adopted styles in conflict, the non-adopted style should take effect"); span.shadowRoot.adoptedStyleSheets = [sheet]; - // the adopted style should be ordered after the non-adopted style - assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 0, 0)", "the adopted style should be ordered after the non-adopted style"); sheet.disabled = true; - // with the adopted sheet disabled, the non-adopted style should take effect - assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 255, 255)"); + assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 255, 255)", "with the adopted sheet disabled, the non-adopted style should take effect"); sheet.disabled = false; - // the adopted sheet re-enabled, it should take effect again. - assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 0, 0)", "the adopted sheet re-enabled, it should take effect again"); }, 'Adopted sheets are ordered after non-adopted sheets in the shadow root') test(() => { @@ -574,41 +569,32 @@ const style = document.createElement("style"); style.textContent = ".target { color: white; }"; span.appendChild(style) - // non-adopted styles should be ordered before adopted styles - assert_equals(getComputedStyle(span).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(span).color, "rgb(255, 0, 0)", "non-adopted styles should be ordered before adopted styles"); document.adoptedStyleSheets = []; - // with no adopted styles in conflict, the non-adopted style should take effect - assert_equals(getComputedStyle(span).color, "rgb(255, 255, 255)"); + assert_equals(getComputedStyle(span).color, "rgb(255, 255, 255)", "with no adopted styles in conflict, the non-adopted style should take effect"); document.adoptedStyleSheets = [sheet]; - // the adopted style should be ordered after the non-adopted style - assert_equals(getComputedStyle(span).color, "rgb(255, 0, 0)"); + assert_equals(getComputedStyle(span).color, "rgb(255, 0, 0)", "the adopted style should be ordered after the non-adopted style"); sheet.disabled = true; - // with the adopted sheet disabled, the non-adopted style should take effect - assert_equals(getComputedStyle(span).color, "rgb(255, 255, 255)"); + assert_equals(getComputedStyle(span).color, "rgb(255, 255, 255)", "with the adopted sheet disabled, the non-adopted style should take effect"); sheet.disabled = false; - // the adopted sheet re-enabled, it should take effect again. - assert_equals(getComputedStyle(span).color, "rgb(255, 0, 0)") + assert_equals(getComputedStyle(span).color, "rgb(255, 0, 0)", "the adopted sheet re-enabled, it should take effect again") }, 'Adopted sheets are ordered after non-adopted sheets in the document') const import_text = '@import url("support/constructable-import.css");'; test(() => { - assert_throws_dom("NotAllowedError", () => { (new CSSStyleSheet).replaceSync(import_text) }); -}, 'CSSStyleSheet.replaceSync throws exception when there is import rule inside'); - -test(() => { - assert_throws_dom("NotAllowedError", () => { (new CSSStyleSheet).insertRule(import_text) }); + assert_throws_dom("SyntaxError", () => { (new CSSStyleSheet).insertRule(import_text) }); }, 'Inserting an @import rule through insertRule on a constructed stylesheet throws an exception'); async_test(t => { const importUrl = "support/constructable-import.css"; const sheet = new CSSStyleSheet(); - assert_throws_dom("NotAllowedError", () => { sheet.replaceSync(`@import url("${importUrl}");`) }); + sheet.replaceSync(`@import url("${importUrl}");`); const timeAfterReplaceSync = performance.now(); let link = document.createElement("link"); @@ -632,27 +618,68 @@ const sheet = new CSSStyleSheet(); span.shadowRoot.adoptedStyleSheets = [sheet]; assert_equals(getComputedStyle(shadowDiv).color, "rgb(0, 0, 0)"); - // Replace and assert that the imported rule is applied. + // Replace and assert that the imported rule is NOT applied. const sheet_promise = sheet.replace(import_text); return sheet_promise.then((sheet) => { - assert_equals(sheet.cssRules.length, 1); - assert_equals(sheet.cssRules[0].cssText, import_text); - assert_equals(getComputedStyle(shadowDiv).color, "rgb(255, 0, 0)"); + // replace() ignores @import rules: + assert_equals(sheet.cssRules.length, 0); + assert_equals(getComputedStyle(shadowDiv).color, "rgb(0, 0, 0)"); }).catch((reason) => { assert_unreached(`Promise was rejected (${reason}) when it should have been resolved`); }); -}, 'CSSStyleSheet.replace allows import rule inside'); +}, 'CSSStyleSheet.replace allows, but ignores, import rule inside'); + +promise_test(() => { + const span = document.createElement("span"); + thirdSection.appendChild(span); + const shadowDiv = attachShadowDiv(span); + const targetSpan = document.createElement("span"); + targetSpan.classList.add("target"); + shadowDiv.appendChild(targetSpan); + const sheet = new CSSStyleSheet(); + span.shadowRoot.adoptedStyleSheets = [sheet]; + assert_equals(getComputedStyle(shadowDiv).color, "rgb(0, 0, 0)"); + // Replace and assert that the imported rule is NOT applied, but regular rule does apply. + const sheet_promise = sheet.replace(import_text + ".target { color: blue; }"); + return sheet_promise.then((sheet) => { + assert_equals(sheet.cssRules.length, 1); + // @import not applied: + assert_equals(getComputedStyle(shadowDiv).color, "rgb(0, 0, 0)"); + // regular rule applied: + assert_equals(getComputedStyle(targetSpan).color, "rgb(0, 0, 255)"); + }).catch((reason) => { + assert_unreached(`Promise was rejected (${reason}) when it should have been resolved`); + }); +}, 'CSSStyleSheet.replace ignores @import rule but still loads other rules'); + +test(() => { + const span = document.createElement("span"); + thirdSection.appendChild(span); + const shadowDiv = attachShadowDiv(span); + const sheet = new CSSStyleSheet(); + span.shadowRoot.adoptedStyleSheets = [sheet]; + assert_equals(getComputedStyle(shadowDiv).color, "rgb(0, 0, 0)"); + // Replace and assert that the imported rule is NOT applied. + try { + sheet.replaceSync(import_text); + // replaceSync() ignores @import rules: + assert_equals(sheet.cssRules.length, 0); + assert_equals(getComputedStyle(shadowDiv).color, "rgb(0, 0, 0)"); + } catch(reason) { + assert_unreached(`replaceSync threw an exception (${reason}) when it shouldn't have`); + } +}, 'CSSStyleSheet.replaceSync allows, but ignores, import rule inside'); promise_test(() => { const sheet = new CSSStyleSheet(); const sheet_promise = sheet.replace("@import url('not-there.css');"); return sheet_promise.then((sheet) => { - assert_unreached("Promise was resolved when it should have been rejected"); + // No exception here }).catch((reason) => { - assert_equals(reason.name, "NetworkError"); + assert_unreached("Promise was rejected"); }); -}, 'CSSStyleSheet.replace returns rejected promise on failed imports'); +}, 'CSSStyleSheet.replace does not reject on failed imports'); test(() => { const span = document.createElement("span");
diff --git a/third_party/blink/web_tests/external/wpt/html/interaction/focus/tabindex-focus-flag.html b/third_party/blink/web_tests/external/wpt/html/interaction/focus/tabindex-focus-flag.html index 341162f..93fdb19 100644 --- a/third_party/blink/web_tests/external/wpt/html/interaction/focus/tabindex-focus-flag.html +++ b/third_party/blink/web_tests/external/wpt/html/interaction/focus/tabindex-focus-flag.html
@@ -15,6 +15,9 @@ <details open><summary id="summary-first"></summary><summary id="summary-second"></summary></details> <div contenteditable="true"></div> <iframe></iframe> +<svg><a id="svg-a"></a></svg> +<svg><text id="svg-text"></text></svg> +<img> </div> <script> setup({ explicit_done: true }); @@ -34,6 +37,9 @@ ['#summary-second', false], ['[contenteditable]', true], ['iframe', true], + ['#svg-a', false], + ['#svg-text', false], + ['img', false], ]; for (entry of defaultList) { test(() => { @@ -52,8 +58,11 @@ <div id="tabindex-0"> <a tabindex="0"></a> +<svg><a tabindex="0"></a></svg> +<svg><text tabindex="0"></text></svg> <summary tabindex="0" id="summary-out-tabindex0"></summary> <details open><summary id="summary-first"></summary><summary tabindex="0" id="summary-second-tabindex0"></summary></details> +<img tabindex="0"> </div> <script> function runTests_tabindex0() { @@ -67,6 +76,58 @@ }, elementDesc + ' with tabindex=0 should be focusable.'); } + runTests_tabindex_negative(); +} +</script> + +<div id="tabindex-negative"> +<a tabindex="-1"></a> +<svg><a tabindex="-1"></a></svg> +<svg><text tabindex="-1"></text></svg> +<summary tabindex="-1" id="summary-out-tabindex-negative"></summary> +<details open><summary id="summary-first"></summary><summary tabindex="0" id="summary-second-tabindex-negative"></summary></details> +<img tabindex="-1"> +</div> +<script> +function runTests_tabindex_negative() { + for (element of document.querySelectorAll('#tabindex-negative [tabindex]')) { + var elementDesc = element.tagName; + if (element.id) + elementDesc += '#' + element.id; + test(() => { + element.focus(); + assert_equals(document.activeElement, element); + }, elementDesc + ' with tabindex=-1 should be focusable.'); + } + + runTests_tabindex_invalid(); +} +</script> + +<div id="tabindex-invalid"> +<a tabindex="invalid"></a> +<a href="#" tabindex="invalid" id="with-href" data-focusable=true></a> +<svg><a tabindex="invalid"></a></svg> +<svg><a href="#" tabindex="invalid" id="with-href" data-focusable=true></a></svg> +<svg><text tabindex="invalid"></text></svg> +<div tabindex="invalid"></div> +<summary tabindex="invalid" id="summary-out-tabindex-invalid"></summary> +<img tabindex="invalid"> +</div> +<script> +function runTests_tabindex_invalid() { + for (element of document.querySelectorAll('#tabindex-invalid [tabindex]')) { + var focusable = element.dataset && element.dataset.focusable; + var elementDesc = element.tagName; + if (element.id) + elementDesc += '#' + element.id; + test(() => { + element.focus(); + focusable ? assert_equals(document.activeElement, element) + : assert_not_equals(document.activeElement, element); + }, `${elementDesc} with tabindex=invalid should ${focusable ? "be" : "not be"} focusable.`); + } + done(); } </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html index 902430d..1cb290d 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/css-module/import-css-module-basic.html
@@ -22,13 +22,13 @@ const iframe = document.createElement("iframe"); iframe.src = "resources/css-module-at-import-iframe.html"; iframe.onload = test.step_func_done(function () { - assert_equals(iframe.contentDocument.load_error, "NotAllowedError"); + assert_equals(iframe.contentDocument.load_error, undefined); assert_not_equals(getComputedStyle(iframe.contentDocument.querySelector('#test')) .backgroundColor, "rgb(255, 0, 0)", "CSS module @import should not succeed"); }); document.body.appendChild(iframe); - }, "An @import CSS Module should not load"); + }, "An @import CSS Module should not load, but should not throw an exception"); async_test(function (test) { const iframe = document.createElement("iframe");
diff --git a/third_party/blink/web_tests/external/wpt/media-capabilities/decodingInfo.any.js b/third_party/blink/web_tests/external/wpt/media-capabilities/decodingInfo.any.js index 2d74d30..772d47e 100644 --- a/third_party/blink/web_tests/external/wpt/media-capabilities/decodingInfo.any.js +++ b/third_party/blink/web_tests/external/wpt/media-capabilities/decodingInfo.any.js
@@ -23,6 +23,19 @@ spatialRendering: true, }; +// VideoConfiguration with optional hdrMetadataType, colorGamut, and +// transferFunction properties. +var videoConfigurationWithDynamicRange = { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + hdrMetadataType: "smpteSt2086", + colorGamut: "srgb", + transferFunction: "srgb", +} + promise_test(t => { return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo()); }, "Test that decodingInfo rejects if it doesn't get a configuration"); @@ -314,3 +327,57 @@ assert_equals(typeof ability.keySystemAccess, "object"); }); }, "Test that decodingInfo with spatialRendering set returns a valid MediaCapabilitiesInfo objects"); + +promise_test(t => { + return navigator.mediaCapabilities.decodingInfo({ + type: 'file', + video: videoConfigurationWithDynamicRange, + }).then(ability => { + assert_equals(typeof ability.supported, "boolean"); + assert_equals(typeof ability.smooth, "boolean"); + assert_equals(typeof ability.powerEfficient, "boolean"); + assert_equals(typeof ability.keySystemAccess, "object"); + }); +}, "Test that decodingInfo with hdrMetadataType, colorGamut, and transferFunction set returns a valid MediaCapabilitiesInfo objects"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ + type: 'file', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + hdrMetadataType: "" + }, + })); +}, "Test that decodingInfo rejects if the video configuration has an empty hdrMetadataType"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ + type: 'file', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + colorGamut: true + }, + })); +}, "Test that decodingInfo rejects if the video configuration has a colorGamut set to true"); + +promise_test(t => { + return promise_rejects_js(t, TypeError, navigator.mediaCapabilities.decodingInfo({ + type: 'file', + video: { + contentType: 'video/webm; codecs="vp09.00.10.08"', + width: 800, + height: 600, + bitrate: 3000, + framerate: 24, + transferFunction: 3 + }, + })); +}, "Test that decodingInfo rejects if the video configuration has a transferFunction set to 3");
diff --git a/third_party/blink/web_tests/wpt_internal/webgpu/cts.html b/third_party/blink/web_tests/wpt_internal/webgpu/cts.html index 6ea24c54..543f931 100644 --- a/third_party/blink/web_tests/wpt_internal/webgpu/cts.html +++ b/third_party/blink/web_tests/wpt_internal/webgpu/cts.html
@@ -112,7 +112,20 @@ <meta name=variant content='?worker=0&q=cts:validation/createBindGroup:texture_binding_must_have_correct_usage={"type":"storage-texture"}'> <meta name=variant content='?worker=0&q=cts:validation/createBindGroup:texture_must_have_correct_component_type~'> <meta name=variant content='?worker=0&q=cts:validation/createBindGroup:texture_must_have_correct_dimension~'> -<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match~'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":512}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":256,"size":256}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1,"size":256}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":128,"size":256}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":255,"size":256}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":256}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":768,"size":256}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1024,"size":0}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":1024}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1280,"size":0}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":1280}'> +<meta name=variant content='?worker=0&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1024,"size":1}'> <meta name=variant content='?worker=0&q=cts:validation/createBindGroupLayout:some_binding_index_was_specified_more_than_once~'> <meta name=variant content='?worker=0&q=cts:validation/createBindGroupLayout:Visibility_of_bindings_can_be_0~'> <meta name=variant content='?worker=0&q=cts:validation/createBindGroupLayout:number_of_dynamic_buffers_exceeds_the_maximum_value~'> @@ -540,7 +553,20 @@ <meta name=variant content='?worker=1&q=cts:validation/createBindGroup:texture_binding_must_have_correct_usage={"type":"storage-texture"}'> <meta name=variant content='?worker=1&q=cts:validation/createBindGroup:texture_must_have_correct_component_type~'> <meta name=variant content='?worker=1&q=cts:validation/createBindGroup:texture_must_have_correct_dimension~'> -<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match~'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":512}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":256,"size":256}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1,"size":256}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":128,"size":256}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":255,"size":256}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":256}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":768,"size":256}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1024,"size":0}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":1024}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1280,"size":0}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":0,"size":1280}'> +<meta name=variant content='?worker=1&q=cts:validation/createBindGroup:buffer_offset_and_size_for_bind_groups_match={"offset":1024,"size":1}'> <meta name=variant content='?worker=1&q=cts:validation/createBindGroupLayout:some_binding_index_was_specified_more_than_once~'> <meta name=variant content='?worker=1&q=cts:validation/createBindGroupLayout:Visibility_of_bindings_can_be_0~'> <meta name=variant content='?worker=1&q=cts:validation/createBindGroupLayout:number_of_dynamic_buffers_exceeds_the_maximum_value~'>
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium index c5aaf33..daa943517 100644 --- a/third_party/libvpx/README.chromium +++ b/third_party/libvpx/README.chromium
@@ -8,7 +8,7 @@ Date: Monday April 06 2020 Branch: master -Commit: 104adb2aa3e650ac81d94f1cf0fcbe9f89d039a0 +Commit: 1717ac939c12e31a358056a36c2fa7a8882e71ed Description: Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h index f56fbfa..69d7671 100644 --- a/third_party/libvpx/source/config/vpx_version.h +++ b/third_party/libvpx/source/config/vpx_version.h
@@ -2,8 +2,8 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 8 #define VERSION_PATCH 2 -#define VERSION_EXTRA "137-g104adb2aa" +#define VERSION_EXTRA "138-g1717ac939" #define VERSION_PACKED \ ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.8.2-137-g104adb2aa" -#define VERSION_STRING " v1.8.2-137-g104adb2aa" +#define VERSION_STRING_NOSP "v1.8.2-138-g1717ac939" +#define VERSION_STRING " v1.8.2-138-g1717ac939"
diff --git a/third_party/r8/README.chromium b/third_party/r8/README.chromium index 5d6ff82..80f593d 100644 --- a/third_party/r8/README.chromium +++ b/third_party/r8/README.chromium
@@ -11,6 +11,7 @@ Local Modifications: * Refer to commit descriptions within "patches" directory. +* Added "playground" directory for quick "how does this optimize" tests. Update Instructions: # Download R8:
diff --git a/third_party/r8/playground/.gitignore b/third_party/r8/playground/.gitignore new file mode 100644 index 0000000..7a72c282 --- /dev/null +++ b/third_party/r8/playground/.gitignore
@@ -0,0 +1,3 @@ +*.class +*.dex +dexdump.txt
diff --git a/third_party/r8/playground/Playground.java b/third_party/r8/playground/Playground.java new file mode 100644 index 0000000..51cc05c1 --- /dev/null +++ b/third_party/r8/playground/Playground.java
@@ -0,0 +1,14 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * Add a snippet of code here that you want to test the optimization of. + */ +public class Playground { + public static void main(String[] args) { + System.out.println("Your test here"); + } + + private static native boolean doThing(long ptr, String s); +}
diff --git a/third_party/r8/playground/build.sh b/third_party/r8/playground/build.sh new file mode 100755 index 0000000..1727d88cb --- /dev/null +++ b/third_party/r8/playground/build.sh
@@ -0,0 +1,12 @@ +#!/bin/bash +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Usage: +# Make edits to *.java and *.pgcfg +# Then run: ./build.sh | less +rm -f *.class +javac *.java && \ +java -jar ../lib/r8.jar *.class --output . --lib ../../jdk/current --no-minification --pg-conf playground.pgcfg && \ +../../android_sdk/public/build-tools/29.0.2/dexdump -d classes.dex > dexdump.txt
diff --git a/third_party/r8/playground/playground.pgcfg b/third_party/r8/playground/playground.pgcfg new file mode 100644 index 0000000..fb218fb --- /dev/null +++ b/third_party/r8/playground/playground.pgcfg
@@ -0,0 +1,8 @@ +# Copyright 2020 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +-keep class Playground { + native *** *(...); + public static void main(...); +}
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index a58ac45..1ae86b7a 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -19940,6 +19940,7 @@ <int value="687" label="ScrollToTextFragmentEnabled"/> <int value="688" label="ManagedGuestSessionAutoLaunchNotificationReduced"/> <int value="689" label="SystemFeaturesDisableList"/> + <int value="690" label="CrostiniArcAdbSideloadingAllowed"/> </enum> <enum name="EnterprisePolicyDeviceIdValidity"> @@ -22610,6 +22611,7 @@ <int value="1462" label="PASSWORDSPRIVATE_OPTINFORACCOUNTSTORAGE"/> <int value="1463" label="CRYPTOTOKENPRIVATE_RECORDREGISTERREQUEST"/> <int value="1464" label="CRYPTOTOKENPRIVATE_RECORDSIGNREQUEST"/> + <int value="1465" label="VIRTUALKEYBOARDPRIVATE_SETWINDOWBOUNDSINSCREEN"/> </enum> <enum name="ExtensionIconState"> @@ -38421,6 +38423,8 @@ label="OmniboxAlternateMatchDescriptionSeparator:enabled"/> <int value="-1062119671" label="enable-password-force-saving"/> <int value="-1060395248" label="PasswordSearchMobile:enabled"/> + <int value="-1056860259" + label="OmniboxEnableClipboardProviderImageSuggestions:enabled"/> <int value="-1056310158" label="disable-memory-pressure-chromeos"/> <int value="-1055845287" label="SensorContentSetting:enabled"/> <int value="-1052782474" label="enable-cloud-devices"/> @@ -39117,6 +39121,8 @@ <int value="-222296540" label="VirtualKeyboardBorderedKey:disabled"/> <int value="-220599034" label="UsePdfCompositorServiceForPrint:enabled"/> <int value="-216219963" label="ash-shelf-color-scheme"/> + <int value="-215580565" + label="OmniboxEnableClipboardProviderImageSuggestions:disabled"/> <int value="-215534141" label="NativeWindowNavButtons:enabled"/> <int value="-213518852" label="protect-sync-credential:enabled"/> <int value="-213214894" label="enable-chromevox-arc-support"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index c70276b9..0059a4a 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -25080,14 +25080,14 @@ <histogram name="CloudPrint.AvailablePrinters" units="units" expires_after="M90"> <owner>thestig@chromium.org</owner> - <summary>The number of printers availible for registration.</summary> + <summary>The number of printers available for registration.</summary> </histogram> <histogram name="CloudPrint.AvailablePrintersList" units="units" expires_after="M90"> <owner>thestig@chromium.org</owner> <summary> - The number of printers availible for registration in Windows Service. + The number of printers available for registration in Windows Service. </summary> </histogram> @@ -114520,8 +114520,8 @@ <histogram name="PageSerialization.MhtmlGeneration.BrowserWaitForRendererTime.FrameTree" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> Total time the browser process waited for all render processes to save their @@ -114531,8 +114531,8 @@ <histogram name="PageSerialization.MhtmlGeneration.BrowserWaitForRendererTime.SingleFrame" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> Time the browser process waited on a single frame to be saved by a render @@ -114541,8 +114541,8 @@ </histogram> <histogram name="PageSerialization.MhtmlGeneration.EncodingTime.SingleFrame" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> Time taken to encode into MTHML the fully serialized contents of a frame. @@ -114556,15 +114556,15 @@ </histogram> <histogram name="PageSerialization.MhtmlGeneration.FinalSaveStatus" - enum="MhtmlGenerationFinalSaveStatus" expires_after="2020-09-27"> - <owner>carlosk@chromium.org</owner> + enum="MhtmlGenerationFinalSaveStatus" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary>Final status of the MHTML save operation for a page.</summary> </histogram> <histogram name="PageSerialization.MhtmlGeneration.FullPageSavingTime" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary>Time taken to save a page into an MHTML file.</summary> </histogram> @@ -114583,8 +114583,8 @@ <histogram name="PageSerialization.MhtmlGeneration.RendererMainThreadTime.FrameTree" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> Time spent by the main threads of all involved render processes while saving @@ -114594,8 +114594,8 @@ <histogram name="PageSerialization.MhtmlGeneration.RendererMainThreadTime.SingleFrame" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> Time spent by the renderer main thread while saving one frame of a page to @@ -114605,8 +114605,8 @@ <histogram name="PageSerialization.MhtmlGeneration.RendererMainThreadTime.SlowestFrame" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> The longest time taken by the main thread of a render processes to save one @@ -114619,8 +114619,8 @@ <histogram name="PageSerialization.MhtmlGeneration.SerializationTime.SingleFrame" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> Time taken to fully serialize the contents of a frame, including HTML and @@ -114629,8 +114629,8 @@ </histogram> <histogram name="PageSerialization.MhtmlGeneration.WriteToDiskTime.SingleFrame" - units="ms" expires_after="2020-04-01"> - <owner>carlosk@chromium.org</owner> + units="ms" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> <owner>offline-dev@chromium.org</owner> <summary> Time spent writing a frame's encoded MHTML data to the file or data pipe @@ -114641,9 +114641,9 @@ </histogram> <histogram name="PageSerialization.MhtmlLoading.LoadResult" - enum="MhtmlLoadResult" expires_after="2020-03-22"> - <owner>iwells@chromium.org</owner> - <owner>carlosk@chromium.org</owner> + enum="MhtmlLoadResult" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> + <owner>offline-dev@chromium.org</owner> <summary>Reports the result of an attempt to load an MHTML archive.</summary> </histogram> @@ -114658,7 +114658,8 @@ <histogram name="PageSerialization.ProblemDetection.LoadedImagePercentage" units="%" expires_after="M85"> - <owner>dimich@chromium.org</owner> + <owner>sclittle@chromium.org</owner> + <owner>offline-dev@chromium.org</owner> <summary> Percentage of loaded images in the main frame at the time of serialization. </summary> @@ -114679,8 +114680,9 @@ </histogram> <histogram name="PageSerialization.SerializationTime.CSSElement" - units="microseconds" expires_after="2020-06-30"> - <owner>carlosk@chromium.org</owner> + units="microseconds" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> + <owner>offline-dev@chromium.org</owner> <summary> Time spent serializing a CSS element (including embedded "sub"-CSS and images). @@ -114694,8 +114696,9 @@ </histogram> <histogram name="PageSerialization.SerializationTime.Html" units="microseconds" - expires_after="2020-06-30"> - <owner>carlosk@chromium.org</owner> + expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> + <owner>offline-dev@chromium.org</owner> <summary> Time taken to generate HTML data from a frame's DOM and serialize it (without sub-resources like CSS and images). @@ -114709,8 +114712,9 @@ </histogram> <histogram name="PageSerialization.SerializationTime.ImageElement" - units="microseconds" expires_after="2020-06-30"> - <owner>carlosk@chromium.org</owner> + units="microseconds" expires_after="2020-12-01"> + <owner>sclittle@chromium.org</owner> + <owner>offline-dev@chromium.org</owner> <summary> Time spent serializing an image element. @@ -128035,11 +128039,12 @@ </histogram> <histogram name="PrintPreview.InitialDisplayTime" units="ms" - expires_after="2020-04-05"> + expires_after="2021-05-10"> <owner>thestig@chromium.org</owner> + <owner>dhoss@chromium.org</owner> <summary> - Time from when print preview is intiated until the intial preview is sent to - the preview tab for rendering. + Time from when print preview is initiated until the initial preview is sent + to the preview tab for rendering. </summary> </histogram> @@ -128047,8 +128052,8 @@ expires_after="2020-08-30"> <owner>thestig@chromium.org</owner> <summary> - Time from when print preview is intiated until the preview PDF generation is - started. + Time from when print preview is initiated until the preview PDF generation + is started. </summary> </histogram> @@ -128289,13 +128294,14 @@ <owner>thestig@chromium.org</owner> <summary> The number of times regenerate preview requests received before the first - preview data is availible. + preview data is available. </summary> </histogram> <histogram name="PrintPreview.RegeneratePreviewRequest.BeforePrint" - units="units" expires_after="2020-05-10"> + units="units" expires_after="2021-05-10"> <owner>thestig@chromium.org</owner> + <owner>dhoss@chromium.org</owner> <summary> The number of times regenerate preview requests received before the user clicked the print button. @@ -128323,8 +128329,9 @@ </histogram> <histogram name="PrintPreview.RendererError" enum="PrintPreviewFailureType" - expires_after="2020-04-05"> + expires_after="2021-05-10"> <owner>thestig@chromium.org</owner> + <owner>dhoss@chromium.org</owner> <summary> Count how frequently a set of pre-defined print preview errors occur. </summary> @@ -172884,7 +172891,7 @@ </histogram> <histogram name="V8.RegExpBacktracks" units="backtracks" - expires_after="2020-04-23"> + expires_after="2021-01-01"> <owner>jgruber@chromium.org</owner> <owner>mvstanton@chromium.org</owner> <summary>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index d3a8f36..0607a55 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -42,7 +42,7 @@ <translation id="1363028406613469049">แทร็ก</translation> <translation id="1378727793141957596">ยินดีต้อนรับสู่ Google ไดรฟ์!</translation> <translation id="1383876407941801731">ค้นหา</translation> -<translation id="1395262318152388157">แถบเลื่อนเพื่อค้นหา</translation> +<translation id="1395262318152388157">แถบเลื่อนสำหรับกรอวิดีโอ</translation> <translation id="1399648040768741453">แป้นพิมพ์ภาษาเตลูกู (คำที่ใช้ออกเสียง)</translation> <translation id="1430915738399379752">พิมพ์</translation> <translation id="1439494416798956626">ย้ายไปที่ <ph name="FOLDER_NAME" /> แล้ว</translation>
diff --git a/ui/events/blink/input_handler_proxy.cc b/ui/events/blink/input_handler_proxy.cc index d30ac0c..8540083 100644 --- a/ui/events/blink/input_handler_proxy.cc +++ b/ui/events/blink/input_handler_proxy.cc
@@ -1120,8 +1120,17 @@ bool is_in_inertial_scrolling_on_impl = in_inertial_scrolling_ && handling_gesture_on_impl_thread_; - if (is_in_inertial_scrolling_on_impl && is_touching_scrolling_layer) + if (is_in_inertial_scrolling_on_impl && is_touching_scrolling_layer) { + // If the touchstart occurs during a fling, it will be ACK'd immediately + // and it and its following touch moves will be dispatched as non-blocking. + // Due to tap suppression on the browser side, this will reset the + // browser-side touch action (see comment in + // TouchActionFilter::FilterGestureEvent for GestureScrollBegin). Ensure we + // send back a white_listed_touch_action that matches this non-blocking + // behavior rather than treating it as if it'll block. + white_listed_touch_action = cc::TouchAction::kAuto; result = DID_NOT_HANDLE_NON_BLOCKING_DUE_TO_FLING; + } client_->SetWhiteListedTouchAction(white_listed_touch_action, touch_event.unique_touch_event_id, result);
diff --git a/ui/events/blink/input_handler_proxy_unittest.cc b/ui/events/blink/input_handler_proxy_unittest.cc index 3ce359c..90d227e 100644 --- a/ui/events/blink/input_handler_proxy_unittest.cc +++ b/ui/events/blink/input_handler_proxy_unittest.cc
@@ -49,9 +49,15 @@ using blink::WebMouseWheelEvent; using blink::WebTouchEvent; using blink::WebTouchPoint; +using cc::InputHandler; +using cc::ScrollBeginThreadState; +using cc::TouchAction; using testing::_; using testing::DoAll; using testing::Field; +using testing::Mock; +using testing::Return; +using testing::SetArgPointee; namespace ui { namespace test { @@ -494,12 +500,15 @@ float delta_y_or_scale = 0, int x = 0, int y = 0) { + InjectInputEvent(CreateGestureScrollPinch( + type, source_device, input_handler_proxy_.tick_clock_->NowTicks(), + delta_y_or_scale, x, y)); + } + + void InjectInputEvent(WebScopedInputEvent event) { LatencyInfo latency; input_handler_proxy_.HandleInputEventWithLatencyInfo( - CreateGestureScrollPinch(type, source_device, - input_handler_proxy_.tick_clock_->NowTicks(), - delta_y_or_scale, x, y), - latency, + std::move(event), latency, base::BindOnce( &InputHandlerProxyEventQueueTest::DidHandleInputEventAndOverscroll, weak_ptr_factory_.GetWeakPtr())); @@ -559,6 +568,10 @@ ->GeneratePrediction(WebInputEvent::GetStaticTimeStampForTests()); } + base::TimeTicks NowTimestampForEvents() { + return input_handler_proxy_.tick_clock_->NowTicks(); + } + protected: testing::StrictMock<MockInputHandler> mock_input_handler_; testing::StrictMock<MockInputHandlerProxyClient> mock_client_; @@ -1322,6 +1335,103 @@ VERIFY_AND_RESET_MOCKS(); } +// Tests that the whitelisted touch action is correctly set when a touch is +// made non blocking due to an ongoing fling. https://crbug.com/1048098. +TEST_F(InputHandlerProxyEventQueueTest, AckTouchActionNonBlockingForFling) { + // Simulate starting a compositor scroll and then flinging. This is setup for + // the real checks below. + { + float delta = 10; + + // ScrollBegin + { + EXPECT_CALL(mock_input_handler_, ScrollBegin(_, _)) + .WillOnce(Return(kImplThreadScrollState)); + EXPECT_CALL( + mock_input_handler_, + RecordScrollBegin(_, ScrollBeginThreadState::kScrollingOnCompositor)) + .Times(1); + + HandleGestureEvent(WebInputEvent::kGestureScrollBegin, delta); + Mock::VerifyAndClearExpectations(&mock_input_handler_); + } + + // ScrollUpdate + { + EXPECT_CALL(mock_input_handler_, SetNeedsAnimateInput()).Times(1); + EXPECT_CALL(mock_input_handler_, ScrollingShouldSwitchtoMainThread()) + .WillOnce(Return(false)); + EXPECT_CALL(mock_input_handler_, ScrollUpdate(_, _)).Times(1); + + HandleGestureEvent(WebInputEvent::kGestureScrollUpdate, delta); + DeliverInputForBeginFrame(); + Mock::VerifyAndClearExpectations(&mock_input_handler_); + } + + // Start a fling - ScrollUpdate with momentum + { + cc::InputHandlerScrollResult scroll_result_did_scroll; + scroll_result_did_scroll.did_scroll = true; + EXPECT_CALL(mock_input_handler_, ScrollUpdate(_, _)) + .WillOnce(Return(scroll_result_did_scroll)); + EXPECT_CALL(mock_input_handler_, SetNeedsAnimateInput()).Times(1); + EXPECT_CALL(mock_input_handler_, ScrollingShouldSwitchtoMainThread()) + .WillOnce(Return(false)); + EXPECT_CALL(mock_input_handler_, + GetSnapFlingInfoAndSetAnimatingSnapTarget(_, _, _)) + .WillOnce(Return(false)); + + auto gsu_fling = CreateGestureScrollPinch( + WebInputEvent::kGestureScrollUpdate, WebGestureDevice::kTouchscreen, + NowTimestampForEvents(), delta, /*x=*/0, /*y=*/0); + static_cast<blink::WebGestureEvent*>(gsu_fling.get()) + ->data.scroll_update.inertial_phase = + WebGestureEvent::InertialPhaseState::kMomentum; + InjectInputEvent(std::move(gsu_fling)); + DeliverInputForBeginFrame(); + } + } + + // We're now in an active gesture fling. Simulate the user touching down on + // the screen. If this touch hits a blocking region (e.g. touch-action or a + // non-passive touchstart listener), we won't actually treat it as blocking; + // because of the ongoing fling it will be treated as non blocking. However, + // we also have to ensure that the whitelisted_touch_action reported is also + // kAuto so that the browser knows that it shouldn't wait for an ACK with an + // allowed touch-action before dispatching more scrolls. + { + // Simulate hitting a blocking region on the scrolling layer, as if there + // was a non-passive touchstart handler. + EXPECT_CALL(mock_input_handler_, + EventListenerTypeForTouchStartOrMoveAt(_, _)) + .WillOnce(DoAll(SetArgPointee<1>(TouchAction::kNone), + Return(InputHandler::TouchStartOrMoveEventListenerType:: + HANDLER_ON_SCROLLING_LAYER))); + + std::unique_ptr<WebTouchEvent> touch_start = + std::make_unique<WebTouchEvent>( + WebInputEvent::kTouchStart, WebInputEvent::kNoModifiers, + WebInputEvent::GetStaticTimeStampForTests()); + touch_start->touches_length = 1; + touch_start->touch_start_or_first_touch_move = true; + touch_start->touches[0] = + CreateWebTouchPoint(WebTouchPoint::kStatePressed, 10, 10); + + // This is the call this test is checking: we expect that the client will + // report the touch as non-blocking and also that the whitelisted touch + // action matches the non blocking expectatithe whitelisted touch action + // matches the non blocking expectation (i.e. all touches are allowed). + EXPECT_CALL( + mock_client_, + SetWhiteListedTouchAction( + TouchAction::kAuto, touch_start->unique_touch_event_id, + InputHandlerProxy::DID_NOT_HANDLE_NON_BLOCKING_DUE_TO_FLING)) + .WillOnce(Return()); + + InjectInputEvent(std::move(touch_start)); + } +} + TEST_P(InputHandlerProxyTest, HitTestTouchEventNullTouchAction) { // One of the touch points is on a touch-region. So the event should be sent // to the main thread.
diff --git a/ui/views/controls/button/button.cc b/ui/views/controls/button/button.cc index d74e05dc..d0327d7 100644 --- a/ui/views/controls/button/button.cc +++ b/ui/views/controls/button/button.cc
@@ -269,9 +269,13 @@ } void Button::SetHighlighted(bool bubble_visible) { - AnimateInkDrop(bubble_visible ? views::InkDropState::ACTIVATED - : views::InkDropState::DEACTIVATED, - nullptr); + const views::InkDropState next_state = bubble_visible + ? views::InkDropState::ACTIVATED + : views::InkDropState::DEACTIVATED; + // Avoid redundantly updating the inkdrop state. + if (next_state == GetInkDrop()->GetTargetInkDropState()) + return; + AnimateInkDrop(next_state, nullptr); for (ButtonObserver& observer : button_observers_) observer.OnHighlightChanged(this, bubble_visible); }
diff --git a/weblayer/README.md b/weblayer/README.md index 0610a7f..df489b3b 100644 --- a/weblayer/README.md +++ b/weblayer/README.md
@@ -71,3 +71,25 @@ $ out/Default/bin/run_weblayer_support_instrumentation_test_apk The test script will build and install all necessary APKs. + +## Running WPT + +To run WPT on android against weblayer do the following: + +$ export WPT_TEST= test you want to run, relative to wpt directory. +$ autoninja -C out/Default run_weblayer_shell weblayer_shell_wpt +$ out/Default/bin/run_weblayer_shell +$ testing/scripts/run_android_wpt.py --webdriver-binary=out/Default/clang_x64/chromedriver --product android_weblayer --isolated-script-test-output /tmp/weblayer_out.json --include ./third_party/blink/web_tests/external/wpt/$WPT_TEST + +`run_android_wpt.py` does not install weblayer-shell, you need to do that +yourself (executing run_weblayer_shell will do that). + +To run against clank: + +$ autoninja -C out/Default monochrome_public_apk +$ out/Default/bin/monochrome_public_apk install +$ testing/scripts/run_android_wpt.py --webdriver-binary=out/Default/clang_x64/chromedriver --product chrome_android --package-name org.chromium.chrome --isolated-script-test-output /tmp/weblayer_out.json --include ./third_party/blink/web_tests/external/wpt/$WPT_TEST + +Passing in `-vvvv` may be useful if you want to see loads of information about +test execution. +
diff --git a/weblayer/browser/android/javatests/BUILD.gn b/weblayer/browser/android/javatests/BUILD.gn index 13c0f6a5..bb5a6da 100644 --- a/weblayer/browser/android/javatests/BUILD.gn +++ b/weblayer/browser/android/javatests/BUILD.gn
@@ -34,6 +34,7 @@ "src/org/chromium/weblayer/test/TabCallbackTest.java", "src/org/chromium/weblayer/test/TabListCallbackTest.java", "src/org/chromium/weblayer/test/TabTest.java", + "src/org/chromium/weblayer/test/TestFullscreenCallback.java", "src/org/chromium/weblayer/test/TopControlsTest.java", "src/org/chromium/weblayer/test/WebLayerJUnit4ClassRunner.java", "src/org/chromium/weblayer/test/WebLayerLoadingTest.java",
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java index c3964c4..d2b8344 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/FullscreenCallbackTest.java
@@ -12,10 +12,7 @@ import org.junit.Test; import org.junit.runner.RunWith; -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 org.chromium.weblayer.FullscreenCallback; import org.chromium.weblayer.shell.InstrumentationActivity; /** @@ -28,49 +25,14 @@ new InstrumentationActivityTestRule(); private InstrumentationActivity mActivity; - private Delegate mDelegate; - - private static class Delegate extends FullscreenCallback { - public int mEnterFullscreenCount; - public int mExitFullscreenCount; - public Runnable mExitFullscreenRunnable; - - @Override - public void onEnterFullscreen(Runnable exitFullscreenRunner) { - mEnterFullscreenCount++; - mExitFullscreenRunnable = exitFullscreenRunner; - } - - @Override - public void onExitFullscreen() { - mExitFullscreenCount++; - } - - public void waitForFullscreen() { - CriteriaHelper.pollUiThread(new Criteria() { - @Override - public boolean isSatisfied() { - return mEnterFullscreenCount == 1; - } - }); - } - - public void waitForExitFullscreen() { - CriteriaHelper.pollUiThread(new Criteria() { - @Override - public boolean isSatisfied() { - return mExitFullscreenCount == 1; - } - }); - } - } + private TestFullscreenCallback mDelegate; @Before public void setUp() { String url = mActivityTestRule.getTestDataURL("fullscreen.html"); mActivity = mActivityTestRule.launchShellWithUrl(url); Assert.assertNotNull(mActivity); - mDelegate = new Delegate(); + mDelegate = new TestFullscreenCallback(); TestThreadUtils.runOnUiThreadBlocking( () -> { mActivity.getTab().setFullscreenCallback(mDelegate); });
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java index c20ea5cf..9eccc256 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/ProfileTest.java
@@ -12,7 +12,6 @@ import org.junit.runner.RunWith; import org.chromium.base.test.util.CallbackHelper; -import org.chromium.base.test.util.DisabledTest; 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; @@ -120,7 +119,6 @@ @Test @SmallTest - @DisabledTest public void testEnumerateAllProfileNames() throws Exception { final String profileName = "TestEnumerateAllProfileNames"; final WebLayer weblayer = mActivityTestRule.getWebLayer();
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SmokeTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SmokeTest.java index f5dc7d7..8a1f6850 100644 --- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SmokeTest.java +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/SmokeTest.java
@@ -60,6 +60,9 @@ PhantomReference<InstrumentationActivity> reference; { InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl("about:blank"); + TestThreadUtils.runOnUiThreadBlocking(() -> { + activity.getTab().setFullscreenCallback(new TestFullscreenCallback()); + }); mActivityTestRule.recreateActivity(); boolean destroyed = TestThreadUtils.runOnUiThreadBlockingNoException(() -> activity.isDestroyed());
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TestFullscreenCallback.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TestFullscreenCallback.java new file mode 100644 index 0000000..a50a9af --- /dev/null +++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/TestFullscreenCallback.java
@@ -0,0 +1,47 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.weblayer.test; + +import org.chromium.content_public.browser.test.util.Criteria; +import org.chromium.content_public.browser.test.util.CriteriaHelper; +import org.chromium.weblayer.FullscreenCallback; + +/** + * FullscreenCallback implementation for tests. + */ +public class TestFullscreenCallback extends FullscreenCallback { + public int mEnterFullscreenCount; + public int mExitFullscreenCount; + public Runnable mExitFullscreenRunnable; + + @Override + public void onEnterFullscreen(Runnable exitFullscreenRunner) { + mEnterFullscreenCount++; + mExitFullscreenRunnable = exitFullscreenRunner; + } + + @Override + public void onExitFullscreen() { + mExitFullscreenCount++; + } + + public void waitForFullscreen() { + CriteriaHelper.pollUiThread(new Criteria() { + @Override + public boolean isSatisfied() { + return mEnterFullscreenCount == 1; + } + }); + } + + public void waitForExitFullscreen() { + CriteriaHelper.pollUiThread(new Criteria() { + @Override + public boolean isSatisfied() { + return mExitFullscreenCount == 1; + } + }); + } +}
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java index 66c8eab..22686449 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/ProfileImpl.java
@@ -56,11 +56,7 @@ mDownloadCallbackProxy = new DownloadCallbackProxy(mName, mNativeProfile); } - @Override - public void destroy() { - StrictModeWorkaround.apply(); - if (mBeingDeleted) return; - + private void destroyDependentJavaObjects() { if (mDownloadCallbackProxy != null) { mDownloadCallbackProxy.destroy(); mDownloadCallbackProxy = null; @@ -70,7 +66,14 @@ mCookieManager.destroy(); mCookieManager = null; } + } + @Override + public void destroy() { + StrictModeWorkaround.apply(); + if (mBeingDeleted) return; + + destroyDependentJavaObjects(); deleteNativeProfile(); maybeRunDestroyCallback(); } @@ -90,15 +93,19 @@ public void destroyAndDeleteDataFromDisk(IObjectWrapper completionCallback) { StrictModeWorkaround.apply(); checkNotDestroyed(); - final Runnable callback = ObjectWrapper.unwrap(completionCallback, Runnable.class); assert mNativeProfile != 0; - mBeingDeleted = ProfileImplJni.get().deleteDataFromDisk(mNativeProfile, () -> { - deleteNativeProfile(); - if (callback != null) callback.run(); - }); - if (!mBeingDeleted) { + if (ProfileImplJni.get().getNumBrowserImpl(mNativeProfile) > 0) { throw new IllegalStateException("Profile still in use: " + mName); } + + final Runnable callback = ObjectWrapper.unwrap(completionCallback, Runnable.class); + + mBeingDeleted = true; + destroyDependentJavaObjects(); + ProfileImplJni.get().destroyAndDeleteDataFromDisk(mNativeProfile, () -> { + if (callback != null) callback.run(); + }); + mNativeProfile = 0; maybeRunDestroyCallback(); } @@ -195,7 +202,8 @@ void enumerateAllProfileNames(Callback<String[]> callback); long createProfile(String name, ProfileImpl caller); void deleteProfile(long profile); - boolean deleteDataFromDisk(long nativeProfileImpl, Runnable completionCallback); + int getNumBrowserImpl(long nativeProfileImpl); + void destroyAndDeleteDataFromDisk(long nativeProfileImpl, Runnable completionCallback); void clearBrowsingData(long nativeProfileImpl, @ImplBrowsingDataType int[] dataTypes, long fromMillis, long toMillis, Runnable callback); void setDownloadDirectory(long nativeProfileImpl, String directory);
diff --git a/weblayer/browser/persistence/browser_persistence_common.cc b/weblayer/browser/persistence/browser_persistence_common.cc index 67445f4..76e2d4c 100644 --- a/weblayer/browser/persistence/browser_persistence_common.cc +++ b/weblayer/browser/persistence/browser_persistence_common.cc
@@ -69,10 +69,13 @@ std::vector<std::unique_ptr<content::NavigationEntry>> entries = sessions::ContentSerializedNavigationBuilder::ToNavigationEntries( session_tab.navigations, browser_context); - // TODO(https://crbug.com/1061917): handle UA client hints override. - web_contents->SetUserAgentOverride(blink::UserAgentOverride::UserAgentOnly( - session_tab.user_agent_override), - false); + + blink::UserAgentOverride ua_override; + ua_override.ua_string_override = + session_tab.user_agent_override.ua_string_override; + ua_override.ua_metadata_override = blink::UserAgentMetadata::Demarshal( + session_tab.user_agent_override.opaque_ua_metadata_override); + web_contents->SetUserAgentOverride(ua_override, false); // CURRENT_SESSION matches what clank does. On the desktop, we should // use a different type. web_contents->GetController().Restore(selected_navigation_index, @@ -119,12 +122,15 @@ result.push_back(sessions::CreateLastActiveTimeCommand( tab_id, tab->web_contents()->GetLastActiveTime())); - // TODO(https://crbug.com/1061917): handle UA client hints override. - const std::string& ua_override = - tab->web_contents()->GetUserAgentOverride().ua_string_override; - if (!ua_override.empty()) { - result.push_back( - sessions::CreateSetTabUserAgentOverrideCommand(tab_id, ua_override)); + const blink::UserAgentOverride& ua_override = + tab->web_contents()->GetUserAgentOverride(); + if (!ua_override.ua_string_override.empty()) { + sessions::SerializedUserAgentOverride serialized_override; + serialized_override.ua_string_override = ua_override.ua_string_override; + serialized_override.opaque_ua_metadata_override = + blink::UserAgentMetadata::Marshal(ua_override.ua_metadata_override); + result.push_back(sessions::CreateSetTabUserAgentOverrideCommand( + tab_id, serialized_override)); } if (index_in_browser != -1) { result.push_back(
diff --git a/weblayer/browser/persistence/browser_persister.cc b/weblayer/browser/persistence/browser_persister.cc index f8adb23..c7fe1a5 100644 --- a/weblayer/browser/persistence/browser_persister.cc +++ b/weblayer/browser/persistence/browser_persister.cc
@@ -164,7 +164,7 @@ void BrowserPersister::SetTabUserAgentOverride( const SessionID& window_id, const SessionID& tab_id, - const std::string& user_agent_override) { + const sessions::SerializedUserAgentOverride& user_agent_override) { if (rebuild_on_next_save_) return;
diff --git a/weblayer/browser/persistence/browser_persister.h b/weblayer/browser/persistence/browser_persister.h index b7c510b0..c157abe 100644 --- a/weblayer/browser/persistence/browser_persister.h +++ b/weblayer/browser/persistence/browser_persister.h
@@ -75,7 +75,8 @@ // sessions::SessionTabHelperDelegate: void SetTabUserAgentOverride(const SessionID& window_id, const SessionID& tab_id, - const std::string& user_agent_override) override; + const sessions::SerializedUserAgentOverride& + user_agent_override) override; void SetSelectedNavigationIndex(const SessionID& window_id, const SessionID& tab_id, int index) override;
diff --git a/weblayer/browser/profile_impl.cc b/weblayer/browser/profile_impl.cc index e5967d8..e451eeef 100644 --- a/weblayer/browser/profile_impl.cc +++ b/weblayer/browser/profile_impl.cc
@@ -4,6 +4,7 @@ #include "weblayer/browser/profile_impl.h" +#include <memory> #include <string> #include <utility> #include <vector> @@ -19,7 +20,9 @@ #include "base/task/thread_pool.h" #include "base/threading/thread_restrictions.h" #include "build/build_config.h" +#include "components/prefs/pref_service.h" #include "components/web_cache/browser/web_cache_manager.h" +#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/browsing_data_remover.h" #include "content/public/browser/device_service.h" @@ -229,18 +232,6 @@ #endif } -bool ProfileImpl::DeleteDataFromDisk(base::OnceClosure done_callback) { - if (num_browser_impl_ > 0) - return false; - base::ThreadPool::PostTaskAndReply( - FROM_HERE, - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce(&NukeProfileFromDisk, name_, data_path_), - std::move(done_callback)); - return true; -} - void ProfileImpl::ClearBrowsingData( const std::vector<BrowsingDataType>& data_types, base::Time from_time, @@ -286,6 +277,31 @@ return cookie_manager_.get(); } +// static +void ProfileImpl::NukeDataAfterRemovingData( + std::unique_ptr<ProfileImpl> profile, + base::OnceClosure done_callback) { + // Need PostTask to avoid reentrancy for deleting |browser_context_|. + base::PostTask(FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce(&ProfileImpl::DoNukeData, std::move(profile), + std::move(done_callback))); +} + +// static +void ProfileImpl::DoNukeData(std::unique_ptr<ProfileImpl> profile, + base::OnceClosure done_callback) { + std::string name = profile->name_; + base::FilePath data_path = profile->data_path_; + + profile.reset(); + base::ThreadPool::PostTaskAndReply( + FROM_HERE, + {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, + base::BindOnce(&NukeProfileFromDisk, name, data_path), + std::move(done_callback)); +} + void ProfileImpl::ClearRendererCache() { for (content::RenderProcessHost::iterator iter = content::RenderProcessHost::AllHostsIterator(); @@ -311,10 +327,44 @@ i18n::GetAcceptLangs())); } +// static std::unique_ptr<Profile> Profile::Create(const std::string& name) { return std::make_unique<ProfileImpl>(name); } +// static +std::unique_ptr<Profile> Profile::DestroyAndDeleteDataFromDisk( + std::unique_ptr<Profile> profile, + base::OnceClosure done_callback) { + std::unique_ptr<ProfileImpl> impl( + static_cast<ProfileImpl*>(profile.release())); + return ProfileImpl::DestroyAndDeleteDataFromDisk(std::move(impl), + std::move(done_callback)); +} + +// static +std::unique_ptr<ProfileImpl> ProfileImpl::DestroyAndDeleteDataFromDisk( + std::unique_ptr<ProfileImpl> profile, + base::OnceClosure done_callback) { + if (profile->num_browser_impl_ > 0) + return profile; + + // Try to finish all writes and remove all data before nuking the profile. + static_cast<BrowserContextImpl*>(profile->GetBrowserContext()) + ->pref_service() + ->CommitPendingWrite(); + + // Unretained is safe here because DataClearer is owned by + // BrowserContextImpl which is owned by this. + auto* clearer = new DataClearer( + profile->GetBrowserContext(), + base::BindOnce(&ProfileImpl::NukeDataAfterRemovingData, + std::move(profile), std::move(done_callback))); + int remove_all_mask = 0x8fffffff; + clearer->ClearData(remove_all_mask, base::Time::Min(), base::Time::Max()); + return nullptr; +} + #if defined(OS_ANDROID) ProfileImpl::ProfileImpl( JNIEnv* env, @@ -347,12 +397,21 @@ base::android::ScopedJavaGlobalRef<jobject>(callback))); } -jboolean ProfileImpl::DeleteDataFromDisk( +jint ProfileImpl::GetNumBrowserImpl(JNIEnv* env) { + return num_browser_impl_; +} + +void ProfileImpl::DestroyAndDeleteDataFromDisk( JNIEnv* env, const base::android::JavaRef<jobject>& j_completion_callback) { - return DeleteDataFromDisk(base::BindOnce( - &base::android::RunRunnableAndroid, - base::android::ScopedJavaGlobalRef<jobject>(j_completion_callback))); + std::unique_ptr<ProfileImpl> ptr(this); + std::unique_ptr<ProfileImpl> result = + ProfileImpl::DestroyAndDeleteDataFromDisk( + std::move(ptr), + base::BindOnce(&base::android::RunRunnableAndroid, + base::android::ScopedJavaGlobalRef<jobject>( + j_completion_callback))); + CHECK(!result); } void ProfileImpl::ClearBrowsingData(
diff --git a/weblayer/browser/profile_impl.h b/weblayer/browser/profile_impl.h index 2d7831b3..eb920f8 100644 --- a/weblayer/browser/profile_impl.h +++ b/weblayer/browser/profile_impl.h
@@ -34,6 +34,10 @@ // |context| must not be null. static base::FilePath GetCachePath(content::BrowserContext* context); + static std::unique_ptr<ProfileImpl> DestroyAndDeleteDataFromDisk( + std::unique_ptr<ProfileImpl> profile, + base::OnceClosure done_callback); + explicit ProfileImpl(const std::string& name); ~ProfileImpl() override; @@ -53,7 +57,6 @@ DownloadDelegate* download_delegate() { return download_delegate_; } // Profile implementation: - bool DeleteDataFromDisk(base::OnceClosure done_callback) override; void ClearBrowsingData(const std::vector<BrowsingDataType>& data_types, base::Time from_time, base::Time to_time, @@ -67,7 +70,8 @@ const base::android::JavaParamRef<jstring>& path, const base::android::JavaParamRef<jobject>& java_profile); - jboolean DeleteDataFromDisk( + jint GetNumBrowserImpl(JNIEnv* env); + void DestroyAndDeleteDataFromDisk( JNIEnv* env, const base::android::JavaRef<jobject>& j_completion_callback); void ClearBrowsingData( @@ -94,6 +98,10 @@ private: class DataClearer; + static void NukeDataAfterRemovingData(std::unique_ptr<ProfileImpl> profile, + base::OnceClosure done_callback); + static void DoNukeData(std::unique_ptr<ProfileImpl> profile, + base::OnceClosure done_callback); void ClearRendererCache(); // Callback when the system locale has been updated.
diff --git a/weblayer/browser/tab_impl.cc b/weblayer/browser/tab_impl.cc index 277e1b8..4cbc4e1 100644 --- a/weblayer/browser/tab_impl.cc +++ b/weblayer/browser/tab_impl.cc
@@ -326,7 +326,7 @@ } bool TabImpl::GetPasswordEchoEnabled() { - return browser_->GetPasswordEchoEnabled(); + return browser_ ? browser_->GetPasswordEchoEnabled() : false; } bool TabImpl::IsActive() {
diff --git a/weblayer/public/profile.h b/weblayer/public/profile.h index 1180a095..f482203 100644 --- a/weblayer/public/profile.h +++ b/weblayer/public/profile.h
@@ -30,12 +30,15 @@ // underscore. static std::unique_ptr<Profile> Create(const std::string& name); - virtual ~Profile() {} - // Delete all profile's data from disk. If there are any existing usage - // of this profile, return false immediately and |done_callback| will not - // be called. Otherwise |done_callback| is called when deletion is complete. - virtual bool DeleteDataFromDisk(base::OnceClosure done_callback) = 0; + // of this profile, return |profile| immediately and |done_callback| will not + // be called. Otherwise return nullptr and |done_callback| is called when + // deletion is complete. + static std::unique_ptr<Profile> DestroyAndDeleteDataFromDisk( + std::unique_ptr<Profile> profile, + base::OnceClosure done_callback); + + virtual ~Profile() {} virtual void ClearBrowsingData( const std::vector<BrowsingDataType>& data_types,