diff --git a/.gitignore b/.gitignore index a874677..99067144 100644 --- a/.gitignore +++ b/.gitignore
@@ -191,6 +191,7 @@ /components/resources/default_200_percent/google_chrome /components/resources/default_300_percent/google_chrome /components/search_engines/prepopulated_engines.xml +/components/site_isolation/internal /components/suggestions.xml /components/test/data/paint_preview/**/*.pb /components/test/data/paint_preview/**/*.skp
diff --git a/AUTHORS b/AUTHORS index d3235dab..e2300b7 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -202,6 +202,7 @@ Conrad Irwin <conrad.irwin@gmail.com> Craig Schlenter <craig.schlenter@gmail.com> Csaba Osztrogonác <ossy.szeged@gmail.com> +Cynthia Revström <me@cynthia.re> Daegyu Lee <na7jun8gi@gmail.com> Dai Chunyang <chunyang.dai@intel.com> Daiwei Li <daiweili@suitabletech.com> @@ -827,6 +828,7 @@ Ruben Terrazas <rubentopo@gmail.com> Rufus Hamade <rufus.hamade@imgtec.com> Ruiyi Luo <luoruiyi2008@gmail.com> +Russell Davis <russell.davis@gmail.com> Ryan Ackley <ryanackley@gmail.com> Ryan Norton <rnorton10@gmail.com> Ryan Sleevi <ryan-chromium-dev@sleevi.com>
diff --git a/DEPS b/DEPS index 11dd954..c77831c 100644 --- a/DEPS +++ b/DEPS
@@ -179,23 +179,23 @@ # 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': 'a0ab34903ce450d674f591ce3ffdf1314a5ffa99', + 'v8_revision': 'ed70e67c11533e98caa126edfb88e081d64072b5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. - 'swarming_revision': 'cc958279ffd6853e0a1b227a7e957ca334fe56af', + 'swarming_revision': '160b445a44e0daacf6f3f8570ca2707ec451f374', # 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': '3d894d87b25bcfcc1e410cbc08109ad78665c632', + 'angle_revision': '6e0d718a48d8fb5e66a6f8a1838adbf8c7f5ff4c', # 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': 'e52e2dbcdf9d46b63ec6cc4df8bdea6f916c97e9', + 'swiftshader_revision': '9418b511c73bc2b079d8b8d8d6fcb5d40b814159', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': '5bc1f981df4d02a2c2329891268667a0ff3a4e0f', + 'pdfium_revision': '671aece845dd17d61a9f223ac41c6a50aa5145c2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # 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': 'a79a2f646d240979f54ef9faa4d45863d0e194a0', + 'catapult_revision': '4b4e8791324284c92a5e6a84d93ed9ccdbbd375e', # 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': 'decaee5ce9bf0b533cca09010f61e0816bf43775', + 'devtools_frontend_revision': 'ef991621e00aa275593725f922530b5684692702', # 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. @@ -270,7 +270,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_platform-tools_version # and whatever else without interference from each other. - 'android_sdk_platform-tools_version': 'Jxtur3_L9RzY4q79K-AwIahwFW4oi5uYVD5URx9h62wC', + 'android_sdk_platform-tools_version': 'zMVtBEihXp2Z0NYFNjLLmNrwy6252b_YWG6sh2l0QAcC', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling android_sdk_platforms_version # and whatever else without interference from each other. @@ -286,7 +286,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'spv_tools_revision': 'e70d25f6fa5d6a560f621aaaf6505472be8cc069', + 'spv_tools_revision': 'c018fc6ae667b659c80b4357c20f6016ee3fe961', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -298,15 +298,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'shaderc_revision': '1926de0638b6dd74b759293a5bd21c473d0b1ade', + 'shaderc_revision': 'a10a0b33493e3ff1c0de1dc8406ed8de230ba8c1', # 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': '8c8d16a1c53f4a0cf4c03a339f1224966676aed0', + 'dawn_revision': '93bea5cb50e30f115088be752145df88562bfa25', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'quiche_revision': 'b86cd3f5fb91ab58f9ba14ec19bdd223c063c917', + 'quiche_revision': '5abb89b35e3c392d46e966001bb26f40a1590d4c', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ios_webkit # and whatever else without interference from each other. @@ -876,7 +876,7 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '08f4d59e0b177d3d15b65f9826bbf05491b3841d', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e1a9c8db7e7cf6ba7d70b06ec3f3cf6d74451680', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), @@ -1185,7 +1185,7 @@ 'src/third_party/nasm': { 'url': Var('chromium_git') + '/chromium/deps/nasm.git' + '@' + - '21eb595319746a669a742d210eaa413c728e7fad' + '4fa54ca5f7fc3a15a8c78ac94688e64d3e4e4fa1' }, 'src/third_party/netty-tcnative/src': { @@ -1213,7 +1213,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + '6f26bce0b1c4e8ce0e13332f7c0083788def5fdf', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '39fd800d2c43c15bf856901a59dad78ab10a5cb9', + Var('chromium_git') + '/openscreen' + '@' + 'b2bcf0eb3a4d566ec224b935b7f0c3bd9a72ee16', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + '9e97b73e7dd2bfc07745489d728f6a36665c648f', @@ -1230,7 +1230,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '38cf748e7a5f5da132b43e93957468f1462397a2', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '8ab5356c195c078f66cdb19dcf601288d1835e0d', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1308,7 +1308,7 @@ 'packages': [ { 'package': 'fuchsia/third_party/aemu/linux-amd64', - 'version': 'vN52wWr_Zy2xIpWpVpYoKVEtVi0AFVR4YrjNEPti9goC' + 'version': 'b4mdctQbsAjpYCqLmhI-lRLzZHRgE1LAEpj2IZpGH1MC' }, ], 'condition': 'host_os == "linux" and checkout_fuchsia', @@ -1460,7 +1460,7 @@ }, 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '3e2809f4f0cd922a0785f7bbad704fa53fcf16fc', + Var('webrtc_git') + '/src.git' + '@' + '2136b569eb2eec25da9483f7ca92a04a168a4f14', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1535,7 +1535,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@62d5d8e82707f4013636a3275c612424f4cd891c', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3aa998dd83acc82fe123eb97be4883f7bbf505f6', 'condition': 'checkout_src_internal', },
diff --git a/android_webview/browser/aw_permission_manager.cc b/android_webview/browser/aw_permission_manager.cc index 6d5084e4..2c1618cd 100644 --- a/android_webview/browser/aw_permission_manager.cc +++ b/android_webview/browser/aw_permission_manager.cc
@@ -339,6 +339,7 @@ case PermissionType::VR: case PermissionType::AR: case PermissionType::STORAGE_ACCESS_GRANT: + case PermissionType::CAMERA_PAN_TILT_ZOOM: NOTIMPLEMENTED() << "RequestPermissions is not implemented for " << static_cast<int>(permissions[i]); pending_request_raw->SetPermissionStatus(permissions[i], @@ -544,6 +545,7 @@ case PermissionType::VR: case PermissionType::AR: case PermissionType::STORAGE_ACCESS_GRANT: + case PermissionType::CAMERA_PAN_TILT_ZOOM: NOTIMPLEMENTED() << "CancelPermission not implemented for " << static_cast<int>(permission); break;
diff --git a/android_webview/browser/network_service/android_stream_reader_url_loader.cc b/android_webview/browser/network_service/android_stream_reader_url_loader.cc index a84d94d..361a5938 100644 --- a/android_webview/browser/network_service/android_stream_reader_url_loader.cc +++ b/android_webview/browser/network_service/android_stream_reader_url_loader.cc
@@ -32,8 +32,9 @@ namespace { -const char kResponseHeaderViaShouldInterceptRequest[] = - "Client-Via: shouldInterceptRequest"; +const char kResponseHeaderViaShouldInterceptRequestName[] = "Client-Via"; +const char kResponseHeaderViaShouldInterceptRequestValue[] = + "shouldInterceptRequest"; const char kHTTPOkText[] = "OK"; const char kHTTPNotFoundText[] = "Not Found"; @@ -237,12 +238,8 @@ &head.charset); if (expected_content_size_ != -1) { - std::string content_length_header( - net::HttpRequestHeaders::kContentLength); - content_length_header.append(": "); - content_length_header.append( - base::NumberToString(expected_content_size_)); - head.headers->AddHeader(content_length_header); + head.headers->SetHeader(net::HttpRequestHeaders::kContentLength, + base::NumberToString(expected_content_size_)); head.content_length = expected_content_size_; } @@ -251,10 +248,7 @@ env, resource_request_.url, input_stream_reader_wrapper_->input_stream(), &mime_type) && !mime_type.empty()) { - std::string content_type_header(net::HttpRequestHeaders::kContentType); - content_type_header.append(": "); - content_type_header.append(mime_type); - head.headers->AddHeader(content_type_header); + head.headers->SetHeader(net::HttpRequestHeaders::kContentType, mime_type); head.mime_type = mime_type; } } @@ -264,7 +258,8 @@ // Indicate that the response had been obtained via shouldInterceptRequest. // TODO(jam): why is this added for protocol handler (e.g. content scheme and // file resources?). The old path does this as well. - head.headers->AddHeader(kResponseHeaderViaShouldInterceptRequest); + head.headers->SetHeader(kResponseHeaderViaShouldInterceptRequestName, + kResponseHeaderViaShouldInterceptRequestValue); SendBody(); }
diff --git a/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc b/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc index ece1af15..55fe3eb 100644 --- a/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc +++ b/android_webview/browser/network_service/android_stream_reader_url_loader_unittest.cc
@@ -136,10 +136,7 @@ return; } headers->ReplaceStatusLine(custom_status_); - std::string header_line(custom_header_name_); - header_line.append(": "); - header_line.append(custom_header_value_); - headers->AddHeader(header_line); + headers->AddHeader(custom_header_name_, custom_header_value_); } private:
diff --git a/android_webview/browser/network_service/aw_web_resource_response.cc b/android_webview/browser/network_service/aw_web_resource_response.cc index ac1b0941..8feb9a2a 100644 --- a/android_webview/browser/network_service/aw_web_resource_response.cc +++ b/android_webview/browser/network_service/aw_web_resource_response.cc
@@ -104,10 +104,7 @@ &header_values); DCHECK_EQ(header_values.size(), header_names.size()); for (size_t i = 0; i < header_names.size(); ++i) { - std::string header_line(header_names[i]); - header_line.append(": "); - header_line.append(header_values[i]); - headers->AddHeader(header_line); + headers->AddHeader(header_names[i], header_values[i]); } return true; }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 8f2849b..c358d10 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -45,6 +45,7 @@ "public/cpp/assistant/assistant_settings.h", "public/cpp/autotest_desks_api.h", "public/cpp/autotest_private_api_utils.h", + "public/cpp/debug_utils.h", "public/cpp/docked_magnifier_controller.h", "public/cpp/event_rewriter_controller.h", "public/cpp/first_run_helper.h", @@ -55,6 +56,7 @@ "public/cpp/shelf_config.h", "public/cpp/shelf_test_api.h", "public/cpp/split_view_test_api.h", + "public/cpp/system_tray_test_api.h", "public/cpp/window_finder.h", "public/cpp/window_tree_host_lookup.h", "root_window_controller.h", @@ -208,8 +210,8 @@ "assistant/assistant_setup_controller.h", "assistant/assistant_state_controller.cc", "assistant/assistant_state_controller.h", - "assistant/assistant_suggestions_controller.cc", - "assistant/assistant_suggestions_controller.h", + "assistant/assistant_suggestions_controller_impl.cc", + "assistant/assistant_suggestions_controller_impl.h", "assistant/assistant_ui_controller.cc", "assistant/assistant_ui_controller.h", "assistant/assistant_view_delegate_impl.cc", @@ -2350,7 +2352,6 @@ "//components/exo/wayland:*", ] public = [ - "public/cpp/system_tray_test_api.h", "public/cpp/test/accessibility_controller_test_api.h", "public/cpp/test/assistant_test_api.h", ] @@ -2435,8 +2436,7 @@ "system/power/power_event_observer_test_api.h", "system/status_area_widget_test_helper.cc", "system/status_area_widget_test_helper.h", - "system/unified/unified_system_tray_test_api.cc", - "system/unified/unified_system_tray_test_api.h", + "system/unified/system_tray_test_api.cc", "test/ash_test_base.cc", "test/ash_test_base.h", "test/ash_test_helper.cc",
diff --git a/ash/accelerators/debug_commands.cc b/ash/accelerators/debug_commands.cc index af80da44..be808ee 100644 --- a/ash/accelerators/debug_commands.cc +++ b/ash/accelerators/debug_commands.cc
@@ -10,6 +10,7 @@ #include "ash/accelerators/accelerator_commands.h" #include "ash/hud_display/hud_display.h" #include "ash/public/cpp/ash_switches.h" +#include "ash/public/cpp/debug_utils.h" #include "ash/public/cpp/toast_data.h" #include "ash/public/cpp/window_properties.h" #include "ash/root_window_controller.h" @@ -42,84 +43,6 @@ namespace debug { namespace { -void HandlePrintLayerHierarchy() { - for (aura::Window* root : Shell::Get()->GetAllRootWindows()) { - ui::Layer* layer = root->layer(); - if (layer) - ui::PrintLayerHierarchy( - layer, - RootWindowController::ForWindow(root)->GetLastMouseLocationInRoot()); - } -} - -void HandlePrintViewHierarchy() { - aura::Window* active_window = window_util::GetActiveWindow(); - if (!active_window) - return; - views::Widget* widget = views::Widget::GetWidgetForNativeView(active_window); - if (!widget) - return; - views::PrintViewHierarchy(widget->GetRootView()); -} - -void PrintWindowHierarchy(const aura::Window* active_window, - const aura::Window* focused_window, - aura::Window* window, - int indent, - std::ostringstream* out) { - std::string indent_str(indent, ' '); - std::string name(window->GetName()); - if (name.empty()) - name = "\"\""; - const gfx::Vector2dF& subpixel_position_offset = - window->layer()->GetSubpixelOffset(); - *out << indent_str; - *out << name << " (" << window << ")" - << " type=" << window->type(); - int window_id = window->id(); - if (window_id != aura::Window::kInitialId) - *out << " id=" << window_id; - if (window->GetProperty(kWindowStateKey)) - *out << " " << WindowState::Get(window)->GetStateType(); - *out << ((window == active_window) ? " [active]" : "") - << ((window == focused_window) ? " [focused]" : "") - << (window->IsVisible() ? " visible" : "") << " " - << (window->occlusion_state() != aura::Window::OcclusionState::UNKNOWN - ? aura::Window::OcclusionStateToString(window->occlusion_state()) - : "") - << " " << window->bounds().ToString(); - if (!subpixel_position_offset.IsZero()) - *out << " subpixel offset=" + subpixel_position_offset.ToString(); - std::string* tree_id = window->GetProperty(ui::kChildAXTreeID); - if (tree_id) - *out << " ax_tree_id=" << *tree_id; - base::string16 title(window->GetTitle()); - if (!title.empty()) - *out << " title=" << title; - int app_type = window->GetProperty(aura::client::kAppType); - *out << " app_type=" << app_type; - std::string* pkg_name = window->GetProperty(ash::kArcPackageNameKey); - if (pkg_name) - *out << " pkg_name=" << *pkg_name; - *out << '\n'; - - for (aura::Window* child : window->children()) - PrintWindowHierarchy(active_window, focused_window, child, indent + 3, out); -} - -void HandlePrintWindowHierarchy() { - aura::Window* active_window = window_util::GetActiveWindow(); - aura::Window* focused_window = window_util::GetFocusedWindow(); - aura::Window::Windows roots = Shell::Get()->GetAllRootWindows(); - for (size_t i = 0; i < roots.size(); ++i) { - std::ostringstream out; - out << "RootWindow " << i << ":\n"; - PrintWindowHierarchy(active_window, focused_window, roots[i], 0, &out); - // Error so logs can be collected from end-users. - LOG(ERROR) << out.str(); - } -} - gfx::ImageSkia CreateWallpaperImage(SkColor fill, SkColor rect) { // TODO(oshima): Consider adding a command line option to control wallpaper // images for testing. The size is randomly picked. @@ -195,6 +118,101 @@ } // namespace +void PrintLayerHierarchy(std::ostringstream* out) { + for (aura::Window* root : Shell::Get()->GetAllRootWindows()) { + ui::Layer* layer = root->layer(); + if (layer) { + ui::PrintLayerHierarchy( + layer, + RootWindowController::ForWindow(root)->GetLastMouseLocationInRoot(), + out); + } + } +} + +void HandlePrintLayerHierarchy() { + std::ostringstream out; + PrintLayerHierarchy(&out); + LOG(ERROR) << out.str(); +} + +void PrintViewHierarchy(std::ostringstream* out) { + aura::Window* active_window = window_util::GetActiveWindow(); + if (!active_window) + return; + views::Widget* widget = views::Widget::GetWidgetForNativeView(active_window); + if (!widget) + return; + views::PrintViewHierarchy(widget->GetRootView(), out); +} + +void HandlePrintViewHierarchy() { + std::ostringstream out; + PrintViewHierarchy(&out); + LOG(ERROR) << out.str(); +} + +void PrintWindowHierarchy(const aura::Window* active_window, + const aura::Window* focused_window, + aura::Window* window, + int indent, + std::ostringstream* out) { + std::string indent_str(indent, ' '); + std::string name(window->GetName()); + if (name.empty()) + name = "\"\""; + const gfx::Vector2dF& subpixel_position_offset = + window->layer()->GetSubpixelOffset(); + *out << indent_str; + *out << name << " (" << window << ")" + << " type=" << window->type(); + int window_id = window->id(); + if (window_id != aura::Window::kInitialId) + *out << " id=" << window_id; + if (window->GetProperty(kWindowStateKey)) + *out << " " << WindowState::Get(window)->GetStateType(); + *out << ((window == active_window) ? " [active]" : "") + << ((window == focused_window) ? " [focused]" : "") + << (window->IsVisible() ? " visible" : "") << " " + << (window->occlusion_state() != aura::Window::OcclusionState::UNKNOWN + ? aura::Window::OcclusionStateToString(window->occlusion_state()) + : "") + << " " << window->bounds().ToString(); + if (!subpixel_position_offset.IsZero()) + *out << " subpixel offset=" + subpixel_position_offset.ToString(); + std::string* tree_id = window->GetProperty(ui::kChildAXTreeID); + if (tree_id) + *out << " ax_tree_id=" << *tree_id; + base::string16 title(window->GetTitle()); + if (!title.empty()) + *out << " title=" << title; + int app_type = window->GetProperty(aura::client::kAppType); + *out << " app_type=" << app_type; + std::string* pkg_name = window->GetProperty(ash::kArcPackageNameKey); + if (pkg_name) + *out << " pkg_name=" << *pkg_name; + *out << '\n'; + + for (aura::Window* child : window->children()) + PrintWindowHierarchy(active_window, focused_window, child, indent + 3, out); +} + +void PrintWindowHierarchy(std::ostringstream* out) { + aura::Window* active_window = window_util::GetActiveWindow(); + aura::Window* focused_window = window_util::GetFocusedWindow(); + aura::Window::Windows roots = Shell::Get()->GetAllRootWindows(); + for (size_t i = 0; i < roots.size(); ++i) { + *out << "RootWindow " << i << ":\n"; + PrintWindowHierarchy(active_window, focused_window, roots[i], 0, out); + } +} + +void HandlePrintWindowHierarchy() { + std::ostringstream out; + PrintWindowHierarchy(&out); + LOG(ERROR) << out.str(); +} + void PrintUIHierarchies() { // This is a separate command so the user only has to hit one key to generate // all the logs. Developers use the individual dumps repeatedly, so keep
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn index 6947e41..ff93a9c 100644 --- a/ash/app_list/BUILD.gn +++ b/ash/app_list/BUILD.gn
@@ -111,6 +111,7 @@ "//ash/assistant/util", "//ash/keyboard/ui", "//ash/public/cpp/app_list/vector_icons", + "//ash/public/cpp/vector_icons", "//ash/resources/vector_icons", "//ash/strings", "//base",
diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc index c758920c..d6738ca 100644 --- a/ash/app_list/app_list_controller_impl_unittest.cc +++ b/ash/app_list/app_list_controller_impl_unittest.cc
@@ -27,6 +27,7 @@ #include "ash/public/cpp/presentation_time_recorder.h" #include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shelf_types.h" +#include "ash/public/cpp/system_tray_test_api.h" #include "ash/public/cpp/window_properties.h" #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_layout_manager.h" @@ -34,7 +35,6 @@ #include "ash/shelf/shelf_view_test_api.h" #include "ash/shelf/shelf_widget.h" #include "ash/shell.h" -#include "ash/system/unified/unified_system_tray_test_api.h" #include "ash/test/ash_test_base.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "ash/wm/window_state.h" @@ -451,7 +451,7 @@ 1u, message_center::MessageCenter::Get()->GetPopupNotifications().size()); // Calculate the drag start point and end point. - UnifiedSystemTrayTestApi test_api(GetPrimaryUnifiedSystemTray()); + SystemTrayTestApi test_api; message_center::MessagePopupView* popup_view = test_api.GetPopupViewForNotificationID(notification_id); ASSERT_TRUE(popup_view);
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc index c2aa894..7cae702 100644 --- a/ash/app_list/views/search_box_view.cc +++ b/ash/app_list/views/search_box_view.cc
@@ -24,6 +24,7 @@ #include "ash/public/cpp/app_list/app_list_config.h" #include "ash/public/cpp/app_list/app_list_features.h" #include "ash/public/cpp/app_list/vector_icons/vector_icons.h" +#include "ash/public/cpp/vector_icons/vector_icons.h" #include "ash/public/cpp/wallpaper_types.h" #include "ash/resources/vector_icons/vector_icons.h" #include "base/bind.h"
diff --git a/ash/app_list/views/search_result_list_view.cc b/ash/app_list/views/search_result_list_view.cc index 31f10eed..7b41bd5 100644 --- a/ash/app_list/views/search_result_list_view.cc +++ b/ash/app_list/views/search_result_list_view.cc
@@ -20,6 +20,7 @@ #include "ash/public/cpp/app_list/app_list_features.h" #include "ash/public/cpp/app_list/app_list_metrics.h" #include "ash/public/cpp/app_list/vector_icons/vector_icons.h" +#include "ash/public/cpp/vector_icons/vector_icons.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/strings/grit/ash_strings.h" #include "base/bind.h"
diff --git a/ash/assistant/assistant_alarm_timer_controller.cc b/ash/assistant/assistant_alarm_timer_controller.cc index e232230..15cd07a 100644 --- a/ash/assistant/assistant_alarm_timer_controller.cc +++ b/ash/assistant/assistant_alarm_timer_controller.cc
@@ -31,6 +31,8 @@ namespace { +using assistant::util::AlarmTimerAction; + // Grouping key and ID prefix for timer notifications. constexpr char kTimerNotificationGroupingKey[] = "assistant/timer"; constexpr char kTimerNotificationIdPrefix[] = "assistant/timer"; @@ -116,26 +118,15 @@ const std::string message = CreateTimerNotificationMessage(timer); base::Optional<GURL> stop_alarm_timer_action_url = - assistant::util::CreateAlarmTimerDeepLink( - assistant::util::AlarmTimerAction::kStopRinging, - /*alarm_timer_id=*/base::nullopt, - /*duration=*/base::nullopt); + assistant::util::CreateAlarmTimerDeepLink(AlarmTimerAction::kRemove, + timer.id); base::Optional<GURL> add_time_to_timer_action_url = assistant::util::CreateAlarmTimerDeepLink( - assistant::util::AlarmTimerAction::kAddTimeToTimer, timer.id, - kOneMin); + AlarmTimerAction::kAddTimeToTimer, timer.id, kOneMin); AssistantNotificationPtr notification = AssistantNotification::New(); - - // If in-Assistant notifications are supported, we'll allow alarm/timer - // notifications to show in either Assistant UI or the Message Center. - // Otherwise, we'll only allow the notification to show in the Message Center. - notification->type = - chromeos::assistant::features::IsInAssistantNotificationsEnabled() - ? AssistantNotificationType::kPreferInAssistant - : AssistantNotificationType::kSystem; - + notification->type = AssistantNotificationType::kSystem; notification->title = title; notification->message = message; notification->client_id = CreateTimerNotificationId(timer); @@ -209,11 +200,9 @@ void AssistantAlarmTimerController::OnAssistantControllerConstructed() { assistant_controller_->state_controller()->AddObserver(this); - assistant_controller_->ui_controller()->AddModelObserver(this); } void AssistantAlarmTimerController::OnAssistantControllerDestroying() { - assistant_controller_->ui_controller()->RemoveModelObserver(this); assistant_controller_->state_controller()->RemoveObserver(this); } @@ -226,21 +215,22 @@ if (type != DeepLinkType::kAlarmTimer) return; - const base::Optional<assistant::util::AlarmTimerAction>& action = + const base::Optional<AlarmTimerAction>& action = assistant::util::GetDeepLinkParamAsAlarmTimerAction(params); if (!action.has_value()) return; - // Timer ID is optional. Only used for adding time to timer. const base::Optional<std::string>& alarm_timer_id = assistant::util::GetDeepLinkParam(params, DeepLinkParam::kId); + if (!alarm_timer_id.has_value()) + return; // Duration is optional. Only used for adding time to timer. const base::Optional<base::TimeDelta>& duration = assistant::util::GetDeepLinkParamAsTimeDelta(params, DeepLinkParam::kDurationMs); - PerformAlarmTimerAction(action.value(), alarm_timer_id, duration); + PerformAlarmTimerAction(action.value(), alarm_timer_id.value(), duration); } void AssistantAlarmTimerController::OnAssistantStatusChanged( @@ -320,43 +310,22 @@ /*from_server=*/false); } -void AssistantAlarmTimerController::OnUiVisibilityChanged( - AssistantVisibility new_visibility, - AssistantVisibility old_visibility, - base::Optional<AssistantEntryPoint> entry_point, - base::Optional<AssistantExitPoint> exit_point) { - // When the Assistant UI transitions from a visible state, we'll dismiss any - // ringing alarms or timers (assuming certain conditions have been met). - if (old_visibility != AssistantVisibility::kVisible) - return; - - // We only do this if in-Assistant notifications are enabled, as in-Assistant - // alarm/timer notifications only live as long the Assistant UI. Per UX - // requirement, when Assistant UI dismisses with an in-Assistant timer - // notification showing, any ringing alarms/timers should be stopped. - if (!chromeos::assistant::features::IsInAssistantNotificationsEnabled()) - return; - - assistant_->StopAlarmTimerRinging(); -} - void AssistantAlarmTimerController::PerformAlarmTimerAction( - const assistant::util::AlarmTimerAction& action, - const base::Optional<std::string>& alarm_timer_id, + const AlarmTimerAction& action, + const std::string& alarm_timer_id, const base::Optional<base::TimeDelta>& duration) { DCHECK(assistant_); switch (action) { - case assistant::util::AlarmTimerAction::kAddTimeToTimer: - if (!alarm_timer_id.has_value() || !duration.has_value()) { - LOG(ERROR) << "Ignore add time to timer action without timer ID or " - << "duration."; + case AlarmTimerAction::kAddTimeToTimer: + if (!duration.has_value()) { + LOG(ERROR) << "Ignoring add time to timer action duration."; return; } - assistant_->AddTimeToTimer(alarm_timer_id.value(), duration.value()); + assistant_->AddTimeToTimer(alarm_timer_id, duration.value()); break; - case assistant::util::AlarmTimerAction::kStopRinging: - assistant_->StopAlarmTimerRinging(); + case AlarmTimerAction::kRemove: + assistant_->RemoveAlarmTimer(alarm_timer_id); break; } }
diff --git a/ash/assistant/assistant_alarm_timer_controller.h b/ash/assistant/assistant_alarm_timer_controller.h index 4678e580..4199988 100644 --- a/ash/assistant/assistant_alarm_timer_controller.h +++ b/ash/assistant/assistant_alarm_timer_controller.h
@@ -12,7 +12,6 @@ #include "ash/assistant/assistant_controller_observer.h" #include "ash/assistant/model/assistant_alarm_timer_model.h" #include "ash/assistant/model/assistant_alarm_timer_model_observer.h" -#include "ash/assistant/model/assistant_ui_model_observer.h" #include "ash/public/cpp/assistant/assistant_state.h" #include "ash/public/mojom/assistant_controller.mojom.h" #include "base/macros.h" @@ -37,8 +36,7 @@ : public mojom::AssistantAlarmTimerController, public AssistantControllerObserver, public AssistantStateObserver, - public AssistantAlarmTimerModelObserver, - public AssistantUiModelObserver { + public AssistantAlarmTimerModelObserver { public: explicit AssistantAlarmTimerController( AssistantController* assistant_controller); @@ -77,18 +75,10 @@ void OnTimerRemoved(const mojom::AssistantTimer& timer) override; void OnAllTimersRemoved() override; - // AssistantUiModelObserver: - void OnUiVisibilityChanged( - AssistantVisibility new_visibility, - AssistantVisibility old_visibility, - base::Optional<AssistantEntryPoint> entry_point, - base::Optional<AssistantExitPoint> exit_point) override; - private: - void PerformAlarmTimerAction( - const assistant::util::AlarmTimerAction& action, - const base::Optional<std::string>& alarm_timer_id, - const base::Optional<base::TimeDelta>& duration); + void PerformAlarmTimerAction(const assistant::util::AlarmTimerAction& action, + const std::string& alarm_timer_id, + const base::Optional<base::TimeDelta>& duration); AssistantController* const assistant_controller_; // Owned by Shell.
diff --git a/ash/assistant/assistant_controller.h b/ash/assistant/assistant_controller.h index f60cef0..f8be6b0 100644 --- a/ash/assistant/assistant_controller.h +++ b/ash/assistant/assistant_controller.h
@@ -19,7 +19,7 @@ #include "ash/assistant/assistant_screen_context_controller.h" #include "ash/assistant/assistant_setup_controller.h" #include "ash/assistant/assistant_state_controller.h" -#include "ash/assistant/assistant_suggestions_controller.h" +#include "ash/assistant/assistant_suggestions_controller_impl.h" #include "ash/assistant/assistant_ui_controller.h" #include "ash/assistant/assistant_view_delegate_impl.h" #include "ash/assistant/assistant_web_ui_controller.h" @@ -44,16 +44,6 @@ namespace ash { -class AssistantAlarmTimerController; -class AssistantInteractionController; -class AssistantNotificationController; -class AssistantScreenContextController; -class AssistantSetupController; -class AssistantStateController; -class AssistantSuggestionsController; -class AssistantUiController; -class AssistantWebUiController; - class ASH_EXPORT AssistantController : public chromeos::assistant::mojom::AssistantController, public AssistantControllerObserver, @@ -145,10 +135,6 @@ return &assistant_state_controller_; } - AssistantSuggestionsController* suggestions_controller() { - return &assistant_suggestions_controller_; - } - AssistantUiController* ui_controller() { return &assistant_ui_controller_; } AssistantWebUiController* web_ui_controller() { @@ -210,7 +196,7 @@ AssistantStateController assistant_state_controller_; AssistantScreenContextController assistant_screen_context_controller_{this}; AssistantSetupController assistant_setup_controller_{this}; - AssistantSuggestionsController assistant_suggestions_controller_{this}; + AssistantSuggestionsControllerImpl assistant_suggestions_controller_{this}; AssistantUiController assistant_ui_controller_{this}; AssistantWebUiController assistant_web_ui_controller_{this};
diff --git a/ash/assistant/assistant_interaction_controller.cc b/ash/assistant/assistant_interaction_controller.cc index b6291baa..6215a7d 100644 --- a/ash/assistant/assistant_interaction_controller.cc +++ b/ash/assistant/assistant_interaction_controller.cc
@@ -25,6 +25,7 @@ #include "ash/public/cpp/ash_pref_names.h" #include "ash/public/cpp/assistant/assistant_setup.h" #include "ash/public/cpp/assistant/assistant_state.h" +#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" #include "ash/public/cpp/assistant/proactive_suggestions.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" @@ -884,13 +885,12 @@ // been cached on the client. To avoid jank, we need to post a task to start // our interaction to give the Assistant UI a chance to initialize itself. base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&AssistantInteractionController:: - StartProactiveSuggestionsInteraction, - weak_factory_.GetWeakPtr(), - assistant_controller_->suggestions_controller() - ->model() - ->GetProactiveSuggestions())); + FROM_HERE, base::BindOnce(&AssistantInteractionController:: + StartProactiveSuggestionsInteraction, + weak_factory_.GetWeakPtr(), + AssistantSuggestionsController::Get() + ->GetModel() + ->GetProactiveSuggestions())); return; }
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc index 90a6b4b..7d738d0 100644 --- a/ash/assistant/assistant_notification_controller.cc +++ b/ash/assistant/assistant_notification_controller.cc
@@ -65,9 +65,8 @@ bool IsSystemNotification( const chromeos::assistant::mojom::AssistantNotification* notification) { - using chromeos::assistant::mojom::AssistantNotificationType; - return notification->type == AssistantNotificationType::kPreferInAssistant || - notification->type == AssistantNotificationType::kSystem; + return notification->type == + chromeos::assistant::mojom::AssistantNotificationType::kSystem; } bool IsValidActionUrl(const GURL& action_url) { @@ -85,13 +84,11 @@ expiry_monitor_(this), notifier_id_(GetNotifierId()) { AddModelObserver(this); - assistant_controller_->AddObserver(this); message_center::MessageCenter::Get()->AddObserver(this); } AssistantNotificationController::~AssistantNotificationController() { message_center::MessageCenter::Get()->RemoveObserver(this); - assistant_controller_->RemoveObserver(this); RemoveModelObserver(this); } @@ -115,68 +112,10 @@ assistant_ = assistant; } -// AssistantControllerObserver ------------------------------------------------- - -void AssistantNotificationController::OnAssistantControllerConstructed() { - assistant_controller_->ui_controller()->AddModelObserver(this); -} - -void AssistantNotificationController::OnAssistantControllerDestroying() { - assistant_controller_->ui_controller()->RemoveModelObserver(this); -} - -// AssistantUiModelObserver ---------------------------------------------------- - -void AssistantNotificationController::OnUiVisibilityChanged( - AssistantVisibility new_visibility, - AssistantVisibility old_visibility, - base::Optional<AssistantEntryPoint> entry_point, - base::Optional<AssistantExitPoint> exit_point) { - switch (new_visibility) { - case AssistantVisibility::kVisible: - // When the Assistant UI becomes visible we convert any notifications of - // type |kPreferInAssistant| to type |kInAssistant|. This will cause them - // to be removed from the Message Center (if they had previously been - // added) and to finish out their lifetimes as in-Assistant notifications. - for (const auto* notification : model_.GetNotificationsByType( - AssistantNotificationType::kPreferInAssistant)) { - auto update = notification->Clone(); - update->type = AssistantNotificationType::kInAssistant; - model_.AddOrUpdateNotification(std::move(update)); - } - break; - case AssistantVisibility::kClosed: - // When the Assistant UI is no longer visible to the user we remove any - // notifications of type |kInAssistant| as this type of notification does - // not outlive the Assistant view hierarchy. - if (old_visibility == AssistantVisibility::kVisible) { - for (const auto* notification : model_.GetNotificationsByType( - AssistantNotificationType::kInAssistant)) { - model_.RemoveNotificationById(notification->client_id, - /*from_server=*/false); - } - } - break; - } -} - // mojom::AssistantNotificationController -------------------------------------- void AssistantNotificationController::AddOrUpdateNotification( AssistantNotificationPtr notification) { - const AssistantVisibility visibility = - assistant_controller_->ui_controller()->model()->visibility(); - - // If Assistant UI is visible and |notification| is of type - // |kPreferInAssistant|, we convert it to a notification of type - // |kInAssistant|. This will cause the notification to be removed from the - // Message Center (if it had previously been added) and it will finish out its - // lifetime as an in-Assistant notification. - if (visibility == AssistantVisibility::kVisible && - notification->type == AssistantNotificationType::kPreferInAssistant) { - notification->type = AssistantNotificationType::kInAssistant; - } - model_.AddOrUpdateNotification(std::move(notification)); }
diff --git a/ash/assistant/assistant_notification_controller.h b/ash/assistant/assistant_notification_controller.h index cbad2ff..a6e2360a 100644 --- a/ash/assistant/assistant_notification_controller.h +++ b/ash/assistant/assistant_notification_controller.h
@@ -8,11 +8,9 @@ #include <string> #include "ash/ash_export.h" -#include "ash/assistant/assistant_controller_observer.h" #include "ash/assistant/assistant_notification_expiry_monitor.h" #include "ash/assistant/model/assistant_notification_model.h" #include "ash/assistant/model/assistant_notification_model_observer.h" -#include "ash/assistant/model/assistant_ui_model_observer.h" #include "ash/public/mojom/assistant_controller.mojom.h" #include "base/macros.h" #include "chromeos/services/assistant/public/mojom/assistant.mojom.h" @@ -28,8 +26,6 @@ // The class to manage Assistant notifications. class ASH_EXPORT AssistantNotificationController : public mojom::AssistantNotificationController, - public AssistantControllerObserver, - public AssistantUiModelObserver, public AssistantNotificationModelObserver, public message_center::MessageCenterObserver { public: @@ -57,17 +53,6 @@ // Provides a pointer to the |assistant| owned by AssistantController. void SetAssistant(chromeos::assistant::mojom::Assistant* assistant); - // AssistantControllerObserver: - void OnAssistantControllerConstructed() override; - void OnAssistantControllerDestroying() override; - - // AssistantUiModelObserver: - void OnUiVisibilityChanged( - AssistantVisibility new_visibility, - AssistantVisibility old_visibility, - base::Optional<AssistantEntryPoint> entry_point, - base::Optional<AssistantExitPoint> exit_point) override; - // mojom::AssistantNotificationController: void AddOrUpdateNotification(AssistantNotificationPtr notification) override; void RemoveNotificationById(const std::string& id, bool from_server) override;
diff --git a/ash/assistant/assistant_proactive_suggestions_controller.cc b/ash/assistant/assistant_proactive_suggestions_controller.cc index b9e8c87d..f811aef 100644 --- a/ash/assistant/assistant_proactive_suggestions_controller.cc +++ b/ash/assistant/assistant_proactive_suggestions_controller.cc
@@ -5,12 +5,13 @@ #include "ash/assistant/assistant_proactive_suggestions_controller.h" #include "ash/assistant/assistant_controller.h" -#include "ash/assistant/assistant_suggestions_controller.h" +#include "ash/assistant/assistant_suggestions_controller_impl.h" #include "ash/assistant/assistant_ui_controller.h" #include "ash/assistant/ui/proactive_suggestions_rich_view.h" #include "ash/assistant/ui/proactive_suggestions_simple_view.h" #include "ash/assistant/ui/proactive_suggestions_view.h" #include "ash/assistant/util/deep_link_util.h" +#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" #include "ash/public/cpp/assistant/proactive_suggestions.h" #include "ash/public/cpp/assistant/util/histogram_util.h" #include "base/strings/string_number_conversions.h" @@ -46,14 +47,14 @@ void AssistantProactiveSuggestionsController:: OnAssistantControllerConstructed() { - assistant_controller_->suggestions_controller()->AddModelObserver(this); + AssistantSuggestionsController::Get()->AddModelObserver(this); assistant_controller_->view_delegate()->AddObserver(this); } void AssistantProactiveSuggestionsController:: OnAssistantControllerDestroying() { assistant_controller_->view_delegate()->RemoveObserver(this); - assistant_controller_->suggestions_controller()->RemoveModelObserver(this); + AssistantSuggestionsController::Get()->RemoveModelObserver(this); } void AssistantProactiveSuggestionsController::OnAssistantReady() { @@ -108,7 +109,8 @@ // read-only access to the Assistant suggestions model, we forward this event // to the Assistant suggestions controller to cache state. We will then react // to the change in model state in OnProactiveSuggestionsChanged(new, old). - assistant_controller_->suggestions_controller() + static_cast<AssistantSuggestionsControllerImpl*>( + AssistantSuggestionsController::Get()) ->OnProactiveSuggestionsChanged(std::move(proactive_suggestions)); } @@ -359,8 +361,8 @@ // Retrieve the cached set of proactive suggestions. scoped_refptr<const ProactiveSuggestions> proactive_suggestions = - assistant_controller_->suggestions_controller() - ->model() + AssistantSuggestionsController::Get() + ->GetModel() ->GetProactiveSuggestions(); // There's nothing to show if there are no proactive suggestions in the cache.
diff --git a/ash/assistant/assistant_suggestions_controller.cc b/ash/assistant/assistant_suggestions_controller_impl.cc similarity index 88% rename from ash/assistant/assistant_suggestions_controller.cc rename to ash/assistant/assistant_suggestions_controller_impl.cc index a47face..a64366a 100644 --- a/ash/assistant/assistant_suggestions_controller.cc +++ b/ash/assistant/assistant_suggestions_controller_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 "ash/assistant/assistant_suggestions_controller.h" +#include "ash/assistant/assistant_suggestions_controller_impl.h" #include <algorithm> #include <utility> @@ -72,9 +72,9 @@ } // namespace -// AssistantSuggestionsController ---------------------------------------------- +// AssistantSuggestionsControllerImpl ------------------------------------------ -AssistantSuggestionsController::AssistantSuggestionsController( +AssistantSuggestionsControllerImpl::AssistantSuggestionsControllerImpl( AssistantController* assistant_controller) : assistant_controller_(assistant_controller) { if (IsProactiveSuggestionsEnabled()) { @@ -92,30 +92,35 @@ AssistantState::Get()->AddObserver(this); } -AssistantSuggestionsController::~AssistantSuggestionsController() { +AssistantSuggestionsControllerImpl::~AssistantSuggestionsControllerImpl() { assistant_controller_->RemoveObserver(this); AssistantState::Get()->RemoveObserver(this); } -void AssistantSuggestionsController::AddModelObserver( +const AssistantSuggestionsModel* AssistantSuggestionsControllerImpl::GetModel() + const { + return &model_; +} + +void AssistantSuggestionsControllerImpl::AddModelObserver( AssistantSuggestionsModelObserver* observer) { model_.AddObserver(observer); } -void AssistantSuggestionsController::RemoveModelObserver( +void AssistantSuggestionsControllerImpl::RemoveModelObserver( AssistantSuggestionsModelObserver* observer) { model_.RemoveObserver(observer); } -void AssistantSuggestionsController::OnAssistantControllerConstructed() { +void AssistantSuggestionsControllerImpl::OnAssistantControllerConstructed() { assistant_controller_->ui_controller()->AddModelObserver(this); } -void AssistantSuggestionsController::OnAssistantControllerDestroying() { +void AssistantSuggestionsControllerImpl::OnAssistantControllerDestroying() { assistant_controller_->ui_controller()->RemoveModelObserver(this); } -void AssistantSuggestionsController::OnUiVisibilityChanged( +void AssistantSuggestionsControllerImpl::OnUiVisibilityChanged( AssistantVisibility new_visibility, AssistantVisibility old_visibility, base::Optional<AssistantEntryPoint> entry_point, @@ -146,12 +151,13 @@ UpdateConversationStarters(); } -void AssistantSuggestionsController::OnProactiveSuggestionsChanged( +void AssistantSuggestionsControllerImpl::OnProactiveSuggestionsChanged( scoped_refptr<const ProactiveSuggestions> proactive_suggestions) { model_.SetProactiveSuggestions(std::move(proactive_suggestions)); } -void AssistantSuggestionsController::OnAssistantContextEnabled(bool enabled) { +void AssistantSuggestionsControllerImpl::OnAssistantContextEnabled( + bool enabled) { // We currently assume that the context setting is not being modified while // Assistant UI is visible. DCHECK_NE(AssistantVisibility::kVisible, @@ -165,7 +171,7 @@ UpdateConversationStarters(); } -void AssistantSuggestionsController::UpdateConversationStarters() { +void AssistantSuggestionsControllerImpl::UpdateConversationStarters() { // If conversation starters V2 is enabled, we'll fetch a fresh set of // conversation starters from the server. if (IsConversationStartersV2Enabled()) { @@ -176,7 +182,7 @@ ProvideConversationStarters(); } -void AssistantSuggestionsController::FetchConversationStarters() { +void AssistantSuggestionsControllerImpl::FetchConversationStarters() { DCHECK(IsConversationStartersV2Enabled()); // Invalidate any requests that are already in flight. @@ -185,7 +191,7 @@ // Fetch a fresh set of conversation starters from the server (via the // dedicated ConversationStartersClient). ConversationStartersClient::Get()->FetchConversationStarters(base::BindOnce( - [](const base::WeakPtr<AssistantSuggestionsController>& self, + [](const base::WeakPtr<AssistantSuggestionsControllerImpl>& self, std::vector<ConversationStarter>&& conversation_starters) { if (!self) return; @@ -222,7 +228,7 @@ conversation_starters_weak_factory_.GetWeakPtr())); } -void AssistantSuggestionsController::ProvideConversationStarters() { +void AssistantSuggestionsControllerImpl::ProvideConversationStarters() { std::vector<AssistantSuggestionPtr> conversation_starters; // Adds a conversation starter for the given |message_id| and |action_url|.
diff --git a/ash/assistant/assistant_suggestions_controller.h b/ash/assistant/assistant_suggestions_controller_impl.h similarity index 68% rename from ash/assistant/assistant_suggestions_controller.h rename to ash/assistant/assistant_suggestions_controller_impl.h index 59002ae3..d071359 100644 --- a/ash/assistant/assistant_suggestions_controller.h +++ b/ash/assistant/assistant_suggestions_controller_impl.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_H_ -#define ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_H_ +#ifndef ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_IMPL_H_ +#define ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_IMPL_H_ #include <memory> @@ -12,6 +12,7 @@ #include "ash/assistant/model/assistant_suggestions_model.h" #include "ash/assistant/model/assistant_ui_model_observer.h" #include "ash/public/cpp/assistant/assistant_state.h" +#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" #include "base/macros.h" namespace ash { @@ -20,20 +21,21 @@ class AssistantSuggestionsModelObserver; class ProactiveSuggestions; -class AssistantSuggestionsController : public AssistantControllerObserver, - public AssistantUiModelObserver, - public AssistantStateObserver { +// The implementation of the Assistant controller in charge of suggestions. +class AssistantSuggestionsControllerImpl + : public AssistantSuggestionsController, + public AssistantControllerObserver, + public AssistantUiModelObserver, + public AssistantStateObserver { public: - explicit AssistantSuggestionsController( + explicit AssistantSuggestionsControllerImpl( AssistantController* assistant_controller); - ~AssistantSuggestionsController() override; + ~AssistantSuggestionsControllerImpl() override; - // Returns a reference to the underlying model. - const AssistantSuggestionsModel* model() const { return &model_; } - - // Adds/removes the specified suggestions model |observer|. - void AddModelObserver(AssistantSuggestionsModelObserver* observer); - void RemoveModelObserver(AssistantSuggestionsModelObserver* observer); + // AssistantSuggestionsController: + const AssistantSuggestionsModel* GetModel() const override; + void AddModelObserver(AssistantSuggestionsModelObserver*) override; + void RemoveModelObserver(AssistantSuggestionsModelObserver*) override; // AssistantControllerObserver: void OnAssistantControllerConstructed() override; @@ -71,12 +73,12 @@ // A WeakPtrFactory used to manage lifecycle of conversation starter requests // to the server (via the dedicated ConversationStartersClient). - base::WeakPtrFactory<AssistantSuggestionsController> + base::WeakPtrFactory<AssistantSuggestionsControllerImpl> conversation_starters_weak_factory_{this}; - DISALLOW_COPY_AND_ASSIGN(AssistantSuggestionsController); + DISALLOW_COPY_AND_ASSIGN(AssistantSuggestionsControllerImpl); }; } // namespace ash -#endif // ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_H_ +#endif // ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_IMPL_H_
diff --git a/ash/assistant/assistant_view_delegate_impl.cc b/ash/assistant/assistant_view_delegate_impl.cc index b04eb839..c59cbbe 100644 --- a/ash/assistant/assistant_view_delegate_impl.cc +++ b/ash/assistant/assistant_view_delegate_impl.cc
@@ -8,13 +8,10 @@ #include "ash/assistant/assistant_controller_observer.h" #include "ash/assistant/assistant_interaction_controller.h" #include "ash/assistant/assistant_notification_controller.h" -#include "ash/assistant/assistant_suggestions_controller.h" #include "ash/assistant/model/assistant_interaction_model.h" #include "ash/assistant/model/assistant_interaction_model_observer.h" #include "ash/assistant/model/assistant_notification_model.h" #include "ash/assistant/model/assistant_notification_model_observer.h" -#include "ash/assistant/model/assistant_suggestions_model.h" -#include "ash/assistant/model/assistant_suggestions_model_observer.h" #include "ash/assistant/model/assistant_ui_model.h" #include "ash/assistant/model/assistant_ui_model_observer.h" #include "ash/public/cpp/assistant/assistant_state_base.h" @@ -44,11 +41,6 @@ return assistant_controller_->notification_controller()->model(); } -const AssistantSuggestionsModel* -AssistantViewDelegateImpl::GetSuggestionsModel() const { - return assistant_controller_->suggestions_controller()->model(); -} - const AssistantUiModel* AssistantViewDelegateImpl::GetUiModel() const { return assistant_controller_->ui_controller()->model(); } @@ -96,17 +88,6 @@ observer); } -void AssistantViewDelegateImpl::AddSuggestionsModelObserver( - AssistantSuggestionsModelObserver* observer) { - assistant_controller_->suggestions_controller()->AddModelObserver(observer); -} - -void AssistantViewDelegateImpl::RemoveSuggestionsModelObserver( - AssistantSuggestionsModelObserver* observer) { - assistant_controller_->suggestions_controller()->RemoveModelObserver( - observer); -} - void AssistantViewDelegateImpl::AddUiModelObserver( AssistantUiModelObserver* observer) { assistant_controller_->ui_controller()->AddModelObserver(observer);
diff --git a/ash/assistant/assistant_view_delegate_impl.h b/ash/assistant/assistant_view_delegate_impl.h index d02a1fc..6e89d16 100644 --- a/ash/assistant/assistant_view_delegate_impl.h +++ b/ash/assistant/assistant_view_delegate_impl.h
@@ -23,7 +23,6 @@ const AssistantAlarmTimerModel* GetAlarmTimerModel() const override; const AssistantInteractionModel* GetInteractionModel() const override; const AssistantNotificationModel* GetNotificationModel() const override; - const AssistantSuggestionsModel* GetSuggestionsModel() const override; const AssistantUiModel* GetUiModel() const override; void AddObserver(AssistantViewDelegateObserver* observer) override; void RemoveObserver(AssistantViewDelegateObserver* observer) override; @@ -39,10 +38,6 @@ AssistantNotificationModelObserver* observer) override; void RemoveNotificationModelObserver( AssistantNotificationModelObserver* observer) override; - void AddSuggestionsModelObserver( - AssistantSuggestionsModelObserver* observer) override; - void RemoveSuggestionsModelObserver( - AssistantSuggestionsModelObserver* observer) override; void AddUiModelObserver(AssistantUiModelObserver* observer) override; void RemoveUiModelObserver(AssistantUiModelObserver* observer) override; void DownloadImage(
diff --git a/ash/assistant/test/test_assistant_service.cc b/ash/assistant/test/test_assistant_service.cc index 034d372..0cc129e 100644 --- a/ash/assistant/test/test_assistant_service.cc +++ b/ash/assistant/test/test_assistant_service.cc
@@ -283,8 +283,7 @@ base::TimeDelta duration) { } -void TestAssistantService::StopAlarmTimerRinging() { -} +void TestAssistantService::RemoveAlarmTimer(const std::string& id) {} void TestAssistantService::StartInteraction( chromeos::assistant::mojom::AssistantInteractionType type,
diff --git a/ash/assistant/test/test_assistant_service.h b/ash/assistant/test/test_assistant_service.h index 57d06ac..d21d8f39 100644 --- a/ash/assistant/test/test_assistant_service.h +++ b/ash/assistant/test/test_assistant_service.h
@@ -112,7 +112,7 @@ void NotifyEntryIntoAssistantUi( chromeos::assistant::mojom::AssistantEntryPoint entry_point) override; void AddTimeToTimer(const std::string& id, base::TimeDelta duration) override; - void StopAlarmTimerRinging() override; + void RemoveAlarmTimer(const std::string& id) override; private: void StartInteraction(
diff --git a/ash/assistant/ui/assistant_view_delegate.h b/ash/assistant/ui/assistant_view_delegate.h index 1c59b3d..c61762f 100644 --- a/ash/assistant/ui/assistant_view_delegate.h +++ b/ash/assistant/ui/assistant_view_delegate.h
@@ -23,8 +23,6 @@ class AssistantInteractionModelObserver; class AssistantNotificationModel; class AssistantNotificationModelObserver; -class AssistantSuggestionsModel; -class AssistantSuggestionsModelObserver; class AssistantUiModel; class AssistantUiModelObserver; enum class AssistantButtonId; @@ -83,9 +81,6 @@ // Gets the notification model. virtual const AssistantNotificationModel* GetNotificationModel() const = 0; - // Gets the suggestions model. - virtual const AssistantSuggestionsModel* GetSuggestionsModel() const = 0; - // Gets the ui model. virtual const AssistantUiModel* GetUiModel() const = 0; @@ -111,12 +106,6 @@ virtual void RemoveNotificationModelObserver( AssistantNotificationModelObserver* observer) = 0; - // Adds/removes the suggestions model observer. - virtual void AddSuggestionsModelObserver( - AssistantSuggestionsModelObserver* observer) = 0; - virtual void RemoveSuggestionsModelObserver( - AssistantSuggestionsModelObserver* observer) = 0; - // Adds/removes the ui model observer. virtual void AddUiModelObserver(AssistantUiModelObserver* observer) = 0; virtual void RemoveUiModelObserver(AssistantUiModelObserver* observer) = 0;
diff --git a/ash/assistant/ui/main_stage/assistant_card_element_view.cc b/ash/assistant/ui/main_stage/assistant_card_element_view.cc index 2fa2c1c..2b0300e0 100644 --- a/ash/assistant/ui/main_stage/assistant_card_element_view.cc +++ b/ash/assistant/ui/main_stage/assistant_card_element_view.cc
@@ -146,10 +146,10 @@ } void AssistantCardElementView::ScrollRectToVisible(const gfx::Rect& rect) { - // We expect this method is called outside this class to show its local + // We expect this method is called outside this class to show its contents // bounds. Inside this class, should call views::View::ScrollRectToVisible() // to show the focused node in the web contents. - DCHECK(rect == GetLocalBounds()); + DCHECK(rect == GetContentsBounds()); // When this view is focused, View::Focus() calls ScrollViewToVisible(), which // calls ScrollRectToVisible(). But we don't want that call to do anything, @@ -204,7 +204,6 @@ void AssistantCardElementView::InitLayout( const AssistantCardElement* card_element) { - SetFocusBehavior(FocusBehavior::ALWAYS); SetLayoutManager(std::make_unique<views::FillLayout>()); // Contents view.
diff --git a/ash/assistant/ui/main_stage/suggestion_container_view.cc b/ash/assistant/ui/main_stage/suggestion_container_view.cc index 431c34b..c1b33d29 100644 --- a/ash/assistant/ui/main_stage/suggestion_container_view.cc +++ b/ash/assistant/ui/main_stage/suggestion_container_view.cc
@@ -17,6 +17,7 @@ #include "ash/assistant/ui/main_stage/element_animator.h" #include "ash/assistant/util/animation_util.h" #include "ash/assistant/util/assistant_util.h" +#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" #include "base/bind.h" #include "ui/compositor/callback_layer_animation_observer.h" #include "ui/compositor/layer_animation_element.h" @@ -93,15 +94,13 @@ SetID(AssistantViewID::kSuggestionContainer); InitLayout(); - // The AssistantViewDelegate should outlive SuggestionContainerView. - delegate->AddSuggestionsModelObserver(this); + AssistantSuggestionsController::Get()->AddModelObserver(this); delegate->AddUiModelObserver(this); } SuggestionContainerView::~SuggestionContainerView() { delegate()->RemoveUiModelObserver(this); - delegate()->RemoveSuggestionsModelObserver(this); - delegate()->RemoveInteractionModelObserver(this); + AssistantSuggestionsController::Get()->RemoveModelObserver(this); } const char* SuggestionContainerView::GetClassName() const { @@ -207,8 +206,9 @@ entry_point.value() != AssistantEntryPoint::kLauncherSearchResult) { // Show conversation starters at the start of a new Assistant session except // when the user already started a query in Launcher quick search box (QSB). - OnConversationStartersChanged( - delegate()->GetSuggestionsModel()->GetConversationStarters()); + OnConversationStartersChanged(AssistantSuggestionsController::Get() + ->GetModel() + ->GetConversationStarters()); return; }
diff --git a/ash/assistant/ui/proactive_suggestions_simple_view.cc b/ash/assistant/ui/proactive_suggestions_simple_view.cc index e416a62..28a37ec 100644 --- a/ash/assistant/ui/proactive_suggestions_simple_view.cc +++ b/ash/assistant/ui/proactive_suggestions_simple_view.cc
@@ -9,7 +9,7 @@ #include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/assistant_view_delegate.h" #include "ash/public/cpp/assistant/proactive_suggestions.h" -#include "ash/resources/vector_icons/vector_icons.h" +#include "ash/public/cpp/vector_icons/vector_icons.h" #include "base/strings/utf_string_conversions.h" #include "chromeos/services/assistant/public/features.h" #include "net/base/escape.h"
diff --git a/ash/assistant/ui/proactive_suggestions_view.cc b/ash/assistant/ui/proactive_suggestions_view.cc index 7cd1ce9..d47997ba 100644 --- a/ash/assistant/ui/proactive_suggestions_view.cc +++ b/ash/assistant/ui/proactive_suggestions_view.cc
@@ -8,6 +8,7 @@ #include "ash/assistant/ui/assistant_ui_constants.h" #include "ash/assistant/ui/assistant_view_delegate.h" #include "ash/keyboard/ui/keyboard_ui_controller.h" +#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" #include "ash/public/cpp/assistant/proactive_suggestions.h" #include "ui/display/screen.h" #include "ui/views/widget/widget.h" @@ -19,8 +20,9 @@ AssistantViewDelegate* delegate) : views::Button(/*listener=*/this), delegate_(delegate), - proactive_suggestions_( - delegate_->GetSuggestionsModel()->GetProactiveSuggestions()), + proactive_suggestions_(AssistantSuggestionsController::Get() + ->GetModel() + ->GetProactiveSuggestions()), keyboard_workspace_occluded_bounds_( keyboard::KeyboardUIController::Get() ->GetWorkspaceOccludedBoundsInScreen()) {
diff --git a/ash/assistant/util/deep_link_util.cc b/ash/assistant/util/deep_link_util.cc index 04cdc3d..f22d73e 100644 --- a/ash/assistant/util/deep_link_util.cc +++ b/ash/assistant/util/deep_link_util.cc
@@ -40,7 +40,7 @@ // Supported alarm/timer action deep link param values. constexpr char kAddTimeToTimer[] = "addTimeToTimer"; -constexpr char kStopAlarmTimerRinging[] = "stopAlarmTimerRinging"; +constexpr char kRemoveAlarmTimer[] = "removeAlarmTimer"; // Supported proactive suggestions action deep link param values. constexpr char kCardClick[] = "cardClick"; @@ -89,12 +89,12 @@ url = net::AppendOrReplaceQueryParameter(url, kActionParamKey, kAddTimeToTimer); break; - case assistant::util::AlarmTimerAction::kStopRinging: - DCHECK(!alarm_timer_id.has_value() && !duration.has_value()); - if (alarm_timer_id.has_value() || duration.has_value()) + case assistant::util::AlarmTimerAction::kRemove: + DCHECK(alarm_timer_id.has_value() && !duration.has_value()); + if (!alarm_timer_id.has_value() || duration.has_value()) return base::nullopt; url = net::AppendOrReplaceQueryParameter(url, kActionParamKey, - kStopAlarmTimerRinging); + kRemoveAlarmTimer); break; } @@ -108,6 +108,7 @@ url, kDurationMsParamKey, base::NumberToString(duration->InMilliseconds())); } + return url; } @@ -184,8 +185,8 @@ if (action_string_value.value() == kAddTimeToTimer) return AlarmTimerAction::kAddTimeToTimer; - if (action_string_value.value() == kStopAlarmTimerRinging) - return AlarmTimerAction::kStopRinging; + if (action_string_value.value() == kRemoveAlarmTimer) + return AlarmTimerAction::kRemove; return base::nullopt; }
diff --git a/ash/assistant/util/deep_link_util.h b/ash/assistant/util/deep_link_util.h index 394c8cc..27132ce9 100644 --- a/ash/assistant/util/deep_link_util.h +++ b/ash/assistant/util/deep_link_util.h
@@ -58,7 +58,7 @@ // Enumeration of alarm/timer deep link actions. enum class AlarmTimerAction { kAddTimeToTimer, - kStopRinging, + kRemove, }; // Enumeration of proactive suggestions deep link actions. @@ -80,7 +80,7 @@ base::Optional<GURL> CreateAlarmTimerDeepLink( AlarmTimerAction action, base::Optional<std::string> alarm_timer_id, - base::Optional<base::TimeDelta> duration); + base::Optional<base::TimeDelta> duration = base::nullopt); // Returns a deep link to send an Assistant query. COMPONENT_EXPORT(ASSISTANT_UTIL)
diff --git a/ash/assistant/util/deep_link_util_unittest.cc b/ash/assistant/util/deep_link_util_unittest.cc index 4a3cbf9..85a60c9 100644 --- a/ash/assistant/util/deep_link_util_unittest.cc +++ b/ash/assistant/util/deep_link_util_unittest.cc
@@ -27,10 +27,10 @@ CreateAlarmTimerDeepLink(AlarmTimerAction::kAddTimeToTimer, "1", base::TimeDelta::FromMinutes(1)) .value()); - ASSERT_EQ("googleassistant://alarm-timer?action=stopAlarmTimerRinging", - CreateAlarmTimerDeepLink(AlarmTimerAction::kStopRinging, - base::nullopt, base::nullopt) - .value()); + ASSERT_EQ( + "googleassistant://alarm-timer?action=removeAlarmTimer&id=1", + CreateAlarmTimerDeepLink(AlarmTimerAction::kRemove, "1", base::nullopt) + .value()); // For invalid deeplink params, we will hit DCHECK since this API isn't meant // to be used in such cases. We'll use a |ScopedLogAssertHandler| to safely @@ -40,15 +40,16 @@ const base::StringPiece stack_trace) {})); ASSERT_EQ(base::nullopt, - CreateAlarmTimerDeepLink(AlarmTimerAction::kStopRinging, "1", + CreateAlarmTimerDeepLink(AlarmTimerAction::kRemove, base::nullopt, base::nullopt)); - ASSERT_EQ(base::nullopt, CreateAlarmTimerDeepLink( - AlarmTimerAction::kStopRinging, base::nullopt, - base::TimeDelta::FromMinutes(1))); ASSERT_EQ(base::nullopt, - CreateAlarmTimerDeepLink(AlarmTimerAction::kStopRinging, "1", + CreateAlarmTimerDeepLink(AlarmTimerAction::kRemove, base::nullopt, base::TimeDelta::FromMinutes(1))); ASSERT_EQ(base::nullopt, + CreateAlarmTimerDeepLink(AlarmTimerAction::kRemove, "1", + base::TimeDelta::FromMinutes(1))); + + ASSERT_EQ(base::nullopt, CreateAlarmTimerDeepLink(AlarmTimerAction::kAddTimeToTimer, "1", base::nullopt)); ASSERT_EQ(base::nullopt, CreateAlarmTimerDeepLink( @@ -175,8 +176,8 @@ // Case: Deep link parameter present, well formed. params["action"] = "addTimeToTimer"; AssertDeepLinkParamEq(AlarmTimerAction::kAddTimeToTimer); - params["action"] = "stopAlarmTimerRinging"; - AssertDeepLinkParamEq(AlarmTimerAction::kStopRinging); + params["action"] = "removeAlarmTimer"; + AssertDeepLinkParamEq(AlarmTimerAction::kRemove); // Case: Deep link parameter present, non AlarmTimerAction value. params["action"] = "true";
diff --git a/ash/display/persistent_window_controller.cc b/ash/display/persistent_window_controller.cc index 0c44f37d..d8232d576 100644 --- a/ash/display/persistent_window_controller.cc +++ b/ash/display/persistent_window_controller.cc
@@ -123,7 +123,13 @@ persistent_window_bounds.Offset(offset); window->SetBoundsInScreen(persistent_window_bounds, display); - // Reset persistent window info everytime the window bounds have restored. + if (persistent_window_info.restore_bounds_in_screen) { + gfx::Rect restore_bounds = + *persistent_window_info.restore_bounds_in_screen; + restore_bounds.Offset(offset); + window_state->SetRestoreBoundsInScreen(restore_bounds); + } + // Reset persistent window info every time the window bounds have restored. window_state->ResetPersistentWindowInfo(); ++window_restored_count;
diff --git a/ash/display/persistent_window_controller_unittest.cc b/ash/display/persistent_window_controller_unittest.cc index 2d79d64f2..e85eddc 100644 --- a/ash/display/persistent_window_controller_unittest.cc +++ b/ash/display/persistent_window_controller_unittest.cc
@@ -422,4 +422,51 @@ EXPECT_EQ(gfx::Rect(-499, 0, 200, 100), w2->GetBoundsInScreen()); } +// Tests that restore bounds persist after adding and removing a display. +TEST_F(PersistentWindowControllerTest, RestoreBounds) { + UpdateDisplay("0+0-500x500,0+501-500x500"); + + std::unique_ptr<aura::Window> window = CreateTestWindow(gfx::Rect(200, 200)); + const int64_t primary_id = WindowTreeHostManager::GetPrimaryDisplayId(); + const int64_t secondary_id = + display::test::DisplayManagerTestApi(display_manager()) + .GetSecondaryDisplay() + .id(); + display::Screen* screen = display::Screen::GetScreen(); + ASSERT_EQ(primary_id, screen->GetDisplayNearestWindow(window.get()).id()); + + // Move the window to the secondary display and maximize it. + display_move_window_util::HandleMoveActiveWindowBetweenDisplays(); + ASSERT_EQ(secondary_id, screen->GetDisplayNearestWindow(window.get()).id()); + WindowState* window_state = WindowState::Get(window.get()); + window_state->Maximize(); + EXPECT_TRUE(window_state->HasRestoreBounds()); + const gfx::Rect restore_bounds_in_screen = + window_state->GetRestoreBoundsInScreen(); + + display::ManagedDisplayInfo primary_info = + display_manager()->GetDisplayInfo(primary_id); + display::ManagedDisplayInfo secondary_info = + display_manager()->GetDisplayInfo(secondary_id); + + // Disconnect secondary display. + std::vector<display::ManagedDisplayInfo> display_info_list; + display_info_list.push_back(primary_info); + display_manager()->OnNativeDisplaysChanged(display_info_list); + EXPECT_EQ(primary_id, screen->GetDisplayNearestWindow(window.get()).id()); + + // Reconnect secondary display. On restoring the maximized window, the bounds + // should be the same as they were before maximizing and disconnecting the + // display. + display_info_list.push_back(secondary_info); + display_manager()->OnNativeDisplaysChanged(display_info_list); + EXPECT_EQ(secondary_id, screen->GetDisplayNearestWindow(window.get()).id()); + EXPECT_TRUE(window_state->IsMaximized()); + + // Restore the window (i.e. press restore button on header). + window_state->Restore(); + EXPECT_TRUE(window_state->IsNormalStateType()); + EXPECT_EQ(restore_bounds_in_screen, window->GetBoundsInScreen()); +} + } // namespace ash
diff --git a/ash/display/persistent_window_info.cc b/ash/display/persistent_window_info.cc index 9145c37..cace3a71 100644 --- a/ash/display/persistent_window_info.cc +++ b/ash/display/persistent_window_info.cc
@@ -4,6 +4,7 @@ #include "ash/display/persistent_window_info.h" +#include "ash/wm/window_state.h" #include "ui/aura/window.h" #include "ui/display/display.h" #include "ui/display/screen.h" @@ -16,8 +17,16 @@ window_bounds_in_screen = window->GetBoundsInScreen(); display_id = display.id(); display_bounds_in_screen = display.bounds(); + + WindowState* window_state = WindowState::Get(window); + DCHECK(window_state); + if (window_state->HasRestoreBounds()) + restore_bounds_in_screen = window_state->GetRestoreBoundsInScreen(); } +PersistentWindowInfo::PersistentWindowInfo(const PersistentWindowInfo& other) = + default; + PersistentWindowInfo::~PersistentWindowInfo() = default; } // namespace ash
diff --git a/ash/display/persistent_window_info.h b/ash/display/persistent_window_info.h index 48ea0c1..d1d2800b 100644 --- a/ash/display/persistent_window_info.h +++ b/ash/display/persistent_window_info.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include "ash/ash_export.h" +#include "base/optional.h" #include "ui/gfx/geometry/rect.h" namespace aura { @@ -20,6 +21,7 @@ // window placement in multi-displays scenario. struct ASH_EXPORT PersistentWindowInfo { explicit PersistentWindowInfo(aura::Window* window); + PersistentWindowInfo(const PersistentWindowInfo& other); ~PersistentWindowInfo(); // Persistent window bounds in screen coordinates. @@ -30,6 +32,9 @@ // Indicates last display bounds for |display_id| in screen coordinates. gfx::Rect display_bounds_in_screen; + + // Stores the restore bounds in screen coordinates if they exist. + base::Optional<gfx::Rect> restore_bounds_in_screen; }; } // namespace ash
diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc index f868d36..37e154e 100644 --- a/ash/drag_drop/drag_drop_controller.cc +++ b/ash/drag_drop/drag_drop_controller.cc
@@ -9,10 +9,14 @@ #include "ash/drag_drop/drag_drop_tracker.h" #include "ash/drag_drop/drag_image_view.h" +#include "ash/public/cpp/ash_features.h" #include "ash/shell.h" +#include "ash/shell_delegate.h" #include "base/bind.h" #include "base/metrics/histogram_macros.h" +#include "base/pickle.h" #include "base/run_loop.h" +#include "base/strings/utf_string_conversions.h" #include "base/threading/thread_task_runner_handle.h" #include "third_party/skia/include/core/SkPath.h" #include "ui/aura/client/capture_client.h" @@ -22,6 +26,8 @@ #include "ui/aura/window.h" #include "ui/aura/window_delegate.h" #include "ui/aura/window_event_dispatcher.h" +#include "ui/base/clipboard/clipboard_format_type.h" +#include "ui/base/clipboard/custom_data_helper.h" #include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/os_exchange_data.h" #include "ui/base/hit_test.h" @@ -466,6 +472,9 @@ cursor = ui::mojom::CursorType::kAlias; else if (op & ui::DragDropTypes::DRAG_MOVE) cursor = ui::mojom::CursorType::kGrabbing; + + // TODO(https://crbug.com/1069869): don't show kNoDrop cursor for + // a tab drag that can drop into a new window. Shell::Get()->cursor_manager()->SetCursor(cursor); } } @@ -503,15 +512,24 @@ aura::client::DragDropDelegate* delegate = aura::client::GetDragDropDelegate(target); if (delegate) { + const bool is_chrome_tab_drag = IsChromeTabDrag(); + ui::DropTargetEvent e(*drag_data_.get(), event.location_f(), event.root_location_f(), drag_operation_); e.set_flags(event.flags()); ui::Event::DispatcherApi(&e).set_target(target); + + ui::OSExchangeData copied_data(drag_data_->provider().Clone()); drag_operation_ = delegate->OnPerformDrop(e, std::move(drag_data_)); - if (drag_operation_ == 0) + if (drag_operation_ == 0 && is_chrome_tab_drag) { + Shell::Get()->shell_delegate()->CreateBrowserForTabDrop( + drag_source_window_, copied_data); StartCanceledAnimation(kCancelAnimationDuration); - else + } else if (drag_operation_ == 0) { + StartCanceledAnimation(kCancelAnimationDuration); + } else { drag_image_.reset(); + } } else { drag_image_.reset(); } @@ -620,4 +638,37 @@ std::unique_ptr<DragDropTracker> holder = std::move(drag_drop_tracker_); } +bool DragDropController::IsChromeTabDrag() { + if (!features::IsWebUITabStripTabDragIntegrationEnabled()) + return false; + + if (!drag_data_) + return false; + base::Pickle pickle; + drag_data_->GetPickledData(ui::ClipboardFormatType::GetWebCustomDataType(), + &pickle); + base::PickleIterator iter(pickle); + + uint32_t entry_count = 0; + if (!iter.ReadUInt32(&entry_count)) + return false; + + for (uint32_t i = 0; i < entry_count; ++i) { + base::StringPiece16 type; + base::StringPiece16 data; + if (!iter.ReadStringPiece16(&type) || !iter.ReadStringPiece16(&data)) { + return false; + } + + // TODO(https://crbug.com/1069869): share this constant between Ash + // and Chrome instead of hardcoding it in both places. + static const base::string16 chrome_tab_type = + base::ASCIIToUTF16("application/vnd.chromium.tab"); + if (type == chrome_tab_type) + return true; + } + + return false; +} + } // namespace ash
diff --git a/ash/drag_drop/drag_drop_controller.h b/ash/drag_drop/drag_drop_controller.h index 6fc034ea..87a9542 100644 --- a/ash/drag_drop/drag_drop_controller.h +++ b/ash/drag_drop/drag_drop_controller.h
@@ -111,6 +111,8 @@ // Helper method to reset everything. void Cleanup(); + bool IsChromeTabDrag(); + bool enabled_ = false; std::unique_ptr<DragImageView> drag_image_; gfx::Vector2d drag_image_offset_;
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn index 7f7853c8..414fa31 100644 --- a/ash/public/cpp/BUILD.gn +++ b/ash/public/cpp/BUILD.gn
@@ -75,6 +75,8 @@ "assistant/assistant_web_view.h", "assistant/assistant_web_view_factory.cc", "assistant/assistant_web_view_factory.h", + "assistant/controller/assistant_suggestions_controller.cc", + "assistant/controller/assistant_suggestions_controller.h", "assistant/conversation_starter.cc", "assistant/conversation_starter.h", "assistant/conversation_starters_client.cc",
diff --git a/ash/public/cpp/app_list/app_list_metrics.h b/ash/public/cpp/app_list/app_list_metrics.h index 4017ff7d..383481e 100644 --- a/ash/public/cpp/app_list/app_list_metrics.h +++ b/ash/public/cpp/app_list/app_list_metrics.h
@@ -80,6 +80,8 @@ ZERO_STATE_FILE, // A result from the Drive QuickAccess provider. DRIVE_QUICK_ACCESS, + // A result from the Assistant provider. + ASSISTANT, // Boundary is always last. SEARCH_RESULT_TYPE_BOUNDARY };
diff --git a/ash/public/cpp/app_list/app_list_types.h b/ash/public/cpp/app_list/app_list_types.h index 1f86d52..ec66912 100644 --- a/ash/public/cpp/app_list/app_list_types.h +++ b/ash/public/cpp/app_list/app_list_types.h
@@ -147,6 +147,7 @@ kDriveQuickAccess, // Drive QuickAccess results. kFileChip, // Local file results in suggestion chips. kDriveQuickAccessChip, // Drive file results in suggestion chips. + kAssistantChip, // Assistant results in suggestion chips. // Add new values here. };
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc index acbccbc1..80775f4 100644 --- a/ash/public/cpp/ash_features.cc +++ b/ash/public/cpp/ash_features.cc
@@ -6,6 +6,7 @@ #include "ash/public/cpp/ash_switches.h" #include "base/command_line.h" +#include "base/feature_list.h" #include "build/build_config.h" #include "chromeos/constants/chromeos_switches.h" @@ -120,6 +121,9 @@ const base::Feature kSystemTrayMicGainSetting{ "SystemTrayMicGainSetting", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kWebUITabStripTabDragIntegration{ + "WebUITabStripTabDragIntegration", base::FEATURE_DISABLED_BY_DEFAULT}; + bool IsAllowAmbientEQEnabled() { return base::FeatureList::IsEnabled(kAllowAmbientEQ); } @@ -248,6 +252,10 @@ return base::FeatureList::IsEnabled(kDisplayIdentification); } +bool IsWebUITabStripTabDragIntegrationEnabled() { + return base::FeatureList::IsEnabled(kWebUITabStripTabDragIntegration); +} + namespace { // The boolean flag indicating if "WebUITabStrip" feature is enabled in Chrome.
diff --git a/ash/public/cpp/ash_features.h b/ash/public/cpp/ash_features.h index f8ff502c..5e40170 100644 --- a/ash/public/cpp/ash_features.h +++ b/ash/public/cpp/ash_features.h
@@ -154,6 +154,12 @@ // section in the system tray. ASH_PUBLIC_EXPORT extern const base::Feature kSystemTrayMicGainSetting; +// Enables special handling of Chrome tab drags from a WebUI tab strip. +// These will be treated similarly to a window drag, showing split view +// indicators in tablet mode, etc. The functionality is behind a flag +// right now since it is under development. +ASH_PUBLIC_EXPORT extern const base::Feature kWebUITabStripTabDragIntegration; + ASH_PUBLIC_EXPORT bool IsAllowAmbientEQEnabled(); ASH_PUBLIC_EXPORT bool IsAltTabLimitedToActiveDesk(); @@ -210,6 +216,8 @@ ASH_PUBLIC_EXPORT bool IsDisplayIdentificationEnabled(); +ASH_PUBLIC_EXPORT bool IsWebUITabStripTabDragIntegrationEnabled(); + // These two functions are supposed to be temporary functions to set or get // whether "WebUITabStrip" feature is enabled from Chrome. ASH_PUBLIC_EXPORT void SetWebUITabStripEnabled(bool enabled);
diff --git a/ash/public/cpp/assistant/controller/assistant_suggestions_controller.cc b/ash/public/cpp/assistant/controller/assistant_suggestions_controller.cc new file mode 100644 index 0000000..60cfbe4 --- /dev/null +++ b/ash/public/cpp/assistant/controller/assistant_suggestions_controller.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 "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" + +#include "base/logging.h" + +namespace ash { + +namespace { + +AssistantSuggestionsController* g_instance = nullptr; + +} // namespace + +AssistantSuggestionsController::AssistantSuggestionsController() { + DCHECK_EQ(nullptr, g_instance); + g_instance = this; +} + +AssistantSuggestionsController::~AssistantSuggestionsController() { + DCHECK_EQ(g_instance, this); + g_instance = nullptr; +} + +// static +AssistantSuggestionsController* AssistantSuggestionsController::Get() { + return g_instance; +} + +} // namespace ash
diff --git a/ash/public/cpp/assistant/controller/assistant_suggestions_controller.h b/ash/public/cpp/assistant/controller/assistant_suggestions_controller.h new file mode 100644 index 0000000..28e7471 --- /dev/null +++ b/ash/public/cpp/assistant/controller/assistant_suggestions_controller.h
@@ -0,0 +1,34 @@ +// 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 ASH_PUBLIC_CPP_ASSISTANT_CONTROLLER_ASSISTANT_SUGGESTIONS_CONTROLLER_H_ +#define ASH_PUBLIC_CPP_ASSISTANT_CONTROLLER_ASSISTANT_SUGGESTIONS_CONTROLLER_H_ + +#include "ash/public/cpp/ash_public_export.h" + +namespace ash { + +class AssistantSuggestionsModel; +class AssistantSuggestionsModelObserver; + +// The interface for the Assistant controller in charge of suggestions. +class ASH_PUBLIC_EXPORT AssistantSuggestionsController { + public: + static AssistantSuggestionsController* Get(); + + // Returns a pointer to the underlying model. + virtual const AssistantSuggestionsModel* GetModel() const = 0; + + // Adds/removes the specified model observer. + virtual void AddModelObserver(AssistantSuggestionsModelObserver*) = 0; + virtual void RemoveModelObserver(AssistantSuggestionsModelObserver*) = 0; + + protected: + AssistantSuggestionsController(); + virtual ~AssistantSuggestionsController(); +}; + +} // namespace ash + +#endif // ASH_PUBLIC_CPP_ASSISTANT_CONTROLLER_ASSISTANT_SUGGESTIONS_CONTROLLER_H_
diff --git a/ash/public/cpp/debug_utils.h b/ash/public/cpp/debug_utils.h new file mode 100644 index 0000000..e972b25 --- /dev/null +++ b/ash/public/cpp/debug_utils.h
@@ -0,0 +1,27 @@ +// 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 ASH_PUBLIC_CPP_DEBUG_UTILS_H_ +#define ASH_PUBLIC_CPP_DEBUG_UTILS_H_ + +#include <sstream> + +#include "ash/ash_export.h" + +namespace ash { +namespace debug { + +// Prints all windows layer hierarchy to |out|. +ASH_EXPORT void PrintLayerHierarchy(std::ostringstream* out); + +// Prints current active window's view hierarchy to |out|. +ASH_EXPORT void PrintViewHierarchy(std::ostringstream* out); + +// Prints all windows hierarchy to |out|. +ASH_EXPORT void PrintWindowHierarchy(std::ostringstream* out); + +} // namespace debug +} // namespace ash + +#endif // ASH_PUBLIC_CPP_DEBUG_UTILS_H_
diff --git a/ash/public/cpp/system_tray_test_api.h b/ash/public/cpp/system_tray_test_api.h index a970df1a..7980700 100644 --- a/ash/public/cpp/system_tray_test_api.h +++ b/ash/public/cpp/system_tray_test_api.h
@@ -10,6 +10,10 @@ #include "ash/ash_export.h" #include "base/strings/string16.h" +namespace message_center { +class MessagePopupView; +} + namespace ash { // Public test API for the system tray. Methods only apply to the system tray @@ -18,43 +22,51 @@ public: static std::unique_ptr<SystemTrayTestApi> Create(); - virtual ~SystemTrayTestApi() {} - - // Disables animations (e.g. the tray view icon slide-in). - virtual void DisableAnimations() = 0; + SystemTrayTestApi(); + ~SystemTrayTestApi(); // Returns true if the system tray bubble menu is open. - virtual bool IsTrayBubbleOpen() = 0; + bool IsTrayBubbleOpen(); + + // Returns true if the system tray bubble menu is expanded. + bool IsTrayBubbleExpanded(); // Shows the system tray bubble menu. - virtual void ShowBubble() = 0; + void ShowBubble(); // Closes the system tray bubble menu. - virtual void CloseBubble() = 0; + void CloseBubble(); + + // Collapse the system tray bubble menu. + void CollapseBubble(); + + // Expand the system tray bubble menu. + void ExpandBubble(); // Shows the submenu view for the given section of the bubble menu. - virtual void ShowAccessibilityDetailedView() = 0; - virtual void ShowNetworkDetailedView() = 0; + void ShowAccessibilityDetailedView(); + void ShowNetworkDetailedView(); // Returns true if the view exists in the bubble and is visible. // If |open_tray| is true, it also opens system tray bubble. - virtual bool IsBubbleViewVisible(int view_id, bool open_tray) = 0; + bool IsBubbleViewVisible(int view_id, bool open_tray); // Clicks the view |view_id|. - virtual void ClickBubbleView(int view_id) = 0; + void ClickBubbleView(int view_id); // Returns the tooltip for a bubble view, or the empty string if the view // does not exist. - virtual base::string16 GetBubbleViewTooltip(int view_id) = 0; + base::string16 GetBubbleViewTooltip(int view_id); + + // Get the notification pop up view based on the notification id. + message_center::MessagePopupView* GetPopupViewForNotificationID( + const std::string& notification_id); // Returns true if the clock is using 24 hour time. - virtual bool Is24HourClock() = 0; + bool Is24HourClock(); // Taps on the Select-to-Speak tray. - virtual void TapSelectToSpeakTray() = 0; - - protected: - SystemTrayTestApi() {} + void TapSelectToSpeakTray(); }; } // namespace ash
diff --git a/ash/public/cpp/vector_icons/BUILD.gn b/ash/public/cpp/vector_icons/BUILD.gn index 38281b02..d2ce26e3 100644 --- a/ash/public/cpp/vector_icons/BUILD.gn +++ b/ash/public/cpp/vector_icons/BUILD.gn
@@ -9,6 +9,7 @@ icon_directory = "." icons = [ + "assistant.icon", "notification_assistant.icon", "notification_supervised_user.icon", "notification_warning.icon",
diff --git a/ash/resources/vector_icons/assistant.icon b/ash/public/cpp/vector_icons/assistant.icon similarity index 100% rename from ash/resources/vector_icons/assistant.icon rename to ash/public/cpp/vector_icons/assistant.icon
diff --git a/ash/quick_answers/ui/quick_answers_view.cc b/ash/quick_answers/ui/quick_answers_view.cc index f22f3a3..4fcc18d 100644 --- a/ash/quick_answers/ui/quick_answers_view.cc +++ b/ash/quick_answers/ui/quick_answers_view.cc
@@ -5,6 +5,7 @@ #include "ash/quick_answers/ui/quick_answers_view.h" #include "ash/public/cpp/assistant/assistant_interface_binder.h" +#include "ash/public/cpp/vector_icons/vector_icons.h" #include "ash/quick_answers/quick_answers_ui_controller.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/shell.h"
diff --git a/ash/quick_answers/ui/user_consent_view.cc b/ash/quick_answers/ui/user_consent_view.cc index c57dbe0..b54b4dc3 100644 --- a/ash/quick_answers/ui/user_consent_view.cc +++ b/ash/quick_answers/ui/user_consent_view.cc
@@ -4,6 +4,7 @@ #include "ash/quick_answers/ui/user_consent_view.h" +#include "ash/public/cpp/vector_icons/vector_icons.h" #include "ash/quick_answers/quick_answers_ui_controller.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/shell.h"
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn index ef9cd16b..017ff5d5 100644 --- a/ash/resources/vector_icons/BUILD.gn +++ b/ash/resources/vector_icons/BUILD.gn
@@ -10,7 +10,6 @@ icons = [ "always_show_shelf.icon", - "assistant.icon", "auto_hide.icon", "autoclick.icon", "autoclick_close.icon",
diff --git a/ash/shell_delegate.cc b/ash/shell_delegate.cc index b5e51c99..684e8fc8 100644 --- a/ash/shell_delegate.cc +++ b/ash/shell_delegate.cc
@@ -6,6 +6,12 @@ namespace ash { +bool ShellDelegate::CreateBrowserForTabDrop( + gfx::NativeWindow source_window, + const ui::OSExchangeData& drop_data) { + return false; +} + media_session::mojom::MediaSessionService* ShellDelegate::GetMediaSessionService() { return nullptr;
diff --git a/ash/shell_delegate.h b/ash/shell_delegate.h index ed68090e..ea8413f 100644 --- a/ash/shell_delegate.h +++ b/ash/shell_delegate.h
@@ -23,6 +23,10 @@ class Window; } +namespace ui { +class OSExchangeData; +} + namespace ash { class AccessibilityDelegate; @@ -54,6 +58,9 @@ // Check whether the current tab of the browser window can go back. virtual bool CanGoBack(gfx::NativeWindow window) const = 0; + virtual bool CreateBrowserForTabDrop(gfx::NativeWindow source_window, + const ui::OSExchangeData& drop_data); + // Binds a BluetoothSystemFactory receiver if possible. virtual void BindBluetoothSystemFactory( mojo::PendingReceiver<device::mojom::BluetoothSystemFactory> receiver) {}
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 73d60319..4f37b61 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Kortpad is afgeskakel</translation> <translation id="6910714959251846841">Hierdie opdatering vereis dat jou toestel 'n kragwas kry. Kom meer te wete oor die jongste <ph name="SYSTEM_APP_NAME" />-opdatering.</translation> <translation id="6919251195245069855">Kon nie jou slimkaart herken nie. Probeer weer.</translation> +<translation id="6945221475159498467">Kies</translation> <translation id="6972754398087986839">Kom aan die gang</translation> <translation id="6981982820502123353">Toeganklikheid</translation> <translation id="698231206551913481">Alle lêers en plaaslike data wat met hierdie gebruiker geassosieer word, sal permanent uitgevee word sodra hierdie gebruiker verwyder word.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Private netwerk</translation> <translation id="8152092012181020186">Druk Ctrl + W om toe te maak.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Jou administrateur bestuur hierdie instelling.</translation> +<translation id="815598010540052116">Rollees na onder</translation> <translation id="8167567890448493835">Gebruik tans <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Pasmaak tale en invoer …</translation> <translation id="8192202700944119416">Kennisgewings word versteek.</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index ec6ce79..2dc605c 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">አቋራጭ ጠፍቷል</translation> <translation id="6910714959251846841">ይህ ዝማኔ የመሣሪያዎን powerwashing ይጠይቃል። ስለቅርብ ጊዜው <ph name="SYSTEM_APP_NAME" /> ዝማኔ የበለጠ ይረዱ።</translation> <translation id="6919251195245069855">የእርስዎን ዘመናዊ ካርድ ለይቶ ማወቅ አልተቻለም። እንደገና ይሞክሩ።</translation> +<translation id="6945221475159498467">ይምረጡ</translation> <translation id="6972754398087986839">አስጀማሪ መመሪያ</translation> <translation id="6981982820502123353">ተደራሽነት</translation> <translation id="698231206551913481">አንዴ ይህ ተጠቃሚ ከተወገደ በኋላ ከዚህ ተጠቃሚ ጋር የተጎዳኙ ሁሉም ፋይሎች እና አካባቢያዊ ውሂብ በቋሚነት ይሰረዛሉ።</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">የግል አውታረ መረብ</translation> <translation id="8152092012181020186">ለመዝጋት Ctrl + W ይጫኑ።</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ይህ ቅንብር በአስተዳዳሪዎ የሚቀናበር ነው።</translation> +<translation id="815598010540052116">ወደ ታች ሸብልል</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" />ን በመጠቀም ላይ</translation> <translation id="8190698733819146287">ቋንቋዎችን እና ግብአቶችን አብጅ...</translation> <translation id="8192202700944119416">ማሳወቂያዎች ተደብቀዋል</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 2eb69b0..3d454d0 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">تم إيقاف الاختصار</translation> <translation id="6910714959251846841">يتطلَّب هذا التحديث إجراء عملية Powerwash لجهازك. مزيد من المعلومات حول آخر تحديث لتطبيق <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">لم يتم التعرُّف على البطاقة الذكية. يُرجى إعادة المحاولة.</translation> +<translation id="6945221475159498467">تحديد</translation> <translation id="6972754398087986839">البدء</translation> <translation id="6981982820502123353">إمكانية الوصول</translation> <translation id="698231206551913481">سيتم حذف جميع الملفات والبيانات المحلية المرتبطة بهذا المستخدم نهائيًا بمجرد إزالة هذا المستخدم.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">الشبكة الخاصة</translation> <translation id="8152092012181020186">يُرجى الضغط على Ctrl + W للإغلاق.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> يتولى مشرفك إدارة هذا الإعداد.</translation> +<translation id="815598010540052116">التمرير إلى أسفل</translation> <translation id="8167567890448493835">استخدام <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">تخصيص اللغات والإدخال...</translation> <translation id="8192202700944119416">يتم إخفاء الإشعارات.</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 2d23c7cb..8aff6a4 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">শ্বৰ্টকাট অফ কৰা হৈছে</translation> <translation id="6910714959251846841">এই আপডে’টটো কৰিবলৈ হ’লে আপোনাৰ ডিভাইচটো পাৱাৰৱাশ্ব কৰাটো প্ৰয়োজনীয়। শেহতীয়া <ph name="SYSTEM_APP_NAME" /> আপডে’টৰ বিষয়ে অধিক জানক।</translation> <translation id="6919251195245069855">আপোনাৰ স্মার্ট কার্ডখন চিনাক্ত কৰিব পৰা নগ'ল। আকৌ চেষ্টা কৰক।</translation> +<translation id="6945221475159498467">বাছনি কৰক</translation> <translation id="6972754398087986839">আৰম্ভ কৰক</translation> <translation id="6981982820502123353">সাধ্য সুবিধাসমূহ</translation> <translation id="698231206551913481">ব্যৱহাৰকাৰীজনক আঁতৰোৱাৰ পাছত তেওঁৰ সৈতে জড়িত সকলো ফাইল বা স্থানীয় ডেটা স্থায়ীভাৱে মচা হ’ব।</translation> @@ -554,6 +555,7 @@ <translation id="8142699993796781067">ব্যক্তিগত নেটৱর্ক</translation> <translation id="8152092012181020186">বন্ধ কৰিবলৈ Ctrl + W টিপক৷</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> এই ছেটিংটো আপোনাৰ প্ৰশাসকে পৰিচালনা কৰে।</translation> +<translation id="815598010540052116">তললৈ স্ক্ৰল কৰক</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ব্যৱহাৰ কৰি থকা হৈছে</translation> <translation id="8190698733819146287">ভাষা আৰু ইনপুট কাষ্টমাইজ কৰক...</translation> <translation id="8192202700944119416">জাননীবোৰ লুকুৱাই ৰখা হৈছে।</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index f6e1f66..158d2044 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Qısayol deaktiv edildi</translation> <translation id="6910714959251846841">Bu güncəlləmə cihazın sıfırlanmasını tələb edir. Ən son <ph name="SYSTEM_APP_NAME" /> güncəlləməsi haqqında ətraflı məlumat əldə edin.</translation> <translation id="6919251195245069855">Smart kartınız tanınmadı. Yenidən sınayın.</translation> +<translation id="6945221475159498467">Seçin</translation> <translation id="6972754398087986839">Başlayın</translation> <translation id="6981982820502123353">Giriş İmkanı</translation> <translation id="698231206551913481">İstifadəçi silinən kimi onunla əlaqədar bütün fayl və data həmişəlik silinəcək.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Şəxsi şəbəkə</translation> <translation id="8152092012181020186">Bağlamaq üçün Ctrl + W düymələrinə basın.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Bu ayar inzibatçınız tərəfindən idarə olunur.</translation> +<translation id="815598010540052116">Aşağı Sürüşdürün</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> istifadə edilir</translation> <translation id="8190698733819146287">Dilləri və daxiletməni dəyişdirin...</translation> <translation id="8192202700944119416">Bildirişlər gizlədildi.</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 6ed21cb..b36bb97b 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Спалучэнне клавіш выключана</translation> <translation id="6910714959251846841">Для ўсталявання абнаўлення патрабуецца скід прылад з дапамогай Powerwash. Даведайцеся больш пра апошняе абнаўленне <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Не ўдалося распазнаць вашу разумную картку. Паўтарыце спробу.</translation> +<translation id="6945221475159498467">Выбраць</translation> <translation id="6972754398087986839">Пачатак працы</translation> <translation id="6981982820502123353">Спецыяльныя магчымасці</translation> <translation id="698231206551913481">Пры выдаленні карыстальніка будуць выдалены ўсе звязаныя з ім файлы і лакальныя даныя.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Прыватная сетка</translation> <translation id="8152092012181020186">Каб закрыць, націсніце Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Гэта налада знаходзіцца пад кіраваннем адміністратара.</translation> +<translation id="815598010540052116">Прагартаць уніз</translation> <translation id="8167567890448493835">Выкарыстоўваецца <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Наладзіць мову і ўвод...</translation> <translation id="8192202700944119416">Апавяшчэнні схаваны.</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 92f5e71..1ad50bc 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Прекият път е изключен</translation> <translation id="6910714959251846841">Тази актуализация изисква Powerwash на устройството ви. Научете повече за най-новата актуализация на <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Смарткартата ви не бе разпозната. Опитайте отново.</translation> +<translation id="6945221475159498467">Избиране</translation> <translation id="6972754398087986839">Първи стъпки</translation> <translation id="6981982820502123353">Достъпност</translation> <translation id="698231206551913481">След като този потребител бъде премахнат, всички свързани с него файлове и локални данни ще се изтрият за постоянно.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Частна мрежа</translation> <translation id="8152092012181020186">Натиснете Ctrl + W за затваряне.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Тази настройка се управлява от администратора ви.</translation> +<translation id="815598010540052116">Превъртане надолу</translation> <translation id="8167567890448493835">Използвате <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Персонализиране на езиците и въвеждането...</translation> <translation id="8192202700944119416">Известията са скрити.</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index f412a16..4a1a8cd 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">শর্টকাট বন্ধ করা আছে</translation> <translation id="6910714959251846841">এই আপডেটটির জন্য আপনার ডিভাইস পাওয়ারওয়াশ করা প্রয়োজন। সাম্প্রতিক <ph name="SYSTEM_APP_NAME" /> আপডেট সম্পর্কে আরও জানুন।</translation> <translation id="6919251195245069855">আপনার স্মার্ট কার্ড শনাক্ত করা যায়নি। আবার চেষ্টা করুন।</translation> +<translation id="6945221475159498467">নির্বাচন</translation> <translation id="6972754398087986839">শুরু করুন</translation> <translation id="6981982820502123353">ব্যবহারযোগ্যতা</translation> <translation id="698231206551913481">একবার এই ব্যবহারকারীকে সরানো হলে এর সঙ্গে সংশ্লিষ্ট সমস্ত ফাইল এবং স্থানীয় ডেটা স্থায়ীভাবে মুছে ফেলা হবে।</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">ব্যক্তিগত নেটওয়ার্ক</translation> <translation id="8152092012181020186">বন্ধ করতে Ctrl + W প্রেস করুন।</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> এই সেটিং আপনার অ্যাডমিনিস্ট্রেটর ম্যানেজ করে থাকে।</translation> +<translation id="815598010540052116">নিচে স্ক্রল করুন</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ব্যবহার করা হচ্ছে</translation> <translation id="8190698733819146287">ভাষা এবং ইনপুট কাস্টমাইজ করুন...</translation> <translation id="8192202700944119416">বিজ্ঞপ্তি লুকানো আছে।</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 4bc0bf5c..ef12fcc56 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Prečica je isključena</translation> <translation id="6910714959251846841">Za ovo ažuriranje na uređaju je potrebno izvršiti Powerwash. Saznajte više o najnovijem ažuriranju za aplikaciju <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Prepoznavanje pametne kartice nije uspjelo. Ponovite.</translation> +<translation id="6945221475159498467">Odaberi</translation> <translation id="6972754398087986839">Započnite</translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="698231206551913481">Nakon što se ukloni ovaj korisnik, trajno će se izbrisati svi fajlovi i lokalni podaci povezani s njim.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privatna mreža</translation> <translation id="8152092012181020186">Pritisnite Ctrl + W da zatvorite.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Ovom postavkom upravlja vaš administrator.</translation> +<translation id="815598010540052116">Klizni prema dolje</translation> <translation id="8167567890448493835">Koristite <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Prilagodite jezike i unos...</translation> <translation id="8192202700944119416">Obavještenje su sakrivena.</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index f7039c6..6f9edc5 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">S'ha desactivat la drecera</translation> <translation id="6910714959251846841">Aquesta actualització requereix executar la funció Powerwash al dispositiu. Obtén més informació sobre l'última actualització de <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">No s'ha reconegut la targeta intel·ligent. Torna-ho a provar.</translation> +<translation id="6945221475159498467">Selecciona</translation> <translation id="6972754398087986839">Comença</translation> <translation id="6981982820502123353">Accessibilitat</translation> <translation id="698231206551913481">Tots els fitxers i les dades locals associats amb aquest usuari se suprimiran definitivament quan aquest usuari se suprimeixi.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Xarxa privada</translation> <translation id="8152092012181020186">Prem Ctrl+W per tancar.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" />. El teu administrador gestiona aquesta opció de configuració.</translation> +<translation id="815598010540052116">Desplaçament avall</translation> <translation id="8167567890448493835">S'està utilitzant <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalitza idiomes i introducció de text...</translation> <translation id="8192202700944119416">S'han amagat les notificacions.</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 121a2b4..d875536 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Zkratka je vypnutá</translation> <translation id="6910714959251846841">Kvůli této aktualizaci je potřeba zařízení pomocí funkce Powerwash obnovit do továrního nastavení. Viz další informace o nejnovější aktualizaci systému <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Chytrou kartu se nepodařilo rozpoznat. Zkuste to znovu.</translation> +<translation id="6945221475159498467">Vybrat</translation> <translation id="6972754398087986839">Začínáme</translation> <translation id="6981982820502123353">Usnadnění</translation> <translation id="698231206551913481">Po odebrání tohoto uživatele budou trvale smazány všechny soubory a místní data, která jsou k němu přiřazena.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Soukromá síť</translation> <translation id="8152092012181020186">Zavřete stisknutím kláves Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Toto nastavení spravuje administrátor.</translation> +<translation id="815598010540052116">Posuv dolů</translation> <translation id="8167567890448493835">Používá se <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalizovat jazyky a zadávání...</translation> <translation id="8192202700944119416">Oznámení jsou skryta.</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 71338e8..bf8e2e5 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Genvejen er deaktiveret</translation> <translation id="6910714959251846841">Denne opdatering kræver, at der udføres en powerwash på din enhed. Få flere oplysninger om den nyeste <ph name="SYSTEM_APP_NAME" />-opdatering.</translation> <translation id="6919251195245069855">Dit chipkort blev ikke genkendt. Prøv igen.</translation> +<translation id="6945221475159498467">Vælg</translation> <translation id="6972754398087986839">Kom godt i gang</translation> <translation id="6981982820502123353">Hjælpefunktioner</translation> <translation id="698231206551913481">Alle filer og lokale data, der er knyttet til denne bruger, slettes permanent, når brugeren fjernes.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Privat netværk</translation> <translation id="8152092012181020186">Tryk på Ctrl+W for at lukke.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Denne indstilling administreres af din administrator.</translation> +<translation id="815598010540052116">Scroll Down</translation> <translation id="8167567890448493835">Bruger <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Tilpas sprog og indtastning...</translation> <translation id="8192202700944119416">Notifikationer er skjult.</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index e5b3769c..7b4f8197 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Tastenkombination deaktiviert</translation> <translation id="6910714959251846841">Damit dieses Update installiert werden kann, muss auf Ihrem Gerät ein Powerwash durchgeführt werden. Informieren Sie sich über das aktuelle <ph name="SYSTEM_APP_NAME" />-Update.</translation> <translation id="6919251195245069855">Ihre Smartcard wurde nicht erkannt. Bitte versuchen Sie es noch einmal.</translation> +<translation id="6945221475159498467">Auswählen</translation> <translation id="6972754398087986839">Erste Schritte</translation> <translation id="6981982820502123353">Bedienungshilfen</translation> <translation id="698231206551913481">Durch das Entfernen des Nutzers werden alle mit ihm verknüpften Dateien und lokalen Daten endgültig gelöscht.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privates Netzwerk</translation> <translation id="8152092012181020186">Drücken Sie zum Schließen Strg + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> – Diese Einstellung wird von Ihrem Administrator verwaltet.</translation> +<translation id="815598010540052116">Nach unten blättern</translation> <translation id="8167567890448493835">"<ph name="LOCALE_NAME" />" wird verwendet</translation> <translation id="8190698733819146287">Sprache und Eingabe anpassen...</translation> <translation id="8192202700944119416">Benachrichtigungen sind ausgeblendet.</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 4ea6b90..3f20c60b6 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Η συντόμευση απενεργοποιήθηκε</translation> <translation id="6910714959251846841">Αυτή η ενημέρωση απαιτεί την εκτέλεση powerwash στη συσκευή σας. Μάθετε περισσότερα σχετικά με την πιο πρόσφατη ενημέρωση της εφαρμογής <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Δεν ήταν δυνατή η αναγνώριση της έξυπνης κάρτας σας. Επανάληψη.</translation> +<translation id="6945221475159498467">Επιλογή</translation> <translation id="6972754398087986839">Έναρξη</translation> <translation id="6981982820502123353">Προσβασιμότητα</translation> <translation id="698231206551913481">Όλα τα αρχεία και τα τοπικά δεδομένα που σχετίζονται με τον χρήστη θα διαγραφούν οριστικά μόλις καταργηθεί ο χρήστης.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Ιδιωτικό δίκτυο</translation> <translation id="8152092012181020186">Πατήστε Ctrl + W για κλείσιμο.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Η διαχείριση αυτής της ρύθμισης πραγματοποιείται από τον διαχειριστή σας.</translation> +<translation id="815598010540052116">Κύλιση κάτω</translation> <translation id="8167567890448493835">Χρησιμοποιείτε <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Προσαρμογή γλωσσών και εισόδου...</translation> <translation id="8192202700944119416">Οι ειδοποιήσεις είναι κρυφές.</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index fa6fad48..9d1b956 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Shortcut turned off</translation> <translation id="6910714959251846841">This update requires powerwashing of your device. Learn more about the latest <ph name="SYSTEM_APP_NAME" /> update.</translation> <translation id="6919251195245069855">Couldn’t recognise your smart card. Try again.</translation> +<translation id="6945221475159498467">Select</translation> <translation id="6972754398087986839">Get Started</translation> <translation id="6981982820502123353">Accessibility</translation> <translation id="698231206551913481">All files and local data associated with this user will be permanently deleted once this user is removed.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Private networks</translation> <translation id="8152092012181020186">Press Ctrl + W to close.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> This setting is managed by your administrator.</translation> +<translation id="815598010540052116">Scroll Down</translation> <translation id="8167567890448493835">Using <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Customise languages and input...</translation> <translation id="8192202700944119416">Notifications are hidden.</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 2e247608..431e1681 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Se desactivó la combinación de teclas</translation> <translation id="6910714959251846841">Esta actualización requiere que apliques la función Powerwash en tu dispositivo. Obtén más información sobre la actualización más reciente de <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">No se reconoció tu tarjeta inteligente. Vuelve a intentarlo.</translation> +<translation id="6945221475159498467">Seleccionar</translation> <translation id="6972754398087986839">Comenzar</translation> <translation id="6981982820502123353">Accesibilidad</translation> <translation id="698231206551913481">Todos los archivos y datos locales asociados a este usuario se borrarán de forma permanente una vez que se quite este usuario.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Red privada</translation> <translation id="8152092012181020186">Presiona Ctrl + W para cerrar.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" />: El administrador controla esta configuración.</translation> +<translation id="815598010540052116">Desplazar hacia abajo</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> en uso</translation> <translation id="8190698733819146287">Personalizar idiomas y la entrada de datos</translation> <translation id="8192202700944119416">Las notificaciones están ocultas.</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 8a6528e..cf23396 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -9,7 +9,7 @@ <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation> <translation id="108486256082349153">Móvil: <ph name="ADDRESS" /></translation> <translation id="109942774857561566">Me aburro</translation> -<translation id="1104084341931202936">Mostrar configuración de accesibilidad</translation> +<translation id="1104084341931202936">Muestra configuración de accesibilidad</translation> <translation id="1104621072296271835">Tus dispositivos funcionan aún mejor juntos</translation> <translation id="112308213915226829">Autoocultar estantería</translation> <translation id="1153356358378277386">Dispositivos vinculados</translation> @@ -40,7 +40,7 @@ <translation id="1351937230027495976">Ocultar menú</translation> <translation id="1383876407941801731">Buscar</translation> <translation id="1419738280318246476">Desbloquea el dispositivo para hacer lo que indica la notificación</translation> -<translation id="1420408895951708260">Activar o desactivar la luz nocturna. <ph name="STATE_TEXT" /></translation> +<translation id="1420408895951708260">Activa o desactiva la luz nocturna. <ph name="STATE_TEXT" /></translation> <translation id="1426410128494586442">Sí</translation> <translation id="1455242230282523554">Mostrar los ajustes de idioma</translation> <translation id="1460620680449458626">El volumen está silenciado.</translation> @@ -158,7 +158,7 @@ <translation id="2963773877003373896">mod3</translation> <translation id="2970920913501714344">Instalar aplicaciones, extensiones y temas</translation> <translation id="2977598380246111477">Número siguiente</translation> -<translation id="2995447421581609334">Mostrar dispositivos de transmisión</translation> +<translation id="2995447421581609334">Mostrar dispositivos de emisión</translation> <translation id="2996462380875591307">Se ha habilitado la lupa fijada. Pulsa Ctrl + tecla de búsqueda + D de nuevo para desactivarla.</translation> <translation id="3000461861112256445">Audio en mono</translation> <translation id="3009178788565917040">Salida</translation> @@ -237,7 +237,7 @@ <translation id="3846575436967432996">No hay información de red disponible.</translation> <translation id="385051799172605136">Atrás</translation> <translation id="3891340733213178823">Pulsa Ctrl+Mayús+Q dos veces para cerrar sesión.</translation> -<translation id="3893630138897523026">ChromeVox (mensajes de voz)</translation> +<translation id="3893630138897523026">ChromeVox (síntesis de voz)</translation> <translation id="3897533311200664389">Iniciar una consulta de texto</translation> <translation id="3899995891769452915">Entrada de voz</translation> <translation id="3900355044994618856">Tu sesión terminará en <ph name="SESSION_TIME_REMAINING" /></translation> @@ -297,8 +297,8 @@ <translation id="4585337515783392668">Dejar de enviar contenido a un receptor desconocido</translation> <translation id="4628757576491864469">Dispositivos</translation> <translation id="4659419629803378708">ChromeVox habilitado</translation> -<translation id="4665114317261903604">Activar o desactivar el modo No molestar. <ph name="STATE_TEXT" /></translation> -<translation id="4696813013609194136">Desbloquear el dispositivo con código parental</translation> +<translation id="4665114317261903604">Activa o desactiva el modo No molestar. <ph name="STATE_TEXT" /></translation> +<translation id="4696813013609194136">Desbloquear con código parental</translation> <translation id="4702647871202761252">La pantalla de privacidad está desactivada</translation> <translation id="4705716602320768426">Comentarios sobre el archivo</translation> <translation id="4710243778082831592">Ajustes de IME</translation> @@ -367,7 +367,7 @@ <translation id="5691772641933328258">Huella digital no reconocida</translation> <translation id="5710450975648804523">Modo No molestar activado</translation> <translation id="573413375004481890">Este dispositivo no puede admitir todas tus pantallas, así que se ha desconectado una</translation> -<translation id="574392208103952083">Mediana</translation> +<translation id="574392208103952083">Media</translation> <translation id="5744083938413354016">Tocar y arrastrar</translation> <translation id="5745612484876805746">La luz nocturna se activa automáticamente al anochecer</translation> <translation id="5750765938512549687">El Bluetooth está desactivado</translation> @@ -468,6 +468,7 @@ <translation id="6878400149835617132">Combinación de teclas desactivada</translation> <translation id="6910714959251846841">Esta actualización le hará un Powerwash a tu dispositivo. Consulta más información sobre la última actualización de <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">No se ha podido reconocer la tarjeta inteligente. Vuelve a intentarlo.</translation> +<translation id="6945221475159498467">Seleccionar</translation> <translation id="6972754398087986839">Empezar</translation> <translation id="6981982820502123353">Accesibilidad</translation> <translation id="698231206551913481">Una vez que se haya quitado este usuario, todos los archivos y datos asociados a él se eliminarán de forma permanente.</translation> @@ -481,7 +482,7 @@ <translation id="7068360136237591149">Abrir un archivo</translation> <translation id="7076293881109082629">Iniciando sesión</translation> <translation id="7088960765736518739">Accesibilidad mediante interruptores</translation> -<translation id="7092922358121866860">Mostrar la configuración de luz nocturna</translation> +<translation id="7092922358121866860">Muestra la configuración de luz nocturna</translation> <translation id="7098389117866926363">Dispositivo USB tipo C (puerto izquierdo situado en la parte trasera)</translation> <translation id="7131634465328662194">Tu sesión se cerrará automáticamente.</translation> <translation id="7143207342074048698">Conectando</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Red privada</translation> <translation id="8152092012181020186">Pulsa Ctrl + W para cerrar.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Este ajuste lo gestiona tu administrador.</translation> +<translation id="815598010540052116">Desplazar hacia abajo</translation> <translation id="8167567890448493835">Idioma: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalizar idiomas...</translation> <translation id="8192202700944119416">Las notificaciones están ocultas.</translation> @@ -603,10 +605,10 @@ <translation id="8676770494376880701">Cargador de baja potencia conectado</translation> <translation id="8683506306463609433">Control del rendimiento activo</translation> <translation id="8712637175834984815">Listo</translation> -<translation id="8721053961083920564">Activar o desactivar el volumen. <ph name="STATE_TEXT" /></translation> +<translation id="8721053961083920564">Activa o desactiva el volumen. <ph name="STATE_TEXT" /></translation> <translation id="8734991477317290293">Es posible que esté intentando captar tus pulsaciones de teclas</translation> <translation id="8735953464173050365">Muestra la configuración de teclado. Actualmente está seleccionado <ph name="KEYBOARD_NAME" />.</translation> -<translation id="875593634123171288">Mostrar configuración de VPN</translation> +<translation id="875593634123171288">Muestra la configuración de VPN</translation> <translation id="8785070478575117577">Conectar a <ph name="NETWORK_NAME" /></translation> <translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation> <translation id="8814190375133053267">Wi-Fi</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 57db3aa..2a88839 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Otsetee on välja lülitatud</translation> <translation id="6910714959251846841">Värskenduse jaoks on vajalik seadme powerwash. Vaadake lisateavet operatsioonisüsteemi <ph name="SYSTEM_APP_NAME" /> uusima värskenduse kohta.</translation> <translation id="6919251195245069855">Teie kiipkaarti ei õnnestunud tuvastada. Proovige uuesti.</translation> +<translation id="6945221475159498467">Vali</translation> <translation id="6972754398087986839">Alustamine</translation> <translation id="6981982820502123353">Juurdepääsetavus</translation> <translation id="698231206551913481">Kõik selle kasutajaga seotud failid ja kohalikud andmed kustutatakse jäädavalt kohe, kui see kasutaja eemaldatakse.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Privaatvõrk</translation> <translation id="8152092012181020186">Sulgemiseks vajutage klahvikombinatsiooni Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Seda seadet haldab administraator.</translation> +<translation id="815598010540052116">Keri alla</translation> <translation id="8167567890448493835">Kasutusel: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Keelte ja sisendi kohandamine...</translation> <translation id="8192202700944119416">Märguanded on peidetud.</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index e189d00c..c2bd948 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Lasterbidea desaktibatu da</translation> <translation id="6910714959251846841">Eguneratu ahal izateko, gailuaren fabrikako ezarpenak berrezarri behar dira. Lortu informazio gehiago <ph name="SYSTEM_APP_NAME" /> aplikazioaren azken eguneratzeari buruz.</translation> <translation id="6919251195245069855">Ezin izan da hauteman txartel adimenduna. Saiatu berriro.</translation> +<translation id="6945221475159498467">Hautatu</translation> <translation id="6972754398087986839">Hasi erabiltzen</translation> <translation id="6981982820502123353">Erabilerraztasuna</translation> <translation id="698231206551913481">Erabiltzailea kentzen denean, harekin erlazionatutako fitxategi eta gailuko datu guztiak betiko ezabatuko dira.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Sare pribatua</translation> <translation id="8152092012181020186">Ixteko, sakatu Ktrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Administratzaileak kudeatzen du ezarpen hau.</translation> +<translation id="815598010540052116">Egin behera</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> erabiltzen</translation> <translation id="8190698733819146287">Pertsonalizatu hizkuntzak eta idazketa…</translation> <translation id="8192202700944119416">Jakinarazpenak ezkutatuta daude.</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 5551524f..50ece4d 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">میانبر خاموش شد</translation> <translation id="6910714959251846841">این بهروزرسانی نیاز به انجام powerwash دستگاهتان دارد. درباره جدیدترین بهروزرسانی <ph name="SYSTEM_APP_NAME" /> بیشتر بدانید.</translation> <translation id="6919251195245069855">کارت هوشمندتان تشخیص داده نشد. دوباره امتحان کنید.</translation> +<translation id="6945221475159498467">انتخاب</translation> <translation id="6972754398087986839">شروع به کار</translation> <translation id="6981982820502123353">قابلیت دسترسی</translation> <translation id="698231206551913481">اگر کاربر حذف شود، همه فایلها و دادههای محلی مربوط به او بهطور دائم حذف خواهند شد.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">شبکههای خصوصی</translation> <translation id="8152092012181020186">برای بستن برگه، Ctrl + W را فشار دهید.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> این تنظیم را سرپرست شما مدیریت میکند.</translation> +<translation id="815598010540052116">پیمایش به پایین</translation> <translation id="8167567890448493835">درحال استفاده از <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">سفارشی کردن زبانها و ورودی...</translation> <translation id="8192202700944119416">اعلانها پنهان شده است.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 9f0a277..8466d26 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -469,6 +469,7 @@ <translation id="6878400149835617132">Pikanäppäin poistettu käytöstä</translation> <translation id="6910714959251846841">Tämän päivityksen asennus edellyttää laitteen powerwashia. Lue lisää uusimmasta <ph name="SYSTEM_APP_NAME" /> ‑päivityksestä.</translation> <translation id="6919251195245069855">Älykorttia ei tunnistettu. Yritä uudelleen.</translation> +<translation id="6945221475159498467">Valitse</translation> <translation id="6972754398087986839">Aloitusopas</translation> <translation id="6981982820502123353">Esteettömyys</translation> <translation id="698231206551913481">Kun käyttäjä poistetaan, kaikki kyseiseen käyttäjään yhdistetyt tiedostot ja paikalliset tiedot poistetaan pysyvästi.</translation> @@ -559,6 +560,7 @@ <translation id="8142699993796781067">Yksityinen verkko</translation> <translation id="8152092012181020186">Sulje painamalla Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Järjestelmänvalvojasi ylläpitää tätä asetusta.</translation> +<translation id="815598010540052116">Vieritä alas</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> käytössä</translation> <translation id="8190698733819146287">Muokkaa kieliä ja syötettä...</translation> <translation id="8192202700944119416">Ilmoitukset on piilotettu.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 90a09ac..fbd23321 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Naka-off ang shortcut</translation> <translation id="6910714959251846841">Kinakailangang i-powerwash ang iyong device para sa update na ito. Matuto pa tungkol sa pinakabagong update sa <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Hindi makilala ang iyong smart card. Subukan ulit.</translation> +<translation id="6945221475159498467">Pumili</translation> <translation id="6972754398087986839">Magsimula</translation> <translation id="6981982820502123353">Pagiging Accessible</translation> <translation id="698231206551913481">Permanenteng made-delete ang lahat ng file at lokal na data na nauugnay sa user na ito kapag inalis na ang user na ito.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Pribadong network</translation> <translation id="8152092012181020186">Pindutin ang Ctrl + W para isara ito.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Pinapamahalaan ng iyong administrator ang setting na ito.</translation> +<translation id="815598010540052116">Mag-scroll Pababa</translation> <translation id="8167567890448493835">Gamit ang <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">I-customize ang mga wika at input...</translation> <translation id="8192202700944119416">Nakatago ang mga notification.</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index f51a6da39..59dde06b 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Raccourci désactivé</translation> <translation id="6910714959251846841">Cette mise à jour nécessite une réinitialisation de votre appareil. En savoir plus sur la dernière mise à jour de <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Votre carte à puce n'a pas été reconnue. Réessayez.</translation> +<translation id="6945221475159498467">Sélectionner</translation> <translation id="6972754398087986839">Démarrer</translation> <translation id="6981982820502123353">Accessibilité</translation> <translation id="698231206551913481">Tous les fichiers et toutes les données locales associés à l'utilisateur seront définitivement supprimés en même temps que ce dernier.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Réseau privé</translation> <translation id="8152092012181020186">Appuyez sur les touches Ctrl + W pour fermer.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> C'est votre administrateur qui gère ce paramètre.</translation> +<translation id="815598010540052116">Défilement vers le bas</translation> <translation id="8167567890448493835">Paramètres régionaux utilisés : <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personnaliser les langues et l'entrée...</translation> <translation id="8192202700944119416">Les notifications sont masquées.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 3877c090..cafbc7a 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Raccourci désactivé</translation> <translation id="6910714959251846841">Cette mise à jour nécessite que vous utilisiez la fonctionnalité Powerwash sur votre appareil. Obtenez de plus amples informations sur la dernière mise à jour <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Impossible de reconnaître votre carte à puce. Veuillez réessayer.</translation> +<translation id="6945221475159498467">Sélectionner</translation> <translation id="6972754398087986839">Démarrer</translation> <translation id="6981982820502123353">Accessibilité</translation> <translation id="698231206551913481">L'ensemble des données locales et des fichiers associés à cet utilisateur seront définitivement supprimés en même temps que ce dernier.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Réseau privé</translation> <translation id="8152092012181020186">Appuyez sur Ctrl+W pour fermer l'élément.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Ce paramètre est géré par votre administrateur.</translation> +<translation id="815598010540052116">Défilement vers le bas</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> en cours d'utilisation</translation> <translation id="8190698733819146287">Personnaliser les langues et la saisie...</translation> <translation id="8192202700944119416">Les notifications sont masquées.</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 33a5f3f6..b0a945d 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -413,7 +413,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: activando...</translation> <translation id="6283712521836204486">Está desactivado o modo Non molestar.</translation> <translation id="6284232397434400372">Cambiouse a resolución</translation> -<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> pode engadirse de novo máis tarde co permiso dun pai ou nai.</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> pode engadirse de novo máis adiante co permiso da súa nai ou do seu pai.</translation> <translation id="6297287540776456956">Utiliza o lapis óptico para seleccionar unha área</translation> <translation id="6310121235600822547">A rotación de <ph name="DISPLAY_NAME" /> cambiou a <ph name="ROTATION" /></translation> <translation id="6376931439017688372">O Bluetooth está activado</translation> @@ -468,6 +468,7 @@ <translation id="6878400149835617132">Desactivouse o atallo</translation> <translation id="6910714959251846841">Esta actualización require executar a función Powerwash do dispositivo. Consulta máis información sobre a última actualización de <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Non se puido recoñecer a tarxeta intelixente. Téntao de novo.</translation> +<translation id="6945221475159498467">Seleccionar</translation> <translation id="6972754398087986839">Introdución</translation> <translation id="6981982820502123353">Accesibilidade</translation> <translation id="698231206551913481">En canto se borre este usuario, eliminaranse permanentemente os ficheiros e os datos locais asociados con el.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Rede privada</translation> <translation id="8152092012181020186">Preme Ctrl+W para pechar.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> O teu administrador xestiona esta opción de configuración.</translation> +<translation id="815598010540052116">Desprazarse cara abaixo</translation> <translation id="8167567890448493835">Usando: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalizar idiomas e introdución de texto...</translation> <translation id="8192202700944119416">As notificacións están ocultas.</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 58f5b4d..893a9ea3 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">શૉર્ટકટ બંધ કર્યો</translation> <translation id="6910714959251846841">આ અપડેટ માટે તમારા ઉપકરણને પાવરવોશ કરવું જરૂરી છે. નવીનતમ <ph name="SYSTEM_APP_NAME" /> અપડેટ વિશે વધુ જાણો.</translation> <translation id="6919251195245069855">તમારું સ્માર્ટ કાર્ડ ઓળખી શક્યાં નથી. ફરી પ્રયાસ કરો.</translation> +<translation id="6945221475159498467">પસંદ કરો</translation> <translation id="6972754398087986839">પ્રારંભ કરો</translation> <translation id="6981982820502123353">ઍક્સેસિબિલિટી</translation> <translation id="698231206551913481">આ વપરાશકર્તા દૂર કરી દેવામાં આવે તે પછી આ વપરાશકર્તા સાથે સંકળાયેલ તમામ ફાઇલો અને સ્થાનિક ડેટા કાયમીરૂપે કાઢી નાખવામાં આવશે.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">ખાનગી નેટવર્ક</translation> <translation id="8152092012181020186">બંધ કરવા માટે Ctrl + W દબાવો.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> આ સેટિંગને તમારા વ્યવસ્થાપક દ્વારા મેનેજ કરવામાં આવે છે.</translation> +<translation id="815598010540052116">નીચે સ્ક્રોલ કરો</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" />નો ઉપયોગ કરી રહ્યા છે</translation> <translation id="8190698733819146287">ભાષાઓ અને ઇનપુટને કસ્ટમાઇઝ કરો...</translation> <translation id="8192202700944119416">નોટિફિકેશન છુપાવેલા છે.</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index a58b60f..8f22276 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">शॉर्टकट बंद किया गया</translation> <translation id="6910714959251846841">इस अपडेट के लिए आपके डिवाइस को पावरवॉश करना ज़रूरी है. <ph name="SYSTEM_APP_NAME" /> के नए अपडेट के बारे में ज़्यादा जानें.</translation> <translation id="6919251195245069855">आपका स्मार्ट कार्ड पहचाना नहीं जा सका. फिर से कोशिश करें.</translation> +<translation id="6945221475159498467">चुनें</translation> <translation id="6972754398087986839">आरंभ करें</translation> <translation id="6981982820502123353">सुलभता</translation> <translation id="698231206551913481">इस उपयोगकर्ता को हटाए जाने पर, इससे जुड़ीं सभी फ़ाइलों और स्थानीय डेटा को हमेशा के लिए मिटा दिया जाएगा.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">निजी नेटवर्क</translation> <translation id="8152092012181020186">बंद करने के लिए Ctrl + W दबाएं.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> इस सेटिंग को आपका एडमिन प्रबंधित करता है.</translation> +<translation id="815598010540052116">नीचे स्क्रोल करें</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> का इस्तेमाल किया जा रहा है</translation> <translation id="8190698733819146287">भाषा और इनपुट को पसंद के मुताबिक बनाएं...</translation> <translation id="8192202700944119416">सूचनाएं छिपी हुई हैं.</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index a01cb78..788404d 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Prečac je isključen</translation> <translation id="6910714959251846841">Ovo ažuriranje zahtijeva powerwashing uređaja. Saznajte više o najnovijem ažuriranju za <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Nismo prepoznali vašu pametnu karticu. Pokušajte ponovo.</translation> +<translation id="6945221475159498467">Odaberi</translation> <translation id="6972754398087986839">Početak upotrebe</translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="698231206551913481">Sve datoteke i lokalni podaci povezani s ovim korisnikom trajno će se izbrisati nakon uklanjanja korisnika.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privatna mreža</translation> <translation id="8152092012181020186">Pritisnite Ctrl + W da biste zatvorili.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Tom postavkom upravlja vaš administrator.</translation> +<translation id="815598010540052116">Pomakni se dolje</translation> <translation id="8167567890448493835">Upotrebljava se <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Prilagodi jezike i unos...</translation> <translation id="8192202700944119416">Obavijesti su skrivene.</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index cc3f5e2..58d0acb 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">A billentyűparancs ki van kapcsolva</translation> <translation id="6910714959251846841">Eszköze frissítéséhez powerwash szükséges. További információ a legújabb <ph name="SYSTEM_APP_NAME" />-frissítésről.</translation> <translation id="6919251195245069855">A rendszer nem ismerte fel az intelligens kártyáját. Próbálja újra.</translation> +<translation id="6945221475159498467">Kiválasztás</translation> <translation id="6972754398087986839">Első lépések</translation> <translation id="6981982820502123353">Kisegítő lehetőségek</translation> <translation id="698231206551913481">A felhasználó eltávolításakor az összes hozzá tartozó fájl és helyi adat is véglegesen törlődik.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Privát hálózat</translation> <translation id="8152092012181020186">A bezáráshoz nyomja meg a Ctrl + W billentyűkódot.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Ezt a beállítást a rendszergazdája kezeli.</translation> +<translation id="815598010540052116">Görgetés lefelé</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> nyelv használata</translation> <translation id="8190698733819146287">Nyelvek és beviteli módok személyre szabása...</translation> <translation id="8192202700944119416">Az értesítések el vannak rejtve.</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 99259b439..12ffe6c9c 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Դյուրանցումն անջատված է</translation> <translation id="6910714959251846841">Այս թարմացումը տեղադրելու համար անհրաժեշտ է վերակայել սարքի կարգավորումները գործարանային տարբերակով։ Իմանալ ավելին <ph name="SYSTEM_APP_NAME" /> հավելվածի վերջին թարմացման մասին։</translation> <translation id="6919251195245069855">Չհաջողվեց ճանաչել ձեր խելացի քարտը: Նորից փորձեք։</translation> +<translation id="6945221475159498467">Ընտրել</translation> <translation id="6972754398087986839">Սկսել աշխատանքը</translation> <translation id="6981982820502123353">Մատչելիությունը</translation> <translation id="698231206551913481">Այս օգտատիրոջ հետ կապված բոլոր ֆայլերը և տեղային տվյալներն ընդմիշտ կջնջվեն, եթե հեռացնեք այս պրոֆիլը:</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Մասնավոր ցանց</translation> <translation id="8152092012181020186">Փակելու համար սեղմեք Ctrl+W։</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Այս կարգավորումը կառավարվում է ձեր ադմինիստրատորի կողմից։</translation> +<translation id="815598010540052116">Ոլորել ներքև</translation> <translation id="8167567890448493835">Օգտագործվում է՝ <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Լեզուների և ներածման կարգավորում…</translation> <translation id="8192202700944119416">Ծանուցումները թաքցված են:</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 31e0b3e..43742966 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Pintasan dinonaktifkan</translation> <translation id="6910714959251846841">Update ini memerlukan powerwash perangkat. Pelajari lebih lanjut update <ph name="SYSTEM_APP_NAME" /> terbaru.</translation> <translation id="6919251195245069855">Tidak bisa mengenali kartu smart Anda. Coba lagi.</translation> +<translation id="6945221475159498467">Pilih</translation> <translation id="6972754398087986839">Mulai</translation> <translation id="6981982820502123353">Aksesibilitas</translation> <translation id="698231206551913481">Semua file dan data lokal yang dikaitkan ke pengguna ini akan dihapus secara permanen setelah pengguna ini dihapus.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Jaringan pribadi</translation> <translation id="8152092012181020186">Tekan Ctrl + W untuk menutup.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Setelan ini dikelola oleh administrator Anda.</translation> +<translation id="815598010540052116">Gulir ke Bawah</translation> <translation id="8167567890448493835">Menggunakan <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Sesuaikan bahasa dan masukan...</translation> <translation id="8192202700944119416">Notifikasi disembunyikan.</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index d152f6118..859d50d 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Slökkt á flýtileið</translation> <translation id="6910714959251846841">Þessi uppfærsla krefst þess að þú djúphreinsir tækið þitt. Frekari upplýsingar um nýjustu uppfærslu <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Ekki var hægt að bera kennsl á snjallkortið þitt. Reyndu aftur.</translation> +<translation id="6945221475159498467">Velja</translation> <translation id="6972754398087986839">Byrja</translation> <translation id="6981982820502123353">Aðgengi</translation> <translation id="698231206551913481">Öllum skrám og staðbundnum gögnum sem tengjast notandanum verður varanlega eytt þegar notandinn er fjarlægður.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Einkanet</translation> <translation id="8152092012181020186">Ýttu á Ctrl + W til að loka.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Kerfisstjóri stjórnar þessari stillingu.</translation> +<translation id="815598010540052116">Fletta niður</translation> <translation id="8167567890448493835">Notar <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Sérsníða tungumál og innslátt...</translation> <translation id="8192202700944119416">Tilkynningar eru faldar.</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 9d2b1b92..8c33fe50 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Scorciatoia disattivata</translation> <translation id="6910714959251846841">Questo aggiornamento richiede il powerwash del dispositivo. Leggi ulteriori informazioni sull'ultimo aggiornamento di <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Impossibile riconoscere la smart card. Riprova.</translation> +<translation id="6945221475159498467">Seleziona</translation> <translation id="6972754398087986839">Inizia</translation> <translation id="6981982820502123353">Accessibilità</translation> <translation id="698231206551913481">Tutti i file e i dati locali associati a questo utente verranno eliminati definitivamente in seguito alla rimozione dell'utente.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Rete privata</translation> <translation id="8152092012181020186">Premi CTRL + W per chiudere.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Questa impostazione è gestita dall'amministratore.</translation> +<translation id="815598010540052116">Scorri verso il basso</translation> <translation id="8167567890448493835">In uso: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalizza lingue e immissione...</translation> <translation id="8192202700944119416">Le notifiche sono nascoste.</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index e327a06..b8be0cf8 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">קיצור הדרך מושבת</translation> <translation id="6910714959251846841">כדי להתקין את העדכון הזה צריך לבצע Powerwash של המכשיר. אפשר לקרוא מידע נוסף על העדכון האחרון של <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">לא ניתן היה לזהות את הכרטיס החכם שלך. יש לנסות שוב.</translation> +<translation id="6945221475159498467">בחירה</translation> <translation id="6972754398087986839">תחילת העבודה</translation> <translation id="6981982820502123353">נגישות</translation> <translation id="698231206551913481">כל הקבצים והנתונים המשויכים למשתמש זה יימחקו לצמיתות ברגע שהמשתמש יוסר.</translation> @@ -559,6 +560,7 @@ <translation id="8142699993796781067">רשת פרטית</translation> <translation id="8152092012181020186">כדי לסגור, יש להקיש על Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ההגדרה הזו מנוהלת על-ידי מנהל המערכת שלך.</translation> +<translation id="815598010540052116">גלול למטה</translation> <translation id="8167567890448493835">המיקום הנוכחי הוא<ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">התאם אישית שפה וקלט...</translation> <translation id="8192202700944119416">ההודעות מוסתרות.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index be201deb..c332ca0 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">ショートカットがオフになっています</translation> <translation id="6910714959251846841">このアップデートを適用するにはデバイスで Powerwash を実行する必要があります。<ph name="SYSTEM_APP_NAME" /> の最新アップデートの詳細をご確認ください。</translation> <translation id="6919251195245069855">スマートカードを認識できませんでした。もう一度お試しください。</translation> +<translation id="6945221475159498467">選択</translation> <translation id="6972754398087986839">開始する</translation> <translation id="6981982820502123353">ユーザー補助機能</translation> <translation id="698231206551913481">このユーザーを削除すると、このユーザーに関連付けられているファイルとローカルデータもすべて完全に削除されます。</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">プライベート ネットワーク</translation> <translation id="8152092012181020186">閉じるには Ctrl+W キーを押します。</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> この設定は管理者によって管理されています。</translation> +<translation id="815598010540052116">下にスクロール</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> を使用しています</translation> <translation id="8190698733819146287">言語と入力方法をカスタマイズ...</translation> <translation id="8192202700944119416">通知は非表示になっています。</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index de6971d..7959ce33 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">მალსახმობი გამოირთო</translation> <translation id="6910714959251846841">ეს განახლება საჭიროებს, თქვენს მოწყობილობაზე შესრულდეს Powerwash. შეიტყვეთ მეტი <ph name="SYSTEM_APP_NAME" />-ის ბოლო განახლების შესახებ.</translation> <translation id="6919251195245069855">თქვენი სმარტ-ბარათის ამოცნობა ვერ მოხერხდა. ცადეთ ხელახლა.</translation> +<translation id="6945221475159498467">არჩევა</translation> <translation id="6972754398087986839">დაწყება</translation> <translation id="6981982820502123353">სპეციალური შესაძლებლობები</translation> <translation id="698231206551913481">ამ მომხმარებლის ამოშლის შემდეგ, მასთან დაკავშირებული ყველა ფაილი და ადგილობრივი მონაცემი სამუდამოდ წაიშლება.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">პირადი ქსელი</translation> <translation id="8152092012181020186">დასახურად დააჭირეთ კლავიშთა კომბინაციას: Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ამ პარამეტრს მართავს თქვენი ადმინისტრატორი.</translation> +<translation id="815598010540052116">გადაადგილება ქვემოთ</translation> <translation id="8167567890448493835">გამოიყენება <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">ენების და შეყვანის მორგება…</translation> <translation id="8192202700944119416">შეტყობინებები დამალულია.</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index dce3e9a..4a61b09 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Таңбаша өшірілді</translation> <translation id="6910714959251846841">Бұл жаңартылған нұсқаны орнату үшін құрылғыны зауыттық параметрлерге қайтару қажет. <ph name="SYSTEM_APP_NAME" /> қолданбасының ең жаңа нұсқасы туралы толығырақ.</translation> <translation id="6919251195245069855">Смарт карта анықталмады. Қайталап көріңіз.</translation> +<translation id="6945221475159498467">Таңдау</translation> <translation id="6972754398087986839">Іске кірісу</translation> <translation id="6981982820502123353">Арнайы мүмкіндіктер</translation> <translation id="698231206551913481">Бұл пайдаланушы өшірілгеннен кейін, оған қатысты барлық файлдар және жергілікті деректер біржола жойылады.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Жеке желі</translation> <translation id="8152092012181020186">Жабу үшін Ctrl + W пернелер тіркесімін басыңыз.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Бұл параметрді әкімшіңіз басқарады.</translation> +<translation id="815598010540052116">Төменге айналдыру</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> тілін пайдалану</translation> <translation id="8190698733819146287">Тілдер мен енгізуді реттеу…</translation> <translation id="8192202700944119416">Хабарландырулар жасырулы.</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 4a58ec6..536d58c 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">បានបិទផ្លូវកាត់</translation> <translation id="6910714959251846841">កំណែថ្មីនេះតម្រូវឱ្យ powerwash ឧបករណ៍របស់អ្នក។ ស្វែងយល់បន្ថែមអំពីកំណែ <ph name="SYSTEM_APP_NAME" /> ថ្មីបំផុត។</translation> <translation id="6919251195245069855">មិនស្គាល់កាតឆ្លាតវៃរបស់អ្នកទេ។ សូមព្យាយាមម្ដងទៀត។</translation> +<translation id="6945221475159498467">ជ្រើសរើស</translation> <translation id="6972754398087986839">ចាប់ផ្ដើម</translation> <translation id="6981982820502123353">លទ្ធភាពប្រើប្រាស់</translation> <translation id="698231206551913481">ឯកសារ និងទិន្នន័យមូលដ្ឋានទាំងអស់ដែលប្រើជាមួយអ្នកប្រើនេះនឹងត្រូវបានលុបជាអចិន្ត្រៃយ៍ បន្ទាប់ពីអ្នកប្រើនេះត្រូវបានលុប។</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">បណ្តាញឯកជន</translation> <translation id="8152092012181020186">ចុច Ctrl + W ដើម្បីបិទ។</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ការកំណត់នេះត្រូវបានគ្រប់គ្រងដោយអ្នកគ្រប់គ្រងរបស់អ្នក។</translation> +<translation id="815598010540052116">ទាញចុះក្រោម</translation> <translation id="8167567890448493835">កំពុងប្រើ <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">កែសម្រូលភាសា និងធាតុបញ្ចូល...</translation> <translation id="8192202700944119416">ការជូនដំណឹងត្រូវបានលាក់។</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index ee74772..bbc2da5 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">ಶಾರ್ಟ್ಕಟ್ ಆಫ್ ಆಗಿದೆ</translation> <translation id="6910714959251846841">ಈ ಅಪ್ಡೇಟ್ಗಾಗಿ ನಿಮ್ಮ ಸಾಧನವನ್ನು ಪವರ್ವಾಷ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ. ಇತ್ತೀಚಿನ <ph name="SYSTEM_APP_NAME" /> ಅಪ್ಡೇಟ್ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿದುಕೊಳ್ಳಿ.</translation> <translation id="6919251195245069855">ನಿಮ್ಮ ಸ್ಮಾರ್ಟ್ ಕಾರ್ಡ್ ಅನ್ನು ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> +<translation id="6945221475159498467">ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="6972754398087986839">ಪ್ರಾರಂಭಗೊಂಡಿದೆ</translation> <translation id="6981982820502123353">ಪ್ರವೇಶ</translation> <translation id="698231206551913481">ಒಮ್ಮೆ ಈ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿದಾಗ ಈ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಎಲ್ಲಾ ಫೈಲ್ಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">ಖಾಸಗಿ ನೆಟ್ವರ್ಕ್</translation> <translation id="8152092012181020186">ಮುಚ್ಚಲು Ctrl + W ಒತ್ತಿರಿ.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸುತ್ತಾರೆ.</translation> +<translation id="815598010540052116">ಕೆಳಗೆ ಸ್ಕ್ರೋಲ್ ಮಾಡು</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ಬಳಸಲಾಗುತ್ತಿದೆ</translation> <translation id="8190698733819146287">ಭಾಷೆಗಳು ಮತ್ತು ಇನ್ಪುಟ್ ಅನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಿ...</translation> <translation id="8192202700944119416">ಅಧಿಸೂಚನೆಗಳು ಮರೆಯಾಗಿವೆ.</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index a617dab..49c03d4 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">바로가기 사용 중지됨</translation> <translation id="6910714959251846841">업데이트하려면 기기에서 파워워시를 실행해야 합니다. 최신 <ph name="SYSTEM_APP_NAME" /> 업데이트에 관해 자세히 알아보세요.</translation> <translation id="6919251195245069855">스마트 카드를 인식할 수 없습니다. 다시 시도해 보세요.</translation> +<translation id="6945221475159498467">선택</translation> <translation id="6972754398087986839">시작하기</translation> <translation id="6981982820502123353">접근성</translation> <translation id="698231206551913481">이 사용자를 제거하면 해당 사용자와 연결되어 있는 모든 파일 및 로컬 데이터가 영구적으로 삭제됩니다.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">사설 네트워크</translation> <translation id="8152092012181020186">닫으려면 Ctrl + W를 누릅니다.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> 관리자가 관리하는 설정입니다.</translation> +<translation id="815598010540052116">아래로 스크롤</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> 사용 중</translation> <translation id="8190698733819146287">언어 및 입력 설정...</translation> <translation id="8192202700944119416">알림이 숨겨져 있음</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index f67d965..41f1862 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -213,7 +213,7 @@ <translation id="3513798432020909783">Аккаунтту башкарган: <ph name="MANAGER_EMAIL" /></translation> <translation id="3573179567135747900">Төмөнкүгө кайра өзгөртүү "<ph name="FROM_LOCALE" />" (өчүрүп күйгүзүү керек)</translation> <translation id="3576141592585647168">Убакыт алкагын өзгөртүү</translation> -<translation id="3593646411856133110">Ачылган колдонмолорду көрүү үчүн экранды өйдө сүрүп, коё бербей кармап туруңуз</translation> +<translation id="3593646411856133110">Ачылган колдонмолорду көрүү үчүн, экранды өйдө сүрүп, коё бербей кармап туруңуз</translation> <translation id="3595596368722241419">Батарея толук</translation> <translation id="3604801046548457007"><ph name="DESK_TITILE" /> иш тактасы түзүлдү</translation> <translation id="3606978283550408104">Брайль дисплеи туташты.</translation> @@ -467,6 +467,7 @@ <translation id="6878400149835617132">Ыкчам баскыч өчүрүлдү</translation> <translation id="6910714959251846841">Бул жаңыртууну орнотуу үчүн түзмөгүңүздү жууп салуу талап кылынат. <ph name="SYSTEM_APP_NAME" /> колдонмосундагы акыркы жаңыртуу жөнүндө кененирээк маалымат алуу.</translation> <translation id="6919251195245069855">Акылдуу картаңыз таанылган жок. Кайталап көрүңүз.</translation> +<translation id="6945221475159498467">Тандаңыз</translation> <translation id="6972754398087986839">Баштоо</translation> <translation id="6981982820502123353">Атайын мүмкүнчүлүктөр</translation> <translation id="698231206551913481">Колдонуучуга тийиштүү бардык файлдар менен жергиликтүү дайындар көзөмөлдөнгөн колдонуучу чыгарылып салынганда биротоло жок болот.</translation> @@ -476,7 +477,7 @@ <translation id="703425375924687388"><ph name="QUERY_NAME" />, Google Жардамчы</translation> <translation id="7042322267639375032">Статус аймагын жыйыштыруу</translation> <translation id="7066646422045619941">Бул тармакты администраторуңуз өчүргөн.</translation> -<translation id="7067196344162293536">Авто айлануу</translation> +<translation id="7067196344162293536">Авто буруу</translation> <translation id="7068360136237591149">Файлдарды ачуу</translation> <translation id="7076293881109082629">Кирүү</translation> <translation id="7088960765736518739">Switch Access функциясы</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Жеке тармак</translation> <translation id="8152092012181020186">Жабуу үчүн Ctrl + W баскычтарын басыңыз.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Бул жөндөөнү администраторуңуз башкарат.</translation> +<translation id="815598010540052116">Ылдый сыдыруу</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> колдонулууда</translation> <translation id="8190698733819146287">Тилдерди жана киргизүү ыкмаларын өзгөчөлөштүрүү…</translation> <translation id="8192202700944119416">Билдирмелер жашырылды.</translation> @@ -586,7 +588,7 @@ <translation id="8473301994082929012"><ph name="ORGANIZATION_NAME" /> уюмунун <ph name="FEATURE_NAME" /> функциясы <ph name="FEATURE_STATE" /> абалда.</translation> <translation id="8477270416194247200">Өчүрүп коюу үчүн Alt+Search же Shift баскычтарын басыңыз.</translation> <translation id="8492573885090281069"><ph name="DISPLAY_NAME" /> <ph name="SPECIFIED_RESOLUTION" /> дааналыкты колдоого албайт. Дааналыгы төмөнкүгө өзгөртүлдү: <ph name="FALLBACK_RESOLUTION" />. Өзгөртүүлөрдү сактоо үчүн "Ырастоо" баскычын басыңыз. Мурунку жөндөөлөр <ph name="TIMEOUT_SECONDS" /> кийин калыбына келтирилет.</translation> -<translation id="8513108775083588393">Авто айлануу</translation> +<translation id="8513108775083588393">Авто буруу</translation> <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> түзмөгүңүз өчүп турганда кубатталбай калышы мүмкүн.</translation> <translation id="8563862697512465947">Билдирмелердин жөндөөлөрү</translation> <translation id="8627191004499078455"><ph name="DEVICE_NAME" /> менен туташты</translation> @@ -609,7 +611,7 @@ <translation id="8785070478575117577"><ph name="NETWORK_NAME" /> түзмөгүнө туташуу</translation> <translation id="8788027118671217603"><ph name="STATE_TEXT" />. <ph name="ENTERPRISE_TEXT" /></translation> <translation id="8814190375133053267">Wi-Fi</translation> -<translation id="8825863694328519386">Артка кайтуу үчүн экраныңыздын сол четинен серпип коюңуз</translation> +<translation id="8825863694328519386">Артка кайтуу үчүн, экраныңыздын сол четинен серпип коюңуз</translation> <translation id="8828714802988429505">90°</translation> <translation id="8841375032071747811">Артка баскычы</translation> <translation id="8843682306134542540">Буруу кулпусун өчүрүү/күйгүзүү. <ph name="STATE_TEXT" /></translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 9ea6c73..62954072 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">ປິດທາງລັດແລ້ວ</translation> <translation id="6910714959251846841">ການອັບເດດນີ້ຈຳເປັນຕ້ອງພາວເວີວອຊອຸປະກອນຂອງທ່ານ. ສຶກສາເພີ່ມເຕີມກ່ຽວກັບການອັບເດດ <ph name="SYSTEM_APP_NAME" /> ຫຼ້າສຸດ.</translation> <translation id="6919251195245069855">ບໍ່ສາມາດຮັບຮູ້ບັດອັດສະລິຍະຂອງທ່ານໄດ້. ລອງໃໝ່.</translation> +<translation id="6945221475159498467">ເລືອກ</translation> <translation id="6972754398087986839">ເລີ່ມຕົ້ນ</translation> <translation id="6981982820502123353">ການເຂົ້າເຖິງໄດ້</translation> <translation id="698231206551913481">ທຸກໄຟລ໌ ແລະ ຂໍ້ມູນພາຍໃນເຄື່ອງທີ່ເຊື່ອມໂຍງກັບຜູ້ໃຊ້ນີ້ຈະຖືກລຶບອອກໂດຍຖາວອນເມື່ອລຶບຜູ້ໃຊ້ນີ້ອອກ.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">ເຄືອຂ່າຍສ່ວນຕົວ</translation> <translation id="8152092012181020186">ກົດ Ctrl + W ເພື່ອປິດ.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ການຕັ້ງຄ່ານີ້ຈັດການໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.</translation> +<translation id="815598010540052116">ເລື່ອນລົງ</translation> <translation id="8167567890448493835">ກຳລັງໃຊ້ <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">ກໍານົດພາສາ ແລະການປ້ອນຄ່າເອງ...</translation> <translation id="8192202700944119416">ເຊື່ອງການແຈ້ງເຕືອນໄວ້ແລ້ວ.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index ffc474e..f5011434 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Spartusis klavišas išjungtas</translation> <translation id="6910714959251846841">Norint pritaikyti šį naujinį, reikia naudoti funkciją „Powerwash“ jūsų įrenginyje. Sužinokite daugiau apie naujausią „<ph name="SYSTEM_APP_NAME" />“ naujinį.</translation> <translation id="6919251195245069855">Nepavyko atpažinti išmaniosios kortelės. Bandykite dar kartą.</translation> +<translation id="6945221475159498467">Pasirinkti</translation> <translation id="6972754398087986839">Darbo pradžia</translation> <translation id="6981982820502123353">Pritaikymas neįgaliesiems</translation> <translation id="698231206551913481">Visi failai ir su šiuo naudotoju susiję duomenys bus ištrinti visam laikui, kai šis naudotojas bus pašalintas.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privatus tinklas</translation> <translation id="8152092012181020186">Paspauskite „Ctrl“ + W, kad uždarytumėte.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Šį nustatymą tvarko jūsų administratorius.</translation> +<translation id="815598010540052116">Slinkti žemyn</translation> <translation id="8167567890448493835">Naudojama: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Tinkinti kalbas ir įvestį...</translation> <translation id="8192202700944119416">Pranešimai yra paslėpti.</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 659a9de..83f7c83 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Īsinājumtaustiņš izslēgts</translation> <translation id="6910714959251846841">Lai atjauninātu sistēmu, ierīcē jāizmanto funkcija Powerwash. Uzziniet vairāk par pēdējo <ph name="SYSTEM_APP_NAME" /> atjauninājumu.</translation> <translation id="6919251195245069855">Nevarēja atpazīt jūsu viedkarti. Mēģiniet vēlreiz.</translation> +<translation id="6945221475159498467">Atlasīt</translation> <translation id="6972754398087986839">Sākt darbu</translation> <translation id="6981982820502123353">Pieejamība</translation> <translation id="698231206551913481">Visi faili un lokālie dati, kas ir saistīti ar šo lietotāju, tiks neatgriezeniski dzēsti, tiklīdz šis lietotājs tiks noņemts.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privāts tīkls</translation> <translation id="8152092012181020186">Lai aizvērtu cilnes lapu, vienlaikus nospiediet taustiņus Ctrl un W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Šo iestatījumu pārvalda jūsu administrators.</translation> +<translation id="815598010540052116">Ritināt lejup</translation> <translation id="8167567890448493835">Izmantotā valoda: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Pielāgot valodas un ievadi...</translation> <translation id="8192202700944119416">Paziņojumi ir paslēpti.</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 5515e6f..209c67f 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Кратенката е исклучена</translation> <translation id="6910714959251846841">За ажурирањево потребно е фабричко ресетирање на уредот. Дознајте повеќе за најновото ажурирање на <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Не можевме да ја препознаеме вашата паметна картичка. Обидете се повторно.</translation> +<translation id="6945221475159498467">Избери</translation> <translation id="6972754398087986839">Започни</translation> <translation id="6981982820502123353">Пристапност</translation> <translation id="698231206551913481">Сите датотеки и локални податоци што се поврзани со корисников трајно ќе се избришат по неговото отстранување.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Приватна мрежа</translation> <translation id="8152092012181020186">Притиснете Ctrl + W за да затворите.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Администраторот управува со поставкава.</translation> +<translation id="815598010540052116">Лизгај надолу</translation> <translation id="8167567890448493835">Се користи <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Приспособи јазици и внесување...</translation> <translation id="8192202700944119416">Известувањата се скриени.</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index c7c69a56..75bf172 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">കുറുക്കുവഴി ഓഫാക്കിയിരിക്കുന്നു</translation> <translation id="6910714959251846841">ഈ അപ്ഡേറ്റിനായി നിങ്ങളുടെ ഉപകരണം powerwash ചെയ്യേണ്ടതുണ്ട്. ഏറ്റവും പുതിയ <ph name="SYSTEM_APP_NAME" /> അപ്ഡേറ്റിനെ കുറിച്ച് കൂടുതലറിയുക.</translation> <translation id="6919251195245069855">നിങ്ങളുടെ സ്മാർട്ട് കാർഡ് തിരിച്ചറിയാൻ കഴിഞ്ഞില്ല. വീണ്ടും ശ്രമിക്കൂ.</translation> +<translation id="6945221475159498467">തിരഞ്ഞെടുക്കുക</translation> <translation id="6972754398087986839">ആരംഭിക്കാം</translation> <translation id="6981982820502123353">ഉപയോഗസഹായി</translation> <translation id="698231206551913481">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുമ്പോൾ അതോടൊപ്പം അയാളുമായി ബന്ധപ്പെട്ട എല്ലാ ഫയലുകളും പ്രാദേശിക വിവരങ്ങളും ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">സ്വകാര്യ നെറ്റ്വര്ക്ക്</translation> <translation id="8152092012181020186">അടയ്ക്കാൻ Ctrl + W അമർത്തുക.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ഈ ക്രമീകരണം മാനേജ് ചെയ്യുന്നത് നിങ്ങളുടെ അഡ്മിനാണ്.</translation> +<translation id="815598010540052116">താഴേയ്ക്ക് സ്ക്രോൾ ചെയ്യുക</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ഉപയോഗിക്കുന്നു</translation> <translation id="8190698733819146287">ഭാഷകൾ ഇച്ഛാനുസൃതമാക്കി നല്കുക...</translation> <translation id="8192202700944119416">അറിയിപ്പുകൾ അദൃശ്യമാക്കിയിരിക്കുന്നു.</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index 0374d7c..c2d11e5 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Товчлол унтраалттай байна</translation> <translation id="6910714959251846841">Тус шинэчлэлт нь таны төхөөрөмжийг үйлдвэрийн тохиргоонд буцааж оруулахыг шаарддаг. Хамгийн сүүлийн үеийн <ph name="SYSTEM_APP_NAME" /> шинэчлэлтийн талаар нэмэлт мэдээлэл авна уу.</translation> <translation id="6919251195245069855">Таны ухаалаг картыг таньж чадсангүй. Дахин оролдоно уу.</translation> +<translation id="6945221475159498467">Сонгох</translation> <translation id="6972754398087986839">Эхлүүлэх</translation> <translation id="6981982820502123353">Хандалт</translation> <translation id="698231206551913481">Энэ хэрэглэгчийг устгасан тохиолдолд холбоотой бүх файл болон дотоод өгөгдөл нь бүрмөсөн устах болно.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Хувийн сүлжээ</translation> <translation id="8152092012181020186">Хаахын тулд Ctrl + W дээр дарна уу.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Энэ тохиргоог таны администратор удирддаг.</translation> +<translation id="815598010540052116">Доош нь гүйлгэж харах</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" />-г ашиглаж байна</translation> <translation id="8190698733819146287">Хэл болон оролтыг гүйцэтгэх...</translation> <translation id="8192202700944119416">Мэдэгдлийг нуусан.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 4feae69..0864ec8 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">शॉर्टकट बंद केला आहे</translation> <translation id="6910714959251846841">या अपडेटसाठी तुमचे डिव्हाइस Powerwash करणे आवश्यक आहे. <ph name="SYSTEM_APP_NAME" /> च्या नवीनतम अपडेटबाबत अधिक जाणून घ्या.</translation> <translation id="6919251195245069855">तुमचे स्मार्ट कार्ड ओळखू शकलो नाही. पुन्हा प्रयत्न करा.</translation> +<translation id="6945221475159498467">निवडा</translation> <translation id="6972754398087986839">प्रारंभ करा</translation> <translation id="6981982820502123353">ॲक्सेसिबिलिटी</translation> <translation id="698231206551913481">एकदा हा वापरकर्ता काढल्यानंतर या वापरकर्त्याशी संबद्ध सर्व फायली आणि स्थानिक डेटा कायमचा हटवला जाईल.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">खाजगी नेटवर्क</translation> <translation id="8152092012181020186">बंद करण्यासाठी Ctrl + W दाबा.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> हे सेटिंग तुमच्या अॅडमिनिस्ट्रेटरद्वारे व्यवस्थापित केले जाते.</translation> +<translation id="815598010540052116">खाली स्क्रोल करा</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> वापरत आहे</translation> <translation id="8190698733819146287">भाषा आणि इनपुट कस्टमाइझ करा...</translation> <translation id="8192202700944119416">सूचना लपवलेल्या आहेत.</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index e0adcc3..5b731f31 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Pintasan dimatikan</translation> <translation id="6910714959251846841">Kemas kini ini memerlukan powerwash dijalankan pada peranti anda. Ketahui lebih lanjut tentang kemas kini <ph name="SYSTEM_APP_NAME" /> yang terbaharu.</translation> <translation id="6919251195245069855">Tidak dapat mengecam kad pintar anda. Cuba lagi.</translation> +<translation id="6945221475159498467">Pilih</translation> <translation id="6972754398087986839">Bermula</translation> <translation id="6981982820502123353">Kebolehcapaian</translation> <translation id="698231206551913481">Semua fail dan data yang berkaitan dengan pengguna ini akan dipadamkan secara kekal selepas pengguna ini dialih keluar.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Rangkaian persendirian</translation> <translation id="8152092012181020186">Tekan Ctrl + W untuk tutup.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Tetapan ini diurus oleh pentadbir anda.</translation> +<translation id="815598010540052116">Tatal Ke Bawah</translation> <translation id="8167567890448493835">Menggunakan <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Sesuaikan bahasa dan input...</translation> <translation id="8192202700944119416">Pemberitahuan disembunyikan.</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 9f7a2f3..31f1337 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">ဖြတ်လမ်းလင့်ခ်ကို ပိတ်ထားသည်</translation> <translation id="6910714959251846841">ဤအပ်ဒိတ်ကို ထည့်သွင်းရန်အတွက် သင့်စက်ပစ္စည်းကို ရှင်းလင်းရပါမည်။ နောက်ဆုံးထွက် <ph name="SYSTEM_APP_NAME" /> အပ်ဒိတ်အကြောင်း ပိုမိုလေ့လာပါ။</translation> <translation id="6919251195245069855">သင့်အဆင့်မြင့်ကတ်ကို ဖတ်၍မရပါ။ ထပ်စမ်းကြည့်ပါ။</translation> +<translation id="6945221475159498467">ရွေးရန်</translation> <translation id="6972754398087986839">စကြရအောင်</translation> <translation id="6981982820502123353">ရယူအသုံးချနိုင်မှု</translation> <translation id="698231206551913481">ဤအသုံးပြုသူကို ဖယ်ရှားလိုက်သည်နှင့် ၎င်းနှင့်ဆက်စပ်နေသော ဖိုင်များနှင့် စက်တွင်းဒေတာများအားလုံး အပြီးတိုင် ပျက်သွားလိမ့်မည်။</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">ကိုယ်ပိုင် ကွန်ရက်</translation> <translation id="8152092012181020186">ပိတ်ရန် Ctrl + W နှိပ်ပါ။</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ဤဆက်တင်ကို သင့်စီမံခန့်ခွဲသူက စီမံသည်။</translation> +<translation id="815598010540052116">အောက်ကို လှိမ့်ဆင်းရန်</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> အသုံးပြုခြင်း</translation> <translation id="8190698733819146287">ဘာသာစကားများ နှင့် ရိုက်သွင်းမှုကို စိတ်ကြိုက် လုပ်ယူရန်...</translation> <translation id="8192202700944119416">အကြောင်းကြားချက်များကို ဝှက်ထားသည်။</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 0ec4bcd..9ddf2999 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -55,6 +55,7 @@ <translation id="1550523713251050646">थप विकल्पहरूका लागि क्लिक गर्नुहोस्</translation> <translation id="1570871743947603115">ब्लुटुथ टगल गर्नुहोस्। <ph name="STATE_TEXT" /></translation> <translation id="1589090746204042747">यो सत्रअन्तर्गतका आफ्ना सबै क्रियाकलापमाथि पहुँच राख्नुहोस्</translation> +<translation id="1632985212731562677">सेटिङ > पहुँचमा गएर स्विचमार्फत पहुँच राख्ने सुविधा असक्षम पार्न सकिन्छ।</translation> <translation id="1654477262762802994">आवाजमार्फत गरिने क्वेरी सुरु गर्नुहोस्</translation> <translation id="1658406695958299976">माफ गर्नुहोस्, तपाईंको पासवर्ड अझै प्रमाणित गर्न सकिएन। टिपोट: तपाईंले हालसालै आफ्नो पासवर्ड परिवर्तन गर्नुभएको खण्डमा तपाईं साइन आउट हुनेबित्तिकै तपाईंको नयाँ पासवर्ड लागू हुनेछ, कृपया यहाँ पुरानै पासवर्ड प्रयोग गर्नुहोस्।</translation> <translation id="1677472565718498478"><ph name="TIME" /> बाँकी छ</translation> @@ -181,6 +182,7 @@ <translation id="3154351730702813399">यन्त्रको प्रशासकले तपाईंको ब्राउजिङ सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।</translation> <translation id="3181441307743005334">पुन: सुरु हुन केही बेर लाग्छ</translation> <translation id="3202010236269062730">{NUM_DEVICES,plural, =1{एउटा यन्त्रमा जोडियो}other{# यन्त्रहरूमा जोडियो}}</translation> +<translation id="3203405173652969239">स्विचमार्फत पहुँच राख्ने सुविधा सक्षम पारियो</translation> <translation id="3207953481422525583">प्रयोगकर्ताका सेटिङहरू</translation> <translation id="3217205077783620295">भोल्युम सक्रिय छ, टगल गर्नुले अडियो म्युट गर्ने छ।</translation> <translation id="3226991577105957773">+<ph name="COUNT" /> थप</translation> @@ -410,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: सक्रिय गर्दै...</translation> <translation id="6283712521836204486">बाधा नपुर्याउनुहोस् नामक मोड निष्क्रिय छ।</translation> <translation id="6284232397434400372">रिजोल्युसन परिवर्तन गरियो</translation> +<translation id="6288235558961782912">अभिभावकको अनुमति लिएर <ph name="USER_EMAIL_ADDRESS" /> पछि पुनः थप्न सकिन्छ।</translation> <translation id="6297287540776456956">कुनै क्षेत्रलाई चयन गर्न स्टाइलसको प्रयोग गर्नुहोस्</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> लाई <ph name="ROTATION" /> मा घुमाइएको थियो</translation> <translation id="6376931439017688372">ब्लुटुथ सक्रिय छ</translation> @@ -464,6 +467,7 @@ <translation id="6878400149835617132">सर्टकट निष्क्रिय पारियो</translation> <translation id="6910714959251846841">यस अद्यावधिका लागि तपाईंको यन्त्र पावरवास गर्नु पर्ने हुन्छ। <ph name="SYSTEM_APP_NAME" /> को पछिल्लो अद्यावधिकबारे थप जान्नुहोस्।</translation> <translation id="6919251195245069855">तपाईंको स्मार्ट कार्ड पहिचान गर्न सकिएन। फेरि प्रयास गर्नुहोस्।</translation> +<translation id="6945221475159498467">चयन गर्नुहोस्</translation> <translation id="6972754398087986839">सुरु गर्नुहोस्</translation> <translation id="6981982820502123353">पहुँच</translation> <translation id="698231206551913481">एक पटक यस प्रयोगकर्तालाई मेटाइएपछि यस प्रयोगकर्तासँग सम्बन्धित सबै फाइलहरू र स्थानीय डेटा सदाका लागि मेटिनेछन्।</translation> @@ -554,6 +558,7 @@ <translation id="8142699993796781067">निजी नेटवर्क</translation> <translation id="8152092012181020186">बन्द गर्न Ctrl + W थिच्नुहोस्।</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> तपाईंका प्रशासक यो सेटिङ मिलाउनुहुन्छ।</translation> +<translation id="815598010540052116">तलतिर स्क्रोल गर्नुहोस्</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> प्रयोग गर्दै</translation> <translation id="8190698733819146287">भाषा तथा इन्पुट आफू अनुकूल गर्नुहोस् ...</translation> <translation id="8192202700944119416">सूचनाहरू लुकाइन्छन्।</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 72f4559..1555f08 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Snelkoppeling uitgeschakeld</translation> <translation id="6910714959251846841">Deze update vereist een powerwash van je apparaat. Meer informatie over de laatste update van <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Je smartkaart wordt niet herkend. Probeer het opnieuw.</translation> +<translation id="6945221475159498467">Selecteren</translation> <translation id="6972754398087986839">Aan de slag</translation> <translation id="6981982820502123353">Toegankelijkheid</translation> <translation id="698231206551913481">Alle bestanden en lokale gegevens die zijn gekoppeld aan deze gebruiker, worden definitief verwijderd zodra deze gebruiker is verwijderd.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privénetwerk</translation> <translation id="8152092012181020186">Druk op Ctrl + W om te sluiten.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Deze instelling wordt beheerd door je beheerder.</translation> +<translation id="815598010540052116">Omlaag bladeren</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> in gebruik</translation> <translation id="8190698733819146287">Talen en invoer aanpassen...</translation> <translation id="8192202700944119416">Meldingen zijn verborgen.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 399f863e..b546b062 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Snarveien er avslått</translation> <translation id="6910714959251846841">Denne oppdateringen krever en powerwash av enheten din. Finn ut mer om den nyeste <ph name="SYSTEM_APP_NAME" />-oppdateringen.</translation> <translation id="6919251195245069855">Smartkortet ditt ble ikke gjenkjent. Prøv på nytt.</translation> +<translation id="6945221475159498467">Velg</translation> <translation id="6972754398087986839">Kom i gang</translation> <translation id="6981982820502123353">Tilgjengelighet</translation> <translation id="698231206551913481">Alle filer og lokale data som er tilknyttet denne brukeren, slettes permanent når brukeren fjernes.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privat nettverk</translation> <translation id="8152092012181020186">Trykk på Ctrl + W for å lukke.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Denne innstillingen administreres av administratoren.</translation> +<translation id="815598010540052116">Rull ned</translation> <translation id="8167567890448493835">Bruker <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Tilpass språk og inndata</translation> <translation id="8192202700944119416">Varsler er skjult.</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 6fa2fdb..95b5ef3 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">ସର୍ଟକଟ୍ ବନ୍ଦ କରାଯାଇଛି</translation> <translation id="6910714959251846841">ଏହି ଅପ୍ଡେଟ୍ ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ପାୱାର୍ୱାସ୍ ଦେବାକୁ ଆବଶ୍ୟକ କରେ। ନବୀନତମ <ph name="SYSTEM_APP_NAME" /> ଅପ୍ଡେଟ୍ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ।</translation> <translation id="6919251195245069855">ଆପଣଙ୍କର ସ୍ମାର୍ଟ କାର୍ଡକୁ ଚିହ୍ନଟ କରିପାରୁ ନାହିଁ। ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> +<translation id="6945221475159498467">ଚୟନ କରନ୍ତୁ</translation> <translation id="6972754398087986839">ଆରମ୍ଭ କରନ୍ତୁ</translation> <translation id="6981982820502123353">ଆକ୍ସେସିବିଲିଟୀ</translation> <translation id="698231206551913481">ଥରେ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ କାଢ଼ିଦେବା ପରେ, ତାଙ୍କର ସମସ୍ତ ଫାଇଲ୍ ଓ ସ୍ଥାନୀୟ ଡାଟାକୁ ସ୍ଥାୟୀ ଭାବେ ଡିଲିଟ୍ କରିଦିଆଯିବ।</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">ବ୍ୟକ୍ତିଗତ ନେଟ୍ୱର୍କ</translation> <translation id="8152092012181020186">ବନ୍ଦ କରିବାକୁ Ctrl + W ଦବାନ୍ତୁ।</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ଏହି ସେଟିଂ ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ଦ୍ୱାରା ପରିଚାଳିତ ହୁଏ।</translation> +<translation id="815598010540052116">ତଳକୁ ସ୍କ୍ରୋଲ କରନ୍ତୁ</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" />କୁ ବ୍ୟବହାର କରାଯାଉଛି</translation> <translation id="8190698733819146287">ଭାଷାଗୁଡ଼ିକୁ ଏବଂ ଇନ୍ପୁଟ୍କୁ କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ...</translation> <translation id="8192202700944119416">ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ଲୁଚାଯାଇଛି।</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index e2057fa..dad4a1e 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">ਸ਼ਾਰਟਕੱਟ ਬੰਦ ਹੈ</translation> <translation id="6910714959251846841">ਇਸ ਅੱਪਡੇਟ ਲਈ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਪਾਵਰਵਾਸ਼ ਕੀਤੇ ਜਾਣ ਦੀ ਲੋੜ ਹੈ। ਨਵੀਨਤਮ <ph name="SYSTEM_APP_NAME" /> ਅੱਪਡੇਟ ਬਾਰੇ ਹੋਰ ਜਾਣੋ।</translation> <translation id="6919251195245069855">ਤੁਹਾਡਾ ਸਮਾਰਟ ਕਾਰਡ ਪਛਾਣਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> +<translation id="6945221475159498467">ਚੁਣੋ</translation> <translation id="6972754398087986839">ਸ਼ੁਰੂ ਕੀਤਾ</translation> <translation id="6981982820502123353">ਪਹੁੰਚਯੋਗਤਾ</translation> <translation id="698231206551913481">ਇਸ ਵਰਤੋਂਕਾਰ ਦੇ ਹਟਾਏ ਜਾਣ ਤੋਂ ਬਾਅਦ ਇਸ ਵਰਤੋਂਕਾਰ ਨਾਲ ਸਬੰਧਿਤ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਅਤੇ ਸਥਾਨਕ ਡਾਟੇ ਨੂੰ ਸਥਾਈ ਤੌਰ 'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">ਨਿੱਜੀ ਨੈੱਟਵਰਕ</translation> <translation id="8152092012181020186">ਬੰਦ ਕਰਨ ਲਈ Ctrl + W ਦਬਾਓ।</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਇਸ ਸੈਟਿੰਗ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ।</translation> +<translation id="815598010540052116">ਸਕ੍ਰੌਲ ਡਾਊਨ</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ਦੀ ਵਰਤੋਂ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> <translation id="8190698733819146287">ਭਾਸ਼ਾਵਾਂ ਅਤੇ ਇਨਪੁਟ ਨੂੰ ਵਿਉਂਤਬੱਧ ਕਰੋ...</translation> <translation id="8192202700944119416">ਸੂਚਨਾਵਾਂ ਲੁਕੀਆਂ ਹੋਈਆਂ ਹਨ।</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 8fad1aa..da7cfe5 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Skrót wyłączony</translation> <translation id="6910714959251846841">Ta aktualizacja wymaga usunięcia wszystkich danych z urządzenia za pomocą funkcji Powerwash. Dowiedz się więcej o najnowszej aktualizacji <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Nie udało się rozpoznać karty elektronicznej. Spróbuj ponownie.</translation> +<translation id="6945221475159498467">Wybierz</translation> <translation id="6972754398087986839">Rozpocznij</translation> <translation id="6981982820502123353">Ułatwienia dostępu</translation> <translation id="698231206551913481">Usunięcie tego użytkownika spowoduje trwałe usunięcie wszystkich związanych z nim plików i danych lokalnych.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Sieć prywatna</translation> <translation id="8152092012181020186">Aby zamknąć, naciśnij CTRL + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> – tym ustawieniem zarządza Twój administrator.</translation> +<translation id="815598010540052116">Przewiń w dół</translation> <translation id="8167567890448493835">W użyciu jest: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Dostosuj języki i metody wprowadzania...</translation> <translation id="8192202700944119416">Powiadomienia są ukryte.</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 1520a71..d2fe9c1 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -413,7 +413,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: Ativando...</translation> <translation id="6283712521836204486">O "Não perturbe" está desativado.</translation> <translation id="6284232397434400372">Resolução alterada</translation> -<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> pode ser adicionado novamente com a permissão de um pai/mãe.</translation> +<translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> pode ser adicionado novamente com a permissão do pai/mãe.</translation> <translation id="6297287540776456956">Use a stylus para selecionar uma região</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> foi substituída por <ph name="ROTATION" /></translation> <translation id="6376931439017688372">Bluetooth ativado</translation> @@ -468,6 +468,7 @@ <translation id="6878400149835617132">Atalho desativado</translation> <translation id="6910714959251846841">Esta atualização requer o powerwash do seu dispositivo. Saiba mais sobre a última atualização do <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Não foi possível reconhecer seu cartão inteligente. Tente novamente.</translation> +<translation id="6945221475159498467">Selecionar</translation> <translation id="6972754398087986839">Primeiros passos</translation> <translation id="6981982820502123353">Acessibilidade</translation> <translation id="698231206551913481">Todos os arquivos e dados locais associados a este usuário serão excluídos permanentemente quando o usuário for removido.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Rede privada</translation> <translation id="8152092012181020186">Pressione Ctrl + W para fechar.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Essas configurações são gerenciadas pelo administrador.</translation> +<translation id="815598010540052116">Percorrer para baixo</translation> <translation id="8167567890448493835">Usando <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalizar idiomas e entrada...</translation> <translation id="8192202700944119416">As notificações estão ocultas.</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 0cabe9769..364b323f 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Atalho desativado</translation> <translation id="6910714959251846841">Para efetuar esta atualização, é necessário efetuar o Powerwash do dispositivo. Saiba mais sobre a mais recente atualização do <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Não foi possível reconhecer o seu cartão inteligente. Tente novamente.</translation> +<translation id="6945221475159498467">Selecionar</translation> <translation id="6972754398087986839">Começar</translation> <translation id="6981982820502123353">Acessibilidade</translation> <translation id="698231206551913481">Todos os ficheiros e dados locais associados a este utilizador são permanentemente eliminados assim que este utilizador é removido.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Rede privada</translation> <translation id="8152092012181020186">Prima Ctrl + W para fechar.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Esta definição é gerida pelo seu administrador.</translation> +<translation id="815598010540052116">Deslocar-se para baixo</translation> <translation id="8167567890448493835">A utilizar <ph name="LOCALE_NAME" />...</translation> <translation id="8190698733819146287">Personalizar idiomas e introdução...</translation> <translation id="8192202700944119416">As notificações estão ocultas.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index d73e7a2..7fc0010 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Comanda rapidă a fost dezactivată</translation> <translation id="6910714959251846841">Această actualizare necesită rularea funcției Powerwash a dispozitivului. Află mai multe despre cea mai recentă actualizare <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Nu s-a recunoscut cardul inteligent. Încearcă din nou.</translation> +<translation id="6945221475159498467">Selectează</translation> <translation id="6972754398087986839">Începe</translation> <translation id="6981982820502123353">Accesibilitate</translation> <translation id="698231206551913481">Toate fișierele și datele locale asociate acestui utilizator vor fi șterse definitiv după eliminarea utilizatorului.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Rețea privată</translation> <translation id="8152092012181020186">Apasă Ctrl + W pentru a închide.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Această setare este gestionată de administrator.</translation> +<translation id="815598010540052116">Derulează în jos</translation> <translation id="8167567890448493835">Se folosește <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalizează limbile și modul de introducere...</translation> <translation id="8192202700944119416">Notificările sunt ascunse.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index f6656308..d83e6ea 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Быстрые клавиши отключены</translation> <translation id="6910714959251846841">Чтобы установить это обновление, необходимо сбросить настройки устройства до заводских. Подробнее о последнем обновлении <ph name="SYSTEM_APP_NAME" />…</translation> <translation id="6919251195245069855">Не удалось распознать смарт-карту. Повторите попытку.</translation> +<translation id="6945221475159498467">Выбрать</translation> <translation id="6972754398087986839">Начать</translation> <translation id="6981982820502123353">Специальные возможности</translation> <translation id="698231206551913481">После удаления пользователя все связанные с ним файлы и локальные данные также будут удалены.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Частные сети</translation> <translation id="8152092012181020186">Нажмите Ctrl + W, чтобы закрыть вкладку.</translation> <translation id="8155007568264258537">Функцией "<ph name="FEATURE_NAME" />" управляет администратор.</translation> +<translation id="815598010540052116">Прокрутка вниз</translation> <translation id="8167567890448493835">Используемый язык: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Настройки языков и ввода…</translation> <translation id="8192202700944119416">Уведомления скрыты</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index b508e7a..9c1dece 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">කෙටිමඟ අක්රියයි</translation> <translation id="6910714959251846841">මෙම යාවත්කාලීන කිරීම සඳහා ඔබේ උපාංගය බල ගැන්වීම අවශ්යය. <ph name="SYSTEM_APP_NAME" /> යාවත්කාලීන කිරීම ගැන නවතම තොරතුරු දැන ගන්න.</translation> <translation id="6919251195245069855">ඔබේ ස්මාර්ට් කාඩ්පත හඳුනා ගැනීමට නොහැකි විය. නැවත උත්සාහ කරන්න.</translation> +<translation id="6945221475159498467">තෝරන්න</translation> <translation id="6972754398087986839">අරඹන්න</translation> <translation id="6981982820502123353">පිවිසුම් සහාය</translation> <translation id="698231206551913481">මෙම පරිශීලකයා ඉවත් කළ විට මෙම පරිශීලක හා සම්බන්ධිත සියලු ගොනු සහ ස්ථානීය දත්ත ස්ථිරවම මකනු ඇත.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">පුද්ගලික ජාලය</translation> <translation id="8152092012181020186">වැසීමට Ctrl + W ඔබන්න.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> මෙම සැකසුම ඔබේ පරිපාලකයා විසින් කළමනා කෙරේ.</translation> +<translation id="815598010540052116">පහළට ස්ක්රෝල්</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> භාවිත කිරීම</translation> <translation id="8190698733819146287">භාෂාව සහ යෙදවුම අවශ්ය පරිදි සකසන්න...</translation> <translation id="8192202700944119416">දැනුම්දීම් සැඟවී ඇත.</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 150ddd00..42a1ac9e 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Skratka je vypnutá</translation> <translation id="6910714959251846841">Táto aktualizácia vyžaduje vykonať v zariadení obnovenie Powerwash. Prečítajte si ďalšie informácie o najnovšej aktualizácii aplikácie <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Inteligentnú kartu sa nepodarilo rozpoznať. Skúste to znova.</translation> +<translation id="6945221475159498467">Vybrať</translation> <translation id="6972754398087986839">Začať</translation> <translation id="6981982820502123353">Dostupnosť</translation> <translation id="698231206551913481">Všetky súbory a miestne údaje priradené k tomuto používateľovi budú po jeho odstránení natrvalo vymazané.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Súkromná sieť</translation> <translation id="8152092012181020186">Zavriete stlačením kombinácie klávesov Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Toto nastavenie ovláda váš správca.</translation> +<translation id="815598010540052116">Rolovať nadol</translation> <translation id="8167567890448493835">Práve sa používa <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Prebieha prispôsobenie jazykov a vstupu...</translation> <translation id="8192202700944119416">Upozornenia sú skryté.</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index cf4f116..505d75f1 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Bližnjica je izklopljena</translation> <translation id="6910714959251846841">Pred namestitvijo te posodobitve morate uporabiti funkcijo Powerwash. Preberite več o najnovejši posodobitvi za <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Pametne kartice ni bilo mogoče prepoznati. Poskusite znova.</translation> +<translation id="6945221475159498467">Izberi</translation> <translation id="6972754398087986839">Začnite</translation> <translation id="6981982820502123353">Dostopnost</translation> <translation id="698231206551913481">Vse datoteke in lokalni podatki, povezani s tem uporabnikom, bodo trajno izbrisani, ko odstranite uporabnika.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Zasebno omrežje</translation> <translation id="8152092012181020186">Pritisnite Ctrl + W, če ga želite zapreti.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> To nastavitev upravlja skrbnik.</translation> +<translation id="815598010540052116">Pomik dol</translation> <translation id="8167567890448493835">Uporaba jezika <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Prilagajanje jezikov in vnosa ...</translation> <translation id="8192202700944119416">Obvestila so skrita.</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index 91d412d..5b2b2e0 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Shkurtorja është çaktivizuar</translation> <translation id="6910714959251846841">Ky përditësim kërkon spastrim rrënjësor të pajisjes tënde. Mëso më shumë për përditësimin e fundit të <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Karta inteligjente nuk mund të njihej. Provo përsëri.</translation> +<translation id="6945221475159498467">Përzgjidhe</translation> <translation id="6972754398087986839">Fillo</translation> <translation id="6981982820502123353">Qasja</translation> <translation id="698231206551913481">Të gjithë skedarët dhe të dhënat lokale të lidhura me këtë përdorues do të fshihen përgjithmonë pasi të hiqet ky përdorues.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Rrjet privat</translation> <translation id="8152092012181020186">Shtyp Ctrl + W për ta mbyllur</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Ky cilësim menaxhohet nga administratori yt.</translation> +<translation id="815598010540052116">Lëviz poshtë</translation> <translation id="8167567890448493835">Po përdor <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Personalizo gjuhët dhe hyrjen...</translation> <translation id="8192202700944119416">Njoftimet janë të fshehura.</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 16a4a9f..e48545b 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Prečica je isključena</translation> <translation id="6910714959251846841">Ovo ažuriranje zahteva da obavite powerwash na uređaju. Saznajte više o najnovijem ažuriranju za: <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Nismo uspeli da prepoznamo pametnu karticu. Probajte ponovo.</translation> +<translation id="6945221475159498467">Izaberi</translation> <translation id="6972754398087986839">Započnimo</translation> <translation id="6981982820502123353">Pristupačnost</translation> <translation id="698231206551913481">Sve datoteke i lokalni podaci povezani sa ovim korisnikom će biti trajno izbrisani kada uklonite ovog korisnika.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privatna mreža</translation> <translation id="8152092012181020186">Pritisnite Ctrl + W da biste zatvorili.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Ovim podešavanjem upravlja administrator.</translation> +<translation id="815598010540052116">Pomeri nadole</translation> <translation id="8167567890448493835">Koristi se <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Prilagodi jezike i unos...</translation> <translation id="8192202700944119416">Obaveštenja su sakrivena.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 5dacfaa..7532837 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Пречица је искључена</translation> <translation id="6910714959251846841">Ово ажурирање захтева да обавите powerwash на уређају. Сазнајте више о најновијем ажурирању за: <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Нисмо успели да препознамо паметну картицу. Пробајте поново.</translation> +<translation id="6945221475159498467">Изабери</translation> <translation id="6972754398087986839">Започнимо</translation> <translation id="6981982820502123353">Приступачност</translation> <translation id="698231206551913481">Све датотеке и локални подаци повезани са овим корисником ће бити трајно избрисани када уклоните овог корисника.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Приватна мрежа</translation> <translation id="8152092012181020186">Притисните Ctrl + W да бисте затворили.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Овим подешавањем управља администратор.</translation> +<translation id="815598010540052116">Помери надоле</translation> <translation id="8167567890448493835">Користи се <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Прилагоди језике и унос...</translation> <translation id="8192202700944119416">Обавештења су сакривена.</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index a7cedf5..e82099a 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Kortkommandot har inaktiverats.</translation> <translation id="6910714959251846841">Den här uppdateringen kräver att en Powerwash görs av enheten. Läs mer om den senaste uppdateringen av <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Det smarta kortet kändes inte igen. Försök igen.</translation> +<translation id="6945221475159498467">Välj</translation> <translation id="6972754398087986839">Komma igång</translation> <translation id="6981982820502123353">Tillgänglighet</translation> <translation id="698231206551913481">Alla filer inklusive lokal data som tillhör den här användaren tas bort permanent när användaren tas bort.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Privat nätverk</translation> <translation id="8152092012181020186">Stäng genom att trycka på Ctrl. + W</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Den här inställningen hanteras av administratören.</translation> +<translation id="815598010540052116">Rulla nedåt</translation> <translation id="8167567890448493835">Använder <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Anpassa språk och inmatning...</translation> <translation id="8192202700944119416">Aviseringar har dolts.</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 2dc65f1b..23099586 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Njia ya mkato imezimwa</translation> <translation id="6910714959251846841">Sasisho hili linahitaji powerwash kwenye kifaa chako. Pata maelezo zaidi kuhusu sasisho jipya la <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Imeshindwa kutambua kadi yako mahiri. Jaribu tena.</translation> +<translation id="6945221475159498467">Chagua</translation> <translation id="6972754398087986839">Anza</translation> <translation id="6981982820502123353">Upatikanaji</translation> <translation id="698231206551913481">Faili na data zote zilizo kwenye kifaa zinazohusishwa na mtumiaji zitafutwa kabisa pindi tu mtumiaji huyu atakapoondolewa.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Mtandao binafsi</translation> <translation id="8152092012181020186">Bonyeza Ctrl + W ili ufunge.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Mipangilio hii inadhibitiwa na msimamizi wako.</translation> +<translation id="815598010540052116">Sogeza Chini</translation> <translation id="8167567890448493835">Unatumia <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Geuza lugha na uingizaji kukufaa...</translation> <translation id="8192202700944119416">Arifa zimefichwa.</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 3d37b38..3e940bd 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">ஷார்ட்கட் முடக்கப்பட்டுள்ளது</translation> <translation id="6910714959251846841">இந்தப் புதுப்பிப்பைப் பெற, உங்கள் சாதனத்தைப் பவர்வாஷ் செய்ய வேண்டும். சமீபத்திய <ph name="SYSTEM_APP_NAME" /> புதுப்பிப்பைப் பற்றி மேலும் அறிக.</translation> <translation id="6919251195245069855">உங்கள் ஸ்மார்ட் கார்டை அடையாளம் காண முடியவில்லை. மீண்டும் முயலவும்.</translation> +<translation id="6945221475159498467">தேர்ந்தெடு</translation> <translation id="6972754398087986839">தொடங்குக</translation> <translation id="6981982820502123353">அணுகல் தன்மை</translation> <translation id="698231206551913481">இந்தப் பயனர் அகற்றப்பட்டதும், பயனருடன் தொடர்புடைய எல்லா கோப்புகளும் அகத் தரவும் நிரந்தரமாக நீக்கப்படும்.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">தனிப்பட்ட நெட்வொர்க்</translation> <translation id="8152092012181020186">மூடுவதற்கு Ctrl + W விசைகளை அழுத்தவும்.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> உங்கள் நிர்வாகி இந்த அமைப்பை நிர்வகிக்கிறார்.</translation> +<translation id="815598010540052116">கீழே நகர்த்து</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" />ஐப் பயன்படுத்துகிறது</translation> <translation id="8190698733819146287">மொழிகள் மற்றும் உள்ளீடைப் பிரத்தியேகமாக்கு...</translation> <translation id="8192202700944119416">அறிவிப்புகள் மறைக்கப்பட்டுள்ளன.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index ba152476..3dfc343 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">షార్ట్కట్ ఆఫ్ చేయబడింది</translation> <translation id="6910714959251846841">ఈ అప్డేట్ కోసం మీ పరికరాన్ని పవర్వాష్ చేయాలి. తాజా <ph name="SYSTEM_APP_NAME" /> అప్డేట్ గురించి మరింత తెలుసుకోండి.</translation> <translation id="6919251195245069855">మీ స్మార్ట్ కార్డ్ను గుర్తించడం సాధ్యం కాలేదు. మళ్ళీ ప్రయత్నించండి.</translation> +<translation id="6945221475159498467">ఎంచుకోండి</translation> <translation id="6972754398087986839">ప్రారంభించండి</translation> <translation id="6981982820502123353">యాక్సెస్</translation> <translation id="698231206551913481">ఈ వినియోగదారును తీసివేసిన తర్వాత ఈ వినియోగదారుతో అనుబంధించిన అన్ని ఫైల్లు మరియు స్థానిక డేటా శాశ్వతంగా తొలగించబడతాయి.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">ప్రైవేట్ నెట్వర్క్</translation> <translation id="8152092012181020186">మూసివేయడానికి Ctrl + W నొక్కండి.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> ఈ సెట్టింగ్ మీ నిర్వాహకుడి ద్వారా నిర్వహించబడుతుంది.</translation> +<translation id="815598010540052116">కిందికి స్క్రోల్ చేయి</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" />ని ఉపయోగిస్తోంది</translation> <translation id="8190698733819146287">భాషలు మరియు ఇన్పుట్ పద్ధతిని అనుకూలీకరించండి...</translation> <translation id="8192202700944119416">నోటిఫికేషన్లు దాచబడ్డాయి.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 430e24e..0096073 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">ทางลัดปิดอยู่</translation> <translation id="6910714959251846841">อัปเดตนี้จะมีการ Powerwash อุปกรณ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับอัปเดตล่าสุดของ <ph name="SYSTEM_APP_NAME" /></translation> <translation id="6919251195245069855">ไม่พบสมาร์ทการ์ดของคุณ ลองใหม่</translation> +<translation id="6945221475159498467">เลือก</translation> <translation id="6972754398087986839">เริ่มต้นใช้งาน</translation> <translation id="6981982820502123353">การเข้าถึง</translation> <translation id="698231206551913481">ระบบจะลบไฟล์ทั้งหมดและข้อมูลในเครื่องที่เชื่อมโยงกับผู้ใช้รายนี้ออกอย่างถาวรหลังจากนำผู้ใช้รายนี้ออกแล้ว</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">เครือข่ายส่วนบุคคล</translation> <translation id="8152092012181020186">กด Ctrl + W เพื่อปิด</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> การตั้งค่านี้จัดการโดยผู้ดูแลระบบ</translation> +<translation id="815598010540052116">เลื่อนลง</translation> <translation id="8167567890448493835">กำลังใช้<ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">กำหนดค่าภาษาและการป้อนข้อมูล... </translation> <translation id="8192202700944119416">ซ่อนการแจ้งเตือนไว้</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 1bf4172..49a1e6e 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -468,6 +468,7 @@ <translation id="6878400149835617132">Kısayol kapalı</translation> <translation id="6910714959251846841">Bu güncelleme, cihazınızda powerwash işlemi yapılmasını gerektiriyor. En yeni <ph name="SYSTEM_APP_NAME" /> güncellemesi ile ilgili daha fazla bilgi edinin.</translation> <translation id="6919251195245069855">Akıllı kartınız tanınamadı. Tekrar deneyin.</translation> +<translation id="6945221475159498467">Seç</translation> <translation id="6972754398087986839">Başlarken</translation> <translation id="6981982820502123353">Erişilebilirlik</translation> <translation id="698231206551913481">Bu kullanıcıyla ilişkilendirilen tüm dosyalar ve yerel veriler, bu kullanıcı kaldırıldıktan sonra kalıcı olarak silinir.</translation> @@ -558,6 +559,7 @@ <translation id="8142699993796781067">Özel ağ</translation> <translation id="8152092012181020186">Kapatmak için Ctrl + W tuşlarına basın.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Bu ayar, yöneticiniz tarafından yönetilir.</translation> +<translation id="815598010540052116">Aşağı Kaydır</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> kullanılıyor</translation> <translation id="8190698733819146287">Dilleri ve girişi özelleştir...</translation> <translation id="8192202700944119416">Bildirimler gizlendi.</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index ed4bb08..8489763 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Комбінацію клавіш вимкнено</translation> <translation id="6910714959251846841">Для цього оновлення потрібно виконати Powerwash на пристрої. Докладніше про останнє оновлення додатка <ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Не вдається розпізнати розумну картку. Повторіть спробу.</translation> +<translation id="6945221475159498467">Вибрати</translation> <translation id="6972754398087986839">Почати</translation> <translation id="6981982820502123353">Доступність</translation> <translation id="698231206551913481">Якщо видалити цього користувача, усі файли та локальні дані, зв’язані з ним, буде видалено назавжди.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Приватна мережа</translation> <translation id="8152092012181020186">Щоб закрити вкладку, натисніть Ctrl + W.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Цим налаштуванням керує адміністратор.</translation> +<translation id="815598010540052116">Прокрутка вниз</translation> <translation id="8167567890448493835">Використовується: <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Налаштувати мови та введення тексту...</translation> <translation id="8192202700944119416">Сповіщення сховано.</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 77976b9..7268213 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">شارٹ کٹ آف ہے</translation> <translation id="6910714959251846841">اس اپ ڈیٹ کیلئے آپ کے آلے کی پاور واشنگ درکار ہے۔ تازہ ترین <ph name="SYSTEM_APP_NAME" /> اپ ڈیٹ کے بارے میں مزید جانیں۔</translation> <translation id="6919251195245069855">آپ کے اسمارٹ کارڈ کی شناخت نہیں کی جا سکی۔ پھر آزمائيں۔</translation> +<translation id="6945221475159498467">منتخب کریں</translation> <translation id="6972754398087986839">شروع کریں</translation> <translation id="6981982820502123353">ایکسیسبیلٹی</translation> <translation id="698231206551913481">اس صارف کو ہٹانے کے بعد اس صارف کے ساتھ وابستہ سبھی فائلیں اور مقامی ڈیٹا کو مستقل طور پر حذف کر دیا جائے گا۔</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">نجی نیٹ ورک</translation> <translation id="8152092012181020186">بند کرنے کے لیے Ctrl + W کو دبائیں۔</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> یہ ترتیب آپ کے منتظم کے زیر انتظام ہے۔</translation> +<translation id="815598010540052116">نیچے سکرول کریں</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> استعمال کر کے</translation> <translation id="8190698733819146287">زبانوں اور ان پٹ کو حسب ضرورت بنائیں…</translation> <translation id="8192202700944119416">اطلاعات پوشیدہ ہیں۔</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 855d1fc..a0f3661 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Yorliq yoqilmagan</translation> <translation id="6910714959251846841">Ushbu yangilanish o‘rnatilishi uchun qurilmani zavod sozlamalariga qaytarish zarur. <ph name="SYSTEM_APP_NAME" /> oxirgi yangilanishi haqida batafsil axborot.</translation> <translation id="6919251195245069855">Smart kartangiz aniqlanmadi. Qayta urining.</translation> +<translation id="6945221475159498467">Tanlash</translation> <translation id="6972754398087986839">Boshlash</translation> <translation id="6981982820502123353">Maxsus imkoniyatlar</translation> <translation id="698231206551913481">Bu foydalanuvchiga tegishli barcha fayllar va mahalliy ma’lumotlar foydalanuvchi olib tashlanganda butunlay o‘chib ketadi.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Xususiy tarmoq</translation> <translation id="8152092012181020186">Yopish uchun Ctrl+W tugmalarini bosing.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Bu sozlama administrator tomonidan boshqariladi.</translation> +<translation id="815598010540052116">Pastga o‘tkazish</translation> <translation id="8167567890448493835"><ph name="LOCALE_NAME" /> ishlatilmoqda</translation> <translation id="8190698733819146287">Tillar va kiritish sozlamalari...</translation> <translation id="8192202700944119416">Bildirishnomalar yashirilgan.</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 9b0b034..02594dc 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -412,6 +412,7 @@ <translation id="6267036997247669271"><ph name="NAME" />: Đang kích hoạt...</translation> <translation id="6283712521836204486">Chế độ Không làm phiền đang tắt.</translation> <translation id="6284232397434400372">Đã thay đổi độ phân giải</translation> +<translation id="6288235558961782912">Bạn có thể thêm <ph name="USER_EMAIL_ADDRESS" /> lại sau nếu cha mẹ cho phép.</translation> <translation id="6297287540776456956">Sử dụng bút cảm ứng để chọn một vùng</translation> <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> đã được xoay vòng sang <ph name="ROTATION" /></translation> <translation id="6376931439017688372">Bluetooth đang bật</translation> @@ -466,6 +467,7 @@ <translation id="6878400149835617132">Đã tắt phím tắt</translation> <translation id="6910714959251846841">Bản cập nhật này yêu cầu phải powerwash (đặt lại toàn bộ) thiết bị của bạn. Hãy tìm hiểu thêm về bản cập nhật <ph name="SYSTEM_APP_NAME" /> mới nhất.</translation> <translation id="6919251195245069855">Không nhận dạng được thẻ thông minh của bạn. Vui lòng thử lại.</translation> +<translation id="6945221475159498467">Chọn</translation> <translation id="6972754398087986839">Bắt đầu</translation> <translation id="6981982820502123353">Hỗ trợ tiếp cận</translation> <translation id="698231206551913481">Tất cả các tệp và dữ liệu cục bộ liên quan tới người dùng này sẽ bị xóa vĩnh viễn sau khi người dùng này bị xóa.</translation> @@ -556,6 +558,7 @@ <translation id="8142699993796781067">Mạng riêng</translation> <translation id="8152092012181020186">Nhấn tổ hợp phím Ctrl + W để đóng.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Quản trị viên của bạn quản lý tùy chọn cài đặt này.</translation> +<translation id="815598010540052116">Cuộn Xuống</translation> <translation id="8167567890448493835">Đang dùng <ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Tùy chỉnh ngôn ngữ và dữ liệu nhập...</translation> <translation id="8192202700944119416">Đã ẩn thông báo.</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index 70b65359..fbd7e27 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">快捷方式已关闭</translation> <translation id="6910714959251846841">必须对您的设备执行 Powerwash 才能安装这项更新。详细了解最新的 <ph name="SYSTEM_APP_NAME" />更新。</translation> <translation id="6919251195245069855">无法识别您的智能卡,请重试。</translation> +<translation id="6945221475159498467">选择</translation> <translation id="6972754398087986839">开始使用</translation> <translation id="6981982820502123353">无障碍</translation> <translation id="698231206551913481">移除该用户后,与其关联的所有文件和本地数据都会被永久删除。</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">专用网络</translation> <translation id="8152092012181020186">按 Ctrl + W 即可关闭。</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" />:此设置由您的管理员管理。</translation> +<translation id="815598010540052116">向下滚动</translation> <translation id="8167567890448493835">目前使用的是“<ph name="LOCALE_NAME" />”</translation> <translation id="8190698733819146287">自定义语言和输入法...</translation> <translation id="8192202700944119416">已隐藏通知。</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index cb5de660..dda9646 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">已關閉快速鍵功能</translation> <translation id="6910714959251846841">此更新需要為裝置執行 Powerwash。進一步瞭解有關 <ph name="SYSTEM_APP_NAME" /> 的更新。</translation> <translation id="6919251195245069855">無法辨識智能卡,請再試一次。</translation> +<translation id="6945221475159498467">選取</translation> <translation id="6972754398087986839">開始使用</translation> <translation id="6981982820502123353">協助工具</translation> <translation id="698231206551913481">移除這位使用者後,系統便會永久刪除所有與該使用者相關的檔案和本機數據。</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">私人網絡</translation> <translation id="8152092012181020186">㩒一下 Ctrl + W 就可以閂咗佢。</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" />,呢項設定由管理員管理。</translation> +<translation id="815598010540052116">向下捲動</translation> <translation id="8167567890448493835">正在使用「<ph name="LOCALE_NAME" />」</translation> <translation id="8190698733819146287">自訂語言與輸入法…</translation> <translation id="8192202700944119416">已隱藏通知。</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index b422c3b..71b0f14 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">已關閉快速鍵功能</translation> <translation id="6910714959251846841">必須對你的裝置執行 Powerwash 才能安裝這項更新。進一步瞭解最新的 <ph name="SYSTEM_APP_NAME" />更新內容。</translation> <translation id="6919251195245069855">無法辨識你的智慧型卡片,請再試一次。</translation> +<translation id="6945221475159498467">選取</translation> <translation id="6972754398087986839">開始使用</translation> <translation id="6981982820502123353">無障礙設定</translation> <translation id="698231206551913481">將這位使用者移除後,與這位使用者相關聯的所有檔案和本機資料都會遭到永久刪除。</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">私人網路</translation> <translation id="8152092012181020186">按下 Ctrl + W 即可關閉。</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> 這項設定是由系統管理員管理。</translation> +<translation id="815598010540052116">向下捲動</translation> <translation id="8167567890448493835">使用<ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">自訂語言與輸入法...</translation> <translation id="8192202700944119416">已隱藏通知。</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index 0cc34ed..f6e2ed49 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -467,6 +467,7 @@ <translation id="6878400149835617132">Isinqamuleli sivaliwe</translation> <translation id="6910714959251846841">Lesi sibuyekezo sidinga i-powerwashing yedivayisi yakho. Funda kabanzi mayelana nesibuyekezo sakamuva se-<ph name="SYSTEM_APP_NAME" />.</translation> <translation id="6919251195245069855">Ayikwazanga ukubona ikhadi lakho elisebenza ngobuchwepheshe besimanje. Zama futhi.</translation> +<translation id="6945221475159498467">Khetha</translation> <translation id="6972754398087986839">Qala</translation> <translation id="6981982820502123353">Ukufinyeleleka</translation> <translation id="698231206551913481">Onke amafayela nedatha yendawo ehlotshaniswa nalo msebenzisi izosuswa ngunaphakade uma lo msebenzisi asuswa.</translation> @@ -557,6 +558,7 @@ <translation id="8142699993796781067">Inethiwekhi eyimfihlo</translation> <translation id="8152092012181020186">Cindezela ku-Ctrl + W ukuze uvale.</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Lesi silungiselelo siphethwe umlawuli wakho.</translation> +<translation id="815598010540052116">Skrolela phansi</translation> <translation id="8167567890448493835">Usebenzisa i-<ph name="LOCALE_NAME" /></translation> <translation id="8190698733819146287">Yenza ngokwezifiso izilimi nokokufaka...</translation> <translation id="8192202700944119416">Izaziso zifihlakele.</translation>
diff --git a/ash/system/message_center/stacked_notification_bar.cc b/ash/system/message_center/stacked_notification_bar.cc index 91830b44..bcd72cc 100644 --- a/ash/system/message_center/stacked_notification_bar.cc +++ b/ash/system/message_center/stacked_notification_bar.cc
@@ -523,7 +523,7 @@ void StackedNotificationBar::OnNotificationRemoved(const std::string& id, bool by_user) { const StackedNotificationBarIcon* icon = GetIconFromId(id); - if (icon) { + if (icon && !icon->is_animating_out()) { delete icon; stacked_notification_count_--; }
diff --git a/ash/system/unified/system_tray_test_api.cc b/ash/system/unified/system_tray_test_api.cc new file mode 100644 index 0000000..14db9ab --- /dev/null +++ b/ash/system/unified/system_tray_test_api.cc
@@ -0,0 +1,129 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/public/cpp/system_tray_test_api.h" + +#include "ash/root_window_controller.h" +#include "ash/shell.h" +#include "ash/system/accessibility/select_to_speak_tray.h" +#include "ash/system/status_area_widget.h" +#include "ash/system/time/time_tray_item_view.h" +#include "ash/system/time/time_view.h" +#include "ash/system/unified/unified_system_tray.h" +#include "ash/system/unified/unified_system_tray_bubble.h" +#include "ash/system/unified/unified_system_tray_controller.h" +#include "base/strings/string16.h" +#include "ui/events/test/event_generator.h" +#include "ui/views/controls/label.h" +#include "ui/views/view.h" +#include "ui/views/widget/widget_utils.h" + +namespace { +ash::UnifiedSystemTray* GetTray() { + return ash::Shell::Get() + ->GetPrimaryRootWindowController() + ->GetStatusAreaWidget() + ->unified_system_tray(); +} + +views::View* GetBubbleView(int view_id) { + return GetTray()->bubble()->GetBubbleView()->GetViewByID(view_id); +} + +} // namespace + +namespace ash { + +SystemTrayTestApi::SystemTrayTestApi() = default; + +SystemTrayTestApi::~SystemTrayTestApi() = default; + +bool SystemTrayTestApi::IsTrayBubbleOpen() { + return GetTray()->IsBubbleShown(); +} + +bool SystemTrayTestApi::IsTrayBubbleExpanded() { + return GetTray()->bubble_->controller_->IsExpanded(); +} + +void SystemTrayTestApi::ShowBubble() { + GetTray()->ShowBubble(false /* show_by_click */); +} + +void SystemTrayTestApi::CloseBubble() { + GetTray()->CloseBubble(); +} + +void SystemTrayTestApi::CollapseBubble() { + GetTray()->EnsureQuickSettingsCollapsed(true /*animate*/); +} + +void SystemTrayTestApi::ExpandBubble() { + GetTray()->EnsureBubbleExpanded(); +} + +void SystemTrayTestApi::ShowAccessibilityDetailedView() { + GetTray()->ShowBubble(false /* show_by_click */); + GetTray()->bubble_->controller_->ShowAccessibilityDetailedView(); +} + +void SystemTrayTestApi::ShowNetworkDetailedView() { + GetTray()->ShowBubble(false /* show_by_click */); + GetTray()->bubble_->controller_->ShowNetworkDetailedView(true /* force */); +} + +bool SystemTrayTestApi::IsBubbleViewVisible(int view_id, bool open_tray) { + if (open_tray) + GetTray()->ShowBubble(false /* show_by_click */); + views::View* view = GetBubbleView(view_id); + return view && view->GetVisible(); +} + +void SystemTrayTestApi::ClickBubbleView(int view_id) { + views::View* view = GetBubbleView(view_id); + if (view && view->GetVisible()) { + gfx::Point cursor_location = view->GetLocalBounds().CenterPoint(); + views::View::ConvertPointToScreen(view, &cursor_location); + + ui::test::EventGenerator generator(GetRootWindow(view->GetWidget())); + generator.MoveMouseTo(cursor_location); + generator.ClickLeftButton(); + } +} + +base::string16 SystemTrayTestApi::GetBubbleViewTooltip(int view_id) { + views::View* view = GetBubbleView(view_id); + return view ? view->GetTooltipText(gfx::Point()) : base::string16(); +} + +bool SystemTrayTestApi::Is24HourClock() { + base::HourClockType type = + GetTray()->time_view_->time_view()->GetHourTypeForTesting(); + return type == base::k24HourClock; +} + +void SystemTrayTestApi::TapSelectToSpeakTray() { + // The Select-to-Speak tray doesn't actually use the event, so construct + // a bare bones event to perform the action. + ui::TouchEvent event( + ui::ET_TOUCH_PRESSED, gfx::Point(), base::TimeTicks::Now(), + ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH), 0); + StatusAreaWidget* status_area_widget = + RootWindowController::ForWindow(GetTray()->GetWidget()->GetNativeWindow()) + ->GetStatusAreaWidget(); + status_area_widget->select_to_speak_tray()->PerformAction(event); +} + +message_center::MessagePopupView* +SystemTrayTestApi::GetPopupViewForNotificationID( + const std::string& notification_id) { + return GetTray()->GetPopupViewForNotificationID(notification_id); +} + +// static +std::unique_ptr<SystemTrayTestApi> SystemTrayTestApi::Create() { + return std::make_unique<SystemTrayTestApi>(); +} + +} // namespace ash
diff --git a/ash/system/unified/unified_system_tray.h b/ash/system/unified/unified_system_tray.h index 48efa059..c25dc77 100644 --- a/ash/system/unified/unified_system_tray.h +++ b/ash/system/unified/unified_system_tray.h
@@ -153,8 +153,8 @@ private: static const base::TimeDelta kNotificationCountUpdateDelay; + friend class SystemTrayTestApi; friend class UnifiedSystemTrayTest; - friend class UnifiedSystemTrayTestApi; // Private class implements MessageCenterUiDelegate. class UiDelegate;
diff --git a/ash/system/unified/unified_system_tray_bubble.h b/ash/system/unified/unified_system_tray_bubble.h index 4e0b301..5c02acf 100644 --- a/ash/system/unified/unified_system_tray_bubble.h +++ b/ash/system/unified/unified_system_tray_bubble.h
@@ -138,7 +138,7 @@ } private: - friend class UnifiedSystemTrayTestApi; + friend class SystemTrayTestApi; void UpdateBubbleBounds();
diff --git a/ash/system/unified/unified_system_tray_controller.h b/ash/system/unified/unified_system_tray_controller.h index bdef0ddd..d1c24c91 100644 --- a/ash/system/unified/unified_system_tray_controller.h +++ b/ash/system/unified/unified_system_tray_controller.h
@@ -139,6 +139,7 @@ } private: + friend class SystemTrayTestApi; friend class UnifiedSystemTrayControllerTest; friend class UnifiedMessageCenterBubbleTest;
diff --git a/ash/system/unified/unified_system_tray_test_api.cc b/ash/system/unified/unified_system_tray_test_api.cc deleted file mode 100644 index 7a559d6..0000000 --- a/ash/system/unified/unified_system_tray_test_api.cc +++ /dev/null
@@ -1,119 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ash/system/unified/unified_system_tray_test_api.h" - -#include "ash/root_window_controller.h" -#include "ash/shell.h" -#include "ash/system/accessibility/select_to_speak_tray.h" -#include "ash/system/status_area_widget.h" -#include "ash/system/time/time_tray_item_view.h" -#include "ash/system/time/time_view.h" -#include "ash/system/unified/unified_system_tray.h" -#include "ash/system/unified/unified_system_tray_bubble.h" -#include "ash/system/unified/unified_system_tray_controller.h" -#include "base/strings/string16.h" -#include "ui/compositor/scoped_animation_duration_scale_mode.h" -#include "ui/events/test/event_generator.h" -#include "ui/views/controls/label.h" -#include "ui/views/view.h" -#include "ui/views/widget/widget_utils.h" - -namespace ash { - -UnifiedSystemTrayTestApi::UnifiedSystemTrayTestApi(UnifiedSystemTray* tray) - : tray_(tray) {} - -UnifiedSystemTrayTestApi::~UnifiedSystemTrayTestApi() = default; - -void UnifiedSystemTrayTestApi::DisableAnimations() { - disable_animations_ = std::make_unique<ui::ScopedAnimationDurationScaleMode>( - ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); -} - -bool UnifiedSystemTrayTestApi::IsTrayBubbleOpen() { - return tray_->IsBubbleShown(); -} - -void UnifiedSystemTrayTestApi::ShowBubble() { - tray_->ShowBubble(false /* show_by_click */); -} - -void UnifiedSystemTrayTestApi::CloseBubble() { - tray_->CloseBubble(); -} - -void UnifiedSystemTrayTestApi::ShowAccessibilityDetailedView() { - tray_->ShowBubble(false /* show_by_click */); - tray_->bubble_->controller_->ShowAccessibilityDetailedView(); -} - -void UnifiedSystemTrayTestApi::ShowNetworkDetailedView() { - tray_->ShowBubble(false /* show_by_click */); - tray_->bubble_->controller_->ShowNetworkDetailedView(true /* force */); -} - -bool UnifiedSystemTrayTestApi::IsBubbleViewVisible(int view_id, - bool open_tray) { - if (open_tray) - tray_->ShowBubble(false /* show_by_click */); - views::View* view = GetBubbleView(view_id); - return view && view->GetVisible(); -} - -void UnifiedSystemTrayTestApi::ClickBubbleView(int view_id) { - views::View* view = GetBubbleView(view_id); - if (view && view->GetVisible()) { - gfx::Point cursor_location = view->GetLocalBounds().CenterPoint(); - views::View::ConvertPointToScreen(view, &cursor_location); - - ui::test::EventGenerator generator(GetRootWindow(view->GetWidget())); - generator.MoveMouseTo(cursor_location); - generator.ClickLeftButton(); - } -} - -base::string16 UnifiedSystemTrayTestApi::GetBubbleViewTooltip(int view_id) { - views::View* view = GetBubbleView(view_id); - return view ? view->GetTooltipText(gfx::Point()) : base::string16(); -} - -bool UnifiedSystemTrayTestApi::Is24HourClock() { - base::HourClockType type = - tray_->time_view_->time_view()->GetHourTypeForTesting(); - return type == base::k24HourClock; -} - -void UnifiedSystemTrayTestApi::TapSelectToSpeakTray() { - // The Select-to-Speak tray doesn't actually use the event, so construct - // a bare bones event to perform the action. - ui::TouchEvent event( - ui::ET_TOUCH_PRESSED, gfx::Point(), base::TimeTicks::Now(), - ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH), 0); - StatusAreaWidget* status_area_widget = - RootWindowController::ForWindow(tray_->GetWidget()->GetNativeWindow()) - ->GetStatusAreaWidget(); - status_area_widget->select_to_speak_tray()->PerformAction(event); -} - -message_center::MessagePopupView* -UnifiedSystemTrayTestApi::GetPopupViewForNotificationID( - const std::string& notification_id) { - return tray_->GetPopupViewForNotificationID(notification_id); -} - -views::View* UnifiedSystemTrayTestApi::GetBubbleView(int view_id) const { - return tray_->bubble_->bubble_view_->GetViewByID(view_id); -} - -// static -std::unique_ptr<SystemTrayTestApi> SystemTrayTestApi::Create() { - UnifiedSystemTray* primary_tray = Shell::Get() - ->GetPrimaryRootWindowController() - ->GetStatusAreaWidget() - ->unified_system_tray(); - return std::make_unique<UnifiedSystemTrayTestApi>(primary_tray); -} - -} // namespace ash
diff --git a/ash/system/unified/unified_system_tray_test_api.h b/ash/system/unified/unified_system_tray_test_api.h deleted file mode 100644 index 95bfe950..0000000 --- a/ash/system/unified/unified_system_tray_test_api.h +++ /dev/null
@@ -1,65 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef ASH_SYSTEM_UNIFIED_UNIFIED_SYSTEM_TRAY_TEST_API_H_ -#define ASH_SYSTEM_UNIFIED_UNIFIED_SYSTEM_TRAY_TEST_API_H_ - -#include <memory> - -#include "ash/public/cpp/system_tray_test_api.h" -#include "base/macros.h" - -namespace ui { -class ScopedAnimationDurationScaleMode; -} // namespace ui - -namespace views { -class View; -} // namespace views - -namespace message_center { -class MessagePopupView; -} // namespace message_center - -namespace ash { - -class UnifiedSystemTray; - -// Use by tests to access private state of UnifiedSystemTray. -// TODO(jamescook): Rename class to SystemTrayTestApiImpl. -class UnifiedSystemTrayTestApi : public SystemTrayTestApi { - public: - explicit UnifiedSystemTrayTestApi(UnifiedSystemTray* tray); - ~UnifiedSystemTrayTestApi() override; - - // SystemTrayTestApi: - void DisableAnimations() override; - bool IsTrayBubbleOpen() override; - void ShowBubble() override; - void CloseBubble() override; - void ShowAccessibilityDetailedView() override; - void ShowNetworkDetailedView() override; - bool IsBubbleViewVisible(int view_id, bool open_tray) override; - void ClickBubbleView(int view_id) override; - base::string16 GetBubbleViewTooltip(int view_id) override; - bool Is24HourClock() override; - void TapSelectToSpeakTray() override; - - message_center::MessagePopupView* GetPopupViewForNotificationID( - const std::string& notification_id); - - private: - // Returns a view in the bubble menu (not the tray itself). Returns null if - // not found. - views::View* GetBubbleView(int view_id) const; - - UnifiedSystemTray* const tray_; - std::unique_ptr<ui::ScopedAnimationDurationScaleMode> disable_animations_; - - DISALLOW_COPY_AND_ASSIGN(UnifiedSystemTrayTestApi); -}; - -} // namespace ash - -#endif // ASH_SYSTEM_UNIFIED_UNIFIED_SYSTEM_TRAY_TEST_API_H_
diff --git a/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc b/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc index a943651..55bdd96 100644 --- a/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc +++ b/ash/system/unified/user_chooser_detailed_view_controller_unittest.cc
@@ -14,6 +14,7 @@ #include "ash/wm/overview/overview_controller.h" #include "base/macros.h" #include "components/account_id/account_id.h" +#include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/views/widget/widget.h" namespace ash { @@ -37,13 +38,16 @@ // AshTestBase void SetUp() override { AshTestBase::SetUp(); - tray_test_api_ = SystemTrayTestApi::Create(); - tray_test_api_->DisableAnimations(); + tray_test_api_ = std::make_unique<SystemTrayTestApi>(); + disable_animations_ = + std::make_unique<ui::ScopedAnimationDurationScaleMode>( + ui::ScopedAnimationDurationScaleMode::ZERO_DURATION); } SystemTrayTestApi* tray_test_api() { return tray_test_api_.get(); } private: + std::unique_ptr<ui::ScopedAnimationDurationScaleMode> disable_animations_; std::unique_ptr<SystemTrayTestApi> tray_test_api_; DISALLOW_COPY_AND_ASSIGN(UserChooserDetailedViewControllerTest); };
diff --git a/base/message_loop/message_loop_unittest.cc b/base/message_loop/message_loop_unittest.cc index fb7ab88c..1d0ed42 100644 --- a/base/message_loop/message_loop_unittest.cc +++ b/base/message_loop/message_loop_unittest.cc
@@ -1615,6 +1615,54 @@ // https://crrev.com/c/1455266/9/base/message_loop/message_pump_win.cc#125 This // is the delayed task equivalent of the above PostImmediateTaskFromSystemPump // test. +// +// As a reminder of how this works, here's the sequence of events in this test: +// 1) Test start: +// work_deduplicator.cc(24): BindToCurrentThread +// work_deduplicator.cc(34): OnWorkRequested +// thread_controller_with_message_pump_impl.cc(237) : DoWork +// work_deduplicator.cc(50): OnWorkStarted +// 2) SubPumpFunc entered: +// message_loop_unittest.cc(278): SubPumpFunc +// 3) ScopedNestableTaskAllower triggers nested ScheduleWork: +// work_deduplicator.cc(34): OnWorkRequested +// 4) Nested system loop starts and pumps internal kMsgHaveWork: +// message_loop_unittest.cc(282): SubPumpFunc : Got Message +// message_pump_win.cc(302): HandleWorkMessage +// thread_controller_with_message_pump_impl.cc(237) : DoWork +// 5) Attempt to DoWork(), there's nothing to do, NextWorkInfo indicates delay. +// work_deduplicator.cc(50): OnWorkStarted +// work_deduplicator.cc(58): WillCheckForMoreWork +// work_deduplicator.cc(67): DidCheckForMoreWork +// 6) Return control to HandleWorkMessage() which schedules native timer +// and goes to sleep (no kMsgHaveWork in native queue). +// message_pump_win.cc(328): HandleWorkMessage ScheduleNativeTimer +// 7) Native timer fires and posts the delayed application task: +// message_loop_unittest.cc(282): SubPumpFunc : Got Message +// message_loop_unittest.cc(1581): DelayedQuitOnSystemTimer +// !! This is the critical step verified by this test. Since the +// ThreadController is idle after (6), it won't be invoked again and thus +// won't get a chance to return a NextWorkInfo that indicates the next +// delay. A native timer is thus required to have SubPumpFunc handle it. +// work_deduplicator.cc(42): OnDelayedWorkRequested +// message_pump_win.cc(129): ScheduleDelayedWork +// 9) The scheduled native timer fires and runs application task binding +// ::PostQuitMessage : +// message_loop_unittest.cc(282) SubPumpFunc : Got Message +// work_deduplicator.cc(50): OnWorkStarted +// thread_controller_with_message_pump_impl.cc(237) : DoWork +// 10) SequenceManager updates delay to none and notifies +// (TODO(scheduler-dev): Could remove this step but WorkDeduplicator knows +// to ignore at least): +// work_deduplicator.cc(42): OnDelayedWorkRequested +// 11) Nested application task completes and SubPumpFunc unwinds: +// work_deduplicator.cc(58): WillCheckForMoreWork +// work_deduplicator.cc(67): DidCheckForMoreWork +// 12) ~ScopedNestableTaskAllower() makes sure WorkDeduplicator knows we're +// back in DoWork() (not relevant in this test but important overall). +// work_deduplicator.cc(50): OnWorkStarted +// 13) Application task which ran SubPumpFunc completes and test finishes. +// work_deduplicator.cc(67): DidCheckForMoreWork TEST_F(MessageLoopTest, PostDelayedTaskFromSystemPump) { MessageLoop message_loop(MessagePumpType::UI);
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc index 89d15f01..e740591 100644 --- a/base/message_loop/message_pump_win.cc +++ b/base/message_loop/message_pump_win.cc
@@ -138,6 +138,7 @@ // from it. This is the only case where we must install/adjust the native // timer from ScheduleDelayedWork() because if we don't, the native loop will // go back to sleep, unaware of the new |delayed_work_time|. + // See MessageLoopTest.PostDelayedTaskFromSystemPump for an example. // TODO(gab): This could potentially be replaced by a ForegroundIdleProc hook // if Windows ends up being the only platform requiring ScheduleDelayedWork(). if (in_native_loop_ && !work_scheduled_) {
diff --git a/base/process/OWNERS b/base/process/OWNERS new file mode 100644 index 0000000..5882a768 --- /dev/null +++ b/base/process/OWNERS
@@ -0,0 +1,3 @@ +# LaunchProcess() is part of the Fuchsia sandbox. +per-file launch_fuchsia.*=set noparent +per-file launch_fuchsia.*=file://fuchsia/SECURITY_OWNERS
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc index 32691be..70c78ba 100644 --- a/base/task/sequence_manager/sequence_manager_impl.cc +++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -44,13 +44,6 @@ } // namespace -// This controls how big the the initial for -// |MainThreadOnly::task_execution_stack| should be. We don't expect to see -// depths of more than 2 unless cooperative scheduling is used on Blink, where -// we might get up to 6. Anyway 10 was chosen because it's a round number -// greater than current anticipated usage. -static constexpr const size_t kInitialTaskExecutionStackReserveCount = 10; - std::unique_ptr<SequenceManager> CreateSequenceManagerOnCurrentThread( SequenceManager::Settings settings) { return internal::SequenceManagerImpl::CreateOnCurrentThread( @@ -252,7 +245,6 @@ random_generator = std::mt19937_64(RandUint64()); uniform_distribution = std::uniform_real_distribution<double>(0.0, 1.0); } - task_execution_stack.reserve(kInitialTaskExecutionStackReserveCount); } SequenceManagerImpl::MainThreadOnly::~MainThreadOnly() = default;
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h index 7cc5684..cf22672 100644 --- a/base/task/sequence_manager/sequence_manager_impl.h +++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -5,6 +5,7 @@ #ifndef BASE_TASK_SEQUENCE_MANAGER_SEQUENCE_MANAGER_IMPL_H_ #define BASE_TASK_SEQUENCE_MANAGER_SEQUENCE_MANAGER_IMPL_H_ +#include <deque> #include <list> #include <map> #include <memory> @@ -12,7 +13,6 @@ #include <set> #include <unordered_map> #include <utility> -#include <vector> #include "base/atomic_sequence_num.h" #include "base/cancelable_callback.h" @@ -302,7 +302,9 @@ bool nesting_observer_registered_ = false; // Due to nested runloops more than one task can be executing concurrently. - std::vector<ExecutingTask> task_execution_stack; + // Note that this uses std::deque for pointer stability, since pointers to + // objects in this container are stored in TLS. + std::deque<ExecutingTask> task_execution_stack; Observer* observer = nullptr; // NOT OWNED
diff --git a/build/OWNERS.setnoparent b/build/OWNERS.setnoparent index 9d690da..7959827 100644 --- a/build/OWNERS.setnoparent +++ b/build/OWNERS.setnoparent
@@ -10,6 +10,7 @@ # Security reviews file://chromeos/SECURITY_OWNERS file://content/browser/SITE_ISOLATION_OWNERS +file://fuchsia/SECURITY_OWNERS file://ipc/SECURITY_OWNERS file://net/base/SECURITY_OWNERS file://sandbox/linux/OWNERS
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni index ddb18e0..27cff40 100644 --- a/build/config/compiler/compiler.gni +++ b/build/config/compiler/compiler.gni
@@ -69,10 +69,9 @@ # Use it by default on official-optimized android and Chrome OS builds, but # not ARC or linux-chromeos since it's been seen to not play nicely with # Chrome's clang. crbug.com/1033839 - use_thin_lto = - is_cfi || (is_official_build && (target_os == "android" || - (target_os == "chromeos" && - is_chromeos_device && !is_android))) + use_thin_lto = is_cfi || (is_official_build && + (target_os == "android" || + (target_os == "chromeos" && is_chromeos_device))) # Performs ThinLTO code generation on Goma. use_goma_thin_lto = false
diff --git a/build/config/linux/gtk/BUILD.gn b/build/config/linux/gtk/BUILD.gn index 9249f88..a731602 100644 --- a/build/config/linux/gtk/BUILD.gn +++ b/build/config/linux/gtk/BUILD.gn
@@ -22,8 +22,9 @@ group("gtk") { visibility = [ - # This is the only directory that should depend on GTK. + # These are the only directories that should depend on GTK. "//ui/gtk:*", + "//ui/gtk/x", # This should probably be moved into //ui/gtk. "//ui/ozone/platform/wayland",
diff --git a/build/config/sanitizers/sanitizers.gni b/build/config/sanitizers/sanitizers.gni index 119bb5c4..df40c9d 100644 --- a/build/config/sanitizers/sanitizers.gni +++ b/build/config/sanitizers/sanitizers.gni
@@ -57,7 +57,7 @@ # crbug.com/1033839. Similarly, don't use this on ARC builds. is_cfi = is_official_build && ((target_os == "linux" && !is_chromeos && target_cpu == "x64") || - (target_os == "chromeos" && is_chromeos_device && !is_android)) + (target_os == "chromeos" && is_chromeos_device)) # Enable checks for indirect function calls via a function pointer. # TODO(pcc): remove this when we're ready to add these checks by default.
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1 index 17d4cfb..9c73bc6 100644 --- a/build/fuchsia/linux.sdk.sha1 +++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@ -0.20200414.2.1 \ No newline at end of file +0.20200415.1.1 \ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1 index d82e38e3..23635aa 100644 --- a/build/fuchsia/mac.sdk.sha1 +++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@ -0.20200414.1.1 \ No newline at end of file +0.20200415.0.1 \ No newline at end of file
diff --git a/cc/base/switches.cc b/cc/base/switches.cc index 57409ca3..9cfde8e 100644 --- a/cc/base/switches.cc +++ b/cc/base/switches.cc
@@ -48,6 +48,10 @@ // Enables the GPU benchmarking extension const char kEnableGpuBenchmarking[] = "enable-gpu-benchmarking"; +// Disables LayerTreeHost::OnMemoryPressure +const char kDisableLayerTreeHostMemoryPressure[] = + "disable-layer-tree-host-memory-pressure"; + // Renders a border around compositor layers to help debug and study // layer compositing. const char kShowCompositedLayerBorders[] = "show-composited-layer-borders";
diff --git a/cc/base/switches.h b/cc/base/switches.h index d3a9d37d..be515d0 100644 --- a/cc/base/switches.h +++ b/cc/base/switches.h
@@ -31,6 +31,9 @@ // Switches for both the renderer and ui compositors. CC_BASE_EXPORT extern const char kEnableGpuBenchmarking[]; +// Switches for LayerTreeHost. +CC_BASE_EXPORT extern const char kDisableLayerTreeHostMemoryPressure[]; + // Debug visualizations. CC_BASE_EXPORT extern const char kShowCompositedLayerBorders[]; CC_BASE_EXPORT extern const char kUIShowCompositedLayerBorders[];
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc index da5c8f0..97f1b09 100644 --- a/cc/layers/picture_layer.cc +++ b/cc/layers/picture_layer.cc
@@ -140,6 +140,26 @@ picture_layer_inputs_.display_list = picture_layer_inputs_.client->PaintContentsToDisplayList( ContentLayerClient::PAINTING_BEHAVIOR_NORMAL); + + // Clear out previous directly composited image state - if the layer + // qualifies we'll set up the state below. + picture_layer_inputs_.directly_composited_image_size = base::nullopt; + picture_layer_inputs_.nearest_neighbor = false; + if (QualifiesForDirectlyCompositedImage()) { + base::Optional<DisplayItemList::DirectlyCompositedImageResult> result = + picture_layer_inputs_.display_list->GetDirectlyCompositedImageResult( + bounds()); + if (result) { + // Directly composited images are not guaranteed to fully cover every + // pixel in the layer due to ceiling when calculating the tile content + // rect from the layer bounds. + recording_source_->SetRequiresClear(true); + picture_layer_inputs_.directly_composited_image_size = + result->intrinsic_image_size; + picture_layer_inputs_.nearest_neighbor = result->nearest_neighbor; + } + } + picture_layer_inputs_.painter_reported_memory_usage = picture_layer_inputs_.client->GetApproximateUnsharedMemoryUsage(); recording_source_->UpdateDisplayItemList( @@ -158,6 +178,21 @@ return updated; } +bool PictureLayer::QualifiesForDirectlyCompositedImage() const { + // Filters and backdrop-filters disqualify a layer from being a directly + // composited image. + // TODO(dlibby): crbug.com/875110 - remove this in an upcoming change and + // update baselines. + const EffectNode* effect_node = + layer_tree_host()->property_trees()->effect_tree.Node( + effect_tree_index()); + if (!effect_node) + return true; + + return (effect_node->filters.IsEmpty() && + effect_node->backdrop_filters.IsEmpty()); +} + sk_sp<SkPicture> PictureLayer::GetPicture() const { if (!DrawsContent() || bounds().IsEmpty()) return nullptr;
diff --git a/cc/layers/picture_layer.h b/cc/layers/picture_layer.h index 8fdfba82..b4595e7 100644 --- a/cc/layers/picture_layer.h +++ b/cc/layers/picture_layer.h
@@ -93,6 +93,8 @@ bool ShouldUseTransformedRasterization() const; + bool QualifiesForDirectlyCompositedImage() const; + std::unique_ptr<RecordingSource> recording_source_; devtools_instrumentation:: ScopedLayerObjectTracker instrumentation_object_tracker_;
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc index e1e9864..8ed99b85 100644 --- a/cc/layers/picture_layer_impl.cc +++ b/cc/layers/picture_layer_impl.cc
@@ -98,6 +98,7 @@ use_transformed_rasterization_(false), can_use_lcd_text_(true), directly_composited_image_size_(base::nullopt), + directly_composited_image_raster_aspect_ratio_(0.f), tile_size_calculator_(this) { layer_tree_impl()->RegisterPictureLayerImpl(this); } @@ -241,6 +242,41 @@ tilings_->num_tilings() ? MaximumTilingContentsScale() : 1.f; PopulateScaledSharedQuadState(shared_quad_state, max_contents_scale, contents_opaque()); + + if (directly_composited_image_size_) { + // Directly composited images should be clipped to the layer's content rect. + // When a PictureLayerTiling is created for a directly composited image, the + // layer bounds are multiplied by the raster scale in order to compute the + // tile size. If the aspect ratio of the layer doesn't match that of the + // image, it's possible that one of the dimensions of the resulting size + // (layer bounds * raster scale) is a fractional number, as raster scale + // does not scale x and y independently. + // When this happens, the ToEnclosingRect() operation in + // |PictureLayerTiling::EnclosingContentsRectFromLayer()| will + // create a tiling that, when scaled by |max_contents_scale| above, is + // larger than the layer bounds by a fraction of a pixel. + gfx::Rect clip_rect = draw_properties().drawable_content_rect; + if (shared_quad_state->is_clipped) + clip_rect.Intersect(shared_quad_state->clip_rect); + + shared_quad_state->is_clipped = true; + shared_quad_state->clip_rect = clip_rect; + +#if DCHECK_IS_ON() + // Validate that the tile and bounds size are always within one pixel. + PictureLayerTiling* high_res = + tilings_->FindTilingWithResolution(HIGH_RESOLUTION); + if (high_res) { + const float epsilon = 1.f; + gfx::SizeF scaled_tiling_size(high_res->tiling_size()); + scaled_tiling_size.Scale(1 / raster_contents_scale_); + DCHECK(std::abs(bounds().width() - scaled_tiling_size.width()) < epsilon); + DCHECK(std::abs(bounds().height() - scaled_tiling_size.height()) < + epsilon); + } +#endif + } + Occlusion scaled_occlusion = draw_properties() .occlusion_in_content_space.GetOcclusionWithGivenDrawTransform( @@ -992,17 +1028,50 @@ if (directly_composited_image_size_ == size) return; - directly_composited_image_size_ = size; + directly_composited_image_size_ = + ShouldDirectlyCompositeImage(size) ? size : base::nullopt; NoteLayerPropertyChanged(); } -float PictureLayerImpl::GetDirectlyCompositedImageRasterScale() const { - float x = static_cast<float>(directly_composited_image_size_->width()) / +bool PictureLayerImpl::ShouldDirectlyCompositeImage( + base::Optional<gfx::Size> size) const { + if (!size) + return false; + + // If the results of scaling the bounds by the expected raster scale + // would end up with a content rect whose width/height are more than one + // pixel different from the layer bounds, don't directly composite the image + // to avoid incorrect rendering. + float raster_scale = GetDirectlyCompositedImageRasterScale(size.value()); + gfx::SizeF layer_bounds(bounds()); + gfx::RectF scaled_bounds_rect(layer_bounds); + scaled_bounds_rect.Scale(raster_scale); + + // Take the scaled bounds, get the enclosing rect then scale it back down - + // this is the same set of operations that will happen when using the tiling + // at that raster scale. + gfx::RectF content_rect(gfx::ToEnclosingRect(scaled_bounds_rect)); + content_rect.Scale(1 / raster_scale); + + return std::abs(layer_bounds.width() - content_rect.width()) < 1.f && + std::abs(layer_bounds.height() - content_rect.height()) < 1.f; +} + +bool PictureLayerImpl::IsDirectlyCompositedImageRasteredAtIntrinsicRatio() + const { + DCHECK(directly_composited_image_size_.has_value()); + return MathUtil::IsWithinEpsilon( + directly_composited_image_raster_aspect_ratio_, + static_cast<float>(directly_composited_image_size_->width()) / + directly_composited_image_size_->height()); +} + +float PictureLayerImpl::GetDirectlyCompositedImageRasterScale( + gfx::Size directly_composited_image_size) const { + float x = static_cast<float>(directly_composited_image_size.width()) / bounds().width(); - float y = static_cast<float>(directly_composited_image_size_->height()) / + float y = static_cast<float>(directly_composited_image_size.height()) / bounds().height(); - DCHECK_EQ(x, 1.f); - DCHECK_EQ(y, 1.f); return GetPreferredRasterScale(gfx::Vector2dF(x, y)); } @@ -1053,9 +1122,18 @@ } high_res->set_resolution(HIGH_RESOLUTION); - if (layer_tree_impl()->IsPendingTree()) { + if (layer_tree_impl()->IsPendingTree() || + (layer_tree_impl()->settings().commit_to_active_tree && + directly_composited_image_size_.has_value())) { // On the pending tree, drop any tilings that are non-ideal since we don't // need them to activate anyway. + + // For DirectlyCompositedImages, if we recomputed a new raster scale, we + // should drop the non-ideal ones if we're committing to the active tree. + // Otherwise a non-ideal scale that is _larger_ than the HIGH_RESOLUTION + // tile will be used as the coverage scale, and we'll produce a slightly + // different rendering. We don't drop the tilings on the active tree if + // we're not committing to the active tree to prevent checkerboarding. tilings_->RemoveNonIdealTilings(); } @@ -1064,7 +1142,21 @@ bool PictureLayerImpl::ShouldAdjustRasterScale() const { if (directly_composited_image_size_) { - float desired_raster_scale = GetDirectlyCompositedImageRasterScale(); + // Since the raster scale is only expressed as a single dimension, + // we may end up rasterizing a directly composited image at an aspect-ratio + // that doesn't match the intrinsic size. In these cases we will re-raster + // as the layers bounds change the aspect ratio, until we raster at the + // intrinsic size (or some multiple of it as enforced by the clamping and + // adjustments in |RecalculateRasterScales()|. + const bool layer_aspect_ratio_changed = !MathUtil::IsWithinEpsilon( + directly_composited_image_raster_aspect_ratio_, + static_cast<float>(bounds().width()) / bounds().height()); + if (layer_aspect_ratio_changed && + !IsDirectlyCompositedImageRasteredAtIntrinsicRatio()) + return true; + + float desired_raster_scale = GetDirectlyCompositedImageRasterScale( + directly_composited_image_size_.value()); float max_scale = std::max(desired_raster_scale, MinimumContentsScale()); if (raster_source_scale_ < std::min(ideal_source_scale_, max_scale)) return true; @@ -1153,11 +1245,12 @@ void PictureLayerImpl::RecalculateRasterScales() { if (directly_composited_image_size_) { + float desired_raster_scale = GetDirectlyCompositedImageRasterScale( + directly_composited_image_size_.value()); if (!raster_source_scale_) - raster_source_scale_ = GetDirectlyCompositedImageRasterScale(); + raster_source_scale_ = desired_raster_scale; float min_scale = MinimumContentsScale(); - float desired_raster_scale = GetDirectlyCompositedImageRasterScale(); float max_scale = std::max(desired_raster_scale, MinimumContentsScale()); float clamped_ideal_source_scale = base::ClampToRange(ideal_source_scale_, min_scale, max_scale); @@ -1174,6 +1267,9 @@ raster_device_scale_ = 1.f; raster_contents_scale_ = raster_source_scale_; low_res_raster_contents_scale_ = raster_contents_scale_; + + directly_composited_image_raster_aspect_ratio_ = + static_cast<float>(bounds().width()) / bounds().height(); return; } @@ -1378,7 +1474,13 @@ if (!min_dimension) return setting_min; - return std::max(1.f / min_dimension, setting_min); + // Directly composited images may result in contents scales that are + // less than the configured setting. We allow this lower scale so that we + // can raster at the intrinsic image size. + const float inverse_min_dimension = 1.f / min_dimension; + return (directly_composited_image_size_.has_value()) + ? inverse_min_dimension + : std::max(inverse_min_dimension, setting_min); } float PictureLayerImpl::MaximumContentsScale() const {
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h index 1061fc6..6337ee1 100644 --- a/cc/layers/picture_layer_impl.h +++ b/cc/layers/picture_layer_impl.h
@@ -173,7 +173,9 @@ float MaximumContentsScale() const; void UpdateViewportRectForTilePriorityInContentSpace(); PictureLayerImpl* GetRecycledTwinLayer() const; - float GetDirectlyCompositedImageRasterScale() const; + bool ShouldDirectlyCompositeImage(base::Optional<gfx::Size> size) const; + bool IsDirectlyCompositedImageRasteredAtIntrinsicRatio() const; + float GetDirectlyCompositedImageRasterScale(gfx::Size) const; void SanityCheckTilingState() const; @@ -230,8 +232,17 @@ bool use_transformed_rasterization_ : 1; bool can_use_lcd_text_ : 1; + // The intrinsic size of the directly composited image. A directly composited + // image is an image which is the only thing drawn into a layer. In these + // cases we attempt to raster the image at its intrinsic size. base::Optional<gfx::Size> directly_composited_image_size_; + // If |directly_composited_image_size_| is set, this is the aspect ratio of + // the *layer* (and thus the rasterized contents) when the + // raster_contents_scale_ was last calculated. See comments in + // |ShouldAdjustRasterScale| for an explanation of how this is used. + float directly_composited_image_raster_aspect_ratio_; + // Use this instead of |visible_layer_rect()| for tiling calculations. This // takes external viewport and transform for tile priority into account. gfx::Rect viewport_rect_for_tile_priority_in_content_space_;
diff --git a/cc/paint/display_item_list.cc b/cc/paint/display_item_list.cc index 7217e70..129d9b3 100644 --- a/cc/paint/display_item_list.cc +++ b/cc/paint/display_item_list.cc
@@ -57,6 +57,13 @@ } } +bool RotationEquivalentToAxisFlip(const SkMatrix& matrix) { + float skew_x = matrix.getSkewX(); + float skew_y = matrix.getSkewY(); + return ((skew_x == 1.f || skew_x == -1.f) && + (skew_y == 1.f || skew_y == -1.f)); +} + } // namespace DisplayItemList::DisplayItemList(UsageHint usage_hint) @@ -290,4 +297,114 @@ return false; } +base::Optional<DisplayItemList::DirectlyCompositedImageResult> +DisplayItemList::GetDirectlyCompositedImageResult( + gfx::Size containing_layer_bounds) const { + const PaintOpBuffer* op_buffer = nullptr; + if (paint_op_buffer_.size() == 1) { + // The actual ops are wrapped in DrawRecord if they were previously + // recorded. + if (paint_op_buffer_.GetFirstOp()->GetType() == PaintOpType::DrawRecord) { + const DrawRecordOp* draw_record = + static_cast<const DrawRecordOp*>(paint_op_buffer_.GetFirstOp()); + op_buffer = draw_record->record.get(); + } else { + op_buffer = &paint_op_buffer_; + } + } else { + return base::nullopt; + } + + const DrawImageRectOp* draw_image_rect_op = nullptr; + bool transpose_image_size = false; + constexpr size_t kNumDrawImageForOrientationOps = 10; + if (op_buffer->size() == 1 && + op_buffer->GetFirstOp()->GetType() == PaintOpType::DrawImageRect) { + draw_image_rect_op = + static_cast<const DrawImageRectOp*>(op_buffer->GetFirstOp()); + } else if (op_buffer->size() < kNumDrawImageForOrientationOps) { + // Images that respect orientation will have 5 paint operations: + // (1) Save + // (2) Translate + // (3) Concat (rotation matrix) + // (4) DrawImageRect + // (5) Restore + // Detect these the paint op buffer and disqualify the layer as a directly + // composited image if any other paint op is detected. + for (auto* op : PaintOpBuffer::Iterator(op_buffer)) { + switch (op->GetType()) { + case PaintOpType::Save: + case PaintOpType::Restore: + break; + case PaintOpType::Translate: { + const TranslateOp* translate = static_cast<const TranslateOp*>(op); + if (translate->dx != 0 || translate->dy != 0) + return base::nullopt; + break; + } + case PaintOpType::Concat: { + // We only expect a single rotation. If we see another one, then this + // image won't be eligible for directly compositing. + if (transpose_image_size) + return base::nullopt; + + const ConcatOp* concat_op = static_cast<const ConcatOp*>(op); + if (concat_op->matrix.hasPerspective() || + !concat_op->matrix.preservesAxisAlignment()) + return base::nullopt; + + // If the rotation is not an axis flip, we'll need to transpose the + // width and height dimensions to account for the same transform + // applying when the layer bounds were calculated. + transpose_image_size = + RotationEquivalentToAxisFlip(concat_op->matrix); + break; + } + case PaintOpType::DrawImageRect: + if (draw_image_rect_op) + return base::nullopt; + draw_image_rect_op = static_cast<const DrawImageRectOp*>(op); + break; + default: + return base::nullopt; + } + } + } + + if (!draw_image_rect_op) + return base::nullopt; + + // The src rect must match the image size exactly, i.e. the entire image + // must be drawn. + const SkRect& src = draw_image_rect_op->src; + if (src.fLeft != 0 || src.fTop != 0 || + src.fRight != draw_image_rect_op->image.width() || + src.fBottom != draw_image_rect_op->image.height()) + return base::nullopt; + + // The DrawImageRect op's destination rect must match the layer bounds + // exactly. Note that the layer bounds have already taken into account image + // orientation so transpose the dst width/height before comparing, if + // appropriate. + const SkRect& dst = draw_image_rect_op->dst; + int dst_width = transpose_image_size ? dst.fBottom : dst.fRight; + int dst_height = transpose_image_size ? dst.fRight : dst.fBottom; + if (dst.fLeft != 0 || dst.fTop != 0 || + dst_width != containing_layer_bounds.width() || + dst_height != containing_layer_bounds.height()) + return base::nullopt; + + int width = transpose_image_size ? draw_image_rect_op->image.height() + : draw_image_rect_op->image.width(); + int height = transpose_image_size ? draw_image_rect_op->image.width() + : draw_image_rect_op->image.height(); + DirectlyCompositedImageResult result; + result.intrinsic_image_size = gfx::Size(width, height); + // Ensure the layer will use nearest neighbor when drawn by the display + // compositor, if required. + result.nearest_neighbor = + draw_image_rect_op->flags.getFilterQuality() == kNone_SkFilterQuality; + return result; +} + } // namespace cc
diff --git a/cc/paint/display_item_list.h b/cc/paint/display_item_list.h index 1796fc3..da9c66da 100644 --- a/cc/paint/display_item_list.h +++ b/cc/paint/display_item_list.h
@@ -170,6 +170,18 @@ // Called after all items are appended, to process the items. void Finalize(); + struct DirectlyCompositedImageResult { + gfx::Size intrinsic_image_size; + bool nearest_neighbor; + }; + + // If this list represents an image that should be directly composited (i.e. + // rasterized at the intrinsic size of the image), return the intrinsic size + // of the image and whether or not to use nearest neighbor filtering when + // scaling the layer. + base::Optional<DirectlyCompositedImageResult> + GetDirectlyCompositedImageResult(gfx::Size containing_layer_bounds) const; + int NumSlowPaths() const { return paint_op_buffer_.numSlowPaths(); } bool HasNonAAPaint() const { return paint_op_buffer_.HasNonAAPaint(); }
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index f97fa37e..f25c9413 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -13,6 +13,7 @@ #include "base/auto_reset.h" #include "base/bind.h" +#include "base/command_line.h" #include "base/compiler_specific.h" #include "base/containers/adapters.h" #include "base/containers/flat_map.h" @@ -31,6 +32,7 @@ #include "cc/base/devtools_instrumentation.h" #include "cc/base/histograms.h" #include "cc/base/math_util.h" +#include "cc/base/switches.h" #include "cc/benchmarks/benchmark_instrumentation.h" #include "cc/debug/rendering_stats_instrumentation.h" #include "cc/input/browser_controls_offset_manager.h" @@ -370,9 +372,12 @@ this, settings.top_controls_show_threshold, settings.top_controls_hide_threshold); - memory_pressure_listener_.reset( - new base::MemoryPressureListener(base::BindRepeating( - &LayerTreeHostImpl::OnMemoryPressure, base::Unretained(this)))); + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableLayerTreeHostMemoryPressure)) { + memory_pressure_listener_.reset( + new base::MemoryPressureListener(base::BindRepeating( + &LayerTreeHostImpl::OnMemoryPressure, base::Unretained(this)))); + } SetDebugState(settings.initial_debug_state); }
diff --git a/chrome/VERSION b/chrome/VERSION index 2d68d73..1475da8c 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=84 MINOR=0 -BUILD=4115 +BUILD=4116 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 0c1cba8..45a8b55 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -340,7 +340,6 @@ "//components/embedder_support/android:util_java", "//components/embedder_support/android:web_contents_delegate_java", "//components/external_intents/android:java", - "//components/favicon/android:java", "//components/feature_engagement:feature_engagement_java", "//components/feed/core/proto:proto_java", "//components/feed/core/proto:proto_java_v2", @@ -888,7 +887,6 @@ "//components/embedder_support/android:web_contents_delegate_javatests", "//components/external_intents/android:java", "//components/external_intents/android:javatests", - "//components/favicon/android:javatests", "//components/feature_engagement:feature_engagement_java", "//components/gcm_driver/android:gcm_driver_java", "//components/gcm_driver/instance_id/android:instance_id_driver_java", @@ -2942,7 +2940,6 @@ "java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesBridge.java", "java/src/org/chromium/chrome/browser/sync/ProfileSyncService.java", "java/src/org/chromium/chrome/browser/sync/TrustedVaultClient.java", - "java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java", "java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java", "java/src/org/chromium/chrome/browser/tab/TabFavicon.java", "java/src/org/chromium/chrome/browser/tab/TabImpl.java", @@ -2998,6 +2995,26 @@ } } +native_java_unittests_tests = [ + "native_java_unittests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizationsUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/payments/PaymentManifestVerifierTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java", + "native_java_unittests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java", +] + android_library("native_java_unittests_java") { testonly = true deps = [ @@ -3010,6 +3027,7 @@ "//base/test:test_support_java", "//chrome/android:chrome_java", "//chrome/browser/flags:java", + "//chrome/browser/image_fetcher:java", "//chrome/browser/profiles/android:java", "//chrome/browser/tab:java", "//chrome/browser/util:java", @@ -3018,6 +3036,7 @@ "//components/embedder_support/android:util_java", "//components/omnibox/browser:browser_java", "//components/payments/content/android:java", + "//components/search_engines/android:java", "//components/security_state/content/android:java", "//components/security_state/core:security_state_enums_java", "//content/public/android:content_java", @@ -3025,6 +3044,7 @@ "//content/public/test/android:content_java_test_support", "//third_party/blink/public:blink_headers_java", "//third_party/blink/public/mojom:android_mojo_bindings_java", + "//third_party/hamcrest:hamcrest_java", "//third_party/jsr-305:jsr_305_javalib", "//third_party/junit", "//third_party/mockito:mockito_java", @@ -3033,19 +3053,13 @@ "//url:gurl_java", "//url/mojom:url_mojom_gurl_java", ] + sources = [ "native_java_unittests/src/org/chromium/chrome/browser/UnitTestUtils.java", - "native_java_unittests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizationsUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/payments/PaymentManifestVerifierTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java", ] + sources += native_java_unittests_tests + annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] } @@ -3053,16 +3067,6 @@ # can't put 'java' in the name here. generate_jni("native_j_unittests_jni_headers") { testonly = true - sources = [ - "native_java_unittests/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulatorTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/installedapp/InstalledAppProviderTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/omnibox/status/StatusMediatorUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/partnercustomizations/PartnerBrowserCustomizationsUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinderUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/payments/PaymentManifestVerifierTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreUnitTest.java", - "native_java_unittests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java", - ] + sources = native_java_unittests_tests feature_list_file = "//chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java" }
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index f75c3a2..20574d7b 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -1099,6 +1099,7 @@ "java/src/org/chromium/chrome/browser/offlinepages/downloads/OfflinePageDownloadBridge.java", "java/src/org/chromium/chrome/browser/offlinepages/indicator/ConnectivityDetector.java", "java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java", + "java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java", "java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarManager.java", "java/src/org/chromium/chrome/browser/offlinepages/indicator/TopSnackbarView.java", "java/src/org/chromium/chrome/browser/offlinepages/prefetch/OfflineNotificationBackgroundTask.java", @@ -1222,6 +1223,7 @@ "java/src/org/chromium/chrome/browser/omnibox/suggestions/tail/TailSuggestionViewProperties.java", "java/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchService.java", "java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java", + "java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java", "java/src/org/chromium/chrome/browser/page_info/PageInfoController.java", "java/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilder.java", "java/src/org/chromium/chrome/browser/page_info/SiteSettingsHelper.java", @@ -1484,6 +1486,7 @@ "java/src/org/chromium/chrome/browser/site_settings/AddExceptionPreference.java", "java/src/org/chromium/chrome/browser/site_settings/ChosenObjectInfo.java", "java/src/org/chromium/chrome/browser/site_settings/ChosenObjectSettings.java", + "java/src/org/chromium/chrome/browser/site_settings/ChromeNotificationSettingsClient.java", "java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClient.java", "java/src/org/chromium/chrome/browser/site_settings/ClearWebsiteStorage.java", "java/src/org/chromium/chrome/browser/site_settings/ClearWebsiteStorageDialog.java", @@ -1499,6 +1502,7 @@ "java/src/org/chromium/chrome/browser/site_settings/ManageSpaceActivity.java", "java/src/org/chromium/chrome/browser/site_settings/NfcCategory.java", "java/src/org/chromium/chrome/browser/site_settings/NotificationCategory.java", + "java/src/org/chromium/chrome/browser/site_settings/NotificationSettingsClient.java", "java/src/org/chromium/chrome/browser/site_settings/PermissionInfo.java", "java/src/org/chromium/chrome/browser/site_settings/SettingsNavigationSource.java", "java/src/org/chromium/chrome/browser/site_settings/SingleCategorySettings.java", @@ -1578,7 +1582,6 @@ "java/src/org/chromium/chrome/browser/tab/AuthenticatorNavigationInterceptor.java", "java/src/org/chromium/chrome/browser/tab/AuthenticatorNavigationInterceptorTabHelper.java", "java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java", - "java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java", "java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java", "java/src/org/chromium/chrome/browser/tab/RedirectHandlerTabHelper.java", "java/src/org/chromium/chrome/browser/tab/SadTab.java",
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni index edbd872..92a2890 100644 --- a/chrome/android/chrome_junit_test_java_sources.gni +++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -160,19 +160,11 @@ "junit/src/org/chromium/chrome/browser/omnibox/geo/PlatformNetworksManagerTest.java", "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", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessorUnitTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/SimpleHorizontalLayoutViewTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionSpannableUnitTest.java", - "junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java", - "junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java", - "junit/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionTest.java", - "junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java", "junit/src/org/chromium/chrome/browser/omnibox/suggestions/tail/AlignmentManagerUnitTest.java", "junit/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java", "junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 38fbddec..e016084 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -8,7 +8,6 @@ chrome_test_java_sources = [ "javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java", "javatests/src/org/chromium/chrome/browser/AudioTest.java", - "javatests/src/org/chromium/chrome/browser/ChromeActionModeHandlerTest.java", "javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java", "javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java", "javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java index cb2ef35e..3c0479c5 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewFactory.java
@@ -41,7 +41,7 @@ public static void setViewAttributes(View view, Context context, int paddingStart, int paddingTop, int paddingEnd, int paddingBottom, @Nullable AssistantDrawable background, @Nullable String contentDescription, - boolean visible) { + boolean visible, boolean enabled) { view.setPaddingRelative(AssistantDimension.getPixelSizeDp(context, paddingStart), AssistantDimension.getPixelSizeDp(context, paddingTop), AssistantDimension.getPixelSizeDp(context, paddingEnd), @@ -55,6 +55,7 @@ } setAccessibility(view, contentDescription); view.setVisibility(visible ? View.VISIBLE : View.GONE); + view.setEnabled(enabled); } /**
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java index 1529469..4a5ab43 100644 --- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java +++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/generic_ui/AssistantViewInteractions.java
@@ -117,6 +117,13 @@ } @CalledByNative + private static void setViewEnabled(View view, AssistantValue enabled) { + if (enabled.getBooleans() != null && enabled.getBooleans().length == 1) { + view.setEnabled(enabled.getBooleans()[0]); + } + } + + @CalledByNative private static boolean setToggleButtonChecked(View view, AssistantValue checked) { if (!(view instanceof AssistantToggleButton)) { return false;
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java index 30dd69a..f9525d9 100644 --- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java +++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantGenericUiTest.java
@@ -93,6 +93,7 @@ import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto; import org.chromium.chrome.browser.autofill_assistant.proto.SetModelValueProto; import org.chromium.chrome.browser.autofill_assistant.proto.SetUserActionsProto; +import org.chromium.chrome.browser.autofill_assistant.proto.SetViewEnabledProto; import org.chromium.chrome.browser.autofill_assistant.proto.SetViewVisibilityProto; import org.chromium.chrome.browser.autofill_assistant.proto.ShapeDrawableProto; import org.chromium.chrome.browser.autofill_assistant.proto.ShowCalendarPopupProto; @@ -2058,4 +2059,95 @@ BooleanList.newBuilder().addValues(false))) .build())); } -} + + /** + * Shows two textviews. Repeated clicks on the second one will enable/disable the first one. + */ + @Test + @MediumTest + public void testEnableDisableView() { + List<InteractionProto> interactions = new ArrayList<>(); + interactions.add( + (InteractionProto) InteractionProto.newBuilder() + .setTriggerEvent(EventProto.newBuilder().setOnViewClicked( + OnViewClickedEventProto.newBuilder().setViewIdentifier( + "toggle_view"))) + .addCallbacks(CallbackProto.newBuilder().setComputeValue( + ComputeValueProto.newBuilder() + .setResultModelIdentifier("enabled") + .setBooleanNot(BooleanNotProto.newBuilder().setValue( + ValueReferenceProto.newBuilder().setModelIdentifier( + "enabled"))))) + .build()); + interactions.add( + (InteractionProto) InteractionProto.newBuilder() + .setTriggerEvent(EventProto.newBuilder().setOnValueChanged( + OnModelValueChangedEventProto.newBuilder().setModelIdentifier( + "enabled"))) + .addCallbacks(CallbackProto.newBuilder().setSetViewEnabled( + SetViewEnabledProto.newBuilder() + .setViewIdentifier("text_view") + .setEnabled( + ValueReferenceProto.newBuilder().setModelIdentifier( + "enabled")))) + .build()); + + // Disable text_view initially. + List<ModelProto.ModelValue> modelValues = new ArrayList<>(); + modelValues.add((ModelProto.ModelValue) ModelProto.ModelValue.newBuilder() + .setIdentifier("enabled") + .setValue(ValueProto.newBuilder().setBooleans( + BooleanList.newBuilder().addValues(false))) + .build()); + + GenericUserInterfaceProto genericUserInterface = + (GenericUserInterfaceProto) GenericUserInterfaceProto.newBuilder() + .setRootView(ViewProto.newBuilder().setViewContainer( + ViewContainerProto.newBuilder() + .setLinearLayout( + LinearLayoutProto.newBuilder().setOrientation( + LinearLayoutProto.Orientation.VERTICAL)) + .addViews( + ViewProto.newBuilder() + .setIdentifier("toggle_view") + .setTextView( + TextViewProto.newBuilder().setText( + "toggle view"))) + .addViews( + ViewProto.newBuilder() + .setIdentifier("text_view") + .setTextView( + TextViewProto.newBuilder().setText( + "text view"))))) + .setInteractions( + InteractionsProto.newBuilder().addAllInteractions(interactions)) + .setModel(ModelProto.newBuilder().addAllValues(modelValues)) + .build(); + + ArrayList<ActionProto> list = new ArrayList<>(); + list.add((ActionProto) ActionProto.newBuilder() + .setShowGenericUi(ShowGenericUiProto.newBuilder().setGenericUserInterface( + genericUserInterface)) + .build()); + AutofillAssistantTestScript script = new AutofillAssistantTestScript( + (SupportedScriptProto) SupportedScriptProto.newBuilder() + .setPath("autofill_assistant_target_website.html") + .setPresentation(PresentationProto.newBuilder().setAutostart(true).setChip( + ChipProto.newBuilder().setText("Autostart"))) + .build(), + list); + + AutofillAssistantTestService testService = + new AutofillAssistantTestService(Collections.singletonList(script)); + startAutofillAssistant(mTestRule.getActivity(), testService); + + waitUntilViewMatchesCondition(withText("toggle view"), isCompletelyDisplayed()); + onView(withText("text view")).check(matches(not(isEnabled()))); + + onView(withText("toggle view")).perform(click()); + onView(withText("text view")).check(matches(isEnabled())); + + onView(withText("toggle view")).perform(click()); + onView(withText("text view")).check(matches(not(isEnabled()))); + } +} \ No newline at end of file
diff --git a/chrome/android/features/keyboard_accessory/DEPS b/chrome/android/features/keyboard_accessory/DEPS index 80c97bb2..1704ebee2 100644 --- a/chrome/android/features/keyboard_accessory/DEPS +++ b/chrome/android/features/keyboard_accessory/DEPS
@@ -4,7 +4,6 @@ "+components/autofill/android/java/src/org/chromium/components/autofill", "+components/browser_ui/widget/android", "+components/embedder_support/android/java", - "+components/favicon/android", "+components/feature_engagement/public", "-content/public/android", "+content/public/android/java/src/org/chromium/content_public",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java index 67857e0..6bfcbae 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
@@ -33,7 +33,7 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.favicon.FaviconUtils; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.ui.HorizontalListDividerDrawable; import org.chromium.ui.modelutil.ListModel; @@ -200,7 +200,7 @@ */ static class FaviconHelper { private final Resources mResources; - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; private final int mDesiredSize; /**
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 a6b63df..0f9c83d 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
@@ -12,7 +12,6 @@ import static android.support.test.espresso.matcher.ViewMatchers.Visibility.GONE; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isRoot; -import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; import static android.support.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withParent; @@ -33,10 +32,10 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.enterTabSwitcher; import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.getSwipeToDismissAction; import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.rotateDeviceToOrientation; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.switchTabModel; 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.ViewUtils.waitForView; -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; @@ -675,6 +674,7 @@ message = "https://crbug.com/1023833") public void testIncognitoToggle_tabCount() throws InterruptedException { mActivityTestRule.loadUrl(mUrl); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); // Prepare two incognito tabs and enter tab switcher. prepareTabs(1, 2, mUrl); @@ -683,11 +683,11 @@ .check(TabCountAssertion.havingTabCount(2)); for (int i = 0; i < mRepeat; i++) { - switchTabModel(false); + switchTabModel(cta, false); onView(withId(R.id.tab_list_view)) .check(TabCountAssertion.havingTabCount(1)); - switchTabModel(true); + switchTabModel(cta, true); onView(withId(R.id.tab_list_view)) .check(TabCountAssertion.havingTabCount(2)); } @@ -701,6 +701,7 @@ message = "https://crbug.com/1023833") public void testIncognitoToggle_thumbnailFetchCount() throws InterruptedException { mActivityTestRule.loadUrl(mUrl); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); int oldFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); // Prepare two incognito tabs and enter tab switcher. @@ -715,7 +716,7 @@ TabContentManager.ThumbnailFetchingResult.GOT_JPEG); for (int i = 0; i < mRepeat; i++) { - switchTabModel(false); + switchTabModel(cta, false); currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); int currentHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, @@ -725,7 +726,7 @@ oldFetchCount = currentFetchCount; oldHistogramRecord = currentHistogramRecord; - switchTabModel(true); + switchTabModel(cta, true); currentFetchCount = mTabListDelegate.getBitmapFetchCountForTesting(); currentHistogramRecord = RecordHistogram.getHistogramValueCountForTesting( TabContentManager.UMA_THUMBNAIL_FETCHING_RESULT, @@ -767,11 +768,12 @@ ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID}) public void testUrlUpdatedNotCrashing_ForTabNotInCurrentModel() throws Exception { // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); prepareTabs(1, 1, null); enterGTSWithThumbnailChecking(); - Tab tab = mActivityTestRule.getActivity().getTabModelSelector().getCurrentTab(); - switchTabModel(false); + Tab tab = cta.getTabModelSelector().getCurrentTab(); + switchTabModel(cta, false); mActivityTestRule.loadUrlInTab( mUrl, PageTransition.TYPED | PageTransition.FROM_ADDRESS_BAR, tab); @@ -909,7 +911,7 @@ verifyTabModelTabCount(cta, 3, 0); // New tab tile should be showing in incognito mode. - switchTabModel(true); + switchTabModel(cta, true); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); @@ -923,13 +925,13 @@ // Close all normal tabs and incognito tabs, the new tab tile should still show in both // modes. - switchTabModel(false); + switchTabModel(cta, false); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(4)); MenuUtils.invokeCustomMenuActionSync( InstrumentationRegistry.getInstrumentation(), cta, R.id.close_all_tabs_menu_id); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); - switchTabModel(true); + switchTabModel(cta, true); onView(withId(R.id.tab_list_view)).check(TabCountAssertion.havingTabCount(1)); onView(withId(R.id.new_tab_tile)).check(matches(isDisplayed())); } @@ -1014,7 +1016,7 @@ onView(withId(R.id.new_tab_tile)).check(doesNotExist()); verifyTabSwitcherCardCount(cta, 2); - switchTabModel(true); + switchTabModel(cta, true); onView(withId(R.id.new_tab_tile)).check(doesNotExist()); verifyTabSwitcherCardCount(cta, 0); } @@ -1288,10 +1290,10 @@ enterTabSwitcher(cta); checkNewTabVariationVisibility(false); - switchTabModel(false); + switchTabModel(cta, false); checkNewTabVariationVisibility(false); - switchTabModel(true); + switchTabModel(cta, true); checkNewTabVariationVisibility(false); closeFirstTabInTabSwitcher(); @@ -1622,24 +1624,6 @@ InstrumentationRegistry.getInstrumentation(), cta, R.id.menu_group_tabs); } - private void switchTabModel(boolean isIncognito) { - assertTrue(isIncognito != - mActivityTestRule.getActivity().getTabModelSelector().isIncognitoSelected()); - - onView(withContentDescription( - isIncognito ? R.string.accessibility_tab_switcher_incognito_stack - : R.string.accessibility_tab_switcher_standard_stack) - ).perform(click()); - - 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); - } - /** * TODO(wychen): move some of the callers to {@link TabUiTestHelper#enterTabSwitcher}. */
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 154ec136..6f49246 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -1365,6 +1365,16 @@ if (modelIndex == Tab.INVALID_TAB_ID) return; List<Tab> relatedTabList = getRelatedTabsForId(pseudoTab.getId()); + Callback<Drawable> faviconCallback = drawable -> { + assert drawable != null; + // Need to re-get the index because the original index can be stale when callback is + // triggered. + int index = mModel.indexFromId(pseudoTab.getId()); + if (index != TabModel.INVALID_TAB_INDEX && drawable != null) { + mModel.get(index).model.set(TabProperties.FAVICON, drawable); + } + }; + if (mActionsOnAllRelatedTabs && relatedTabList.size() > 1) { if (!TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled()) { // For tab group card in grid tab switcher, the favicon is set to be null. @@ -1382,10 +1392,7 @@ // For tab group card in grid tab switcher, the favicon is the composed favicon. mTabListFaviconProvider.getComposedFaviconImageAsync( - urls, pseudoTab.isIncognito(), (drawable) -> { - assert drawable != null; - mModel.get(modelIndex).model.set(TabProperties.FAVICON, drawable); - }); + urls, pseudoTab.isIncognito(), faviconCallback); return; } @@ -1400,15 +1407,7 @@ mModel.get(modelIndex).model.set(TabProperties.FAVICON, drawable); return; } - Callback<Drawable> faviconCallback = drawable -> { - assert drawable != null; - // Need to re-get the index because the original index can be stale when callback is - // triggered. - int index = mModel.indexFromId(pseudoTab.getId()); - if (index != Tab.INVALID_TAB_ID && drawable != null) { - mModel.get(index).model.set(TabProperties.FAVICON, drawable); - } - }; + mTabListFaviconProvider.getFaviconForUrlAsync( pseudoTab.getUrl(), pseudoTab.isIncognito(), faviconCallback); }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java index 0029b58..fa27c948 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMultiWindowTest.java
@@ -7,17 +7,19 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper.moveActivityToFront; import static org.chromium.chrome.browser.multiwindow.MultiWindowTestHelper.waitForSecondChromeTabbedActivity; import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.clickFirstCardFromTabSwitcher; import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.createTabs; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.enterTabSwitcher; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.switchTabModel; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabModelTabCount; +import static org.chromium.chrome.browser.tasks.tab_management.TabUiTestHelper.verifyTabSwitcherCardCount; import android.annotation.TargetApi; import android.os.Build; import android.support.test.InstrumentationRegistry; import android.support.test.filters.MediumTest; -import android.view.ViewGroup; - -import androidx.recyclerview.widget.RecyclerView; import org.junit.Before; import org.junit.Rule; @@ -32,7 +34,6 @@ import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.toolbar.IncognitoToggleTabLayout; import org.chromium.chrome.features.start_surface.StartSurfaceLayout; import org.chromium.chrome.tab_ui.R; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -41,14 +42,13 @@ import org.chromium.chrome.test.util.browser.Features; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper; -import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.test.util.UiRestriction; /** Tests for Multi-window related behavior in grid tab switcher. */ @RunWith(ChromeJUnit4ClassRunner.class) // clang-format off @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, - ChromeSwitches.DISABLE_TAB_MERGING_FOR_TESTING}) + ChromeSwitches.DISABLE_TAB_MERGING_FOR_TESTING}) @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) @MinAndroidSdkLevel(Build.VERSION_CODES.N) @Features.EnableFeatures({ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID}) @@ -87,48 +87,42 @@ assertTrue(cta1.getTabModelSelector().getCurrentModel().isIncognito()); // Before move, there are 3 incognito tabs in cta1. - RecyclerView recyclerView1 = cta1.findViewById(R.id.tab_list_view); - CriteriaHelper.pollUiThread(Criteria.equals(3, recyclerView1::getChildCount)); + verifyTabSwitcherCardCount(cta1, 3); // Move 2 incognito tabs to cta2. clickFirstCardFromTabSwitcher(cta1); - moveTabsToOtherWindow(cta1, 2); + MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), cta1, + R.id.move_to_other_window_menu_id); + final ChromeTabbedActivity cta2 = waitForSecondChromeTabbedActivity(); + moveActivityToFront(cta1); + moveTabsToOtherWindow(cta1, 1); // After move, there are 1 incognito tab in cta1 and 2 incognito tabs in cta2. - final ChromeTabbedActivity cta2 = waitForSecondChromeTabbedActivity(); + enterTabSwitcher(cta1); + verifyTabSwitcherCardCount(cta1, 1); + clickFirstCardFromTabSwitcher(cta1); + moveActivityToFront(cta2); + enterTabSwitcher(cta2); + verifyTabSwitcherCardCount(cta2, 2); verifyTabModelTabCount(cta1, 4, 1); verifyTabModelTabCount(cta2, 0, 2); - enterTabSwitcher(cta1); - CriteriaHelper.pollUiThread(Criteria.equals(1, recyclerView1::getChildCount)); - - // Enter tab switcher in cta2. - enterTabSwitcher(cta2); - - // There should be two incognito tabs in tab switcher in cta2. - RecyclerView recyclerView2 = cta2.findViewById(R.id.tab_list_view); - CriteriaHelper.pollUiThread(Criteria.equals(2, recyclerView2::getChildCount)); // Move 1 incognito tab back to cta1. clickFirstCardFromTabSwitcher(cta2); moveTabsToOtherWindow(cta2, 1); // After move, there are 2 incognito tabs in cta1 and 1 incognito tab in cta2. + enterTabSwitcher(cta2); + verifyTabSwitcherCardCount(cta2, 1); + clickFirstCardFromTabSwitcher(cta2); + moveActivityToFront(cta1); + enterTabSwitcher(cta1); + verifyTabSwitcherCardCount(cta1, 2); verifyTabModelTabCount(cta1, 4, 2); verifyTabModelTabCount(cta2, 0, 1); - enterTabSwitcher(cta2); - CriteriaHelper.pollUiThread(Criteria.equals(1, recyclerView2::getChildCount)); - - // Enter tab switcher in cta1. Verify there are two incognito tabs in tab switcher in cta1. - enterTabSwitcher(cta1); - CriteriaHelper.pollUiThread(Criteria.equals(2, recyclerView1::getChildCount)); // Switch to normal tab list in cta1. - TestThreadUtils.runOnUiThreadBlocking(() -> { - IncognitoToggleTabLayout toggleTabLayout = - cta1.findViewById(R.id.incognito_toggle_tabs); - ViewGroup toggleButtons = (ViewGroup) toggleTabLayout.getChildAt(0); - toggleButtons.getChildAt(0).performClick(); - }); + switchTabModel(cta1, false); assertFalse(cta1.getTabModelSelector().getCurrentModel().isIncognito()); // Move 3 normal tabs to cta2. @@ -136,48 +130,35 @@ moveTabsToOtherWindow(cta1, 3); // After move, there are 1 normal tab in cta1 and 3 normal tabs in cta2. + enterTabSwitcher(cta1); + verifyTabSwitcherCardCount(cta1, 1); + clickFirstCardFromTabSwitcher(cta1); + moveActivityToFront(cta2); + enterTabSwitcher(cta2); + verifyTabSwitcherCardCount(cta2, 3); verifyTabModelTabCount(cta1, 1, 2); verifyTabModelTabCount(cta2, 3, 1); - enterTabSwitcher(cta1); - CriteriaHelper.pollUiThread(Criteria.equals(1, recyclerView1::getChildCount)); - - // Enter tab switcher in cta2. - enterTabSwitcher(cta2); - - // There should be 3 normal tabs in tab switcher in cta2. - CriteriaHelper.pollUiThread(Criteria.equals(3, recyclerView2::getChildCount)); // Move 2 normal tabs back to cta1. clickFirstCardFromTabSwitcher(cta2); moveTabsToOtherWindow(cta2, 2); // After move, there are 3 normal tabs in cta1 and 1 normal tab in cta2. + enterTabSwitcher(cta2); + verifyTabSwitcherCardCount(cta2, 1); + clickFirstCardFromTabSwitcher(cta2); + moveActivityToFront(cta1); + enterTabSwitcher(cta1); + verifyTabSwitcherCardCount(cta1, 3); verifyTabModelTabCount(cta1, 3, 2); verifyTabModelTabCount(cta2, 1, 1); - enterTabSwitcher(cta2); - CriteriaHelper.pollUiThread(Criteria.equals(1, recyclerView2::getChildCount)); } private void moveTabsToOtherWindow(ChromeTabbedActivity cta, int number) { for (int i = 0; i < number; i++) { MenuUtils.invokeCustomMenuActionSync(InstrumentationRegistry.getInstrumentation(), cta, - org.chromium.chrome.R.id.move_to_other_window_menu_id); + R.id.move_to_other_window_menu_id); + moveActivityToFront(cta); } } - - private void enterTabSwitcher(ChromeTabbedActivity cta) { - assertFalse(cta.getLayoutManager().overviewVisible()); - TestThreadUtils.runOnUiThreadBlocking( - () -> { cta.findViewById(R.id.tab_switcher_button).performClick(); }); - CriteriaHelper.pollUiThread( - Criteria.equals(true, () -> cta.getLayoutManager().overviewVisible())); - } - - private void verifyTabModelTabCount( - ChromeTabbedActivity cta, int normalTabs, int incognitoTabs) { - CriteriaHelper.pollUiThread(Criteria.equals( - normalTabs, () -> cta.getTabModelSelector().getModel(false).getCount())); - CriteriaHelper.pollUiThread(Criteria.equals( - incognitoTabs, () -> cta.getTabModelSelector().getModel(true).getCount())); - } }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java index 1333a57..4c56688 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java
@@ -10,6 +10,7 @@ import static android.support.test.espresso.matcher.RootMatchers.withDecorView; import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withParent; @@ -21,6 +22,7 @@ import static org.junit.Assert.assertTrue; import static org.chromium.base.test.util.CallbackHelper.WAIT_TIMEOUT_SECONDS; +import static org.chromium.chrome.test.util.browser.RecyclerViewTestUtils.waitForStableRecyclerView; 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; @@ -589,6 +591,29 @@ } /** + * Click on the incognito toggle within grid tab switcher top toolbar to switch between normal + * and incognito tab model. + * @param cta The current running activity. + * @param isIncognito indicates whether the incognito or normal tab model is selected after + * switch. + */ + public static void switchTabModel(ChromeTabbedActivity cta, boolean isIncognito) { + assertTrue(isIncognito != cta.getTabModelSelector().isIncognitoSelected()); + assertTrue(cta.getOverviewModeBehavior().overviewVisible()); + + onView(withContentDescription(isIncognito + ? R.string.accessibility_tab_switcher_incognito_stack + : R.string.accessibility_tab_switcher_standard_stack)) + .perform(click()); + + CriteriaHelper.pollUiThread(Criteria.equals( + isIncognito, () -> cta.getTabModelSelector().isIncognitoSelected())); + // Wait for tab list recyclerView to finish animation after tab model switch. + RecyclerView recyclerView = cta.findViewById(R.id.tab_list_view); + waitForStableRecyclerView(recyclerView); + } + + /** * Implementation of {@link ViewAssertion} to verify the {@link RecyclerView} has correct number * of children. */
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java index e3a4061..3d520996 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -2025,6 +2025,84 @@ assertThat(mModel.get(1).model.get(TabProperties.FAVICON), equalTo(mFaviconDrawable)); } + @Test + @Features.EnableFeatures({TAB_GROUPS_CONTINUATION_ANDROID}) + public void testUpdateFaviconForGroup_StaleIndex_SelectAnotherTabWithinGroup() { + setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER); + mMediator.setActionOnAllRelatedTabsForTesting(true); + mModel.get(0).model.set(TabProperties.FAVICON, null); + mModel.get(1).model.set(TabProperties.FAVICON, null); + doNothing() + .when(mTabListFaviconProvider) + .getComposedFaviconImageAsync(any(), anyBoolean(), mCallbackCaptor.capture()); + + TabImpl tab3 = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL); + List<Tab> group1 = new ArrayList<>(Arrays.asList(mTab2, tab3)); + createTabGroup(group1, TAB2_ID); + assertEquals(1, mModel.indexFromId(TAB2_ID)); + + mTabObserverCaptor.getValue().onFaviconUpdated(mTab2, mFaviconBitmap); + + // Simulate selecting another Tab within TabGroup before callback in + // getComposedFaviconImageAsync triggers + mModel.get(1).model.set(TabProperties.TAB_ID, TAB3_ID); + mCallbackCaptor.getValue().onResult(mFaviconDrawable); + + assertNotEquals(1, mModel.indexFromId(TAB2_ID)); + assertNull(mModel.get(1).model.get(TabProperties.FAVICON)); + } + + @Test + @Features.EnableFeatures({TAB_GROUPS_CONTINUATION_ANDROID}) + public void testUpdateFaviconForGroup_StaleIndex_CloseTab() { + setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER); + mMediator.setActionOnAllRelatedTabsForTesting(true); + mModel.get(0).model.set(TabProperties.FAVICON, null); + mModel.get(1).model.set(TabProperties.FAVICON, null); + doNothing() + .when(mTabListFaviconProvider) + .getComposedFaviconImageAsync(any(), anyBoolean(), mCallbackCaptor.capture()); + + TabImpl tab3 = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL); + List<Tab> group1 = new ArrayList<>(Arrays.asList(mTab2, tab3)); + createTabGroup(group1, TAB2_ID); + assertEquals(1, mModel.indexFromId(TAB2_ID)); + + mTabObserverCaptor.getValue().onFaviconUpdated(mTab2, mFaviconBitmap); + + // Simulate closing mTab1 at index 0 before callback in getComposedFaviconImageAsync + // triggers. + mModel.removeAt(0); + mCallbackCaptor.getValue().onResult(mFaviconDrawable); + + assertEquals(0, mModel.indexFromId(TAB2_ID)); + assertEquals(mFaviconDrawable, mModel.get(0).model.get(TabProperties.FAVICON)); + } + + @Test + @Features.EnableFeatures({TAB_GROUPS_CONTINUATION_ANDROID}) + public void testUpdateFaviconForGroup_StaleIndex_Reset() { + setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER); + mMediator.setActionOnAllRelatedTabsForTesting(true); + mModel.get(0).model.set(TabProperties.FAVICON, null); + mModel.get(1).model.set(TabProperties.FAVICON, null); + doNothing() + .when(mTabListFaviconProvider) + .getComposedFaviconImageAsync(any(), anyBoolean(), mCallbackCaptor.capture()); + + TabImpl tab3 = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL); + List<Tab> group1 = new ArrayList<>(Arrays.asList(mTab2, tab3)); + createTabGroup(group1, TAB2_ID); + assertEquals(1, mModel.indexFromId(TAB2_ID)); + + mTabObserverCaptor.getValue().onFaviconUpdated(mTab2, mFaviconBitmap); + + // Simulate TabListMediator reset with null before callback in getComposedFaviconImageAsync + // triggers. + mModel.set(new ArrayList<>()); + mCallbackCaptor.getValue().onResult(mFaviconDrawable); + } + private void initAndAssertAllProperties() { List<Tab> tabs = new ArrayList<>(); for (int i = 0; i < mTabModel.getCount(); i++) {
diff --git a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java index 273b5d6..bf241fb 100644 --- a/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java +++ b/chrome/android/features/vr/java/src/org/chromium/chrome/browser/vr/VrShell.java
@@ -40,6 +40,7 @@ import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.compositor.CompositorView; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; +import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate; import org.chromium.chrome.browser.page_info.PageInfoController; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.RedirectHandlerTabHelper; @@ -565,11 +566,12 @@ public void showPageInfo() { Tab tab = mActivity.getActivityTab(); if (tab == null) return; - - PageInfoController.show(mActivity, tab.getWebContents(), null, + WebContents webContents = tab.getWebContents(); + PageInfoController.show(mActivity, webContents, null, PageInfoController.OpenedFromSource.VR, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab)); + new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab), + new ChromePageInfoControllerDelegate(mActivity, webContents)); } // Called because showing audio permission dialog isn't supported in VR. This happens when
diff --git a/chrome/android/java/DEPS b/chrome/android/java/DEPS index c39a77fc..ef881be 100644 --- a/chrome/android/java/DEPS +++ b/chrome/android/java/DEPS
@@ -28,7 +28,6 @@ "+components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core", "+components/embedder_support/android", "+components/embedder_support/android/delegate", - "+components/favicon/android", "+components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement", "+components/gcm_driver/android/java/src/org/chromium/components/gcm_driver", "+components/language",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java index 84f6be4e..f140c970 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActionModeHandler.java
@@ -45,12 +45,15 @@ */ public class ChromeActionModeHandler { /** Observes the active WebContents being initialized into a Tab. */ - private final Callback<WebContents> mInitWebContentsObserver; + private final Consumer<WebContents> mInitWebContentsObserver; private final ActivityTabProvider.ActivityTabTabObserver mActivityTabTabObserver; private Tab mActiveTab; + /** Set to {@code true} once the first Tab content is changed. */ + private boolean mContentChanged; + /** * @param activityTabProvider {@link ActivityTabProvider} instance. * @param actionBarObserver observer called when the contextual action bar's visibility @@ -81,6 +84,19 @@ TabWebContentsObserver.from(tab).addInitWebContentsObserver( mInitWebContentsObserver); mActiveTab = tab; + + // For the very first tab being observed, we miss mInitWebContentsObserver + // because TabObserver.onContentChanged -> + // TabWebContentsObserver.initWebContents occurs before this activity tab + // observer is ready. Manually triggers it here. + if (!mContentChanged && tab.getWebContents() != null) { + mInitWebContentsObserver.accept(tab.getWebContents()); + } + } + + @Override + public void onContentChanged(Tab tab) { + mContentChanged = true; } }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java index f8a9ef829..5b720a0a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -110,6 +110,7 @@ import org.chromium.chrome.browser.omaha.UpdateMenuItemHelper.MenuButtonState; import org.chromium.chrome.browser.omaha.notification.UpdateNotificationController; import org.chromium.chrome.browser.omaha.notification.UpdateNotificationControllerFactory; +import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate; import org.chromium.chrome.browser.page_info.PageInfoController; import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations; import org.chromium.chrome.browser.preferences.Pref; @@ -1965,10 +1966,12 @@ RecordUserAction.record("MobileMenuReload"); } } else if (id == R.id.info_menu_id) { - PageInfoController.show(this, currentTab.getWebContents(), null, + WebContents webContents = currentTab.getWebContents(); + PageInfoController.show(this, webContents, null, PageInfoController.OpenedFromSource.MENU, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(currentTab)); + new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(currentTab), + new ChromePageInfoControllerDelegate(this, webContents)); } else if (id == R.id.translate_id) { RecordUserAction.record("MobileMenuTranslate"); Tracker tracker = TrackerFactory.getTrackerForProfile(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java index dec543db..578803f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeCachedFlags.java
@@ -45,6 +45,7 @@ // clang-format off List<String> featuresToCache = Arrays.asList( + ChromeFeatureList.ANDROID_PARTNER_CUSTOMIZATION_PHENOTYPE, ChromeFeatureList.COMMAND_LINE_ON_NON_ROOTED, ChromeFeatureList.CHROME_DUET, ChromeFeatureList.CHROME_DUET_ADAPTIVE,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java index e76b2d1..36c47ca 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -598,6 +598,8 @@ * Extracts the URL from voice search result intent. * @return URL if it was found, null otherwise. */ + // TODO(https://crbug.com/783819): Investigate whether this function can return a GURL instead, + // or split into formatted/unformatted getUrl. static String getUrlFromVoiceSearchResult(Intent intent) { if (!RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals(intent.getAction())) { return null; @@ -629,7 +631,7 @@ if (urls != null && urls.size() > 0) { url = urls.get(0); } else { - url = TemplateUrlServiceFactory.get().getUrlForVoiceSearchQuery(query); + url = TemplateUrlServiceFactory.get().getUrlForVoiceSearchQuery(query).getSpec(); } } return url;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java index a9f37c4..d116c86 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ShortcutHelper.java
@@ -49,7 +49,7 @@ import org.chromium.chrome.browser.webapps.WebappInfo; import org.chromium.chrome.browser.webapps.WebappLauncherActivity; import org.chromium.chrome.browser.webapps.WebappRegistry; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.content_public.common.ScreenOrientationConstants; import org.chromium.ui.base.ViewUtils; import org.chromium.ui.widget.Toast; @@ -560,8 +560,8 @@ int cornerRadius = Math.round(ICON_CORNER_RADIUS_RATIO * outerSize); int fontSize = Math.round(GENERATED_ICON_FONT_SIZE_RATIO * outerSize); int color = Color.rgb(red, green, blue); - FaviconFallbackGenerator generator = - new FaviconFallbackGenerator(innerSize, innerSize, cornerRadius, color, fontSize); + RoundedIconGenerator generator = + new RoundedIconGenerator(innerSize, innerSize, cornerRadius, color, fontSize); Bitmap icon = generator.generateIconForUrl(url); if (icon == null) return null; // Bookmark URL does not have a domain. canvas.drawBitmap(icon, padding, padding, null);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java index 7980d723..aa8d0fcf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemRow.java
@@ -15,7 +15,7 @@ import org.chromium.chrome.browser.ui.favicon.IconType; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge.LargeIconCallback; import org.chromium.components.bookmarks.BookmarkId; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; /** * A row view that shows bookmark info in the bookmarks UI. @@ -23,7 +23,7 @@ public class BookmarkItemRow extends BookmarkRow implements LargeIconCallback { private String mUrl; - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; private final int mMinIconSize; private final int mDisplayedIconSize;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java index f7fc17a..33ddc5a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java
@@ -40,7 +40,7 @@ import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge.LargeIconCallback; import org.chromium.components.bookmarks.BookmarkId; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.content_public.browser.UiThreadTaskTraits; import java.util.ArrayList; @@ -170,7 +170,7 @@ private BookmarkFolder mFolder; private BookmarkModel mBookmarkModel; private LargeIconBridge mLargeIconBridge; - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; private int mMinIconSizeDp; private int mDisplayedIconSize; private int mRemainingTaskCount;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java index e8855d0..30ca834 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java
@@ -36,7 +36,7 @@ import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge.LargeIconCallback; import org.chromium.components.browser_ui.util.ConversionUtils; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import java.util.ArrayList; import java.util.HashMap; @@ -57,7 +57,7 @@ extends ArrayAdapter<String> implements AdapterView.OnItemClickListener { private final String[] mDomains; private final int mFaviconSize; - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; private ClearBrowsingDataAdapter( String[] domains, String[] faviconURLs, Resources resources) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java index 19b87d9..8d92bac1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabCoordinator.java
@@ -27,9 +27,10 @@ import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetContent; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController; import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController.SheetState; +import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetController.StateChangeReason; import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.view.ContentView; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.Tracker; import org.chromium.content_public.browser.LoadUrlParams; @@ -203,7 +204,8 @@ private void openInNewTab() { if (mCanPromoteToNewTab.get() && mUrl != null) { - mBottomSheetController.hideContent(mSheetContent, /* animate= */ true); + mBottomSheetController.hideContent( + mSheetContent, /* animate= */ true, StateChangeReason.PROMOTE_TAB); mTabCreator.get().createNewTab(new LoadUrlParams(mUrl, PageTransition.LINK), TabLaunchType.FROM_LINK, mTabProvider.get()); mMetrics.recordOpenInNewTab(); @@ -253,7 +255,7 @@ static class FaviconLoader { private final Context mContext; private final FaviconHelper mFaviconHelper; - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; private final int mFaviconSize; /** Constructor. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java index b4ef7f94..0f57c79 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMetrics.java
@@ -25,8 +25,12 @@ /** The timestamp when the panel entered the opened state for the first time. */ private long mPanelOpenedNanoseconds; + /** Whether the panel is in any visible state. */ + private boolean mIsVisible; + /** Records metrics for the peeked panel state. */ public void recordMetricsForPeeked() { + mIsVisible = true; startPeekTimer(); // Could be returning to Peek from Open. finishOpenTimer(); @@ -34,22 +38,26 @@ /** Records metrics when the panel has been fully opened. */ public void recordMetricsForOpened() { + mIsVisible = true; startOpenTimer(); finishPeekTimer(); } /** Records metrics when the panel has been closed. */ public void recordMetricsForClosed(@StateChangeReason int stateChangeReason) { + if (!mIsVisible) return; + finishPeekTimer(); finishOpenTimer(); RecordHistogram.recordBooleanHistogram("EphemeralTab.Ctr", mDidRecordFirstOpen); RecordHistogram.recordEnumeratedHistogram("EphemeralTab.BottomSheet.CloseReason", stateChangeReason, StateChangeReason.MAX_VALUE + 1); - resetTimers(); + reset(); } /** Records a user action that promotes the ephemeral tab to a full tab. */ public void recordOpenInNewTab() { + recordMetricsForClosed(StateChangeReason.PROMOTE_TAB); RecordUserAction.record("EphemeralTab.OpenInNewTab"); } @@ -58,12 +66,13 @@ RecordUserAction.record("EphemeralTab.NavigateLink"); } - /** Resets the metrics used by the timers. */ - private void resetTimers() { + /** Resets all internal state including metrics and timers. */ + private void reset() { mDidRecordFirstPeek = false; mPanelPeekedNanoseconds = 0; mDidRecordFirstOpen = false; mPanelOpenedNanoseconds = 0; + mIsVisible = false; } /** Starts timing the peek state if it's not already been started. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java index e3a4664..b450bb6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/PickerCategoryView.java
@@ -26,10 +26,10 @@ import org.chromium.chrome.browser.util.BitmapCache; import org.chromium.chrome.browser.vr.VrModeProviderImpl; import org.chromium.components.browser_ui.util.ConversionUtils; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListLayout; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.content.browser.contacts.ContactsPickerPropertiesRequested; import org.chromium.ui.ContactsPickerListener; import org.chromium.ui.UiUtils; @@ -56,7 +56,7 @@ private static final int ACTION_CONTACTS_SELECTED = 1; private static final int ACTION_BOUNDARY = 2; - // Constants for the FaviconFallbackGenerator. + // Constants for the RoundedIconGenerator. private static final int ICON_SIZE_DP = 36; private static final int ICON_CORNER_RADIUS_DP = 20; private static final int ICON_TEXT_SIZE_DP = 12; @@ -89,7 +89,7 @@ private LinearLayoutManager mLayoutManager; // A helper class to draw the icon for each contact. - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; // The {@link SelectionDelegate} keeping track of which contacts are selected. private SelectionDelegate<ContactDetails> mSelectionDelegate; @@ -150,7 +150,7 @@ Resources resources = context.getResources(); int iconColor = ApiCompatibilityUtils.getColor(resources, R.color.default_favicon_background_color); - mIconGenerator = new FaviconFallbackGenerator(resources, ICON_SIZE_DP, ICON_SIZE_DP, + mIconGenerator = new RoundedIconGenerator(resources, ICON_SIZE_DP, ICON_SIZE_DP, ICON_CORNER_RADIUS_DP, iconColor, ICON_TEXT_SIZE_DP); View root = LayoutInflater.from(context).inflate(R.layout.contacts_picker_dialog, this); @@ -315,7 +315,7 @@ return mSelectionDelegate; } - FaviconFallbackGenerator getIconGenerator() { + RoundedIconGenerator getIconGenerator() { return mIconGenerator; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java index 5d2e0fd7..f42104967 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/RevampedContextMenuHeaderMediator.java
@@ -30,8 +30,8 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.favicon.IconType; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.contextmenu.ContextMenuParams; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.ui.modelutil.PropertyModel; class RevampedContextMenuHeaderMediator implements View.OnClickListener { @@ -80,8 +80,7 @@ boolean isColorDefault, @IconType int iconType) { // If we didn't get a favicon, generate a monogram instead if (icon == null) { - final FaviconFallbackGenerator iconGenerator = - createFaviconFallbackGenerator(fallbackColor); + final RoundedIconGenerator iconGenerator = createRoundedIconGenerator(fallbackColor); icon = iconGenerator.generateIconForUrl(mPlainUrl); // generateIconForUrl might return null if the URL is empty or the domain cannot be // resolved. See https://crbug.com/987101 @@ -183,7 +182,7 @@ mModel.set(RevampedContextMenuHeaderProperties.IMAGE, bitmap); } - private FaviconFallbackGenerator createFaviconFallbackGenerator(@ColorInt int iconColor) { + private RoundedIconGenerator createRoundedIconGenerator(@ColorInt int iconColor) { final Resources resources = mContext.getResources(); final int iconSize = resources.getDimensionPixelSize(R.dimen.revamped_context_menu_header_monogram_size); @@ -191,6 +190,6 @@ final int textSize = resources.getDimensionPixelSize( R.dimen.revamped_context_menu_header_monogram_text_size); - return new FaviconFallbackGenerator(iconSize, iconSize, cornerRadius, iconColor, textSize); + return new RoundedIconGenerator(iconSize, iconSize, cornerRadius, iconColor, textSize); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java index 1fa9d078..61ee748 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java
@@ -221,8 +221,12 @@ */ protected Uri getUriTemplate(String query, @Nullable String alternateTerm, @Nullable String mid, boolean shouldPrefetch) { - Uri uri = Uri.parse(TemplateUrlServiceFactory.get().getUrlForContextualSearchQuery( - query, alternateTerm, shouldPrefetch, CTXS_TWO_REQUEST_PROTOCOL)); + // TODO(https://crbug.com/783819): Avoid parsing the GURL as a Uri, and update + // makeKPTriggeringUri to operate on GURLs. + Uri uri = Uri.parse(TemplateUrlServiceFactory.get() + .getUrlForContextualSearchQuery(query, alternateTerm, + shouldPrefetch, CTXS_TWO_REQUEST_PROTOCOL) + .getSpec()); if (!TextUtils.isEmpty(mid)) uri = makeKPTriggeringUri(uri, mid); return uri; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 287dbda..110f3c3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -49,6 +49,7 @@ import org.chromium.chrome.browser.infobar.InfoBarContainer; import org.chromium.chrome.browser.night_mode.NightModeUtils; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; +import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate; import org.chromium.chrome.browser.page_info.PageInfoController; import org.chromium.chrome.browser.previews.Previews; import org.chromium.chrome.browser.tab.Tab; @@ -246,11 +247,12 @@ } else if (id == R.id.info_menu_id) { Tab tab = getTabModelSelector().getCurrentTab(); if (tab == null) return false; - PageInfoController.show(this, tab.getWebContents(), - getToolbarManager().getContentPublisher(), + WebContents webContents = tab.getWebContents(); + PageInfoController.show(this, webContents, getToolbarManager().getContentPublisher(), PageInfoController.OpenedFromSource.MENU, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab)); + new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab), + new ChromePageInfoControllerDelegate(this, webContents)); return true; } return super.onMenuOrKeyboardAction(id, fromMenu);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java index 45e30ce..617fe89 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java
@@ -8,7 +8,7 @@ import android.graphics.Bitmap; import android.text.TextUtils; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; /** * Generates icons suitable for Custom Tabs in the recent tasks list. @@ -36,7 +36,7 @@ /** * Generates the icon if there is no adequate favicon. */ - private FaviconFallbackGenerator mGenerator; + private RoundedIconGenerator mGenerator; public CustomTabTaskDescriptionIconGenerator(Context context) { mContext = context; @@ -64,7 +64,7 @@ } if (mGenerator == null) { - mGenerator = new FaviconFallbackGenerator(mContext.getResources(), APP_ICON_SIZE_DP, + mGenerator = new RoundedIconGenerator(mContext.getResources(), APP_ICON_SIZE_DP, APP_ICON_SIZE_DP, APP_ICON_CORNER_RADIUS_DP, APP_ICON_DEFAULT_BACKGROUND_COLOR, APP_ICON_TEXT_SIZE_DP); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/CategoryCardAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/CategoryCardAdapter.java index 9200401..90ec03c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/CategoryCardAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/CategoryCardAdapter.java
@@ -16,7 +16,7 @@ import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.browser_ui.widget.LoadingView; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.ui.modelutil.ForwardingListObservable; import org.chromium.ui.modelutil.ListObservable.ListObserver; import org.chromium.ui.modelutil.PropertyKey; @@ -44,7 +44,7 @@ int ERROR = 2; } - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; private final ContextMenuManager mContextMenuManager; private final NativePageNavigationDelegate mNavDelegate; private final Profile mProfile; @@ -56,7 +56,7 @@ private PropertyModel mCategoryModel; CategoryCardAdapter(PropertyModel model, StableScrollLayoutManager layoutManager, - FaviconFallbackGenerator iconGenerator, ContextMenuManager contextMenuManager, + RoundedIconGenerator iconGenerator, ContextMenuManager contextMenuManager, NativePageNavigationDelegate navDelegate, Profile profile) { mCategoryModel = model; mCategoryModel.addObserver(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExperimentalExploreSitesCategoryTileView.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExperimentalExploreSitesCategoryTileView.java index dca6776..25cbdf28 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExperimentalExploreSitesCategoryTileView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExperimentalExploreSitesCategoryTileView.java
@@ -16,7 +16,7 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.ui.base.ViewUtils; /** @@ -28,7 +28,7 @@ private ExploreSitesCategoryTile mCategoryData; private Resources mResources; - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; private TextView mTitleView; private ImageView mIconView; @@ -56,7 +56,7 @@ * mResources.getDimensionPixelSize( R.dimen.experimental_explore_sites_padding)); mIconHeightPx = mIconWidthPx * 2 / 3; - mIconGenerator = new FaviconFallbackGenerator(mIconWidthPx, mIconHeightPx, + mIconGenerator = new RoundedIconGenerator(mIconWidthPx, mIconHeightPx, mResources.getDimensionPixelSize(R.dimen.experimental_explore_sites_radius), ApiCompatibilityUtils.getColor( mResources, R.color.default_favicon_background_color),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardView.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardView.java index b5f10ba..d4b5442 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesCategoryCardView.java
@@ -23,7 +23,7 @@ import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.suggestions.tile.TileGridLayout; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.ui.base.PageTransition; import org.chromium.ui.modelutil.PropertyKey; @@ -43,7 +43,7 @@ private final ExploreSitesSiteViewBinder mSiteViewBinder; private TextView mTitleView; private TileGridLayout mTileView; - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; private ContextMenuManager mContextMenuManager; private NativePageNavigationDelegate mNavigationDelegate; private Profile mProfile; @@ -209,7 +209,7 @@ } public void setCategory(ExploreSitesCategory category, int categoryCardIndex, - FaviconFallbackGenerator iconGenerator, ContextMenuManager contextMenuManager, + RoundedIconGenerator iconGenerator, ContextMenuManager contextMenuManager, NativePageNavigationDelegate navigationDelegate, Profile profile) { mIconGenerator = iconGenerator; mContextMenuManager = contextMenuManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java index 171e9a91..16784f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesPage.java
@@ -31,8 +31,8 @@ import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.browser.ui.native_page.BasicNativePage; import org.chromium.chrome.browser.ui.native_page.NativePageHost; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.util.UrlConstants; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.content_public.browser.NavigationController; import org.chromium.content_public.browser.NavigationEntry; import org.chromium.ui.modelutil.ListModel; @@ -225,8 +225,8 @@ iconRadius = iconSizePx / 2; } - FaviconFallbackGenerator iconGenerator = - new FaviconFallbackGenerator(iconSizePx, iconSizePx, iconRadius, + RoundedIconGenerator iconGenerator = + new RoundedIconGenerator(iconSizePx, iconSizePx, iconRadius, ApiCompatibilityUtils.getColor( context.getResources(), R.color.default_favicon_background_color), context.getResources().getDimensionPixelSize(textSizeDimensionResource));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java index fe9e46a..0cdb47c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/explore_sites/ExploreSitesTileView.java
@@ -17,7 +17,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.suggestions.tile.TileWithTextView; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; /** * View for a category name and site tiles. @@ -27,7 +27,7 @@ private final int mIconCornerRadius; // Used to generate textual icons. - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; public ExploreSitesTileView(Context ctx, AttributeSet attrs) { super(ctx, attrs); @@ -38,7 +38,7 @@ styleAttrs.recycle(); } - public void initialize(FaviconFallbackGenerator generator) { + public void initialize(RoundedIconGenerator generator) { mIconGenerator = generator; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java index 559edbbe..b2409f78 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetMediator.java
@@ -18,9 +18,9 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; import org.chromium.chrome.browser.ui.favicon.FaviconUtils; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.browser_ui.widget.TintedDrawable; import org.chromium.components.embedder_support.util.UrlConstants; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.content_public.browser.NavigationEntry; import org.chromium.content_public.browser.NavigationHistory; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; @@ -39,7 +39,7 @@ class NavigationSheetMediator { private final ClickListener mClickListener; private final FaviconHelper mFaviconHelper; - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; private final int mFaviconSize; private final ModelList mModelList; private final Drawable mHistoryIcon;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java index 990eb7b..b213cc2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryItemView.java
@@ -25,8 +25,8 @@ import org.chromium.chrome.browser.ui.favicon.FaviconUtils; import org.chromium.chrome.browser.ui.favicon.IconType; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge.LargeIconCallback; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.browser_ui.widget.selectable_list.SelectableItemView; -import org.chromium.components.favicon.FaviconFallbackGenerator; /** * The SelectableItemView for items displayed in the browsing history UI. @@ -36,7 +36,7 @@ private VectorDrawableCompat mBlockedVisitDrawable; private HistoryManager mHistoryManager; - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; private DefaultFaviconHelper mFaviconHelper; private final int mMinIconSize;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java index a60e4cc..6c33e7ed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationBuilderBase.java
@@ -25,7 +25,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -120,7 +120,7 @@ private final int mLargeIconWidthPx; private final int mLargeIconHeightPx; - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; protected CharSequence mTitle; protected CharSequence mBody; @@ -624,14 +624,14 @@ } @VisibleForTesting - static FaviconFallbackGenerator createIconGenerator(Resources resources) { + static RoundedIconGenerator createIconGenerator(Resources resources) { int largeIconWidthPx = resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_width); int largeIconHeightPx = resources.getDimensionPixelSize(android.R.dimen.notification_large_icon_height); float density = resources.getDisplayMetrics().density; int cornerRadiusPx = Math.min(largeIconWidthPx, largeIconHeightPx) / 2; - return new FaviconFallbackGenerator(largeIconWidthPx, largeIconHeightPx, cornerRadiusPx, + return new RoundedIconGenerator(largeIconWidthPx, largeIconHeightPx, cornerRadiusPx, NOTIFICATION_ICON_BG_COLOR, NOTIFICATION_ICON_TEXT_SIZE_DP * density); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/FakeboxDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/FakeboxDelegate.java index 9f2bb0a..8fca74ce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/FakeboxDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/FakeboxDelegate.java
@@ -27,6 +27,14 @@ boolean shouldBeFocused, @Nullable String pastedText, @OmniboxFocusReason int reason); /** + * Performs a search query on the current {@link Tab}. This calls {@link + * TemplateUrlService#getUrlForSearchQuery(String)} to get a url based on {@code query} and + * loads that url in the current {@link Tab}. + * @param query The {@link String} that represents the text query that should be searched for. + */ + void performSearchQuery(String query); + + /** * @return Whether the URL bar is currently focused. */ boolean isUrlBarFocused();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java index 11eecb3b..6cd6e7b2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
@@ -220,6 +220,12 @@ } @Override + public void performSearchQuery(String query) { + if (mFakeboxDelegate == null) return; + mFakeboxDelegate.performSearchQuery(query); + } + + @Override public boolean isCurrentPage() { if (mIsDestroyed) return false; if (mFakeboxDelegate == null) return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java index 6a95ae84..5de63a5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -267,10 +267,11 @@ setSearchProviderInfo(searchProviderHasLogo, searchProviderIsGoogle); mSearchProviderLogoView.showSearchProviderInitialView(); - mQueryTileSection = new QueryTileSection( - findViewById(R.id.query_tiles), mSearchBoxCoordinator, profile); + mQueryTileSection = new QueryTileSection(findViewById(R.id.query_tiles), + mSearchBoxCoordinator, profile, mManager::performSearchQuery); - mTileGroup.startObserving(getMaxTileRows() * getMaxTileColumns()); + mTileGroup.startObserving( + getMaxRowsForMostVisitedTiles() * getMaxColumnsForMostVisitedTiles()); VrModuleProvider.registerVrModeObserver(this); if (VrModuleProvider.getDelegate().isInVr()) onEnterVr(); @@ -785,15 +786,15 @@ } } - private static int getMaxTileRows() { - return 2; + private int getMaxRowsForMostVisitedTiles() { + return mQueryTileSection != null && mQueryTileSection.shouldConsiderAsSmallScreen() ? 1 : 2; } /** * Determines The maximum number of tiles to try and fit in a row. On smaller screens, there * may not be enough space to fit all of them. */ - private int getMaxTileColumns() { + private int getMaxColumnsForMostVisitedTiles() { return 4; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java index 330bee2..7451c42 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageView.java
@@ -78,6 +78,12 @@ void focusSearchBox(boolean beginVoiceSearch, String pastedText); /** + * Performs a search query on the current {@link Tab}. + * @param query The {@link String} representing the query text. + */ + void performSearchQuery(String query); + + /** * @return whether the {@link NewTabPage} associated with this manager is the current page * displayed to the user. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java index ae3562a..74eeb60 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java
@@ -34,8 +34,8 @@ import org.chromium.chrome.browser.ui.favicon.FaviconHelper.DefaultFaviconHelper; import org.chromium.chrome.browser.ui.favicon.FaviconHelper.FaviconImageCallback; import org.chromium.chrome.browser.ui.favicon.FaviconUtils; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.util.UrlUtilities; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.components.signin.metrics.SigninAccessPoint; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.mojom.WindowOpenDisposition; @@ -120,7 +120,7 @@ new ArrayMap<>(FaviconLocality.NUM_ENTRIES); private final int mFaviconSize; private boolean mHasForeignDataRecorded; - private FaviconFallbackGenerator mIconGenerator; + private RoundedIconGenerator mIconGenerator; /** * A generic group of objects to be shown in the RecentTabsRowAdapter, such as the list of
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java index 8a81a5a..a3ec24e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorController.java
@@ -86,8 +86,12 @@ * Initializes the singleton once. */ public static void initialize() { - // No need to create the singleton if the feature is not enabled. - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_INDICATOR)) return; + // No need to create the singleton if the feature is not enabled. Also, if V2 is enabled, + // this version will be disabled. + if (!ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_INDICATOR) + || ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_INDICATOR_V2)) { + return; + } if (sInstance == null) { sInstance = new OfflineIndicatorController();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java new file mode 100644 index 0000000..df09095d --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2.java
@@ -0,0 +1,78 @@ +// 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.offlinepages.indicator; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.os.Handler; + +import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.status_indicator.StatusIndicatorCoordinator; + +/** + * Class that controls visibility and content of {@link StatusIndicatorCoordinator} to relay + * connectivity information. + */ +public class OfflineIndicatorControllerV2 implements ConnectivityDetector.Observer { + private static final int STATUS_INDICATOR_WAIT_BEFORE_HIDE_DURATION_MS = 2000; + + private Context mContext; + private StatusIndicatorCoordinator mStatusIndicator; + private ConnectivityDetector mConnectivityDetector; + + /** + * Constructs the offline indicator. + * @param context The {@link Context}. + * @param statusIndicator The {@link StatusIndicatorCoordinator} instance this controller will + * control based on the connectivity. + */ + public OfflineIndicatorControllerV2( + Context context, StatusIndicatorCoordinator statusIndicator) { + mContext = context; + mStatusIndicator = statusIndicator; + mConnectivityDetector = new ConnectivityDetector(this); + } + + @Override + public void onConnectionStateChanged(int connectionState) { + final boolean offline = connectionState != ConnectivityDetector.ConnectionState.VALIDATED; + if (offline) { + final int backgroundColor = ApiCompatibilityUtils.getColor( + mContext.getResources(), R.color.offline_indicator_offline_color); + final int textColor = ApiCompatibilityUtils.getColor( + mContext.getResources(), R.color.default_text_color_light); + final Drawable statusIcon = VectorDrawableCompat.create( + mContext.getResources(), R.drawable.ic_cloud_offline_24dp, mContext.getTheme()); + final int iconTint = ApiCompatibilityUtils.getColor( + mContext.getResources(), R.color.default_icon_color_light); + mStatusIndicator.show(mContext.getString(R.string.offline_indicator_v2_offline_text), + statusIcon, backgroundColor, textColor, iconTint); + } else { + final int backgroundColor = ApiCompatibilityUtils.getColor( + mContext.getResources(), R.color.offline_indicator_back_online_color); + final int textColor = ApiCompatibilityUtils.getColor( + mContext.getResources(), R.color.default_text_color_inverse); + final Drawable statusIcon = VectorDrawableCompat.create( + mContext.getResources(), R.drawable.ic_globe_24dp, mContext.getTheme()); + final int iconTint = ApiCompatibilityUtils.getColor( + mContext.getResources(), R.color.default_icon_color_inverse); + Runnable hide = () -> { + final Handler handler = new Handler(); + handler.postDelayed(() -> mStatusIndicator.hide(), + STATUS_INDICATOR_WAIT_BEFORE_HIDE_DURATION_MS); + }; + mStatusIndicator.updateContent( + mContext.getString(R.string.offline_indicator_v2_back_online_text), statusIcon, + backgroundColor, textColor, iconTint, hide); + } + } + + public void destroy() { + mConnectivityDetector = null; + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/ChromeAutocompleteSchemeClassifier.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/ChromeAutocompleteSchemeClassifier.java index b0848b4..4647248 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/ChromeAutocompleteSchemeClassifier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/ChromeAutocompleteSchemeClassifier.java
@@ -20,6 +20,7 @@ super(ChromeAutocompleteSchemeClassifierJni.get().createAutocompleteClassifier(profile)); } + @Override public void destroy() { ChromeAutocompleteSchemeClassifierJni.get().deleteAutocompleteClassifier( super.getNativePtr());
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 1b4b961..9c4f4e4 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
@@ -66,7 +66,6 @@ import org.chromium.chrome.browser.util.AccessibilityUtil; import org.chromium.components.browser_ui.styles.ChromeColors; 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; @@ -730,14 +729,8 @@ // When we restore tabs, we focus the selected tab so the URL of the page shows. } - /** - * Performs a search query on the current {@link Tab}. This calls - * {@link TemplateUrlService#getUrlForSearchQuery(String)} to get a url based on {@code query} - * and loads that url in the current {@link Tab}. - * @param query The {@link String} that represents the text query that should be searched for. - */ - @VisibleForTesting - public void performSearchQueryForTest(String query) { + @Override + public void performSearchQuery(String query) { if (TextUtils.isEmpty(query)) return; String queryUrl = TemplateUrlServiceFactory.get().getUrlForSearchQuery(query);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java index 8d7a494..9cf466e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtils.java
@@ -25,8 +25,8 @@ import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.toolbar.ToolbarCommonPropertiesModel; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.util.UrlUtilities; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.content_public.browser.BrowserStartupController; import java.lang.annotation.Retention; @@ -48,7 +48,7 @@ private static Bitmap sCachedComposedBackground; private static String sCachedComposedBackgroundLogoUrl; private static FaviconHelper sFaviconHelper; - private static FaviconFallbackGenerator sFaviconFallbackGenerator; + private static RoundedIconGenerator sRoundedIconGenerator; // Cache these values so they don't need to be recalculated. private static int sSearchEngineLogoTargetSizePixels; @@ -288,17 +288,17 @@ Bitmap composedIcon = scaledIcon; if (isRoundedSearchEngineLogoEnabled()) { int composedSizePixels = getSearchEngineLogoComposedSizePixels(resources); - if (sFaviconFallbackGenerator == null) { - sFaviconFallbackGenerator = new FaviconFallbackGenerator(composedSizePixels, + if (sRoundedIconGenerator == null) { + sRoundedIconGenerator = new RoundedIconGenerator(composedSizePixels, composedSizePixels, composedSizePixels, Color.TRANSPARENT, 0); } int color = (image.getWidth() == 0 || image.getHeight() == 0) ? Color.TRANSPARENT : getMostCommonEdgeColor(image); - sFaviconFallbackGenerator.setBackgroundColor(color); + sRoundedIconGenerator.setBackgroundColor(color); // Generate a rounded background with no text. - composedIcon = sFaviconFallbackGenerator.generateIconForText(""); + composedIcon = sRoundedIconGenerator.generateIconForText(""); Canvas canvas = new Canvas(composedIcon); // Draw the logo in the middle of the generated background. int dx = (composedSizePixels - logoSizePixels) / 2; @@ -379,10 +379,9 @@ sDelegate = mDelegate; } - /** Set the FaviconFallbackGenerator for testing. */ - static void setFaviconFallbackGeneratorForTesting( - FaviconFallbackGenerator roundedIconGenerator) { - sFaviconFallbackGenerator = roundedIconGenerator; + /** Set the RoundedIconGenerator for testing. */ + static void setRoundedIconGeneratorForTesting(RoundedIconGenerator roundedIconGenerator) { + sRoundedIconGenerator = roundedIconGenerator; } /** Reset the cache values for testing. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java index ca137ce..8ad119599 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java
@@ -11,14 +11,17 @@ import androidx.annotation.VisibleForTesting; import org.chromium.chrome.R; +import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils; import org.chromium.chrome.browser.omnibox.UrlBar.UrlTextChangeListener; import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; +import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate; import org.chromium.chrome.browser.page_info.PageInfoController; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabImpl; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; +import org.chromium.content_public.browser.WebContents; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; @@ -195,10 +198,13 @@ } Tab tab = mToolbarDataProvider.getTab(); - PageInfoController.show(((TabImpl) tab).getActivity(), tab.getWebContents(), null, + ChromeActivity activity = ((TabImpl) tab).getActivity(); + WebContents webContents = tab.getWebContents(); + PageInfoController.show(activity, webContents, null, PageInfoController.OpenedFromSource.TOOLBAR, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab)); + new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab), + new ChromePageInfoControllerDelegate(activity, webContents)); } /**
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 e644ea41..10dee20 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
@@ -21,6 +21,7 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.omnibox.SuggestionAnswer; import org.chromium.content_public.browser.WebContents; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -296,7 +297,7 @@ int relevance, int transition, String contents, int[] contentClassificationOffsets, int[] contentClassificationStyles, String description, int[] descriptionClassificationOffsets, int[] descriptionClassificationStyles, - SuggestionAnswer answer, String fillIntoEdit, String url, String imageUrl, + SuggestionAnswer answer, String fillIntoEdit, GURL url, GURL imageUrl, String imageDominantColor, boolean isStarred, boolean isDeletable, String postContentType, byte[] postData) { assert contentClassificationOffsets.length == contentClassificationStyles.length; @@ -343,7 +344,7 @@ * @return The url to navigate to for this match with aqs parameter updated, if we are * making a Google search query. */ - String updateMatchDestinationUrlWithQueryFormulationTime( + GURL updateMatchDestinationUrlWithQueryFormulationTime( int selectedIndex, int hashCode, long elapsedTimeSinceInputChange) { return AutocompleteControllerJni.get().updateMatchDestinationURLWithQueryFormulationTime( mNativeAutocompleteControllerAndroid, AutocompleteController.this, selectedIndex, @@ -371,7 +372,7 @@ int pageClassification, String currentTitle); void deleteSuggestion(long nativeAutocompleteControllerAndroid, AutocompleteController caller, int selectedIndex, int hashCode); - String updateMatchDestinationURLWithQueryFormulationTime( + GURL updateMatchDestinationURLWithQueryFormulationTime( long nativeAutocompleteControllerAndroid, AutocompleteController caller, int selectedIndex, int hashCode, long elapsedTimeSinceInputChange); /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinatorImpl.java index de622808..485c7b6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinatorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinatorImpl.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.omnibox.suggestions; import android.content.Context; +import android.os.Handler; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; @@ -69,7 +70,7 @@ PropertyModel listModel = new PropertyModel(SuggestionListProperties.ALL_KEYS); ModelList listItems = new ModelList(); mMediator = new AutocompleteMediator(context, delegate, urlBarEditingTextProvider, - new AutocompleteController(), listModel); + new AutocompleteController(), listModel, new Handler()); mMediator.initDefaultProcessors(); listModel.set(SuggestionListProperties.EMBEDDER, listEmbedder);
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 eeb4d91..6a66b18 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
@@ -62,6 +62,7 @@ import org.chromium.ui.modelutil.MVCListAdapter; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -190,14 +191,15 @@ public AutocompleteMediator(Context context, AutocompleteDelegate delegate, UrlBarEditingTextStateProvider textProvider, - AutocompleteController autocompleteController, PropertyModel listPropertyModel) { + AutocompleteController autocompleteController, PropertyModel listPropertyModel, + Handler handler) { mContext = context; mDelegate = delegate; mUrlBarEditingTextProvider = textProvider; mListPropertyModel = listPropertyModel; mAutocomplete = autocompleteController; mAutocomplete.setOnSuggestionsReceivedListener(this); - mHandler = new Handler(); + mHandler = handler; mSuggestionProcessors = new ArrayList<>(); mAvailableSuggestions = new ArrayList<>(); @@ -774,7 +776,7 @@ * @param skipCheck Whether to skip an out of bounds check. * @return The url to navigate to. */ - private String updateSuggestionUrlIfNeeded( + private GURL updateSuggestionUrlIfNeeded( OmniboxSuggestion suggestion, int selectedIndex, boolean skipCheck) { // Only called once we have suggestions, and don't have a listener though which we can // receive suggestions until the native side is ready, so this is safe @@ -796,7 +798,7 @@ long elapsedTimeSinceInputChange = mNewOmniboxEditSessionTimestamp > 0 ? (SystemClock.elapsedRealtime() - mNewOmniboxEditSessionTimestamp) : -1; - String updatedUrl = mAutocomplete.updateMatchDestinationUrlWithQueryFormulationTime( + GURL updatedUrl = mAutocomplete.updateMatchDestinationUrlWithQueryFormulationTime( verifiedIndex, suggestion.hashCode(), elapsedTimeSinceInputChange); return updatedUrl == null ? suggestion.getUrl() : updatedUrl; @@ -1113,8 +1115,7 @@ RecordHistogram.recordMediumTimesHistogram( "Omnibox.FocusToOpenTimeAnyPopupState3", activationTime - mUrlFocusTime); - String url = - updateSuggestionUrlIfNeeded(suggestion, matchPosition, !inVisibleSuggestionList); + GURL url = updateSuggestionUrlIfNeeded(suggestion, matchPosition, !inVisibleSuggestionList); // loadUrl modifies AutocompleteController's state clearing the native // AutocompleteResults needed by onSuggestionsSelected. Therefore, @@ -1139,7 +1140,7 @@ autocompleteLength, webContents); } if (((transition & PageTransition.CORE_MASK) == PageTransition.TYPED) - && TextUtils.equals(url, mDataProvider.getCurrentUrl())) { + && TextUtils.equals(url.getSpec(), mDataProvider.getCurrentUrl())) { // When the user hit enter on the existing permanent URL, treat it like a // reload for scoring purposes. We could detect this by just checking // user_input_in_progress_, but it seems better to treat "edits" that end @@ -1168,11 +1169,11 @@ } if (suggestion.getType() == OmniboxSuggestionType.CLIPBOARD_IMAGE) { - mDelegate.loadUrlWithPostData(url, transition, inputStart, + mDelegate.loadUrlWithPostData(url.getSpec(), transition, inputStart, suggestion.getPostContentType(), suggestion.getPostData()); return; } - mDelegate.loadUrl(url, transition, inputStart); + mDelegate.loadUrl(url.getSpec(), 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 db70065..615ddaf 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
@@ -16,6 +16,7 @@ import org.chromium.base.ContextUtils; import org.chromium.chrome.browser.omnibox.MatchClassificationStyle; import org.chromium.components.omnibox.SuggestionAnswer; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -79,8 +80,8 @@ private final List<MatchClassification> mDescriptionClassifications; private final SuggestionAnswer mAnswer; private final String mFillIntoEdit; - private final String mUrl; - private final String mImageUrl; + private final GURL mUrl; + private final GURL mImageUrl; private final String mImageDominantColor; private final int mRelevance; private final int mTransition; @@ -92,7 +93,7 @@ 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, + SuggestionAnswer answer, String fillIntoEdit, GURL url, GURL imageUrl, String imageDominantColor, boolean isStarred, boolean isDeletable, String postContentType, byte[] postData) { mType = nativeType; @@ -105,7 +106,9 @@ mDescriptionClassifications = descriptionClassifications; mAnswer = answer; mFillIntoEdit = TextUtils.isEmpty(fillIntoEdit) ? displayText : fillIntoEdit; + assert url != null; mUrl = url; + assert imageUrl != null; mImageUrl = imageUrl; mImageDominantColor = imageDominantColor; mIsStarred = isStarred; @@ -150,12 +153,11 @@ return mFillIntoEdit; } - public String getUrl() { + public GURL getUrl() { return mUrl; } - @Nullable - public String getImageUrl() { + public GURL getImageUrl() { return mImageUrl; } @@ -241,7 +243,7 @@ OmniboxSuggestion suggestion = suggestions.get(i); if (suggestion.mAnswer != null) continue; - editor.putString(KEY_PREFIX_ZERO_SUGGEST_URL + i, suggestion.getUrl()) + editor.putString(KEY_PREFIX_ZERO_SUGGEST_URL + i, suggestion.getUrl().serialize()) .putString( KEY_PREFIX_ZERO_SUGGEST_DISPLAY_TEST + i, suggestion.getDisplayText()) .putString(KEY_PREFIX_ZERO_SUGGEST_DESCRIPTION + i, suggestion.getDescription()) @@ -280,7 +282,8 @@ String answerText = prefs.getString(KEY_PREFIX_ZERO_SUGGEST_ANSWER_TEXT + i, ""); if (!TextUtils.isEmpty(answerText)) continue; - String url = prefs.getString(KEY_PREFIX_ZERO_SUGGEST_URL + i, ""); + GURL url = GURL.deserialize(prefs.getString(KEY_PREFIX_ZERO_SUGGEST_URL + i, "")); + if (url == null) continue; String displayText = prefs.getString(KEY_PREFIX_ZERO_SUGGEST_DISPLAY_TEST + i, ""); String description = prefs.getString(KEY_PREFIX_ZERO_SUGGEST_DESCRIPTION + i, ""); int nativeType = prefs.getInt(KEY_PREFIX_ZERO_SUGGEST_NATIVE_TYPE + i, -1); @@ -297,7 +300,7 @@ OmniboxSuggestion suggestion = new OmniboxSuggestion(nativeType, isSearchType, 0, 0, displayText, classifications, description, classifications, null, "", url, - null, null, isStarred, isDeletable, + GURL.emptyGURL(), 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 587216a..9bbc0b7 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
@@ -12,6 +12,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion.MatchClassification; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler.VoiceResult; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.Collections; @@ -116,13 +117,13 @@ List<OmniboxSuggestion> suggestions, VoiceResult result, float confidenceThreshold) { if (doesVoiceResultHaveMatch(suggestions, result)) return; if (result.getConfidence() < confidenceThreshold && result.getConfidence() > 0) return; - String voiceUrl = + GURL voiceUrl = TemplateUrlServiceFactory.get().getUrlForVoiceSearchQuery(result.getMatch()); List<MatchClassification> classifications = new ArrayList<>(); 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)); + GURL.emptyGURL(), null, false, false, null, null)); } private boolean doesVoiceResultHaveMatch(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java index d0133e2..26827af 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java
@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewDelegate; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.util.List; @@ -176,11 +177,11 @@ * @param onIconFetched Optional callback that will be invoked after successful fetch of a * favicon. */ - protected void fetchSuggestionFavicon(PropertyModel model, String url, - LargeIconBridge iconBridge, @Nullable Runnable onIconFetched) { + protected void fetchSuggestionFavicon(PropertyModel model, GURL url, LargeIconBridge iconBridge, + @Nullable Runnable onIconFetched) { if (url == null || iconBridge == null) return; - iconBridge.getLargeIconForStringUrl(url, mDesiredFaviconWidthPx, + iconBridge.getLargeIconForUrl(url, mDesiredFaviconWidthPx, (Bitmap icon, int fallbackColor, boolean isFallbackColorDefault, int iconType) -> { if (icon == null) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java index 3030e13..14e69029 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java
@@ -165,7 +165,7 @@ boolean urlHighlighted = false; if (suggestion.isUrlSuggestion()) { - if (!TextUtils.isEmpty(suggestion.getUrl())) { + if (!suggestion.getUrl().isEmpty()) { SuggestionSpannable str = new SuggestionSpannable(suggestion.getDisplayText()); urlHighlighted = applyHighlightToMatchRegions( str, suggestion.getDisplayTextClassifications()); @@ -197,10 +197,9 @@ */ private SuggestionSpannable getSuggestedQuery(OmniboxSuggestion suggestion, boolean showDescriptionIfPresent, boolean shouldHighlight) { - String userQuery = mUrlBarEditingTextProvider.getTextWithoutAutocomplete(); String suggestedQuery = null; List<OmniboxSuggestion.MatchClassification> classifications; - if (showDescriptionIfPresent && !TextUtils.isEmpty(suggestion.getUrl()) + if (showDescriptionIfPresent && !suggestion.getUrl().isEmpty() && !TextUtils.isEmpty(suggestion.getDescription())) { suggestedQuery = suggestion.getDescription(); classifications = suggestion.getDescriptionClassifications();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor.java index 115467f..59bc26e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionProcessor.java
@@ -32,6 +32,7 @@ import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.ui.base.Clipboard; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -138,8 +139,7 @@ mLastProcessedSuggestion = suggestion; - if (!isSuggestionEquivalentToCurrentPage( - mLastProcessedSuggestion, activeTab.getUrlString())) { + if (!isSuggestionEquivalentToCurrentPage(mLastProcessedSuggestion, activeTab.getUrl())) { return false; } @@ -170,17 +170,18 @@ model.set(EditUrlSuggestionProperties.BUTTON_CLICK_LISTENER, this); if (mOriginalTitle == null) mOriginalTitle = mTabProvider.get().getTitle(); model.set(EditUrlSuggestionProperties.TITLE_TEXT, mOriginalTitle); - model.set(EditUrlSuggestionProperties.URL_TEXT, mLastProcessedSuggestion.getUrl()); + model.set( + EditUrlSuggestionProperties.URL_TEXT, mLastProcessedSuggestion.getUrl().getSpec()); fetchIcon(model, mLastProcessedSuggestion.getUrl()); } - private void fetchIcon(PropertyModel model, String url) { + private void fetchIcon(PropertyModel model, GURL url) { if (url == null) return; final LargeIconBridge iconBridge = mIconBridgeSupplier.get(); if (iconBridge == null) return; - iconBridge.getLargeIconForStringUrl(url, mDesiredFaviconWidthPx, + iconBridge.getLargeIconForUrl(url, mDesiredFaviconWidthPx, (Bitmap icon, int fallbackColor, boolean isFallbackColorDefault, int iconType) -> model.set(EditUrlSuggestionProperties.SITE_FAVICON, icon)); } @@ -228,7 +229,7 @@ if (R.id.url_copy_icon == view.getId()) { recordSuggestionAction(SuggestionAction.COPY); RecordUserAction.record("Omnibox.EditUrlSuggestion.Copy"); - Clipboard.getInstance().copyUrlToClipboard(mLastProcessedSuggestion.getUrl()); + Clipboard.getInstance().copyUrlToClipboard(mLastProcessedSuggestion.getUrl().getSpec()); } else if (R.id.url_share_icon == view.getId()) { recordSuggestionAction(SuggestionAction.SHARE); RecordUserAction.record("Omnibox.EditUrlSuggestion.Share"); @@ -243,7 +244,7 @@ } else if (R.id.url_edit_icon == view.getId()) { recordSuggestionAction(SuggestionAction.EDIT); RecordUserAction.record("Omnibox.EditUrlSuggestion.Edit"); - mLocationBarDelegate.setOmniboxEditingText(mLastProcessedSuggestion.getUrl()); + mLocationBarDelegate.setOmniboxEditingText(mLastProcessedSuggestion.getUrl().getSpec()); } } @@ -276,13 +277,13 @@ * 2. It's a URL suggestion for the current URL. */ private boolean isSuggestionEquivalentToCurrentPage( - OmniboxSuggestion suggestion, String pageUrl) { + OmniboxSuggestion suggestion, GURL pageUrl) { switch (suggestion.getType()) { case OmniboxSuggestionType.SEARCH_WHAT_YOU_TYPED: return TextUtils.equals(suggestion.getFillIntoEdit(), TemplateUrlServiceFactory.get().getSearchQueryForUrl(pageUrl)); case OmniboxSuggestionType.URL_WHAT_YOU_TYPED: - return TextUtils.equals(suggestion.getUrl(), pageUrl); + return suggestion.getUrl().equals(pageUrl); default: return false; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java index ed66d54c..fbd1e753 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessor.java
@@ -26,6 +26,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionHost; import org.chromium.components.browser_ui.util.ConversionUtils; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.HashMap; @@ -37,7 +38,7 @@ private static final String TAG = "EntitySP"; private final Context mContext; private final SuggestionHost mSuggestionHost; - private final Map<String, List<PropertyModel>> mPendingImageRequests; + private final Map<GURL, List<PropertyModel>> mPendingImageRequests; private final int mEntityImageSizePx; private final Supplier<ImageFetcher> mImageFetcherSupplier; // Threshold for low RAM devices. We won't be showing entity suggestion images @@ -98,8 +99,8 @@ private void fetchEntityImage(OmniboxSuggestion suggestion, PropertyModel model) { ThreadUtils.assertOnUiThread(); - final String url = suggestion.getImageUrl(); - if (TextUtils.isEmpty(url)) return; + final GURL url = suggestion.getImageUrl(); + if (url.isEmpty()) return; // Ensure an image fetcher is available prior to requesting images. ImageFetcher imageFetcher = mImageFetcherSupplier.get(); @@ -116,7 +117,7 @@ models.add(model); mPendingImageRequests.put(url, models); - imageFetcher.fetchImage(url, ImageFetcher.ENTITY_SUGGESTIONS_UMA_CLIENT_NAME, + imageFetcher.fetchImage(url.getSpec(), ImageFetcher.ENTITY_SUGGESTIONS_UMA_CLIENT_NAME, mEntityImageSizePx, mEntityImageSizePx, (Bitmap bitmap) -> { ThreadUtils.assertOnUiThread();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java index 3243f8b..fabae08 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java
@@ -238,7 +238,9 @@ String url = autocompleteCoordinator.qualifyPartialURLQuery(topResultQuery); if (url == null) { - url = TemplateUrlServiceFactory.get().getUrlForVoiceSearchQuery(topResultQuery); + url = TemplateUrlServiceFactory.get() + .getUrlForVoiceSearchQuery(topResultQuery) + .getSpec(); } // Since voice was used, we need to let the frame know that there was a user gesture.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java new file mode 100644 index 0000000..99f4cf06 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/ChromePageInfoControllerDelegate.java
@@ -0,0 +1,59 @@ +// 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.page_info; + +import org.chromium.chrome.browser.ChromeActivity; +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; +import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.chrome.browser.site_settings.CookieControlsBridge; +import org.chromium.components.feature_engagement.Tracker; +import org.chromium.components.omnibox.AutocompleteSchemeClassifier; +import org.chromium.components.page_info.PageInfoControllerDelegate; +import org.chromium.content_public.browser.WebContents; +import org.chromium.ui.modaldialog.ModalDialogManager; + +/** + * Chrome's implementation of PageInfoControllerDelegate, that provides + * Chrome-specific info to PageInfoController. + */ +public class ChromePageInfoControllerDelegate implements PageInfoControllerDelegate { + private final WebContents mWebContents; + private final ChromeActivity mActivity; + + public ChromePageInfoControllerDelegate(ChromeActivity activity, WebContents webContents) { + mWebContents = webContents; + mActivity = activity; + } + + private Profile profile() { + return Profile.fromWebContents(mWebContents); + } + + @Override + public Tracker getTracker() { + return TrackerFactory.getTrackerForProfile(profile()); + } + + @Override + public AutocompleteSchemeClassifier createAutocompleteSchemeClassifier() { + return new ChromeAutocompleteSchemeClassifier(profile()); + } + + @Override + public boolean cookieControlsShown() { + return CookieControlsBridge.isCookieControlsEnabled(profile()); + } + + @Override + public ModalDialogManager getModalDialogManager() { + return mActivity.getModalDialogManager(); + } + + @Override + public boolean useDarkColors() { + return !mActivity.getNightModeStateProvider().isInNightMode(); + } +} \ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java index 844731e..3790d324 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.page_info; +import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; @@ -27,16 +28,12 @@ import org.chromium.base.annotations.NativeMethods; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.ChromeActivity; -import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.instantapps.InstantAppsHandler; import org.chromium.chrome.browser.offlinepages.OfflinePageItem; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils.OfflinePageLoadUrlDelegate; -import org.chromium.chrome.browser.omnibox.ChromeAutocompleteSchemeClassifier; import org.chromium.chrome.browser.previews.PreviewsAndroidBridge; import org.chromium.chrome.browser.previews.PreviewsUma; -import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.site_settings.ContentSettingValues; import org.chromium.chrome.browser.site_settings.CookieControlsBridge; import org.chromium.chrome.browser.vr.VrModuleProvider; @@ -44,11 +41,12 @@ import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.feature_engagement.EventConstants; -import org.chromium.components.feature_engagement.Tracker; +import org.chromium.components.omnibox.AutocompleteSchemeClassifier; import org.chromium.components.omnibox.OmniboxUrlEmphasizer; import org.chromium.components.page_info.ConnectionInfoPopup; import org.chromium.components.page_info.CookieControlsStatus; import org.chromium.components.page_info.CookieControlsView; +import org.chromium.components.page_info.PageInfoControllerDelegate; import org.chromium.components.page_info.PageInfoDialog; import org.chromium.components.page_info.PageInfoView; import org.chromium.components.page_info.PageInfoView.ConnectionInfoParams; @@ -113,6 +111,7 @@ private final WebContents mWebContents; private final OfflinePageLoadUrlDelegate mOfflinePageLoadUrlDelegate; private final PermissionParamsListBuilder mPermissionParamsListBuilder; + private final PageInfoControllerDelegate mDelegate; // A pointer to the C++ object for this UI. private long mNativePageInfoController; @@ -170,17 +169,20 @@ * @param publisher The name of the content publisher, if any. * @param offlinePageLoadUrlDelegate {@link OfflinePageLoadUrlDelegate} * defined by the caller. + * @param delegate The PageInfoControllerDelegate used to provide + * embedder-specific info. */ - protected PageInfoController(ChromeActivity activity, WebContents webContents, - int securityLevel, String offlinePageUrl, String offlinePageCreationDate, + protected PageInfoController(Activity activity, WebContents webContents, int securityLevel, + String offlinePageUrl, String offlinePageCreationDate, @OfflinePageState int offlinePageState, @PreviewPageState int previewPageState, - String publisher, OfflinePageLoadUrlDelegate offlinePageLoadUrlDelegate) { + String publisher, OfflinePageLoadUrlDelegate offlinePageLoadUrlDelegate, + PageInfoControllerDelegate delegate) { mOfflinePageLoadUrlDelegate = offlinePageLoadUrlDelegate; mWebContents = webContents; mSecurityLevel = securityLevel; mOfflinePageState = offlinePageState; mPreviewPageState = previewPageState; - Profile profile = Profile.fromWebContents(webContents); + mDelegate = delegate; PageInfoViewParams viewParams = new PageInfoViewParams(); if (mOfflinePageState != OfflinePageState.NOT_OFFLINE_PAGE) { @@ -218,12 +220,12 @@ displayUrl = UrlUtilities.stripScheme(mFullUrl); } SpannableStringBuilder displayUrlBuilder = new SpannableStringBuilder(displayUrl); - ChromeAutocompleteSchemeClassifier chromeAutocompleteSchemeClassifier = - new ChromeAutocompleteSchemeClassifier(profile); + AutocompleteSchemeClassifier autocompleteSchemeClassifier = + delegate.createAutocompleteSchemeClassifier(); if (mSecurityLevel == ConnectionSecurityLevel.SECURE) { OmniboxUrlEmphasizer.EmphasizeComponentsResponse emphasizeResponse = OmniboxUrlEmphasizer.parseForEmphasizeComponents( - displayUrlBuilder.toString(), chromeAutocompleteSchemeClassifier); + displayUrlBuilder.toString(), autocompleteSchemeClassifier); if (emphasizeResponse.schemeLength > 0) { displayUrlBuilder.setSpan( new TextAppearanceSpan(activity, R.style.TextAppearance_RobotoMediumStyle), @@ -231,14 +233,14 @@ } } - final boolean useDarkColors = !activity.getNightModeStateProvider().isInNightMode(); + final boolean useDarkColors = delegate.useDarkColors(); OmniboxUrlEmphasizer.emphasizeUrl(displayUrlBuilder, activity.getResources(), - chromeAutocompleteSchemeClassifier, mSecurityLevel, mIsInternalPage, useDarkColors, + autocompleteSchemeClassifier, mSecurityLevel, mIsInternalPage, useDarkColors, /*emphasizeScheme=*/true); viewParams.url = displayUrlBuilder; viewParams.urlOriginLength = OmniboxUrlEmphasizer.getOriginEndIndex( - displayUrlBuilder.toString(), chromeAutocompleteSchemeClassifier); - chromeAutocompleteSchemeClassifier.destroy(); + displayUrlBuilder.toString(), autocompleteSchemeClassifier); + autocompleteSchemeClassifier.destroy(); if (SiteSettingsHelper.isSiteSettingsAvailable(webContents)) { viewParams.siteSettingsButtonClickCallback = () -> { @@ -248,7 +250,7 @@ SiteSettingsHelper.showSiteSettings(activity, mFullUrl); }); }; - viewParams.cookieControlsShown = CookieControlsBridge.isCookieControlsEnabled(profile); + viewParams.cookieControlsShown = delegate.cookieControlsShown(); } else { viewParams.siteSettingsButtonShown = false; viewParams.cookieControlsShown = false; @@ -332,7 +334,7 @@ mDialog = new PageInfoDialog(activity, mView, webContents.getViewAndroidDelegate().getContainerView(), isSheet(activity), - activity.getModalDialogManager(), this); + delegate.getModalDialogManager(), this); mDialog.show(); } @@ -412,7 +414,7 @@ // Display the appropriate connection message. SpannableStringBuilder messageBuilder = new SpannableStringBuilder(); - ChromeActivity context = (ChromeActivity) mWindowAndroid.getActivity().get(); + Context context = mWindowAndroid.getActivity().get(); assert context != null; if (mContentPublisher != null) { messageBuilder.append( @@ -465,7 +467,7 @@ if (!mWebContents.isDestroyed()) { recordAction(PageInfoAction.PAGE_INFO_SECURITY_DETAILS_OPENED); ConnectionInfoPopup.show(context, mWebContents, - context.getModalDialogManager(), VrModuleProvider.getDelegate()); + mDelegate.getModalDialogManager(), VrModuleProvider.getDelegate()); } }); }; @@ -555,10 +557,12 @@ * @param source Determines the source that triggered the popup. * @param offlinePageLoadUrlDelegate {@link OfflinePageLoadUrlDelegate} defined by the * caller. + * @param delegate The PageInfoControllerDelegate used to provide embedder-specific info. */ - public static void show(final ChromeActivity activity, WebContents webContents, + public static void show(final Activity activity, WebContents webContents, final String contentPublisher, @OpenedFromSource int source, - OfflinePageLoadUrlDelegate offlinePageLoadUrlDelegate) { + OfflinePageLoadUrlDelegate offlinePageLoadUrlDelegate, + PageInfoControllerDelegate delegate) { // If the activity's decor view is not attached to window, we don't show the dialog because // the window manager might have revoked the window token for this activity. See // https://crbug.com/921450. @@ -586,9 +590,7 @@ : PreviewPageState.INSECURE_PAGE_PREVIEW; PreviewsUma.recordPageInfoOpened(bridge.getPreviewsType(webContents)); - Tracker tracker = - TrackerFactory.getTrackerForProfile(Profile.fromWebContents(webContents)); - tracker.notifyEvent(EventConstants.PREVIEWS_VERBOSE_STATUS_OPENED); + delegate.getTracker().notifyEvent(EventConstants.PREVIEWS_VERBOSE_STATUS_OPENED); } String offlinePageUrl = null; @@ -617,7 +619,7 @@ new PageInfoController(activity, webContents, securityLevel, offlinePageUrl, offlinePageCreationDate, offlinePageState, previewPageState, contentPublisher, - offlinePageLoadUrlDelegate); + offlinePageLoadUrlDelegate, delegate); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java index 6c3aa28..adaaece3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java
@@ -11,6 +11,7 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.offlinepages.OfflinePageUtils; +import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate; import org.chromium.chrome.browser.page_info.PageInfoController; import org.chromium.components.omnibox.SecurityStatusIcon; import org.chromium.components.security_state.ConnectionSecurityLevel; @@ -134,6 +135,7 @@ PageInfoController.show(mChromeActivity, mWebContentsRef, null, PageInfoController.OpenedFromSource.TOOLBAR, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.WebContentsOfflinePageLoadUrlDelegate(mWebContentsRef)); + new OfflinePageUtils.WebContentsOfflinePageLoadUrlDelegate(mWebContentsRef), + new ChromePageInfoControllerDelegate(mChromeActivity, mWebContentsRef)); }; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileSection.java b/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileSection.java index e7dc62ae..221aaa0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileSection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileSection.java
@@ -13,7 +13,14 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.ntp.search.SearchBoxCoordinator; import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.components.browser_ui.widget.image_tiles.ImageTile; +import org.chromium.components.browser_ui.widget.image_tiles.ImageTileCoordinator; +import org.chromium.components.browser_ui.widget.image_tiles.ImageTileCoordinatorFactory; +import org.chromium.components.browser_ui.widget.image_tiles.TileConfig; +import org.chromium.ui.display.DisplayAndroid; +import org.chromium.ui.display.DisplayUtil; +import java.util.ArrayList; import java.util.List; /** @@ -22,36 +29,77 @@ * section. */ public class QueryTileSection { + private static final String QUERY_TILES_SHORTEN_MOST_VISITED_TILES_FOR_SMALL_SCREEN = + "shorten_most_visited_tiles_for_small_screen"; + private static final int SMALL_SCREEN_HEIGHT_THRESHOLD_DP = 600; + private static final String UMA_PREFIX = "NTP.QueryTiles"; + private final ViewGroup mQueryTileSectionView; private final SearchBoxCoordinator mSearchBoxCoordinator; - private QueryTileCoordinator mQueryTileCoordinator; + private final Callback<String> mSubmitQueryCallback; + private ImageTileCoordinator mTileCoordinator; private TileProvider mTileProvider; /** Constructor. */ public QueryTileSection(ViewGroup queryTileSectionView, - SearchBoxCoordinator searchBoxCoordinator, Profile profile) { + SearchBoxCoordinator searchBoxCoordinator, Profile profile, + Callback<String> performSearchQueryCallback) { mQueryTileSectionView = queryTileSectionView; mSearchBoxCoordinator = searchBoxCoordinator; - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES)) return; + mSubmitQueryCallback = performSearchQueryCallback; + if (!isFeatureEnabled()) return; mTileProvider = TileProviderFactory.getForProfile(profile); - mQueryTileCoordinator = QueryTileCoordinatorFactory.create( - mQueryTileSectionView.getContext(), this::onTileClicked, this::getVisuals); - mQueryTileSectionView.addView(mQueryTileCoordinator.getView(), + TileConfig tileConfig = new TileConfig.Builder().setUmaPrefix(UMA_PREFIX).build(); + mTileCoordinator = ImageTileCoordinatorFactory.create(mQueryTileSectionView.getContext(), + tileConfig, this::onTileClicked, this::getVisuals); + mQueryTileSectionView.addView(mTileCoordinator.getView(), new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); onTileClicked(null); } - private void onTileClicked(Tile tile) { - mTileProvider.getQueryTiles(tiles -> { - mQueryTileCoordinator.setTiles(tiles); - mQueryTileSectionView.setVisibility(tiles.isEmpty() ? View.GONE : View.VISIBLE); - }); - - if (tile != null) mSearchBoxCoordinator.setSearchText(tile.queryText); + private void onTileClicked(ImageTile tile) { + QueryTile queryTile = (QueryTile) tile; + if (queryTile == null) { + mTileProvider.getQueryTiles(this::setTiles); + } else { + boolean isLastLevelTile = queryTile.children.isEmpty(); + setTiles(queryTile.children); + if (isLastLevelTile) { + mSubmitQueryCallback.onResult(queryTile.queryText); + } else { + // TODO(shaktisahu): Show chip on fakebox; + } + } } - private void getVisuals(Tile tile, Callback<List<Bitmap>> callback) { + private void setTiles(List<QueryTile> tiles) { + mTileCoordinator.setTiles(new ArrayList<>(tiles)); + mQueryTileSectionView.setVisibility(tiles.isEmpty() ? View.GONE : View.VISIBLE); + } + + private void getVisuals(ImageTile tile, Callback<List<Bitmap>> callback) { mTileProvider.getVisuals(tile.id, callback); } -} \ No newline at end of file + + /** + * @return Whether the screen height is small. Used for shortening the most visited tiles + * section on NTP so that feed is still visible above the fold. + */ + public boolean shouldConsiderAsSmallScreen() { + if (!isFeatureEnabled()) return false; + boolean shortenMostVisitedTiles = ChromeFeatureList.getFieldTrialParamByFeatureAsBoolean( + ChromeFeatureList.QUERY_TILES, + QUERY_TILES_SHORTEN_MOST_VISITED_TILES_FOR_SMALL_SCREEN, false); + if (!shortenMostVisitedTiles) return false; + + DisplayAndroid display = + DisplayAndroid.getNonMultiDisplay(mQueryTileSectionView.getContext()); + int screenHeightDp = DisplayUtil.pxToDp(display, display.getDisplayHeight()); + return screenHeightDp < SMALL_SCREEN_HEIGHT_THRESHOLD_DP; + } + + private static boolean isFeatureEnabled() { + return ChromeFeatureList.isEnabled(ChromeFeatureList.QUERY_TILES); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChosenObjectSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChosenObjectSettings.java index 7373805..3710c8f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChosenObjectSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChosenObjectSettings.java
@@ -271,8 +271,8 @@ for (int i = 0; i < mSites.size() && i < mObjectInfos.size(); ++i) { Website site = mSites.get(i); ChosenObjectInfo info = mObjectInfos.get(i); - WebsitePreference preference = - new WebsitePreference(getStyledContext(), site, mCategory); + WebsitePreference preference = new WebsitePreference( + getStyledContext(), getSiteSettingsClient(), site, mCategory); preference.getExtras().putSerializable(SingleWebsiteSettings.EXTRA_SITE, site); preference.setFragment(SingleWebsiteSettings.class.getCanonicalName());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChromeNotificationSettingsClient.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChromeNotificationSettingsClient.java new file mode 100644 index 0000000..af6232f --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChromeNotificationSettingsClient.java
@@ -0,0 +1,40 @@ +// 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.site_settings; + +import androidx.annotation.Nullable; + +import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager; +import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager; +import org.chromium.components.embedder_support.util.Origin; + +import java.util.Set; + +/** + * A SiteSettingsClient instance that contains Chrome-specific Site Settings logic. + */ +public class ChromeNotificationSettingsClient implements NotificationSettingsClient { + @Override + public Set<String> getAllDelegatedOrigins() { + return TrustedWebActivityPermissionManager.get().getAllDelegatedOrigins(); + } + + @Override + @Nullable + public String getDelegateAppNameForOrigin(Origin origin) { + return TrustedWebActivityPermissionManager.get().getDelegateAppName(origin); + } + + @Override + @Nullable + public String getDelegatePackageNameForOrigin(Origin origin) { + return TrustedWebActivityPermissionManager.get().getDelegatePackageName(origin); + } + + @Override + public String getChannelIdForOrigin(String origin) { + return SiteChannelsManager.getInstance().getChannelIdForOrigin(origin); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClient.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClient.java index a058177..18c57df2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsClient.java
@@ -5,18 +5,24 @@ package org.chromium.chrome.browser.site_settings; import android.app.Activity; +import android.graphics.Bitmap; import androidx.preference.Preference; +import org.chromium.base.Callback; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.help.HelpAndFeedback; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.settings.ChromeManagedPreferenceDelegate; +import org.chromium.chrome.browser.ui.favicon.FaviconHelper; +import org.chromium.chrome.browser.ui.favicon.FaviconHelper.FaviconImageCallback; import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate; /** * A SiteSettingsClient instance that contains Chrome-specific Site Settings logic. */ public class ChromeSiteSettingsClient implements SiteSettingsClient { + private ChromeNotificationSettingsClient mChromeNotificationSettingsClient; private ManagedPreferenceDelegate mManagedPreferenceDelegate; @Override @@ -37,4 +43,55 @@ HelpAndFeedback.getInstance().show( currentActivity, helpContext, Profile.getLastUsedRegularProfile(), null); } + + @Override + public NotificationSettingsClient getNotificationSettingsClient() { + if (mChromeNotificationSettingsClient == null) { + mChromeNotificationSettingsClient = new ChromeNotificationSettingsClient(); + } + return mChromeNotificationSettingsClient; + } + + @Override + public void getLocalFaviconImageForURL( + String faviconUrl, int faviconSizePx, Callback<Bitmap> callback) { + new FaviconLoader(faviconUrl, faviconSizePx, callback); + } + + /** + * A helper class that groups a FaviconHelper with its corresponding Callback. + * + * This object is kept alive by being passed to the native + * FaviconHelper.getLocalFaviconImageForURL. Its reference will be released after the callback + * has been called. + */ + private static class FaviconLoader implements FaviconImageCallback { + // Loads the favicons asynchronously. + private final FaviconHelper mFaviconHelper; + private final Callback<Bitmap> mCallback; + + private FaviconLoader(String faviconUrl, int faviconSizePx, Callback<Bitmap> callback) { + mCallback = callback; + mFaviconHelper = new FaviconHelper(); + + // TODO(https://crbug.com/1048632): Use the current profile (i.e., regular profile or + // incognito profile) instead of always using regular profile. It works correctly now, + // but it is not safe. + if (!mFaviconHelper.getLocalFaviconImageForURL( + Profile.getLastUsedRegularProfile(), faviconUrl, faviconSizePx, this)) { + onFaviconAvailable(/*image=*/null, faviconUrl); + } + } + + @Override + public void onFaviconAvailable(Bitmap image, String iconUrl) { + mFaviconHelper.destroy(); + mCallback.onResult(image); + } + } + + @Override + public boolean isQuietNotificationPromptsFeatureEnabled() { + return ChromeFeatureList.isEnabled(ChromeFeatureList.QUIET_NOTIFICATION_PROMPTS); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/NotificationSettingsClient.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/NotificationSettingsClient.java new file mode 100644 index 0000000..36caab6 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/NotificationSettingsClient.java
@@ -0,0 +1,41 @@ +// 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.site_settings; + +import androidx.annotation.Nullable; + +import org.chromium.components.embedder_support.util.Origin; + +import java.util.Set; + +/** + * An interface implemented by the embedder that allows the Site Settings UI to access + * notification related embedder-specific logic. + */ +public interface NotificationSettingsClient { + /** + * @return The set of all origins whose notification permissions are delegated to another app. + */ + Set<String> getAllDelegatedOrigins(); + + /** + * @return The user visible name of the app that will handle permission delegation for the + * origin. + */ + @Nullable + String getDelegateAppNameForOrigin(Origin origin); + + /** + * @return The package name of the app that should handle permission delegation for the origin. + */ + @Nullable + String getDelegatePackageNameForOrigin(Origin origin); + + /** + * @return The id of the notification channel associated with the given origin. + */ + // TODO(crbug.com/1069895): Remove this once WebLayer supports notifications. + String getChannelIdForOrigin(String origin); +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleCategorySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleCategorySettings.java index ef0dbf6..3c628c6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleCategorySettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleCategorySettings.java
@@ -37,8 +37,6 @@ import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.R; -import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.site_settings.FourStateCookieSettingsPreference.CookieSettingsState; @@ -720,7 +718,8 @@ // Find origins matching the current search. for (Website site : sites) { if (mSearch == null || mSearch.isEmpty() || site.getTitle().contains(mSearch)) { - websites.add(new WebsitePreference(getStyledContext(), site, mCategory)); + websites.add(new WebsitePreference( + getStyledContext(), getSiteSettingsClient(), site, mCategory)); } } @@ -754,7 +753,9 @@ Set<String> delegatedOrigins = mCategory.showSites(SiteSettingsCategory.Type.NOTIFICATIONS) - ? TrustedWebActivityPermissionManager.get().getAllDelegatedOrigins() + ? getSiteSettingsClient() + .getNotificationSettingsClient() + .getAllDelegatedOrigins() : Collections.emptySet(); for (WebsitePreference website : websites) { @@ -973,7 +974,7 @@ screen.removePreference(notificationsVibrate); } - if (ChromeFeatureList.isEnabled(ChromeFeatureList.QUIET_NOTIFICATION_PROMPTS)) { + if (getSiteSettingsClient().isQuietNotificationPromptsFeatureEnabled()) { notificationsQuietUi.setOnPreferenceChangeListener(this); } else { screen.removePreference(notificationsQuietUi); @@ -1110,7 +1111,7 @@ NOTIFICATIONS_VIBRATE_TOGGLE_KEY); if (vibrate_pref != null) vibrate_pref.setEnabled(categoryEnabled); - if (!ChromeFeatureList.isEnabled(ChromeFeatureList.QUIET_NOTIFICATION_PROMPTS)) return; + if (!getSiteSettingsClient().isQuietNotificationPromptsFeatureEnabled()) return; // The notifications quiet ui checkbox. ChromeBaseCheckBoxPreference quiet_ui_pref =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettings.java index a093edc..939fdca 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettings.java
@@ -27,8 +27,6 @@ import org.chromium.base.Callback; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.R; -import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager; -import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.browser_ui.settings.ChromeImageViewPreference; import org.chromium.components.browser_ui.settings.ManagedPreferencesUtils; @@ -429,13 +427,13 @@ } private void setUpNotificationsPreference(Preference preference) { - TrustedWebActivityPermissionManager manager = TrustedWebActivityPermissionManager.get(); + NotificationSettingsClient client = getSiteSettingsClient().getNotificationSettingsClient(); Origin origin = Origin.create(mSite.getAddress().getOrigin()); if (origin != null) { - String managedBy = manager.getDelegateAppName(origin); + String managedBy = client.getDelegateAppNameForOrigin(origin); if (managedBy != null) { - final Intent notificationSettingsIntent = - getNotificationSettingsIntent(manager.getDelegatePackageName(origin)); + final Intent notificationSettingsIntent = getNotificationSettingsIntent( + client.getDelegatePackageNameForOrigin(origin)); String summaryText = getString(R.string.website_notification_managed_by_app, managedBy); ChromeImageViewPreference newPreference = @@ -503,8 +501,9 @@ // generic Sites channel if no specific channel has been created for the given // origin, so it is safe to open the channel settings for whatever channel ID // it returns. - String channelId = SiteChannelsManager.getInstance().getChannelIdForOrigin( - mSite.getAddress().getOrigin()); + String channelId = + getSiteSettingsClient().getNotificationSettingsClient().getChannelIdForOrigin( + mSite.getAddress().getOrigin()); launchOsChannelSettings(preference.getContext(), channelId); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SiteSettingsClient.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SiteSettingsClient.java index d1befdc5..2feb400 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SiteSettingsClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/SiteSettingsClient.java
@@ -5,7 +5,9 @@ package org.chromium.chrome.browser.site_settings; import android.app.Activity; +import android.graphics.Bitmap; +import org.chromium.base.Callback; import org.chromium.components.browser_ui.settings.ManagedPreferenceDelegate; /** @@ -23,4 +25,28 @@ * @see org.chromium.chrome.browser.help.HelpAndFeedback#show */ void launchHelpAndFeedbackActivity(Activity currentActivity, String helpContext); + + /** + * @return The NotificationSettingsClient that should be used when showing the Site Settings UI. + */ + NotificationSettingsClient getNotificationSettingsClient(); + + /** + * Asynchronously looks up the locally cached favicon image for the given URL. + * + * @param faviconUrl The URL of the page to get the favicon for. If a favicon for the full URL + * can't be found, the favicon for its host will be used as a fallback. + * @param faviconSizePx The expected size of the favicon in pixels. If a favicon of this size + * doesn't exist, the cached favicon closest to this size will be resized to a square of + * this dimension. + * @param callback A callback that will be called with the favicon bitmap, or null if no + * favicon could be found locally. + */ + void getLocalFaviconImageForURL( + String faviconUrl, int faviconSizePx, Callback<Bitmap> callback); + + /** + * @return true if the QuietNotificationPrompts Feature is enabled. + */ + boolean isQuietNotificationPromptsFeatureEnabled(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/WebsitePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/WebsitePreference.java index 0551295..f83ef83 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/WebsitePreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/WebsitePreference.java
@@ -19,11 +19,8 @@ import androidx.preference.PreferenceViewHolder; import org.chromium.chrome.R; -import org.chromium.chrome.browser.profiles.Profile; -import org.chromium.chrome.browser.ui.favicon.FaviconHelper; -import org.chromium.chrome.browser.ui.favicon.FaviconHelper.FaviconImageCallback; import org.chromium.components.browser_ui.settings.ChromeImageViewPreference; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; /** * A preference that displays a website's favicon and URL and, optionally, the amount of local @@ -31,15 +28,13 @@ * of the preference. See {@link ChromeImageViewPreference} for more details on how this icon * can be used. */ -class WebsitePreference extends ChromeImageViewPreference implements FaviconImageCallback { +class WebsitePreference extends ChromeImageViewPreference { + private final SiteSettingsClient mSiteSettingsClient; private final Website mSite; private final SiteSettingsCategory mCategory; private static final int TEXT_SIZE_SP = 13; - // Loads the favicons asynchronously. - private FaviconHelper mFaviconHelper; - // Whether the favicon has been fetched already. private boolean mFaviconFetched; @@ -53,8 +48,10 @@ private int mFaviconSizePx; - WebsitePreference(Context context, Website site, SiteSettingsCategory category) { + WebsitePreference(Context context, SiteSettingsClient siteSettingsClient, Website site, + SiteSettingsCategory category) { super(context); + mSiteSettingsClient = siteSettingsClient; mSite = site; mCategory = category; setWidgetLayoutResource(R.layout.website_features); @@ -85,26 +82,6 @@ return mSite; } - @Override - public void onFaviconAvailable(Bitmap image, String iconUrl) { - mFaviconHelper.destroy(); - mFaviconHelper = null; - Resources resources = getContext().getResources(); - if (image == null) { - // Invalid favicon, produce a generic one. - float density = resources.getDisplayMetrics().density; - int faviconSizeDp = Math.round(mFaviconSizePx / density); - FaviconFallbackGenerator faviconGenerator = - new FaviconFallbackGenerator(resources, faviconSizeDp, faviconSizeDp, - Math.round(FAVICON_CORNER_RADIUS_FRACTION * faviconSizeDp), - FAVICON_BACKGROUND_COLOR, - Math.round(FAVICON_TEXT_SIZE_FRACTION * faviconSizeDp)); - image = faviconGenerator.generateIconForUrl(faviconUrl()); - } - - setIcon(new BitmapDrawable(resources, image)); - } - /** * Returns the url of the site to fetch a favicon for. */ @@ -166,14 +143,8 @@ if (!mFaviconFetched) { // Start the favicon fetching. Will respond in onFaviconAvailable. - mFaviconHelper = new FaviconHelper(); - // TODO(https://crbug.com/1048632): Use the current profile (i.e., regular profile or - // incognito profile) instead of always using regular profile. It works correctly now, - // but it is not safe. - if (!mFaviconHelper.getLocalFaviconImageForURL( - Profile.getLastUsedRegularProfile(), faviconUrl(), mFaviconSizePx, this)) { - onFaviconAvailable(null, null); - } + mSiteSettingsClient.getLocalFaviconImageForURL( + faviconUrl(), mFaviconSizePx, this::onFaviconAvailable); mFaviconFetched = true; } @@ -182,4 +153,21 @@ View iconView = holder.findViewById(android.R.id.icon); iconView.setPadding(iconPadding, iconPadding, iconPadding, iconPadding); } + + private void onFaviconAvailable(Bitmap image) { + Resources resources = getContext().getResources(); + if (image == null) { + // Invalid favicon, produce a generic one. + float density = resources.getDisplayMetrics().density; + int faviconSizeDp = Math.round(mFaviconSizePx / density); + RoundedIconGenerator faviconGenerator = + new RoundedIconGenerator(resources, faviconSizeDp, faviconSizeDp, + Math.round(FAVICON_CORNER_RADIUS_FRACTION * faviconSizeDp), + FAVICON_BACKGROUND_COLOR, + Math.round(FAVICON_TEXT_SIZE_FRACTION * faviconSizeDp)); + image = faviconGenerator.generateIconForUrl(faviconUrl()); + } + + setIcon(new BitmapDrawable(resources, image)); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesFaviconHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesFaviconHelper.java index ad05fe6..9be0ee3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesFaviconHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesFaviconHelper.java
@@ -19,7 +19,7 @@ import org.chromium.chrome.browser.suggestions.SiteSuggestion; import org.chromium.chrome.browser.ui.favicon.IconType; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.url.GURL; import java.io.File; @@ -37,7 +37,7 @@ private final int mMinIconSize; private final int mDesiredIconSize; private final LargeIconBridge mLargeIconBridge; - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; public MostVisitedSitesFaviconHelper(Context context, LargeIconBridge largeIconBridge) { mLargeIconBridge = largeIconBridge; @@ -51,7 +51,7 @@ int iconColor = ApiCompatibilityUtils.getColor(resources, R.color.default_favicon_background_color); int iconTextSize = resources.getDimensionPixelSize(R.dimen.tile_view_icon_text_size); - mIconGenerator = new FaviconFallbackGenerator( + mIconGenerator = new RoundedIconGenerator( mDesiredIconSize, mDesiredIconSize, mDesiredIconSize / 2, iconColor, iconTextSize); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java index 9f748c0..2184c663 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
@@ -31,7 +31,7 @@ import org.chromium.chrome.browser.suggestions.SuggestionsConfig.TileStyle; import org.chromium.chrome.browser.ui.favicon.IconType; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.Tracker; import org.chromium.ui.base.ViewUtils; @@ -49,7 +49,7 @@ private final Resources mResources; private final ImageFetcher mImageFetcher; - private final FaviconFallbackGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; private final Resources.Theme mTheme; @TileStyle @@ -86,7 +86,7 @@ int iconColor = ApiCompatibilityUtils.getColor( mResources, R.color.default_favicon_background_color); int iconTextSize = mResources.getDimensionPixelSize(R.dimen.tile_view_icon_text_size); - mIconGenerator = new FaviconFallbackGenerator( + mIconGenerator = new RoundedIconGenerator( mDesiredIconSize, mDesiredIconSize, mDesiredIconSize / 2, iconColor, iconTextSize); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java index c70432c5..5cf2aba 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java
@@ -14,6 +14,7 @@ import org.chromium.components.external_intents.AuthenticatorNavigationInterceptor; import org.chromium.components.external_intents.ExternalNavigationHandler; import org.chromium.components.external_intents.InterceptNavigationDelegateClient; +import org.chromium.components.external_intents.InterceptNavigationDelegateImpl; import org.chromium.components.external_intents.RedirectHandlerImpl; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.WebContents;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java index c477a03..91ab440 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.tab; import org.chromium.base.UserData; +import org.chromium.components.external_intents.InterceptNavigationDelegateImpl; /** * Class that glues InterceptNavigationDelegateImpl objects to Tabs.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java index a6191c1d..b15bda9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.tab; -import android.os.Handler; import android.view.View; import androidx.annotation.IntDef; @@ -13,10 +12,9 @@ import org.chromium.base.ActivityState; import org.chromium.base.ApplicationState; import org.chromium.base.ApplicationStatus; -import org.chromium.base.Callback; +import org.chromium.base.Consumer; import org.chromium.base.ContextUtils; import org.chromium.base.Log; -import org.chromium.base.ObserverList; import org.chromium.base.ObserverList.RewindableIterator; import org.chromium.base.metrics.RecordHistogram; import org.chromium.chrome.browser.AppHooks; @@ -34,6 +32,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; +import java.util.List; /** * WebContentsObserver used by Tab. @@ -73,8 +73,7 @@ } private final TabImpl mTab; - private final ObserverList<Callback<WebContents>> mInitObservers = new ObserverList<>(); - private final Handler mHandler = new Handler(); + private final List<Consumer<WebContents>> mInitObservers = new ArrayList<>(); private WebContentsObserver mObserver; public static TabWebContentsObserver from(Tab tab) { @@ -98,22 +97,16 @@ /** * Adds an observer triggered when |initWebContents| is invoked. - * <p>A newly created tab adding this observer misses the event because - * |TabObserver.onContentChanged| -> |TabWebContentsObserver.initWebContents| - * occurs before the observer is added. Manually trigger it here. - * @param observer Observer to add. */ - public void addInitWebContentsObserver(Callback<WebContents> observer) { - if (mInitObservers.addObserver(observer) && mTab.getWebContents() != null) { - observer.onResult(mTab.getWebContents()); - } + public void addInitWebContentsObserver(Consumer<WebContents> initObserver) { + mInitObservers.add(initObserver); } /** * Remove the InitWebContents observer from the list. */ - public void removeInitWebContentsObserver(Callback<WebContents> observer) { - mInitObservers.removeObserver(observer); + public void removeInitWebContentsObserver(Consumer<WebContents> initObserver) { + mInitObservers.remove(initObserver); } @Override @@ -129,7 +122,7 @@ // is not the default behavior for embedded web views. WebContentsAccessibility.fromWebContents(webContents).setShouldFocusOnPageLoad(true); - for (Callback<WebContents> callback : mInitObservers) callback.onResult(webContents); + for (Consumer<WebContents> consumer : mInitObservers) consumer.accept(webContents); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index bd4227a..0944fb8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -4,14 +4,9 @@ package org.chromium.chrome.browser.tabbed_mode; -import android.graphics.drawable.Drawable; -import android.os.Handler; - import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; -import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; -import org.chromium.base.ApiCompatibilityUtils; import org.chromium.base.Callback; import org.chromium.base.TraceEvent; import org.chromium.base.supplier.ObservableSupplier; @@ -33,7 +28,7 @@ import org.chromium.chrome.browser.lifecycle.NativeInitObserver; import org.chromium.chrome.browser.locale.LocaleManager; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; -import org.chromium.chrome.browser.offlinepages.indicator.ConnectivityDetector; +import org.chromium.chrome.browser.offlinepages.indicator.OfflineIndicatorControllerV2; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.share.ShareDelegate; @@ -57,15 +52,13 @@ public class TabbedRootUiCoordinator extends RootUiCoordinator implements NativeInitObserver { private static boolean sEnableStatusIndicatorForTests; - private static final int STATUS_INDICATOR_WAIT_BEFORE_HIDE_DURATION_MS = 2000; - private final ObservableSupplierImpl<EphemeralTabCoordinator> mEphemeralTabCoordinatorSupplier; private TabbedSystemUiCoordinator mSystemUiCoordinator; private @Nullable EmptyBackgroundViewWrapper mEmptyBackgroundViewWrapper; private StatusIndicatorCoordinator mStatusIndicatorCoordinator; private StatusIndicatorCoordinator.StatusIndicatorObserver mStatusIndicatorObserver; - private ConnectivityDetector mConnectivityDetector; + private OfflineIndicatorControllerV2 mOfflineIndicatorController; private @Nullable ToolbarButtonInProductHelpController mToolbarButtonInProductHelpController; private boolean mIntentWithEffect; @@ -94,6 +87,10 @@ if (mSystemUiCoordinator != null) mSystemUiCoordinator.destroy(); if (mEmptyBackgroundViewWrapper != null) mEmptyBackgroundViewWrapper.destroy(); + if (mOfflineIndicatorController != null) { + mOfflineIndicatorController.destroy(); + } + if (mStatusIndicatorCoordinator != null) { mStatusIndicatorCoordinator.removeObserver(mStatusIndicatorObserver); mStatusIndicatorCoordinator.removeObserver(mActivity.getStatusBarColorController()); @@ -231,44 +228,13 @@ mStatusIndicatorCoordinator.addObserver(mStatusIndicatorObserver); mStatusIndicatorCoordinator.addObserver(mActivity.getStatusBarColorController()); - // Don't listen to the ConnectivityDetector if the feature is disabled. + // Don't initialize the offline indicator controller if the feature is disabled. if (!ChromeFeatureList.isEnabled(ChromeFeatureList.OFFLINE_INDICATOR_V2)) { return; } - // TODO(sinansahin): Move to a separate class in /offlinepages/indicator. - mConnectivityDetector = new ConnectivityDetector((state) -> { - final boolean offline = state != ConnectivityDetector.ConnectionState.VALIDATED; - if (offline) { - final int backgroundColor = ApiCompatibilityUtils.getColor( - mActivity.getResources(), R.color.offline_indicator_offline_color); - final int textColor = ApiCompatibilityUtils.getColor( - mActivity.getResources(), R.color.default_text_color_light); - final Drawable statusIcon = VectorDrawableCompat.create(mActivity.getResources(), - R.drawable.ic_cloud_offline_24dp, mActivity.getTheme()); - final int iconTint = ApiCompatibilityUtils.getColor( - mActivity.getResources(), R.color.default_icon_color_light); - mStatusIndicatorCoordinator.show( - mActivity.getString(R.string.offline_indicator_v2_offline_text), statusIcon, - backgroundColor, textColor, iconTint); - } else { - final int backgroundColor = ApiCompatibilityUtils.getColor( - mActivity.getResources(), R.color.offline_indicator_back_online_color); - final int textColor = ApiCompatibilityUtils.getColor( - mActivity.getResources(), R.color.default_text_color_inverse); - final Drawable statusIcon = VectorDrawableCompat.create( - mActivity.getResources(), R.drawable.ic_globe_24dp, mActivity.getTheme()); - final int iconTint = ApiCompatibilityUtils.getColor( - mActivity.getResources(), R.color.default_icon_color_inverse); - Runnable hide = () -> { - final Handler handler = new Handler(); - handler.postDelayed(() -> mStatusIndicatorCoordinator.hide(), - STATUS_INDICATOR_WAIT_BEFORE_HIDE_DURATION_MS); - }; - mStatusIndicatorCoordinator.updateContent( - mActivity.getString(R.string.offline_indicator_v2_back_online_text), - statusIcon, backgroundColor, textColor, iconTint, hide); - } - }); + + mOfflineIndicatorController = + new OfflineIndicatorControllerV2(mActivity, mStatusIndicatorCoordinator); } @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java index a74a388..ac85ecf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelImpl.java
@@ -11,7 +11,6 @@ import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.homepage.HomepageManager; import org.chromium.chrome.browser.ntp.RecentlyClosedBridge; -import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl; import org.chromium.chrome.browser.tab.InterceptNavigationDelegateTabHelper; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabCreationState; @@ -20,6 +19,7 @@ import org.chromium.chrome.browser.tab.TabState; import org.chromium.chrome.browser.tabmodel.TabCreatorManager.TabCreator; import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; +import org.chromium.components.external_intents.InterceptNavigationDelegateImpl; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.ResourceRequestBody;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java index e6883bf..e1e6df8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java
@@ -8,7 +8,6 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; -import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Configuration; @@ -56,6 +55,7 @@ import org.chromium.chrome.browser.omnibox.UrlBarCoordinator.SelectionState; import org.chromium.chrome.browser.omnibox.UrlBarData; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler; +import org.chromium.chrome.browser.page_info.ChromePageInfoControllerDelegate; import org.chromium.chrome.browser.page_info.PageInfoController; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; @@ -68,6 +68,7 @@ import org.chromium.components.browser_ui.widget.TintedDrawable; import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.content_public.browser.UiThreadTaskTraits; +import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.common.ContentUrlConstants; import org.chromium.net.GURLUtils; import org.chromium.ui.base.Clipboard; @@ -594,13 +595,16 @@ public void onNativeLibraryReady() { mSecurityButton.setOnClickListener(v -> { Tab currentTab = getToolbarDataProvider().getTab(); - if (currentTab == null || currentTab.getWebContents() == null) return; - Activity activity = currentTab.getWindowAndroid().getActivity().get(); + WebContents webContents = currentTab.getWebContents(); + if (currentTab == null || webContents == null) return; + ChromeActivity activity = + (ChromeActivity) currentTab.getWindowAndroid().getActivity().get(); if (activity == null) return; - PageInfoController.show((ChromeActivity) activity, currentTab.getWebContents(), - getContentPublisher(), PageInfoController.OpenedFromSource.TOOLBAR, + PageInfoController.show(activity, webContents, getContentPublisher(), + PageInfoController.OpenedFromSource.TOOLBAR, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(currentTab)); + new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(currentTab), + new ChromePageInfoControllerDelegate(activity, webContents)); }); } @@ -848,6 +852,9 @@ } @Override + public void performSearchQuery(String query) {} + + @Override public void setUrlBarFocus(boolean shouldBeFocused, @Nullable String pastedText, @LocationBar.OmniboxFocusReason int reason) {}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 120b205..1a64e1a3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -72,7 +72,7 @@ private @Nullable StartSurfaceToolbarCoordinator mStartSurfaceToolbarCoordinator; private final IdentityDiscController mIdentityDiscController; - private final OptionalBrowsingModeButtonController mOptionalButtonController; + private OptionalBrowsingModeButtonController mOptionalButtonController; private HomepageManager.HomepageStateListener mHomepageStateListener = new HomepageManager.HomepageStateListener() { @@ -203,6 +203,11 @@ } else if (mStartSurfaceToolbarCoordinator != null) { mStartSurfaceToolbarCoordinator.destroy(); } + + if (mOptionalButtonController != null) { + mOptionalButtonController.destroy(); + mOptionalButtonController = null; + } } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java index 585317c..74a06ab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -76,7 +76,6 @@ private TabObserverRegistrar mTabObserverRegistrar; private CustomTabDelegateFactory mDelegateFactory; - private boolean mIsInitialized; private Integer mBrandColor; private static Integer sOverrideCoreCountForTesting; @@ -146,7 +145,7 @@ if (newWebappInfo == null) { Log.e(TAG, "Failed to parse new Intent: " + intent); ApiCompatibilityUtils.finishAndRemoveTask(this); - } else if (newWebappInfo.shouldForceNavigation() && mIsInitialized) { + } else if (newWebappInfo.shouldForceNavigation()) { mCustomTabIntentHandler.onNewIntent(newWebappInfo.getProvider()); } } @@ -335,7 +334,6 @@ getFullscreenManager().setTab(getActivityTab()); super.finishNativeInitialization(); - mIsInitialized = true; } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java index ac5ec36d..f8395ca9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheetController.java
@@ -83,7 +83,8 @@ */ @IntDef({StateChangeReason.NONE, StateChangeReason.SWIPE, StateChangeReason.BACK_PRESS, StateChangeReason.TAP_SCRIM, StateChangeReason.NAVIGATION, - StateChangeReason.COMPOSITED_UI, StateChangeReason.VR, StateChangeReason.MAX_VALUE}) + StateChangeReason.COMPOSITED_UI, StateChangeReason.VR, StateChangeReason.PROMOTE_TAB, + StateChangeReason.MAX_VALUE}) @Retention(RetentionPolicy.SOURCE) public @interface StateChangeReason { int NONE = 0; @@ -93,7 +94,8 @@ int NAVIGATION = 4; int COMPOSITED_UI = 5; int VR = 6; - int MAX_VALUE = VR; + int PROMOTE_TAB = 7; + int MAX_VALUE = PROMOTE_TAB; } /** The initial capacity for the priority queue handling pending content show requests. */ @@ -611,8 +613,10 @@ * request to show it. * @param content The content to be hidden. * @param animate Whether the sheet should animate when hiding. + * @param hideReason The reason that the content is being hidden. */ - public void hideContent(BottomSheetContent content, boolean animate) { + public void hideContent( + BottomSheetContent content, boolean animate, @StateChangeReason int hideReason) { if (mBottomSheet == null) return; if (content != mBottomSheet.getCurrentSheetContent()) { @@ -628,11 +632,23 @@ showNextContent(animate); } else { mIsProcessingHideRequest = true; - mBottomSheet.setSheetState(SheetState.HIDDEN, animate); + mBottomSheet.setSheetState(SheetState.HIDDEN, animate, hideReason); } } /** + * Hide content shown in the bottom sheet. If the content is not showing, this call retracts the + * request to show it. + * Supply a close reason if possible: hideContent(BottomSheetContent, boolean, int). + * @param content The content to be hidden. + * @param animate Whether the sheet should animate when hiding. + * @see #hideContent(BottomSheetContent, boolean, int) method. + */ + public void hideContent(BottomSheetContent content, boolean animate) { + hideContent(content, animate, StateChangeReason.NONE); + } + + /** * Expand the {@link BottomSheet}. If there is no content in the sheet, this is a noop. */ public void expandSheet() {
diff --git a/chrome/android/javatests/DEPS b/chrome/android/javatests/DEPS index 1f8e1d9..98a7baa30 100644 --- a/chrome/android/javatests/DEPS +++ b/chrome/android/javatests/DEPS
@@ -16,7 +16,6 @@ "+components/browser_ui/widget/android", "+components/crash/android", "+components/embedder_support/android", - "+components/favicon/android", "+components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement", "+components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core", "+components/gcm_driver/android/java/src/org/chromium/components/gcm_driver",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeActionModeHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeActionModeHandlerTest.java deleted file mode 100644 index d5427e7..0000000 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeActionModeHandlerTest.java +++ /dev/null
@@ -1,67 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser; - -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.SmallTest; - -import org.junit.Assert; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.tab.Tab; -import org.chromium.chrome.browser.tab.TabLaunchType; -import org.chromium.chrome.test.ChromeJUnit4ClassRunner; -import org.chromium.chrome.test.ChromeTabbedActivityTestRule; -import org.chromium.components.embedder_support.util.UrlConstants; -import org.chromium.content_public.browser.LoadUrlParams; -import org.chromium.content_public.browser.test.util.TestThreadUtils; -import org.chromium.content_public.browser.test.util.WebContentsUtils; -import org.chromium.content_public.common.ContentUrlConstants; -import org.chromium.net.test.EmbeddedTestServer; - -/** - * Tests {@link ChromeActionModeHandler} operation. - */ -@RunWith(ChromeJUnit4ClassRunner.class) -@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -public class ChromeActionModeHandlerTest { - @Rule - public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - - private void assertActionModeIsReady() { - // clang-format off - TestThreadUtils.runOnUiThreadBlocking( - () -> Assert.assertTrue(WebContentsUtils.isActionModeSupported( - mActivityTestRule.getWebContents()))); - // clang-format on - } - - @Test - @SmallTest - public void testActionModeSetForNewTab() { - EmbeddedTestServer testServer = EmbeddedTestServer.createAndStartServer( - InstrumentationRegistry.getInstrumentation().getContext()); - - mActivityTestRule.startMainActivityWithURL(UrlConstants.NTP_URL); - mActivityTestRule.loadUrl(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); - assertActionModeIsReady(); - - LoadUrlParams urlParams = new LoadUrlParams(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL); - Tab tab = mActivityTestRule.getActivity().getActivityTabProvider().get(); - - // Assert that a new tab has an action mode callback set as expected. - // clang-format off - TestThreadUtils.runOnUiThreadBlockingNoException( - () -> mActivityTestRule.getActivity().getTabModelSelector().openNewTab( - urlParams, TabLaunchType.FROM_LONGPRESS_FOREGROUND, tab, true)); - // clang-format on - assertActionModeIsReady(); - testServer.stopAndDestroyServer(); - } -}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java index 57a95b0b..b3df9b2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
@@ -24,7 +24,7 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.browsing_data.ClearBrowsingDataFragment.DialogOption; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.sync.ProfileSyncService; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -46,6 +46,10 @@ @Rule public final ChromeActivityTestRule<ChromeActivity> mActivityTestRule = new ChromeActivityTestRule<>(ChromeActivity.class); + @Rule + public final SettingsActivityTestRule<ClearBrowsingDataFragmentBasic> + mSettingsActivityTestRule = + new SettingsActivityTestRule<>(ClearBrowsingDataFragmentBasic.class); private static final String GOOGLE_ACCOUNT = "Google Account"; private static final String OTHER_ACTIVITY = "other forms of browsing history"; @@ -104,12 +108,10 @@ @Test @SmallTest public void testCheckBoxTextNonsigned() { - final SettingsActivity settingsActivity = mActivityTestRule.startSettingsActivity( - ClearBrowsingDataFragmentBasic.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); TestThreadUtils.runOnUiThreadBlocking(() -> { - ClearBrowsingDataFragmentBasic fragment = - (ClearBrowsingDataFragmentBasic) settingsActivity.getMainFragment(); + ClearBrowsingDataFragmentBasic fragment = mSettingsActivityTestRule.getFragment(); PreferenceScreen screen = fragment.getPreferenceScreen(); String cookiesSummary = getCheckboxSummary(screen, @@ -135,12 +137,10 @@ SigninTestUtil.addAndSignInTestAccount(); setSyncable(false); - final SettingsActivity settingsActivity = mActivityTestRule.startSettingsActivity( - ClearBrowsingDataFragmentBasic.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); TestThreadUtils.runOnUiThreadBlocking(() -> { - ClearBrowsingDataFragmentBasic fragment = - (ClearBrowsingDataFragmentBasic) settingsActivity.getMainFragment(); + ClearBrowsingDataFragmentBasic fragment = mSettingsActivityTestRule.getFragment(); PreferenceScreen screen = fragment.getPreferenceScreen(); String cookiesSummary = getCheckboxSummary(screen, @@ -166,12 +166,10 @@ SigninTestUtil.addAndSignInTestAccount(); setSyncable(true); - final SettingsActivity settingsActivity = mActivityTestRule.startSettingsActivity( - ClearBrowsingDataFragmentBasic.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); TestThreadUtils.runOnUiThreadBlocking(() -> { - ClearBrowsingDataFragmentBasic fragment = - (ClearBrowsingDataFragmentBasic) settingsActivity.getMainFragment(); + ClearBrowsingDataFragmentBasic fragment = mSettingsActivityTestRule.getFragment(); PreferenceScreen screen = fragment.getPreferenceScreen(); String cookiesSummary = getCheckboxSummary(screen,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java index a23fa63b..54d3929 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentTest.java
@@ -50,6 +50,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager; import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.signin.SigninTestUtil; @@ -72,6 +73,13 @@ @Rule public ChromeActivityTestRule<ChromeActivity> mActivityTestRule = new ChromeActivityTestRule<>(ChromeActivity.class); + @Rule + public SettingsActivityTestRule<ClearBrowsingDataFragmentAdvanced> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(ClearBrowsingDataFragmentAdvanced.class); + @Rule + public SettingsActivityTestRule<ClearBrowsingDataTabsFragment> + mSettingsActivityTabFragmentTestRule = + new SettingsActivityTestRule<>(ClearBrowsingDataTabsFragment.class); @Rule public JniMocker mJniMocker = new JniMocker(); @@ -143,11 +151,9 @@ } private SettingsActivity startPreferences() { - SettingsActivity settingsActivity = mActivityTestRule.startSettingsActivity( - ClearBrowsingDataFragmentAdvanced.class.getName()); + SettingsActivity settingsActivity = mSettingsActivityTestRule.startSettingsActivity(); ClearBrowsingDataFetcher fetcher = new ClearBrowsingDataFetcher(); - ClearBrowsingDataFragment fragment = - (ClearBrowsingDataFragment) settingsActivity.getMainFragment(); + ClearBrowsingDataFragment fragment = mSettingsActivityTestRule.getFragment(); fragment.setClearBrowsingDataFetcher(fetcher); TestThreadUtils.runOnUiThreadBlocking(fetcher::fetchImportantSites); return settingsActivity; @@ -163,10 +169,9 @@ // Set "Advanced" as the user's cached preference. when(mBrowsingDataBridgeMock.getLastClearBrowsingDataTab(any())).thenReturn(1); - SettingsActivity settingsActivity = mActivityTestRule.startSettingsActivity( - ClearBrowsingDataTabsFragment.class.getName()); + mSettingsActivityTabFragmentTestRule.startSettingsActivity(); final ClearBrowsingDataTabsFragment preferences = - (ClearBrowsingDataTabsFragment) settingsActivity.getMainFragment(); + mSettingsActivityTabFragmentTestRule.getFragment(); // Verify tab preference is loaded. verify(mBrowsingDataBridgeMock).getLastClearBrowsingDataTab(any());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index 03c99518..04e3e720 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -121,14 +121,10 @@ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, ContextualSearchFieldTrial.ONLINE_DETECTION_DISABLED, - "disable-features=" + ChromeFeatureList.CONTEXTUAL_SEARCH_ML_TAP_SUPPRESSION}) + "disable-features=" + ChromeFeatureList.CONTEXTUAL_SEARCH_ML_TAP_SUPPRESSION + "," + + ChromeFeatureList.OMNIBOX_SEARCH_ENGINE_LOGO}) @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) @RetryOnFailure -// -// NOTE -- THIS WHOLE TEST CLASS IS TEMPORARILY DISABLED: -// -@DisabledTest(message = "See https://crbug.com/1058362") -// public class ContextualSearchManagerTest { @Rule public ChromeActivityTestRule<ChromeActivity> mActivityTestRule =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java index cb23b30..0539494 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java
@@ -28,13 +28,13 @@ import org.chromium.chrome.browser.LaunchIntentDispatcher; import org.chromium.chrome.browser.customtabs.CustomTabDelegateFactory.CustomTabNavigationDelegate; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl; import org.chromium.chrome.browser.tab.InterceptNavigationDelegateTabHelper; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabDelegateFactory; import org.chromium.chrome.browser.tab.TabTestUtils; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult; +import org.chromium.components.external_intents.InterceptNavigationDelegateImpl; 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;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index cd3671cc..98c5297 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -32,7 +32,6 @@ import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.tab.EmptyTabObserver; -import org.chromium.chrome.browser.tab.InterceptNavigationDelegateImpl; import org.chromium.chrome.browser.tab.InterceptNavigationDelegateTabHelper; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabCreationState; @@ -40,6 +39,7 @@ import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult; +import org.chromium.components.external_intents.InterceptNavigationDelegateImpl; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.content_public.browser.NavigationHandle; import org.chromium.content_public.browser.test.util.Criteria;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java index f9f7ae8..310b6f5b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
@@ -10,7 +10,6 @@ import android.view.View; import androidx.preference.Preference; -import androidx.preference.PreferenceFragmentCompat; import org.junit.After; import org.junit.Assert; @@ -32,7 +31,7 @@ import org.chromium.chrome.browser.homepage.settings.HomepageSettings; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; -import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.toolbar.HomeButton; import org.chromium.chrome.browser.toolbar.ToolbarManager; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -75,6 +74,9 @@ @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + @Rule + public SettingsActivityTestRule<HomepageSettings> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(HomepageSettings.class); @Rule public HomepageTestRule mHomepageTestRule = new HomepageTestRule(); @@ -177,11 +179,8 @@ @DisableFeatures(ChromeFeatureList.HOMEPAGE_SETTINGS_UI_CONVERSION) public void testHomepagePreference() { // Launch homepage preference page - SettingsActivity homepagePreferenceActivity = - mActivityTestRule.startSettingsActivity(HomepageSettings.class.getName()); - PreferenceFragmentCompat fragment = - (PreferenceFragmentCompat) homepagePreferenceActivity.getSupportFragmentManager() - .findFragmentById(android.R.id.content); + mSettingsActivityTestRule.startSettingsActivity(); + HomepageSettings fragment = mSettingsActivityTestRule.getFragment(); Assert.assertNotNull(fragment); ChromeSwitchPreference homepageSwitch = (ChromeSwitchPreference) fragment.findPreference(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentTest.java index a917675..9cd272b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentTest.java
@@ -17,15 +17,13 @@ import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.UserActionTester; -import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.homepage.HomepageManager; import org.chromium.chrome.browser.homepage.HomepageTestRule; import org.chromium.chrome.browser.homepage.settings.HomepageMetricsEnums.HomepageLocationType; import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.partnercustomizations.PartnerBrowserCustomizations; -import org.chromium.chrome.browser.settings.SettingsActivity; -import org.chromium.chrome.test.ChromeActivityTestRule; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.settings.ChromeSwitchPreference; @@ -90,8 +88,8 @@ private static final String CHROME_NTP = UrlConstants.NTP_NON_NATIVE_URL; @Rule - public ChromeActivityTestRule<ChromeActivity> mTestRule = - new ChromeActivityTestRule<>(ChromeActivity.class); + public SettingsActivityTestRule<HomepageSettings> mTestRule = + new SettingsActivityTestRule<>(HomepageSettings.class); @Rule public HomepageTestRule mHomepageTestRule = new HomepageTestRule(); @@ -108,9 +106,8 @@ private RadioButtonWithEditText mCustomUriRadioButton; private void launchSettingsActivity() { - SettingsActivity homepagePreferenceActivity = - mTestRule.startSettingsActivity(HomepageSettings.class.getName()); - HomepageSettings fragment = (HomepageSettings) homepagePreferenceActivity.getMainFragment(); + mTestRule.startSettingsActivity(); + HomepageSettings fragment = mTestRule.getFragment(); Assert.assertNotNull(fragment); mSwitch = (ChromeSwitchPreference) fragment.findPreference(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentWithEditorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentWithEditorTest.java index 5199f08..9fd0dc0d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentWithEditorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsFragmentWithEditorTest.java
@@ -19,12 +19,10 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Feature; -import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.homepage.HomepageManager; import org.chromium.chrome.browser.homepage.HomepageTestRule; -import org.chromium.chrome.browser.settings.SettingsActivity; -import org.chromium.chrome.test.ChromeActivityTestRule; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.browser_ui.settings.ChromeSwitchPreference; import org.chromium.components.embedder_support.util.UrlConstants; @@ -60,8 +58,8 @@ public static final String CHROME_NTP = UrlConstants.NTP_NON_NATIVE_URL; @Rule - public ChromeActivityTestRule<ChromeActivity> mTestRule = - new ChromeActivityTestRule<>(ChromeActivity.class); + public SettingsActivityTestRule<HomepageSettings> mTestRule = + new SettingsActivityTestRule<>(HomepageSettings.class); @Rule public HomepageTestRule mHomepageTestRule = new HomepageTestRule(); @@ -83,9 +81,8 @@ private Preference mHomepageEditor; private void launchSettingsActivity() { - SettingsActivity homepagePreferenceActivity = - mTestRule.startSettingsActivity(HomepageSettings.class.getName()); - HomepageSettings fragment = (HomepageSettings) homepagePreferenceActivity.getMainFragment(); + mTestRule.startSettingsActivity(); + HomepageSettings fragment = mTestRule.getFragment(); Assert.assertNotNull(fragment); mSwitch = (ChromeSwitchPreference) fragment.findPreference(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java index c7c612ed..9d7ca45 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetricsIntegrationTest.java
@@ -36,7 +36,9 @@ import org.chromium.chrome.browser.omnibox.UrlBar; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; +import org.chromium.chrome.browser.settings.DummySettingsForTest; import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.tab.TabLaunchType; import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.test.ChromeActivityTestRule; @@ -64,6 +66,9 @@ @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); + @Rule + public SettingsActivityTestRule<DummySettingsForTest> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(DummySettingsForTest.class); private UserActionTester mActionTester; @@ -250,7 +255,7 @@ mActivityTestRule.startMainActivityFromLauncher(); - SettingsActivity settingsActivity = mActivityTestRule.startSettingsActivity(null); + SettingsActivity settingsActivity = mSettingsActivityTestRule.startSettingsActivity(); settingsActivity.finish(); ChromeActivityTestRule.waitForActivityNativeInitializationComplete( ChromeActivityTestRule.waitFor(ChromeTabbedActivity.class));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationBuilderBaseTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationBuilderBaseTest.java index f3e455e..a0dde4b9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationBuilderBaseTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationBuilderBaseTest.java
@@ -19,15 +19,15 @@ import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.util.UrlUtilities; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.content_public.browser.test.NativeLibraryTestRule; /** * Instrumentation unit tests for NotificationBuilderBase. * * Extends NativeLibraryTestBase so that {@link UrlUtilities#getDomainAndRegistry} can access - * native GetDomainAndRegistry, when called by {@link FaviconFallbackGenerator#getIconTextForUrl} + * native GetDomainAndRegistry, when called by {@link RoundedIconGenerator#getIconTextForUrl} * during testEnsureNormalizedIconBehavior(). */ @RunWith(BaseJUnit4ClassRunner.class)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java index a945d06..f574472 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeTest.java
@@ -46,7 +46,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.TabTitleObserver; import org.chromium.chrome.test.util.browser.notifications.MockNotificationManagerProxy.NotificationEntry; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.permissions.PermissionDialogController; import org.chromium.components.url_formatter.SchemeDisplay; import org.chromium.components.url_formatter.UrlFormatter; @@ -633,7 +633,7 @@ // Create a second rounded icon for the test's origin, and compare its dimensions against // those of the icon associated to the notification itself. - FaviconFallbackGenerator generator = + RoundedIconGenerator generator = NotificationBuilderBase.createIconGenerator(context.getResources()); Bitmap generatedIcon = generator.generateIconForUrl(mPermissionTestRule.getOrigin());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilderTest.java index 215be3b..a7ac62a6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilderTest.java
@@ -31,15 +31,15 @@ import org.chromium.base.test.util.MinAndroidSdkLevel; import org.chromium.chrome.R; import org.chromium.chrome.browser.notifications.channels.ChannelDefinitions; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.embedder_support.util.UrlUtilities; -import org.chromium.components.favicon.FaviconFallbackGenerator; import org.chromium.content_public.browser.test.NativeLibraryTestRule; /** * Instrumentation unit tests for StandardNotificationBuilder. * * Extends NativeLibraryTestBase so that {@link UrlUtilities#getDomainAndRegistry} can access - * native GetDomainAndRegistry, when called by {@link FaviconFallbackGenerator#getIconTextForUrl} + * native GetDomainAndRegistry, when called by {@link RoundedIconGenerator#getIconTextForUrl} * during notification construction. */ @RunWith(BaseJUnit4ClassRunner.class)
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 427795f..97bcd37 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
@@ -214,8 +214,7 @@ } @Test - @DisabledTest(message = "https://crbug.com/888129") - @SmallTest + @MediumTest @Feature({"NewTabPage", "FeedNewTabPage", "RenderTest"}) @ParameterAnnotations.UseMethodParameter(InterestFeedParams.class) public void testRender_FocusFakeBox(boolean interestFeedEnabled) throws Exception {
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 bfb6f30e..44c2e112 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
@@ -22,6 +22,7 @@ import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion.MatchClassification; import org.chromium.chrome.browser.omnibox.voice.VoiceRecognitionHandler.VoiceResult; import org.chromium.chrome.test.ChromeBrowserTestRule; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -40,8 +41,8 @@ List<MatchClassification> classifications = new ArrayList<>(); 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, null); + classifications, null, classifications, null, "", new GURL("http://www.google.com"), + GURL.emptyGURL(), null, false, false, null, null); } private static List<OmniboxSuggestion> createDummySuggestions(String... texts) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java index 86ce4a1..284237fe 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoControllerTest.java
@@ -67,7 +67,9 @@ PageInfoController.show(mActivityTestRule.getActivity(), tab.getWebContents(), null, PageInfoController.OpenedFromSource.MENU, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab)); + new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab), + new ChromePageInfoControllerDelegate( + mActivityTestRule.getActivity(), tab.getWebContents())); }); } @@ -90,7 +92,9 @@ PageInfoController.OfflinePageState.NOT_OFFLINE_PAGE, PageInfoController.PreviewPageState.NOT_PREVIEW, /*publisher=*/null, /*offlinePageLoadUrlDelegate=*/ - new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab)); + new OfflinePageUtils.TabOfflinePageLoadUrlDelegate(tab), + new ChromePageInfoControllerDelegate( + mActivityTestRule.getActivity(), tab.getWebContents())); PageInfoView pageInfoView = pageInfo.getPageInfoViewForTesting(); // Test that the title contains the Unicode hostname rather than strict equality, as // the test server will be bound to a random port.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java index d62d2e68..73794e2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
@@ -12,8 +12,6 @@ import android.widget.Button; import android.widget.EditText; -import androidx.preference.PreferenceFragmentCompat; - import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -31,6 +29,7 @@ import org.chromium.chrome.browser.homepage.settings.HomepageEditor; import org.chromium.chrome.browser.homepage.settings.HomepageSettings; import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver; import org.chromium.chrome.browser.tabmodel.TabList; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -56,6 +55,12 @@ @Rule public BasePartnerBrowserCustomizationIntegrationTestRule mActivityTestRule = new BasePartnerBrowserCustomizationIntegrationTestRule(); + @Rule + public SettingsActivityTestRule<HomepageSettings> mHomepageSettingsTestRule = + new SettingsActivityTestRule<>(HomepageSettings.class); + @Rule + public SettingsActivityTestRule<HomepageEditor> mHomepageEditorTestRule = + new SettingsActivityTestRule<>(HomepageEditor.class); private static final String TEST_PAGE = "/chrome/test/data/android/about.html"; @@ -150,7 +155,7 @@ public void testPreferenceCustomUriFixup() { // Change home page custom URI on hompage edit screen. final SettingsActivity editHomepagePreferenceActivity = - mActivityTestRule.startSettingsActivity(HomepageEditor.class.getName()); + mHomepageEditorTestRule.startSettingsActivity(); TestThreadUtils.runOnUiThreadBlocking(new Runnable() { @Override // TODO(crbug.com/635567): Fix this properly. @@ -239,10 +244,8 @@ private void toggleHomepageSwitchPreference(boolean expected) { // Launch preference activity with Homepage settings fragment. SettingsActivity homepagePreferenceActivity = - mActivityTestRule.startSettingsActivity(HomepageSettings.class.getName()); - PreferenceFragmentCompat fragment = - (PreferenceFragmentCompat) homepagePreferenceActivity.getSupportFragmentManager() - .findFragmentById(android.R.id.content); + mHomepageSettingsTestRule.startSettingsActivity(); + HomepageSettings fragment = mHomepageSettingsTestRule.getFragment(); ChromeSwitchPreference preference = (ChromeSwitchPreference) fragment.findPreference( HomepageSettings.PREF_HOMEPAGE_SWITCH); Assert.assertNotNull(preference);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java index a3a47786..00458df 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/TemplateUrlServiceTest.java
@@ -25,6 +25,7 @@ import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.test.util.UiRestriction; +import org.chromium.url.GURL; import java.util.List; import java.util.concurrent.Callable; @@ -78,15 +79,15 @@ private void validateQuery(final String query, final String alternative, final boolean prefetch, final String protocolVersion) throws ExecutionException { - String result = TestThreadUtils.runOnUiThreadBlocking(new Callable<String>() { + GURL result = TestThreadUtils.runOnUiThreadBlocking(new Callable<GURL>() { @Override - public String call() { + public GURL call() { return TemplateUrlServiceFactory.get().getUrlForContextualSearchQuery( query, alternative, prefetch, protocolVersion); } }); Assert.assertNotNull(result); - Uri uri = Uri.parse(result); + Uri uri = Uri.parse(result.getSpec()); Assert.assertEquals(query, uri.getQueryParameter(QUERY_PARAMETER)); Assert.assertEquals(alternative, uri.getQueryParameter(ALTERNATIVE_PARAMETER)); Assert.assertEquals(protocolVersion, uri.getQueryParameter(VERSION_PARAMETER));
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 62bfd93..fae86bd 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
@@ -57,6 +57,7 @@ import org.chromium.content_public.browser.test.util.KeyUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.common.ContentUrlConstants; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -340,10 +341,12 @@ 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, null, null); + "", new GURL("https://google.com"), GURL.emptyGURL(), 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, null); + null, "", new GURL("https://android.com"), GURL.emptyGURL(), null, false, false, + null, null); List<OmniboxSuggestion> list = new ArrayList<>(); list.add(mockSuggestion); list.add(mockSuggestion2);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java index 7d34ef8..3c8f25d2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java
@@ -64,6 +64,9 @@ public HomepageTestRule mHomepageTestRule = new HomepageTestRule(); @Rule public SyncTestRule mSyncTestRule = new SyncTestRule(); + @Rule + public SettingsActivityTestRule<MainSettings> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(MainSettings.class); @Mock public TemplateUrlService mMockTemplateUrlService; @@ -92,10 +95,8 @@ } private void launchSettingsActivity() { - SettingsActivity activity = - mSyncTestRule.startSettingsActivity(MainSettings.class.getName()); - - mMainSettings = (MainSettings) activity.getMainFragment(); + mSettingsActivityTestRule.startSettingsActivity(); + mMainSettings = mSettingsActivityTestRule.getFragment(); Assert.assertNotNull("SettingsActivity failed to launch.", mMainSettings); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java index d84bc34..6a70bcdc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java
@@ -37,6 +37,7 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileAccountManagementMetrics; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.sync.settings.AccountManagementFragment; import org.chromium.chrome.test.ChromeActivityTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -59,6 +60,10 @@ public final DisableAnimationsTestRule mNoAnimationsRule = new DisableAnimationsTestRule(); @Rule + public final SettingsActivityTestRule<AccountManagementFragment> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(AccountManagementFragment.class); + + @Rule public final JniMocker mocker = new JniMocker(); @Mock @@ -116,7 +121,7 @@ @LargeTest public void testSignOut() { signIn(); - mActivityTestRule.startSettingsActivity(AccountManagementFragment.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); onView(withText(R.string.sign_out_and_turn_off_sync)).perform(click()); onView(withText(R.string.continue_button)).inRoot(isDialog()).perform(click()); assertSignedOut(); @@ -133,7 +138,7 @@ @LargeTest public void testSignOutDismissedByPressingBack() { signIn(); - mActivityTestRule.startSettingsActivity(AccountManagementFragment.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); onView(withText(R.string.sign_out_and_turn_off_sync)).perform(click()); onView(isRoot()).perform(pressBack()); verify(mSignInStateObserverMock, never()).onSignedOut(); @@ -150,7 +155,7 @@ @LargeTest public void testSignOutCancelled() { signIn(); - mActivityTestRule.startSettingsActivity(AccountManagementFragment.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); onView(withText(R.string.sign_out_and_turn_off_sync)).perform(click()); onView(withText(R.string.cancel)).inRoot(isDialog()).perform(click()); verify(mSignInStateObserverMock, never()).onSignedOut(); @@ -168,7 +173,7 @@ public void testSignOutNonManagedAccountWithDataWiped() { signIn(); addOneTestBookmark(); - mActivityTestRule.startSettingsActivity(AccountManagementFragment.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); onView(withText(R.string.sign_out_and_turn_off_sync)).perform(click()); onView(withId(R.id.remove_local_data)).perform(click()); onView(withText(R.string.continue_button)).inRoot(isDialog()).perform(click()); @@ -183,7 +188,7 @@ public void testSignOutNonManagedAccountWithoutWipingData() { signIn(); addOneTestBookmark(); - mActivityTestRule.startSettingsActivity(AccountManagementFragment.class.getName()); + mSettingsActivityTestRule.startSettingsActivity(); onView(withText(R.string.sign_out_and_turn_off_sync)).perform(click()); onView(withText(R.string.continue_button)).inRoot(isDialog()).perform(click()); assertSignedOut();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java index 5c0f5f2..d63d14c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
@@ -443,7 +443,7 @@ // If the ContentSettingsType.NUM_TYPES value changes *and* a new value has been exposed on // Android, then please update this code block to include a test for your new type. // Otherwise, just update count in the assert. - Assert.assertEquals(61, ContentSettingsType.NUM_TYPES); + Assert.assertEquals(62, ContentSettingsType.NUM_TYPES); websitePreferenceBridge.addContentSettingException( new ContentSettingException(ContentSettingsType.COOKIES, googleOrigin, ContentSettingValues.DEFAULT, preferenceSource));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java index 7228b4e..15dc263 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java
@@ -31,6 +31,7 @@ import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.sync.settings.ManageSyncSettings; import org.chromium.chrome.browser.sync.ui.PassphraseCreationDialogFragment; import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment; @@ -76,6 +77,9 @@ @Rule public SyncTestRule mSyncTestRule = new SyncTestRule(); + @Rule + public SettingsActivityTestRule<ManageSyncSettings> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(ManageSyncSettings.class); @After public void tearDown() { @@ -437,9 +441,8 @@ } private ManageSyncSettings startManageSyncPreferences() { - mSettingsActivity = mSyncTestRule.startSettingsActivity(ManageSyncSettings.class.getName()); - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); - return (ManageSyncSettings) mSettingsActivity.getMainFragment(); + mSettingsActivity = mSettingsActivityTestRule.startSettingsActivity(); + return mSettingsActivityTestRule.getFragment(); } private void closeFragment(ManageSyncSettings fragment) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java index 651dc12..0852c1ce 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsWithFakeProfileSyncServiceTest.java
@@ -19,6 +19,7 @@ import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.sync.settings.ManageSyncSettings; import org.chromium.chrome.browser.sync.ui.PassphraseDialogFragment; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -40,6 +41,9 @@ return new FakeProfileSyncService(); } }; + @Rule + public SettingsActivityTestRule<ManageSyncSettings> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(ManageSyncSettings.class); private SettingsActivity mSettingsActivity; @@ -80,9 +84,8 @@ } private ManageSyncSettings startManageSyncPreferences() { - mSettingsActivity = mSyncTestRule.startSettingsActivity(ManageSyncSettings.class.getName()); - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); - return (ManageSyncSettings) mSettingsActivity.getMainFragment(); + mSettingsActivity = mSettingsActivityTestRule.startSettingsActivity(); + return mSettingsActivityTestRule.getFragment(); } private void clickPreference(final Preference pref) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java index 4bf8f79..bf49602b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsTest.java
@@ -30,6 +30,7 @@ import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.settings.SettingsLauncher; import org.chromium.chrome.browser.sync.settings.SyncAndServicesSettings; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; @@ -49,6 +50,9 @@ public class SyncAndServicesSettingsTest { @Rule public SyncTestRule mSyncTestRule = new SyncTestRule(); + @Rule + public SettingsActivityTestRule<SyncAndServicesSettings> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(SyncAndServicesSettings.class); private SettingsActivity mSettingsActivity; @@ -359,8 +363,7 @@ } private SyncAndServicesSettings startSyncAndServicesPreferences() { - mSettingsActivity = - mSyncTestRule.startSettingsActivity(SyncAndServicesSettings.class.getName()); + mSettingsActivity = mSettingsActivityTestRule.startSettingsActivity(); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); return (SyncAndServicesSettings) mSettingsActivity.getMainFragment(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java index 0c4fc433..62bb7df 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesSettingsWithFakeProfileSyncServiceTest.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.sync; -import android.support.test.InstrumentationRegistry; import android.support.test.filters.LargeTest; import androidx.preference.Preference; @@ -18,7 +17,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; -import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.sync.settings.SyncAndServicesSettings; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.util.browser.sync.SyncTestUtil; @@ -36,6 +35,9 @@ return new FakeProfileSyncService(); } }; + @Rule + public SettingsActivityTestRule<SyncAndServicesSettings> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(SyncAndServicesSettings.class); @Test @LargeTest @@ -54,10 +56,8 @@ } private SyncAndServicesSettings startSyncAndServicesPreferences() { - SettingsActivity settingsActivity = - mSyncTestRule.startSettingsActivity(SyncAndServicesSettings.class.getName()); - InstrumentationRegistry.getInstrumentation().waitForIdleSync(); - return (SyncAndServicesSettings) settingsActivity.getMainFragment(); + mSettingsActivityTestRule.startSettingsActivity(); + return mSettingsActivityTestRule.getFragment(); } private Preference getSyncErrorCard(SyncAndServicesSettings fragment) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java index 6e21bc2f..e7bcb7ae 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
@@ -24,6 +24,7 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.components.external_intents.ExternalNavigationHandler; import org.chromium.components.external_intents.ExternalNavigationParams; +import org.chromium.components.external_intents.InterceptNavigationDelegateImpl; import org.chromium.components.navigation_interception.NavigationParams; import org.chromium.content_public.browser.test.util.Criteria; import org.chromium.content_public.browser.test.util.CriteriaHelper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java index 5d5f8ac..48c75331 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java
@@ -35,6 +35,7 @@ import org.chromium.chrome.browser.ChromeActivity; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.settings.SettingsActivity; +import org.chromium.chrome.browser.settings.SettingsActivityTestRule; import org.chromium.chrome.browser.settings.SettingsLauncher; import org.chromium.chrome.browser.tracing.TracingController; import org.chromium.chrome.browser.tracing.TracingNotificationManager; @@ -61,6 +62,9 @@ @Rule public final ChromeActivityTestRule<ChromeActivity> mActivityTestRule = new ChromeActivityTestRule<>(ChromeActivity.class); + @Rule + public final SettingsActivityTestRule<TracingSettings> mSettingsActivityTestRule = + new SettingsActivityTestRule<>(TracingSettings.class); private MockNotificationManagerProxy mMockNotificationManager; @@ -143,10 +147,8 @@ @DisableIf.Build(sdk_is_less_than = 21, message = "crbug.com/899894") public void testRecordTrace() throws Exception { mActivityTestRule.startMainActivityOnBlankPage(); - SettingsActivity activity = - mActivityTestRule.startSettingsActivity(TracingSettings.class.getName()); - final PreferenceFragmentCompat fragment = - (PreferenceFragmentCompat) activity.getMainFragment(); + mSettingsActivityTestRule.startSettingsActivity(); + final PreferenceFragmentCompat fragment = mSettingsActivityTestRule.getFragment(); final ButtonPreference startTracingButton = (ButtonPreference) fragment.findPreference(TracingSettings.UI_PREF_START_RECORDING); @@ -243,10 +245,8 @@ public void testNotificationsDisabledMessage() throws Exception { mMockNotificationManager.setNotificationsEnabled(false); - SettingsActivity activity = - mActivityTestRule.startSettingsActivity(TracingSettings.class.getName()); - final PreferenceFragmentCompat fragment = - (PreferenceFragmentCompat) activity.getMainFragment(); + mSettingsActivityTestRule.startSettingsActivity(); + final PreferenceFragmentCompat fragment = mSettingsActivityTestRule.getFragment(); final ButtonPreference startTracingButton = (ButtonPreference) fragment.findPreference(TracingSettings.UI_PREF_START_RECORDING); final TextMessagePreference statusPreference = @@ -268,10 +268,8 @@ public void testSelectCategories() throws Exception { // We need a renderer so that its tracing categories will be populated. mActivityTestRule.startMainActivityOnBlankPage(); - SettingsActivity activity = - mActivityTestRule.startSettingsActivity(TracingSettings.class.getName()); - final PreferenceFragmentCompat fragment = - (PreferenceFragmentCompat) activity.getMainFragment(); + mSettingsActivityTestRule.startSettingsActivity(); + final PreferenceFragmentCompat fragment = mSettingsActivityTestRule.getFragment(); final Preference defaultCategoriesPref = fragment.findPreference(TracingSettings.UI_PREF_DEFAULT_CATEGORIES); final Preference nonDefaultCategoriesPref = @@ -328,10 +326,8 @@ @SmallTest @Feature({"Preferences"}) public void testSelectMode() throws Exception { - SettingsActivity activity = - mActivityTestRule.startSettingsActivity(TracingSettings.class.getName()); - final PreferenceFragmentCompat fragment = - (PreferenceFragmentCompat) activity.getMainFragment(); + mSettingsActivityTestRule.startSettingsActivity(); + final PreferenceFragmentCompat fragment = mSettingsActivityTestRule.getFragment(); final ListPreference modePref = (ListPreference) fragment.findPreference(TracingSettings.UI_PREF_MODE);
diff --git a/chrome/android/junit/DEPS b/chrome/android/junit/DEPS index ec8f610..7b9d6bd0 100644 --- a/chrome/android/junit/DEPS +++ b/chrome/android/junit/DEPS
@@ -13,7 +13,6 @@ "+components/background_task_scheduler/android", "+components/bookmarks/common/android", "+components/browser_ui/widget/android", - "+components/favicon/android", "+components/offline_items_collection/core/android/java/src", "+components/omnibox/browser/android/java/src/org/chromium/components/omnibox", "+components/payments/content/android/java/src/org/chromium/components/payments",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java index 6f9dca9..53729bd8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/SearchEngineLogoUtilsUnitTest.java
@@ -37,7 +37,7 @@ import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.browser.ui.favicon.FaviconHelper; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.components.search_engines.TemplateUrlService; /** @@ -63,7 +63,7 @@ @Mock TemplateUrlService mTemplateUrlService; @Mock - FaviconFallbackGenerator mFaviconFallbackGenerator; + RoundedIconGenerator mRoundedIconGenerator; Bitmap mBitmap; @@ -80,9 +80,9 @@ SearchEngineLogoUtils.resetCacheForTesting(); SearchEngineLogoUtils.setDelegateForTesting(mDelegate); SearchEngineLogoUtils.setFaviconHelperForTesting(mFaviconHelper); - SearchEngineLogoUtils.setFaviconFallbackGeneratorForTesting(mFaviconFallbackGenerator); + SearchEngineLogoUtils.setRoundedIconGeneratorForTesting(mRoundedIconGenerator); - when(mFaviconFallbackGenerator.generateIconForText(any())).thenReturn(mBitmap); + when(mRoundedIconGenerator.generateIconForText(any())).thenReturn(mBitmap); when(mDelegate.isSearchEngineLogoEnabled()).thenReturn(true); when(mDelegate.shouldShowSearchEngineLogo(false)).thenReturn(true); when(mDelegate.shouldShowRoundedSearchEngineLogo(false)).thenReturn(true);
diff --git a/chrome/android/native_java_unittests/DEPS b/chrome/android/native_java_unittests/DEPS index 74e4c52..7ee95c4 100644 --- a/chrome/android/native_java_unittests/DEPS +++ b/chrome/android/native_java_unittests/DEPS
@@ -1,5 +1,8 @@ include_rules = [ + "+chrome/browser/image_fetcher", + "+chrome/browser/profiles/android", "+components/embedder_support/android/java/src/org/chromium/components/embedder_support", + "+components/omnibox/browser/android/java/src/org/chromium/components/omnibox", "+components/payments/content/android/java/src/org/chromium/components/payments", "+components/search_engines/android/java/src/org/chromium/components/search_engines", "+components/security_state/content/android/java/src/org/chromium/components/security_state",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java similarity index 79% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java index 8a1d577..236f37dd 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.omnibox.suggestions; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyObject; @@ -14,31 +15,29 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import android.app.Activity; +import android.os.Handler; +import android.os.Message; import android.view.View; 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.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowLooper; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.chromium.base.ContextUtils; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; +import org.chromium.base.annotations.NativeJavaTestFeatures; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.toolbar.ToolbarDataProvider; -import org.chromium.chrome.test.util.browser.Features; -import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -46,15 +45,10 @@ /** * Tests for {@link AutocompleteMediator}. */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) public class AutocompleteMediatorUnitTest { private static final int MINIMUM_NUMBER_OF_SUGGESTIONS_TO_SHOW = 5; private static final int SUGGESTION_MIN_HEIGHT = 10; - @Rule - public TestRule mFeatureProcessor = new Features.JUnitProcessor(); - @Mock AutocompleteDelegate mAutocompleteDelegate; @@ -70,23 +64,28 @@ @Mock ToolbarDataProvider mToolbarDataProvider; - private Activity mActivity; + @Mock + Handler mHandler; + private PropertyModel mListModel; private AutocompleteMediator mMediator; private List<OmniboxSuggestion> mSuggestionsList; private ModelList mSuggestionModels; - @Before + @CalledByNative + private AutocompleteMediatorUnitTest() {} + + @CalledByNative public void setUp() { MockitoAnnotations.initMocks(this); - mActivity = Robolectric.buildActivity(Activity.class).setup().get(); mSuggestionModels = new ModelList(); mListModel = new PropertyModel(SuggestionListProperties.ALL_KEYS); mListModel.set(SuggestionListProperties.SUGGESTION_MODELS, mSuggestionModels); - mMediator = new AutocompleteMediator(mActivity, mAutocompleteDelegate, mTextStateProvider, - mAutocompleteController, mListModel); + mMediator = new AutocompleteMediator(ContextUtils.getApplicationContext(), + mAutocompleteDelegate, mTextStateProvider, mAutocompleteController, mListModel, + mHandler); mMediator.setToolbarDataProvider(mToolbarDataProvider); mMediator.registerSuggestionProcessor(mMockProcessor); mMediator.setSuggestionVisibilityState( @@ -97,6 +96,15 @@ .thenAnswer((mock) -> new PropertyModel(SuggestionCommonProperties.ALL_KEYS)); when(mMockProcessor.getMinimumSuggestionViewHeight()).thenReturn(SUGGESTION_MIN_HEIGHT); + when(mHandler.sendMessageAtTime(any(Message.class), anyLong())) + .thenAnswer(new Answer<Void>() { + @Override + public Void answer(InvocationOnMock invocation) { + ((Message) invocation.getArguments()[0]).getCallback().run(); + return null; + } + }); + mSuggestionsList = buildDummySuggestionsList(10, "Suggestion"); } @@ -110,23 +118,24 @@ List<OmniboxSuggestion> list = new ArrayList<>(); for (int index = 0; index < count; ++index) { - OmniboxSuggestion suggestion = new OmniboxSuggestion( - OmniboxSuggestionType.SEARCH_SUGGEST, true /* isSearchType */, - 0 /* relevance */, 0 /* transition */, prefix + (index + 1), - null /* displayTextClassifications */, null /* description */, - null /* descriptionClassifications */, null /* answer */, - null /* fillIntoEdit */, null /* url */, null /* imageUrl */, - null /* imageDominantColor */, false /* isStarred */, false /* isDeletable */, - null /* postContentType */, null /* postData */); + OmniboxSuggestion suggestion = + new OmniboxSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST, + true /* isSearchType */, 0 /* relevance */, 0 /* transition */, + prefix + (index + 1), null /* displayTextClassifications */, + null /* description */, null /* descriptionClassifications */, + null /* answer */, null /* fillIntoEdit */, GURL.emptyGURL() /* url */, + GURL.emptyGURL() /* imageUrl */, null /* imageDominantColor */, + false /* isStarred */, false /* isDeletable */, + null /* postContentType */, null /* postData */); list.add(suggestion); } return list; } - @Test - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_showsAtLeast5Suggestions() { mMediator.onNativeInitialized(); @@ -139,9 +148,9 @@ Assert.assertTrue(mListModel.get(SuggestionListProperties.VISIBLE)); } - @Test - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_fillsInAvailableSpace() { mMediator.onNativeInitialized(); @@ -154,11 +163,9 @@ Assert.assertTrue(mListModel.get(SuggestionListProperties.VISIBLE)); } - @Test - @Features.DisableFeatures({ - ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, - ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP - }) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void updateSuggestionsList_notEffectiveWhenDisabled() { mMediator.onNativeInitialized(); @@ -171,9 +178,9 @@ Assert.assertTrue(mListModel.get(SuggestionListProperties.VISIBLE)); } - @Test - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_worksWithNullList() { mMediator.onNativeInitialized(); @@ -186,9 +193,9 @@ Assert.assertFalse(mListModel.get(SuggestionListProperties.VISIBLE)); } - @Test - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_worksWithEmptyList() { mMediator.onNativeInitialized(); @@ -201,9 +208,9 @@ Assert.assertFalse(mListModel.get(SuggestionListProperties.VISIBLE)); } - @Test - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_reusesExistingSuggestionsWhenHinted() { mMediator.onNativeInitialized(); @@ -235,7 +242,7 @@ Assert.assertTrue(mListModel.get(SuggestionListProperties.VISIBLE)); } - @Test + @CalledByNativeJavaTest public void setNewSuggestions_detectsSameSuggestions() { final List<OmniboxSuggestion> list1 = buildDummySuggestionsList(5, "Set A"); final List<OmniboxSuggestion> list2 = buildDummySuggestionsList(5, "Set A"); @@ -243,7 +250,7 @@ Assert.assertFalse(mMediator.setNewSuggestions(list2)); } - @Test + @CalledByNativeJavaTest public void setNewSuggestions_detectsDifferentLists() { final List<OmniboxSuggestion> list1 = buildDummySuggestionsList(5, "Set A"); final List<OmniboxSuggestion> list2 = buildDummySuggestionsList(5, "Set B"); @@ -251,7 +258,7 @@ Assert.assertTrue(mMediator.setNewSuggestions(list2)); } - @Test + @CalledByNativeJavaTest public void setNewSuggestions_detectsNewElements() { final List<OmniboxSuggestion> list1 = buildDummySuggestionsList(5, "Set A"); final List<OmniboxSuggestion> list2 = buildDummySuggestionsList(6, "Set A"); @@ -259,7 +266,7 @@ Assert.assertTrue(mMediator.setNewSuggestions(list2)); } - @Test + @CalledByNativeJavaTest public void setNewSuggestions_detectsNoDifferenceWhenSuppliedEmptyLists() { final List<OmniboxSuggestion> list1 = new ArrayList<>(); final List<OmniboxSuggestion> list2 = new ArrayList<>(); @@ -267,7 +274,7 @@ Assert.assertFalse(mMediator.setNewSuggestions(list2)); } - @Test + @CalledByNativeJavaTest public void setNewSuggestions_detectsDifferenceWhenWorkingWithEmptyLists() { final List<OmniboxSuggestion> list1 = buildDummySuggestionsList(5, "Set"); final List<OmniboxSuggestion> list2 = new ArrayList<>(); @@ -278,9 +285,9 @@ Assert.assertTrue(mMediator.setNewSuggestions(list1)); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_defersKeyboardPopupWhenHaveLotsOfSuggestionsToShow() { mMediator.onNativeInitialized(); mMediator.signalPendingKeyboardShowDecision(); @@ -289,9 +296,9 @@ verify(mAutocompleteDelegate, never()).setKeyboardVisibility(eq(true)); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_showsKeyboardWhenHaveFewSuggestionsToShow() { mMediator.onNativeInitialized(); mMediator.signalPendingKeyboardShowDecision(); @@ -301,9 +308,9 @@ verify(mAutocompleteDelegate, never()).setKeyboardVisibility(eq(false)); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_doesNotShowKeyboardAfterReceivingSubsequentSuggestionLists() { mMediator.onNativeInitialized(); mMediator.signalPendingKeyboardShowDecision(); @@ -313,9 +320,9 @@ verify(mAutocompleteDelegate, never()).setKeyboardVisibility(eq(true)); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_hidesKeyboardOnScrollWithLotsOfSuggestions() { // It is quite important that we hide keyboard every time the user initiates scroll. // The reason for this is that the keyboard could be requested by the user when they press @@ -333,9 +340,9 @@ verify(mAutocompleteDelegate, never()).setKeyboardVisibility(eq(true)); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) - @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT) + @NativeJavaTestFeatures.Enable(ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP) public void updateSuggestionsList_retainsKeyboardOnScrollWithFewSuggestions() { mMediator.onNativeInitialized(); mMediator.signalPendingKeyboardShowDecision(); @@ -351,8 +358,8 @@ verify(mAutocompleteDelegate, never()).setKeyboardVisibility(eq(false)); } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void onTextChanged_emptyTextTriggersZeroSuggest() { when(mAutocompleteDelegate.isUrlBarFocused()).thenReturn(true); @@ -376,8 +383,8 @@ .startZeroSuggest(profile, "", url, pageClassification, title); } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void onTextChanged_nonEmptyTextTriggersSuggestions() { Profile profile = Mockito.mock(Profile.class); @@ -394,13 +401,11 @@ mMediator.onNativeInitialized(); mMediator.onTextChanged("test", "testing"); - ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); - verify(mAutocompleteController).start(profile, url, pageClassification, "test", 4, false); } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void onTextChanged_cancelsPendingRequests() { Profile profile = Mockito.mock(Profile.class); @@ -418,14 +423,12 @@ mMediator.onNativeInitialized(); mMediator.onTextChanged("test", "testing"); mMediator.onTextChanged("nottest", "nottesting"); - ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); - verify(mAutocompleteController) .start(profile, url, pageClassification, "nottest", 4, false); } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void onSuggestionsReceived_sendsOnSuggestionsChanged() { mMediator.onNativeInitialized(); @@ -437,8 +440,8 @@ verifyNoMoreInteractions(mAutocompleteDelegate); } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void setLayoutDirection_beforeInitialization() { mMediator.setLayoutDirection(View.LAYOUT_DIRECTION_RTL); @@ -453,8 +456,8 @@ } } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void setLayoutDirection_afterInitialization() { mMediator.setNewSuggestions(mSuggestionsList); @@ -478,8 +481,8 @@ } } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void onUrlFocusChange_triggersZeroSuggest_nativeInitialized() { when(mAutocompleteDelegate.isUrlBarFocused()).thenReturn(true); @@ -503,8 +506,8 @@ .startZeroSuggest(profile, url, url, pageClassification, title); } - @Test - @Features.DisableFeatures({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable({ChromeFeatureList.OMNIBOX_ADAPTIVE_SUGGESTIONS_COUNT, ChromeFeatureList.OMNIBOX_DEFERRED_KEYBOARD_POPUP}) public void onUrlFocusChange_triggersZeroSuggest_nativeNotInitialized() { when(mAutocompleteDelegate.isUrlBarFocused()).thenReturn(true); @@ -527,7 +530,6 @@ // Initialize native and ensure zero suggest is triggered. mMediator.onNativeInitialized(); - ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); verify(mAutocompleteController) .startZeroSuggest(profile, "", url, pageClassification, title); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java similarity index 84% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java index c9b7c2b..40414b8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionUnitTest.java
@@ -6,17 +6,12 @@ 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.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; -import org.chromium.testing.local.LocalRobolectricTestRunner; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.Arrays; @@ -25,13 +20,9 @@ /** * Unit tests for {@link OmniboxSuggestion}. */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) public class OmniboxSuggestionUnitTest { - @Before - public void setUp() { - ContextUtils.initApplicationContextForTests(ApplicationProvider.getApplicationContext()); - } + @CalledByNative + private OmniboxSuggestionUnitTest() {} /** * Compare two cached {@link OmniboxSuggestion} to see if they are same. Only comparing cached @@ -45,7 +36,7 @@ return suggestion1.getType() == suggestion2.getType() && TextUtils.equals(suggestion1.getDisplayText(), suggestion2.getDisplayText()) && TextUtils.equals(suggestion1.getDescription(), suggestion2.getDescription()) - && TextUtils.equals(suggestion1.getUrl(), suggestion2.getUrl()) + && suggestion1.getUrl().equals(suggestion2.getUrl()) && suggestion1.isUrlSuggestion() == suggestion2.isUrlSuggestion() && suggestion1.isStarred() == suggestion2.isStarred() && suggestion1.isDeletable() == suggestion2.isDeletable() @@ -90,9 +81,9 @@ 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 */, + null /* fillIntoEdit */, new GURL("dummy url" + (index + 1)) /* url */, + GURL.emptyGURL() /* 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); @@ -101,7 +92,7 @@ return list; } - @Test + @CalledByNativeJavaTest public void setNewSuggestions_cachedSuggestionsWithPostdataBeforeAndAfterAreSame() { List<OmniboxSuggestion> list1 = buildDummySuggestionsList(2, true); OmniboxSuggestion.cacheOmniboxSuggestionListForZeroSuggest(list1); @@ -110,7 +101,7 @@ Assert.assertTrue(isOmniboxSuggestionListMatch(list1, list2)); } - @Test + @CalledByNativeJavaTest public void setNewSuggestions_cachedSuggestionsWithoutPostdataBeforeAndAfterAreSame() { List<OmniboxSuggestion> list1 = buildDummySuggestionsList(2, false); OmniboxSuggestion.cacheOmniboxSuggestionListForZeroSuggest(list1);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java similarity index 92% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java index 20b50d4..671ed2d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/answer/AnswerSuggestionProcessorUnitTest.java
@@ -12,23 +12,21 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.Activity; import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.text.Spannable; import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; import org.chromium.base.Callback; +import org.chromium.base.ContextUtils; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.chrome.R; import org.chromium.chrome.browser.image_fetcher.ImageFetcher; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; @@ -43,18 +41,16 @@ import org.chromium.components.omnibox.SuggestionAnswer; import org.chromium.components.omnibox.SuggestionAnswer.ImageLine; import org.chromium.components.omnibox.SuggestionAnswer.TextField; -import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.modelutil.PropertyModel.WritableIntPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; +import org.chromium.url.GURL; import java.util.Arrays; /** * Tests for {@link AnswerSuggestionProcessor}. */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) public class AnswerSuggestionProcessorUnitTest { private static final @AnswerType int ANSWER_TYPES[] = {AnswerType.DICTIONARY, AnswerType.FINANCE, AnswerType.KNOWLEDGE_GRAPH, AnswerType.SPORTS, AnswerType.SUNRISE, @@ -69,10 +65,7 @@ @Mock ImageFetcher mImageFetcher; - @Mock - Bitmap mFakeBitmap; - - private Activity mActivity; + private Bitmap mBitmap; private AnswerSuggestionProcessor mProcessor; /** @@ -143,8 +136,8 @@ /* isSearchType */ true, /* relevance */ 0, /* transition */ 0, displayText, /* displayTextClassifications */ null, /* description */ null, /* descriptionClassifications */ null, - /* suggestionAnswer */ null, /* fillIntoEdit */ "", /* url */ "", - /* imageUrl */ "", /* imageDominantColor */ "", + /* suggestionAnswer */ null, /* fillIntoEdit */ "", /* url */ GURL.emptyGURL(), + /* imageUrl */ GURL.emptyGURL(), /* imageDominantColor */ "", /* isStarred */ false, /* isDeletable */ false, /* postContentType */ null, /* postData */ null); PropertyModel model = mProcessor.createModelForSuggestion(suggestion); @@ -162,7 +155,7 @@ /* isSearchType */ true, /* relevance */ 0, /* transition */ 0, /* displayText */ null, /* displayTextClassifications */ null, /* description */ null, /* descriptionClassifications */ null, answer, - /* fillIntoEdit */ "", /* url */ "", /* imageUrl */ "", + /* fillIntoEdit */ "", /* url */ GURL.emptyGURL(), /* imageUrl */ GURL.emptyGURL(), /* imageDominantColor */ "", /* isStarred */ false, /* isDeletable */ false, /* postContentType */ null, /* postData */ null); @@ -177,13 +170,16 @@ /* additionalText */ null, /* statusText */ null, url); } - @Before + @CalledByNative + private AnswerSuggestionProcessorUnitTest() {} + + @CalledByNative public void setUp() { MockitoAnnotations.initMocks(this); - mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + mBitmap = Bitmap.createBitmap(1, 1, Config.ALPHA_8); - mProcessor = new AnswerSuggestionProcessor( - mActivity, mSuggestionHost, mUrlStateProvider, () -> mImageFetcher); + mProcessor = new AnswerSuggestionProcessor(ContextUtils.getApplicationContext(), + mSuggestionHost, mUrlStateProvider, () -> mImageFetcher); } /** Populate model for associated suggestion. */ @@ -197,7 +193,7 @@ when(mUrlStateProvider.getTextWithoutAutocomplete()).thenReturn(null); } - @Test + @CalledByNativeJavaTest public void regularAnswer_order() { final SuggestionTestHelper suggHelper = createAnswerSuggestion(AnswerType.KNOWLEDGE_GRAPH, "Query", 1, "Answer", 1, null); @@ -209,7 +205,7 @@ suggHelper.verifyLine2("Query", 1, "Answer"); } - @Test + @CalledByNativeJavaTest public void dictionaryAnswer_order() { final SuggestionTestHelper suggHelper = createAnswerSuggestion(AnswerType.DICTIONARY, "Query", 1, "Answer", 1, null); @@ -220,7 +216,7 @@ suggHelper.verifyLine2("Answer", 1, "Answer"); } - @Test + @CalledByNativeJavaTest public void calculationAnswer_order() { final SuggestionTestHelper suggHelper = createCalculationSuggestion("12345", "123 + 45"); processSuggestion(suggHelper); @@ -229,7 +225,7 @@ suggHelper.verifyLine2("12345", 1, null); } - @Test + @CalledByNativeJavaTest public void regularAnswer_shortMultiline() { final SuggestionTestHelper suggHelper = createAnswerSuggestion(AnswerType.KNOWLEDGE_GRAPH, "", 1, "", 3, null); @@ -239,7 +235,7 @@ suggHelper.verifyLine2("", 1, ""); } - @Test + @CalledByNativeJavaTest public void dictionaryAnswer_shortMultiline() { final SuggestionTestHelper suggHelper = createAnswerSuggestion(AnswerType.DICTIONARY, "", 1, "", 3, null); @@ -251,7 +247,7 @@ // Check that multiline answers that span across more than 3 lines - are reduced to 3 lines. // Check that multiline titles are truncated to a single line. - @Test + @CalledByNativeJavaTest public void regularAnswer_truncatedMultiline() { final SuggestionTestHelper suggHelper = createAnswerSuggestion(AnswerType.KNOWLEDGE_GRAPH, "", 3, "", 10, null); @@ -261,7 +257,7 @@ suggHelper.verifyLine2("", 1, ""); } - @Test + @CalledByNativeJavaTest public void dictionaryAnswer_truncatedMultiline() { final SuggestionTestHelper suggHelper = createAnswerSuggestion(AnswerType.DICTIONARY, "", 3, "", 10, null); @@ -272,7 +268,7 @@ } // Image fetching and icon association tests. - @Test + @CalledByNativeJavaTest public void answerImage_fallbackIcons() { for (@AnswerType int type : ANSWER_TYPES) { SuggestionTestHelper suggHelper = createAnswerSuggestion(type, "", 1, "", 1, null); @@ -282,7 +278,7 @@ } } - @Test + @CalledByNativeJavaTest public void answerImage_iconAssociation() { SuggestionTestHelper suggHelper = createAnswerSuggestion(AnswerType.DICTIONARY, "", 1, "", 1, null); @@ -326,7 +322,7 @@ mProcessor.getSuggestionIcon(suggHelper.mSuggestion)); } - @Test + @CalledByNativeJavaTest public void answerImage_repeatedUrlsAreFetchedOnlyOnce() { final String url1 = "http://site1.com"; final String url2 = "http://site2.com"; @@ -349,7 +345,7 @@ verify(mImageFetcher, times(2)).fetchImage(anyString(), anyString(), any()); } - @Test + @CalledByNativeJavaTest public void answerImage_bitmapReplacesIconForAllSuggestionsWithSameUrl() { final String url = "http://site.com"; final ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); @@ -369,7 +365,7 @@ final Drawable icon1 = sugg1.getIcon(); final Drawable icon2 = sugg2.getIcon(); final Drawable icon3 = sugg3.getIcon(); - callback.getValue().onResult(mFakeBitmap); + callback.getValue().onResult(mBitmap); final Drawable newIcon1 = sugg1.getIcon(); final Drawable newIcon2 = sugg2.getIcon(); final Drawable newIcon3 = sugg3.getIcon(); @@ -382,12 +378,12 @@ Assert.assertThat(newIcon2, instanceOf(BitmapDrawable.class)); Assert.assertThat(newIcon3, instanceOf(BitmapDrawable.class)); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) newIcon1).getBitmap()); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) newIcon2).getBitmap()); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) newIcon3).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) newIcon1).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) newIcon2).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) newIcon3).getBitmap()); } - @Test + @CalledByNativeJavaTest public void answerImage_failedBitmapFetchDoesNotClearIcons() { final String url = "http://site.com"; final ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); @@ -405,7 +401,7 @@ Assert.assertEquals(icon, newIcon); } - @Test + @CalledByNativeJavaTest public void answerImage_noImageFetchWhenFetcherIsUnavailable() { final String url = "http://site.com"; mImageFetcher = null; @@ -415,7 +411,7 @@ Assert.assertNotNull(suggHelper.getIcon()); } - @Test + @CalledByNativeJavaTest public void answerImage_associatedModelsAreErasedFromPendingListAfterImageFetch() { ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); final String url = "http://site1.com"; @@ -435,7 +431,7 @@ // Invoke callback twice. If models were not erased, these should be updated. callback.getValue().onResult(null); - callback.getValue().onResult(mFakeBitmap); + callback.getValue().onResult(mBitmap); final Drawable newIcon1 = sugg1.getIcon(); final Drawable newIcon2 = sugg2.getIcon();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java similarity index 78% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java index ffca8bb..cdf6d7a 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionProcessorTest.java
@@ -8,37 +8,33 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.verify; -import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; import android.graphics.drawable.BitmapDrawable; import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; +import org.chromium.base.ContextUtils; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionHost; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge.LargeIconCallback; -import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.util.ArrayList; /** * Tests for {@link BaseSuggestionViewProcessor}. */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) public class BaseSuggestionProcessorTest { private class TestBaseSuggestionProcessor extends BaseSuggestionViewProcessor { private final Context mContext; @@ -71,8 +67,7 @@ public void populateModel(OmniboxSuggestion suggestion, PropertyModel model, int position) { super.populateModel(suggestion, model, position); setSuggestionDrawableState(model, - SuggestionDrawableState.Builder.forBitmap(mContext, mFakeDefaultBitmap) - .build()); + SuggestionDrawableState.Builder.forBitmap(mContext, mDefaultBitmap).build()); fetchSuggestionFavicon(model, suggestion.getUrl(), mLargeIconBridge, mRunable); } } @@ -83,67 +78,67 @@ LargeIconBridge mIconBridge; @Mock Runnable mRunnable; - @Mock - Bitmap mFakeBitmap; - @Mock - Bitmap mFakeDefaultBitmap; - private Activity mActivity; private TestBaseSuggestionProcessor mProcessor; private OmniboxSuggestion mSuggestion; private PropertyModel mModel; + private Bitmap mBitmap; + private Bitmap mDefaultBitmap; - @Before + @CalledByNative + private BaseSuggestionProcessorTest() {} + + @CalledByNative public void setUp() { MockitoAnnotations.initMocks(this); - mActivity = Robolectric.buildActivity(Activity.class).setup().get(); - mProcessor = - new TestBaseSuggestionProcessor(mActivity, mSuggestionHost, mIconBridge, mRunnable); + mBitmap = Bitmap.createBitmap(1, 1, Config.ALPHA_8); + mProcessor = new TestBaseSuggestionProcessor( + ContextUtils.getApplicationContext(), mSuggestionHost, mIconBridge, mRunnable); } /** * Create Suggestion for test. */ - private void createSuggestion(int type, String url) { + private void createSuggestion(int type, GURL url) { mSuggestion = new OmniboxSuggestion(type, /* isSearchType */ false, /* relevance */ 0, /* transition */ 0, "title", /* displayTextClassifications */ new ArrayList<>(), "description", /* descriptionClassifications */ new ArrayList<>(), /* suggestionAnswer */ null, /* fillIntoEdit */ null, url, - /* imageUrl */ "", /* imageDominantColor */ "", false, + /* imageUrl */ GURL.emptyGURL(), /* imageDominantColor */ "", false, /* isDeletable */ false, /* postContentType */ null, /* postData */ null); mModel = mProcessor.createModelForSuggestion(mSuggestion); mProcessor.populateModel(mSuggestion, mModel, 0); } - @Test + @CalledByNativeJavaTest public void suggestionFavicons_showFaviconWhenAvailable() { final ArgumentCaptor<LargeIconCallback> callback = ArgumentCaptor.forClass(LargeIconCallback.class); - final String url = "http://url"; + final GURL url = new GURL("http://url"); createSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, url); SuggestionDrawableState icon1 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon1); - verify(mIconBridge).getLargeIconForStringUrl(eq(url), anyInt(), callback.capture()); - callback.getValue().onLargeIconAvailable(mFakeBitmap, 0, false, 0); + verify(mIconBridge).getLargeIconForUrl(eq(url), anyInt(), callback.capture()); + callback.getValue().onLargeIconAvailable(mBitmap, 0, false, 0); SuggestionDrawableState icon2 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon2); Assert.assertNotEquals(icon1, icon2); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) icon2.drawable).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) icon2.drawable).getBitmap()); } - @Test + @CalledByNativeJavaTest public void suggestionFavicons_doNotReplaceFallbackIconWhenNoFaviconIsAvailable() { final ArgumentCaptor<LargeIconCallback> callback = ArgumentCaptor.forClass(LargeIconCallback.class); - final String url = "http://url"; + final GURL url = new GURL("http://url"); createSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, url); SuggestionDrawableState icon1 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon1); - verify(mIconBridge).getLargeIconForStringUrl(eq(url), anyInt(), callback.capture()); + verify(mIconBridge).getLargeIconForUrl(eq(url), anyInt(), callback.capture()); callback.getValue().onLargeIconAvailable(null, 0, false, 0); SuggestionDrawableState icon2 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon2);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorUnitTest.java similarity index 86% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorUnitTest.java index 23bd2f3d..6638bea 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorUnitTest.java
@@ -9,25 +9,22 @@ import static org.mockito.Mockito.eq; import static org.mockito.Mockito.verify; -import android.app.Activity; import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; import android.graphics.drawable.BitmapDrawable; import androidx.annotation.IntDef; import androidx.collection.ArrayMap; 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.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; +import org.chromium.base.ContextUtils; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; +import org.chromium.base.annotations.NativeJavaTestFeatures; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; @@ -37,9 +34,8 @@ import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewProperties.SuggestionIcon; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge.LargeIconCallback; -import org.chromium.chrome.test.util.browser.Features; -import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -48,9 +44,7 @@ /** * Tests for {@link BasicSuggestionProcessor}. */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public class BasicSuggestionProcessorTest { +public class BasicSuggestionProcessorUnitTest { @IntDef({SuggestionKind.URL, SuggestionKind.SEARCH, SuggestionKind.BOOKMARK}) @Retention(RetentionPolicy.SOURCE) public @interface SuggestionKind { @@ -99,30 +93,28 @@ } }; - @Rule - public TestRule mFeatureProcessor = new Features.JUnitProcessor(); - @Mock SuggestionHost mSuggestionHost; @Mock LargeIconBridge mIconBridge; @Mock UrlBarEditingTextStateProvider mUrlBarText; - @Mock - Bitmap mFakeBitmap; - private Activity mActivity; + private Bitmap mBitmap; private BasicSuggestionProcessor mProcessor; private OmniboxSuggestion mSuggestion; private PropertyModel mModel; - @Before + @CalledByNative + private BasicSuggestionProcessorUnitTest() {} + + @CalledByNative public void setUp() { MockitoAnnotations.initMocks(this); - mActivity = Robolectric.buildActivity(Activity.class).setup().get(); doReturn("").when(mUrlBarText).getTextWithoutAutocomplete(); - mProcessor = new BasicSuggestionProcessor( - mActivity, mSuggestionHost, mUrlBarText, () -> mIconBridge); + mBitmap = Bitmap.createBitmap(1, 1, Config.ALPHA_8); + mProcessor = new BasicSuggestionProcessor(ContextUtils.getApplicationContext(), + mSuggestionHost, mUrlBarText, () -> mIconBridge); } /** @@ -130,30 +122,30 @@ * Do not use directly; use helper methods to create specific suggestion type instead. */ private void createSuggestion(int type, boolean isSearch, boolean isBookmark, String title, - String description, String url) { + String description, GURL url) { mSuggestion = new OmniboxSuggestion(type, /* isSearchType */ isSearch, /* relevance */ 0, /* transition */ 0, title, /* displayTextClassifications */ new ArrayList<>(), description, /* descriptionClassifications */ new ArrayList<>(), /* suggestionAnswer */ null, /* fillIntoEdit */ null, url, - /* imageUrl */ "", /* imageDominantColor */ "", isBookmark, + /* imageUrl */ GURL.emptyGURL(), /* imageDominantColor */ "", isBookmark, /* isDeletable */ false, /* postContentType */ null, /* postData */ null); mModel = mProcessor.createModelForSuggestion(mSuggestion); mProcessor.populateModel(mSuggestion, mModel, 0); } /** Create bookmark suggestion for test. */ - private void createBookmarkSuggestion(int type, String title, String description, String url) { + private void createBookmarkSuggestion(int type, String title, String description, GURL url) { createSuggestion(type, false, true, title, description, url); } /** Create search suggestion for test. */ private void createSearchSuggestion(int type, String title, String description) { - createSuggestion(type, true, false, title, description, null); + createSuggestion(type, true, false, title, description, GURL.emptyGURL()); } /** Create URL suggestion for test. */ - private void createUrlSuggestion(int type, String title, String description, String url) { + private void createUrlSuggestion(int type, String title, String description, GURL url) { createSuggestion(type, false, false, title, description, url); } @@ -166,8 +158,8 @@ expectedIcon, actualIcon); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) public void getSuggestionIconTypeForSearch_Default() { int[][] testCases = { {OmniboxSuggestionType.URL_WHAT_YOU_TYPED, SuggestionIcon.MAGNIFIER}, @@ -198,8 +190,8 @@ } } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) public void getSuggestionIconTypeForUrl_Default() { int[][] testCases = { {OmniboxSuggestionType.URL_WHAT_YOU_TYPED, SuggestionIcon.GLOBE}, @@ -224,14 +216,14 @@ mProcessor.onNativeInitialized(); for (int[] testCase : testCases) { - createUrlSuggestion(testCase[0], "", "", null); + createUrlSuggestion(testCase[0], "", "", GURL.emptyGURL()); Assert.assertFalse(mModel.get(SuggestionViewProperties.IS_SEARCH_SUGGESTION)); assertSuggestionTypeAndIcon(testCase[0], testCase[1]); } } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) public void getSuggestionIconTypeForBookmarks_Default() { int[][] testCases = { {OmniboxSuggestionType.URL_WHAT_YOU_TYPED, SuggestionIcon.BOOKMARK}, @@ -256,24 +248,24 @@ mProcessor.onNativeInitialized(); for (int[] testCase : testCases) { - createBookmarkSuggestion(testCase[0], "", "", null); + createBookmarkSuggestion(testCase[0], "", "", GURL.emptyGURL()); Assert.assertFalse(mModel.get(SuggestionViewProperties.IS_SEARCH_SUGGESTION)); assertSuggestionTypeAndIcon(testCase[0], testCase[1]); } } - @Test + @CalledByNativeJavaTest public void refineIconNotShownForWhatYouTypedSuggestions() { final String typed = "Typed content"; doReturn(typed).when(mUrlBarText).getTextWithoutAutocomplete(); createSearchSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, typed, ""); Assert.assertFalse(mProcessor.canRefine(mSuggestion)); - createUrlSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, typed, "", null); + createUrlSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, typed, "", GURL.emptyGURL()); Assert.assertFalse(mProcessor.canRefine(mSuggestion)); } - @Test + @CalledByNativeJavaTest public void refineIconShownForRefineSuggestions() { final String typed = "Typed conte"; final String refined = "Typed content"; @@ -281,42 +273,43 @@ createSearchSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, refined, ""); Assert.assertTrue(mProcessor.canRefine(mSuggestion)); - createUrlSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, refined, "", null); + createUrlSuggestion( + OmniboxSuggestionType.URL_WHAT_YOU_TYPED, refined, "", GURL.emptyGURL()); Assert.assertTrue(mProcessor.canRefine(mSuggestion)); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) public void suggestionFavicons_showFaviconWhenAvailable() { final ArgumentCaptor<LargeIconCallback> callback = ArgumentCaptor.forClass(LargeIconCallback.class); - final String url = "http://url"; + final GURL url = new GURL("http://url.com"); mProcessor.onNativeInitialized(); createUrlSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, "", "", url); SuggestionDrawableState icon1 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon1); - verify(mIconBridge).getLargeIconForStringUrl(eq(url), anyInt(), callback.capture()); - callback.getValue().onLargeIconAvailable(mFakeBitmap, 0, false, 0); + verify(mIconBridge).getLargeIconForUrl(eq(url), anyInt(), callback.capture()); + callback.getValue().onLargeIconAvailable(mBitmap, 0, false, 0); SuggestionDrawableState icon2 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon2); Assert.assertNotEquals(icon1, icon2); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) icon2.drawable).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) icon2.drawable).getBitmap()); } - @Test - @Features.DisableFeatures(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) + @CalledByNativeJavaTest + @NativeJavaTestFeatures.Disable(ChromeFeatureList.OMNIBOX_COMPACT_SUGGESTIONS) public void suggestionFavicons_doNotReplaceFallbackIconWhenNoFaviconIsAvailable() { final ArgumentCaptor<LargeIconCallback> callback = ArgumentCaptor.forClass(LargeIconCallback.class); - final String url = "http://url"; + final GURL url = new GURL("http://url.com"); mProcessor.onNativeInitialized(); createUrlSuggestion(OmniboxSuggestionType.URL_WHAT_YOU_TYPED, "", "", url); SuggestionDrawableState icon1 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon1); - verify(mIconBridge).getLargeIconForStringUrl(eq(url), anyInt(), callback.capture()); + verify(mIconBridge).getLargeIconForUrl(eq(url), anyInt(), callback.capture()); callback.getValue().onLargeIconAvailable(null, 0, false, 0); SuggestionDrawableState icon2 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon2);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java similarity index 68% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java index 789c90bd..e173305 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorTest.java
@@ -7,25 +7,23 @@ import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import android.app.Activity; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; import android.graphics.drawable.BitmapDrawable; -import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; import android.widget.TextView; import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; +import org.chromium.base.ContextUtils; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.chrome.R; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestion; @@ -37,62 +35,67 @@ import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionViewViewBinder; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.chrome.browser.ui.favicon.LargeIconBridge.LargeIconCallback; -import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; import java.util.ArrayList; /** * Tests for {@link ClipboardSuggestionProcessor}. */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) public class ClipboardSuggestionProcessorTest { - private static final String TEST_URL = "http://url"; - private static final String ARABIC_URL = "http://site.com/مرحبا/123"; - private static final String ARABIC_STRING = "مرحبامرحبامرحبا"; + private static final GURL TEST_URL = new GURL("http://url"); + private static final GURL ARABIC_URL = new GURL("http://site.com/مرحبا/123"); @Mock SuggestionHost mSuggestionHost; @Mock LargeIconBridge mIconBridge; @Mock - Bitmap mFakeBitmap; - @Mock - View mRootView; - @Mock - TextView mTitleTextView; - @Mock - TextView mContentTextView; - @Mock Resources mResources; - private Activity mActivity; private ClipboardSuggestionProcessor mProcessor; private OmniboxSuggestion mSuggestion; private PropertyModel mModel; + private Bitmap mBitmap; + private ViewGroup mRootView; + private TextView mTitleTextView; + private TextView mContentTextView; + private int mLastSetTextDirection = -1; - @Before + @CalledByNative + private ClipboardSuggestionProcessorTest() {} + + @CalledByNative public void setUp() { MockitoAnnotations.initMocks(this); - mActivity = Robolectric.buildActivity(Activity.class).setup().get(); - mProcessor = - new ClipboardSuggestionProcessor(mActivity, mSuggestionHost, () -> mIconBridge); - when(mRootView.getContext()).thenReturn(mActivity); - when(mRootView.findViewById(R.id.line_1)).thenReturn(mTitleTextView); - when(mRootView.findViewById(R.id.line_2)).thenReturn(mContentTextView); - when(mRootView.getResources()).thenReturn(mResources); + mBitmap = Bitmap.createBitmap(1, 1, Config.ALPHA_8); + mProcessor = new ClipboardSuggestionProcessor( + ContextUtils.getApplicationContext(), mSuggestionHost, () -> mIconBridge); + mRootView = new LinearLayout(ContextUtils.getApplicationContext()); + mTitleTextView = new TextView(ContextUtils.getApplicationContext()); + mTitleTextView.setId(R.id.line_1); + mContentTextView = new TextView(ContextUtils.getApplicationContext()) { + @Override + public void setTextDirection(int textDirection) { + super.setTextDirection(textDirection); + mLastSetTextDirection = textDirection; + } + }; + mContentTextView.setId(R.id.line_2); + mRootView.addView(mTitleTextView); + mRootView.addView(mContentTextView); } /** Create clipboard suggestion for test. */ - private void createClipboardSuggestion(int type, String url) { + private void createClipboardSuggestion(int type, GURL url) { mSuggestion = new OmniboxSuggestion(type, /* isSearchType */ type != OmniboxSuggestionType.CLIPBOARD_URL, /* relevance */ 0, /* transition */ 0, "test title", /* displayTextClassifications */ new ArrayList<>(), "test description", /* descriptionClassifications */ new ArrayList<>(), /* suggestionAnswer */ null, /* fillIntoEdit */ null, url, - /* imageUrl */ "", /* imageDominantColor */ "", false, + /* imageUrl */ GURL.emptyGURL(), /* imageDominantColor */ "", false, /* isDeletable */ false, /* postContentType */ null, /* postData */ null); mModel = mProcessor.createModelForSuggestion(mSuggestion); mProcessor.populateModel(mSuggestion, mModel, 0); @@ -104,29 +107,29 @@ SuggestionViewViewBinder.bind(mModel, mRootView, SuggestionViewProperties.TEXT_LINE_2_TEXT); } - @Test + @CalledByNativeJavaTest public void clipboardSugestion_identifyUrlSuggestion() { - createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_URL, ""); + createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_URL, GURL.emptyGURL()); Assert.assertFalse(mModel.get(SuggestionViewProperties.IS_SEARCH_SUGGESTION)); - createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_TEXT, ""); + createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_TEXT, GURL.emptyGURL()); Assert.assertTrue(mModel.get(SuggestionViewProperties.IS_SEARCH_SUGGESTION)); - createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_IMAGE, ""); + createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_IMAGE, GURL.emptyGURL()); Assert.assertTrue(mModel.get(SuggestionViewProperties.IS_SEARCH_SUGGESTION)); } - @Test + @CalledByNativeJavaTest public void clipboardSuggestion_doesNotRefine() { - createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_URL, ""); + createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_URL, GURL.emptyGURL()); Assert.assertFalse(mProcessor.canRefine(mSuggestion)); - createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_TEXT, ""); + createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_TEXT, GURL.emptyGURL()); Assert.assertFalse(mProcessor.canRefine(mSuggestion)); - createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_IMAGE, ""); + createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_IMAGE, GURL.emptyGURL()); Assert.assertFalse(mProcessor.canRefine(mSuggestion)); } - @Test + @CalledByNativeJavaTest public void clipboardSuggestion_showsFaviconWhenAvailable() { final ArgumentCaptor<LargeIconCallback> callback = ArgumentCaptor.forClass(LargeIconCallback.class); @@ -134,16 +137,16 @@ SuggestionDrawableState icon1 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon1); - verify(mIconBridge).getLargeIconForStringUrl(eq(TEST_URL), anyInt(), callback.capture()); - callback.getValue().onLargeIconAvailable(mFakeBitmap, 0, false, 0); + verify(mIconBridge).getLargeIconForUrl(eq(TEST_URL), anyInt(), callback.capture()); + callback.getValue().onLargeIconAvailable(mBitmap, 0, false, 0); SuggestionDrawableState icon2 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon2); Assert.assertNotEquals(icon1, icon2); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) icon2.drawable).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) icon2.drawable).getBitmap()); } - @Test + @CalledByNativeJavaTest public void clipboardSuggestion_showsFallbackIconWhenNoFaviconIsAvailable() { final ArgumentCaptor<LargeIconCallback> callback = ArgumentCaptor.forClass(LargeIconCallback.class); @@ -151,7 +154,7 @@ SuggestionDrawableState icon1 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon1); - verify(mIconBridge).getLargeIconForStringUrl(eq(TEST_URL), anyInt(), callback.capture()); + verify(mIconBridge).getLargeIconForUrl(eq(TEST_URL), anyInt(), callback.capture()); callback.getValue().onLargeIconAvailable(null, 0, false, 0); SuggestionDrawableState icon2 = mModel.get(BaseSuggestionViewProperties.ICON); Assert.assertNotNull(icon2); @@ -159,19 +162,19 @@ Assert.assertEquals(icon1, icon2); } - @Test + @CalledByNativeJavaTest public void clipobardSuggestion_urlAndTextDirection() { final ArgumentCaptor<LargeIconCallback> callback = ArgumentCaptor.forClass(LargeIconCallback.class); // URL createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_URL, ARABIC_URL); Assert.assertFalse(mModel.get(SuggestionViewProperties.IS_SEARCH_SUGGESTION)); - verify(mIconBridge).getLargeIconForStringUrl(eq(ARABIC_URL), anyInt(), callback.capture()); + verify(mIconBridge).getLargeIconForUrl(eq(ARABIC_URL), anyInt(), callback.capture()); callback.getValue().onLargeIconAvailable(null, 0, false, 0); - verify(mContentTextView).setTextDirection(eq(TextView.TEXT_DIRECTION_LTR)); + Assert.assertEquals(TextView.TEXT_DIRECTION_LTR, mLastSetTextDirection); // Text - createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_TEXT, ""); - verify(mContentTextView).setTextDirection(eq(TextView.TEXT_DIRECTION_INHERIT)); + createClipboardSuggestion(OmniboxSuggestionType.CLIPBOARD_TEXT, GURL.emptyGURL()); + Assert.assertEquals(TextView.TEXT_DIRECTION_INHERIT, mLastSetTextDirection); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java similarity index 79% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java index b1678db..f8927bc9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java
@@ -11,18 +11,14 @@ import android.content.Context; import android.content.res.Resources; -import android.support.test.filters.SmallTest; import android.view.View; import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.annotation.Config; -import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; @@ -34,22 +30,21 @@ import org.chromium.chrome.browser.ui.favicon.LargeIconBridge; import org.chromium.components.search_engines.TemplateUrlService; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; /** * Unit tests for the "edit url" omnibox suggestion. */ -@RunWith(BaseRobolectricTestRunner.class) -@Config(manifest = Config.NONE) -public final class EditUrlSuggestionTest { - private static final String TEST_URL = "http://www.example.com"; +public final class EditUrlSuggestionUnitTest { private static final String TEST_TITLE = "Test Page"; - - private static final String FOOBAR_SEARCH_URL = "http://www.example.com?q=foobar"; private static final String FOOBAR_SEARCH_TERMS = "foobar"; - - private static final String BARBAZ_SEARCH_URL = "http://www.example.com?q=barbaz"; private static final String BARBAZ_SEARCH_TERMS = "barbaz"; + private final GURL mTestUrl = new GURL("http://www.example.com"); + private final GURL mFoobarSearchUrl = + new GURL("http://www.example.com?q=" + FOOBAR_SEARCH_TERMS); + private final GURL mBarbazSearchUrl = + new GURL("http://www.example.com?q=" + BARBAZ_SEARCH_TERMS); private EditUrlSuggestionProcessor mProcessor; private PropertyModel mModel; @@ -95,14 +90,17 @@ @Mock private SuggestionViewDelegate mDelegate; - @Before + @CalledByNative + private EditUrlSuggestionUnitTest() {} + + @CalledByNative public void setUp() { MockitoAnnotations.initMocks(this); TemplateUrlServiceFactory.setInstanceForTesting(mTemplateUrlService); when(mContext.getResources()).thenReturn(mResources); - when(mTab.getUrlString()).thenReturn(TEST_URL); + when(mTab.getUrl()).thenReturn(mTestUrl); when(mTab.getTitle()).thenReturn(TEST_TITLE); when(mTab.isNativePage()).thenReturn(false); when(mTab.isIncognito()).thenReturn(false); @@ -111,10 +109,10 @@ when(mWhatYouTypedSuggestion.getType()) .thenReturn(OmniboxSuggestionType.URL_WHAT_YOU_TYPED); - when(mWhatYouTypedSuggestion.getUrl()).thenReturn(TEST_URL); + when(mWhatYouTypedSuggestion.getUrl()).thenReturn(mTestUrl); when(mSearchSuggestion.getType()).thenReturn(OmniboxSuggestionType.SEARCH_WHAT_YOU_TYPED); - when(mSearchSuggestion.getUrl()).thenReturn(FOOBAR_SEARCH_URL); + when(mSearchSuggestion.getUrl()).thenReturn(mFoobarSearchUrl); when(mSearchSuggestion.getFillIntoEdit()).thenReturn(FOOBAR_SEARCH_TERMS); when(mOtherSuggestion.getType()).thenReturn(OmniboxSuggestionType.SEARCH_HISTORY); @@ -131,8 +129,7 @@ } /** Test that the suggestion is triggered. */ - @Test - @SmallTest + @CalledByNativeJavaTest public void testSuggestionTriggered() { mProcessor.onUrlFocusChange(true); @@ -144,24 +141,22 @@ Assert.assertEquals("The model should have the title set.", TEST_TITLE, mModel.get(EditUrlSuggestionProperties.TITLE_TEXT)); - Assert.assertEquals("The model should have the URL set to the tab's URL", TEST_URL, - mModel.get(EditUrlSuggestionProperties.URL_TEXT)); + Assert.assertEquals("The model should have the URL set to the tab's URL", + mTestUrl.getSpec(), mModel.get(EditUrlSuggestionProperties.URL_TEXT)); } /** Test that the suggestion is not triggered if its url doesn't match the current page's. */ - @Test - @SmallTest + @CalledByNativeJavaTest public void testWhatYouTypedWrongUrl() { mProcessor.onUrlFocusChange(true); - when(mWhatYouTypedSuggestion.getUrl()).thenReturn(FOOBAR_SEARCH_URL); + when(mWhatYouTypedSuggestion.getUrl()).thenReturn(mFoobarSearchUrl); Assert.assertFalse("The processor should not handle the suggestion.", mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion)); } /** Test the edit button is pressed, the correct method in the URL bar delegate is triggered. */ - @Test - @SmallTest + @CalledByNativeJavaTest public void testEditButtonPress() { mProcessor.onUrlFocusChange(true); mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion); @@ -169,12 +164,11 @@ mModel.get(EditUrlSuggestionProperties.BUTTON_CLICK_LISTENER).onClick(mEditButton); - verify(mLocationBarDelegate).setOmniboxEditingText(TEST_URL); + verify(mLocationBarDelegate).setOmniboxEditingText(mTestUrl.getSpec()); } /** Test that when suggestion is tapped, it still navigates to the correct location. */ - @Test - @SmallTest + @CalledByNativeJavaTest public void testPressSuggestion() { mProcessor.onUrlFocusChange(true); mProcessor.doesProcessSuggestion(mWhatYouTypedSuggestion); @@ -185,19 +179,18 @@ verify(mDelegate).onSelection(); } - @Test - @SmallTest + @CalledByNativeJavaTest public void testSearchSuggestion() { - when(mTab.getUrlString()).thenReturn(FOOBAR_SEARCH_URL); + when(mTab.getUrl()).thenReturn(mFoobarSearchUrl); mProcessor.onUrlFocusChange(true); - when(mTemplateUrlService.getSearchQueryForUrl(FOOBAR_SEARCH_URL)) + when(mTemplateUrlService.getSearchQueryForUrl(mFoobarSearchUrl)) .thenReturn(FOOBAR_SEARCH_TERMS); - when(mTemplateUrlService.getSearchQueryForUrl(BARBAZ_SEARCH_URL)) + when(mTemplateUrlService.getSearchQueryForUrl(mBarbazSearchUrl)) .thenReturn(BARBAZ_SEARCH_TERMS); Assert.assertTrue(mProcessor.doesProcessSuggestion(mSearchSuggestion)); - when(mSearchSuggestion.getUrl()).thenReturn(BARBAZ_SEARCH_URL); + when(mSearchSuggestion.getUrl()).thenReturn(mBarbazSearchUrl); when(mSearchSuggestion.getFillIntoEdit()).thenReturn(BARBAZ_SEARCH_TERMS); Assert.assertFalse(mProcessor.doesProcessSuggestion(mSearchSuggestion));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java similarity index 80% rename from chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java rename to chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java index 950c72f..fd8ce94 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java +++ b/chrome/android/native_java_unittests/src/org/chromium/chrome/browser/omnibox/suggestions/entity/EntitySuggestionProcessorUnitTest.java
@@ -12,24 +12,22 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import android.app.Activity; import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.robolectric.Robolectric; -import org.robolectric.annotation.Config; import org.chromium.base.Callback; +import org.chromium.base.ContextUtils; +import org.chromium.base.annotations.CalledByNative; +import org.chromium.base.annotations.CalledByNativeJavaTest; import org.chromium.chrome.browser.image_fetcher.ImageFetcher; import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType; import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider; @@ -37,14 +35,12 @@ import org.chromium.chrome.browser.omnibox.suggestions.base.BaseSuggestionViewProperties; import org.chromium.chrome.browser.omnibox.suggestions.base.SuggestionDrawableState; import org.chromium.chrome.browser.omnibox.suggestions.basic.SuggestionHost; -import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.url.GURL; /** * Tests for {@link EntitySuggestionProcessor}. */ -@RunWith(LocalRobolectricTestRunner.class) -@Config(manifest = Config.NONE) public class EntitySuggestionProcessorUnitTest { // These values are used with UMA to report Omnibox.RichEntity.DecorationType histograms. // These values are INTENTIONALLY copied here to prevent accidental updates that may @@ -62,10 +58,7 @@ @Mock ImageFetcher mImageFetcher; - @Mock - Bitmap mFakeBitmap; - - private Activity mActivity; + private Bitmap mBitmap; private EntitySuggestionProcessor mProcessor; /** @@ -97,13 +90,14 @@ /** Create fake Entity suggestion. */ SuggestionTestHelper createSuggestion( - String subject, String description, String color, String url) { + String subject, String description, String color, GURL url) { OmniboxSuggestion suggestion = new OmniboxSuggestion(OmniboxSuggestionType.SEARCH_SUGGEST_ENTITY, /* isSearchType */ true, /* relevance */ 0, /* transition */ 0, subject, /* displayTextClassifications */ null, /* description */ description, /* descriptionClassifications */ null, - /* suggestionAnswer */ null, /* fillIntoEdit */ "", /* url */ "", + /* suggestionAnswer */ null, /* fillIntoEdit */ "", + /* url */ GURL.emptyGURL(), /* imageUrl */ url, /* imageDominantColor */ color, /* isStarred */ false, /* isDeletable */ false, /* postContentType */ null, /* postData */ null); @@ -116,17 +110,23 @@ mProcessor.populateModel(helper.mSuggestion, helper.mModel, 0); } - @Before + @CalledByNative + private EntitySuggestionProcessorUnitTest() {} + + @CalledByNative public void setUp() { MockitoAnnotations.initMocks(this); - mActivity = Robolectric.buildActivity(Activity.class).setup().get(); - mProcessor = new EntitySuggestionProcessor(mActivity, mSuggestionHost, () -> mImageFetcher); + mBitmap = Bitmap.createBitmap(1, 1, Config.ALPHA_8); + + mProcessor = new EntitySuggestionProcessor( + ContextUtils.getApplicationContext(), mSuggestionHost, () -> mImageFetcher); } - @Test + @CalledByNativeJavaTest public void contentTest_basicContent() { - SuggestionTestHelper suggHelper = createSuggestion("subject", "details", null, null); + SuggestionTestHelper suggHelper = + createSuggestion("subject", "details", null, GURL.emptyGURL()); processSuggestion(suggHelper); Assert.assertEquals( "subject", suggHelper.mModel.get(EntitySuggestionViewProperties.SUBJECT_TEXT)); @@ -135,9 +135,9 @@ suggHelper.verifyReportedType(DECORATION_TYPE_ICON); } - @Test + @CalledByNativeJavaTest public void decorationTest_noColorOrImage() { - SuggestionTestHelper suggHelper = createSuggestion("", "", null, null); + SuggestionTestHelper suggHelper = createSuggestion("", "", null, GURL.emptyGURL()); processSuggestion(suggHelper); Assert.assertNotNull(suggHelper.getIcon()); @@ -145,9 +145,9 @@ suggHelper.verifyReportedType(DECORATION_TYPE_ICON); } - @Test + @CalledByNativeJavaTest public void decorationTest_validHexColor() { - SuggestionTestHelper suggHelper = createSuggestion("", "", "#fedcba", null); + SuggestionTestHelper suggHelper = createSuggestion("", "", "#fedcba", GURL.emptyGURL()); processSuggestion(suggHelper); Assert.assertThat(suggHelper.getIcon(), instanceOf(ColorDrawable.class)); @@ -156,9 +156,9 @@ suggHelper.verifyReportedType(DECORATION_TYPE_COLOR); } - @Test + @CalledByNativeJavaTest public void decorationTest_validNamedColor() { - SuggestionTestHelper suggHelper = createSuggestion("", "", "red", null); + SuggestionTestHelper suggHelper = createSuggestion("", "", "red", GURL.emptyGURL()); processSuggestion(suggHelper); Assert.assertThat(suggHelper.getIcon(), instanceOf(ColorDrawable.class)); @@ -167,47 +167,47 @@ suggHelper.verifyReportedType(DECORATION_TYPE_COLOR); } - @Test + @CalledByNativeJavaTest public void decorationTest_invalidColor() { // Note, fallback is the bitmap drawable representing a search loupe. - SuggestionTestHelper suggHelper = createSuggestion("", "", "", null); + SuggestionTestHelper suggHelper = createSuggestion("", "", "", GURL.emptyGURL()); processSuggestion(suggHelper); Assert.assertThat(suggHelper.getIcon(), instanceOf(BitmapDrawable.class)); suggHelper.verifyReportedType(DECORATION_TYPE_ICON); - suggHelper = createSuggestion("", "", "#", null); + suggHelper = createSuggestion("", "", "#", GURL.emptyGURL()); processSuggestion(suggHelper); Assert.assertThat(suggHelper.getIcon(), instanceOf(BitmapDrawable.class)); suggHelper.verifyReportedType(DECORATION_TYPE_ICON); - suggHelper = createSuggestion("", "", "invalid", null); + suggHelper = createSuggestion("", "", "invalid", GURL.emptyGURL()); processSuggestion(suggHelper); Assert.assertThat(suggHelper.getIcon(), instanceOf(BitmapDrawable.class)); suggHelper.verifyReportedType(DECORATION_TYPE_ICON); } - @Test + @CalledByNativeJavaTest public void decorationTest_basicSuccessfulBitmapFetch() { - final String url = "http://site.com"; + final GURL url = new GURL("http://site.com"); final ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); SuggestionTestHelper suggHelper = createSuggestion("", "", "red", url); processSuggestion(suggHelper); verify(mImageFetcher) - .fetchImage(eq(url), anyString(), anyInt(), anyInt(), callback.capture()); + .fetchImage(eq(url.getSpec()), anyString(), anyInt(), anyInt(), callback.capture()); suggHelper.verifyReportedType(DECORATION_TYPE_COLOR); Assert.assertThat(suggHelper.getIcon(), instanceOf(ColorDrawable.class)); - callback.getValue().onResult(mFakeBitmap); + callback.getValue().onResult(mBitmap); Assert.assertThat(suggHelper.getIcon(), instanceOf(BitmapDrawable.class)); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) suggHelper.getIcon()).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) suggHelper.getIcon()).getBitmap()); suggHelper.verifyReportedType(DECORATION_TYPE_IMAGE); } - @Test + @CalledByNativeJavaTest public void decorationTest_repeatedUrlsAreFetchedOnlyOnce() { - final String url1 = "http://site1.com"; - final String url2 = "http://site2.com"; + final GURL url1 = new GURL("http://site1.com"); + final GURL url2 = new GURL("http://site2.com"); final SuggestionTestHelper sugg1 = createSuggestion("", "", "", url1); final SuggestionTestHelper sugg2 = createSuggestion("", "", "", url1); final SuggestionTestHelper sugg3 = createSuggestion("", "", "", url2); @@ -218,15 +218,17 @@ processSuggestion(sugg3); processSuggestion(sugg4); - verify(mImageFetcher).fetchImage(eq(url1), anyString(), anyInt(), anyInt(), any()); - verify(mImageFetcher).fetchImage(eq(url2), anyString(), anyInt(), anyInt(), any()); + verify(mImageFetcher) + .fetchImage(eq(url1.getSpec()), anyString(), anyInt(), anyInt(), any()); + verify(mImageFetcher) + .fetchImage(eq(url2.getSpec()), anyString(), anyInt(), anyInt(), any()); verify(mImageFetcher, times(2)) .fetchImage(anyString(), anyString(), anyInt(), anyInt(), any()); } - @Test + @CalledByNativeJavaTest public void decorationTest_bitmapReplacesIconForAllSuggestionsWithSameUrl() { - final String url = "http://site.com"; + final GURL url = new GURL("http://site.com"); final ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); final SuggestionTestHelper sugg1 = createSuggestion("", "", "", url); final SuggestionTestHelper sugg2 = createSuggestion("", "", "", url); @@ -237,7 +239,7 @@ processSuggestion(sugg3); verify(mImageFetcher) - .fetchImage(eq(url), anyString(), anyInt(), anyInt(), callback.capture()); + .fetchImage(eq(url.getSpec()), anyString(), anyInt(), anyInt(), callback.capture()); final Drawable icon1 = sugg1.getIcon(); final Drawable icon2 = sugg2.getIcon(); @@ -246,7 +248,7 @@ sugg2.verifyReportedType(DECORATION_TYPE_ICON); sugg3.verifyReportedType(DECORATION_TYPE_ICON); - callback.getValue().onResult(mFakeBitmap); + callback.getValue().onResult(mBitmap); final Drawable newIcon1 = sugg1.getIcon(); final Drawable newIcon2 = sugg2.getIcon(); final Drawable newIcon3 = sugg3.getIcon(); @@ -262,20 +264,20 @@ Assert.assertThat(newIcon2, instanceOf(BitmapDrawable.class)); Assert.assertThat(newIcon3, instanceOf(BitmapDrawable.class)); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) newIcon1).getBitmap()); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) newIcon2).getBitmap()); - Assert.assertEquals(mFakeBitmap, ((BitmapDrawable) newIcon3).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) newIcon1).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) newIcon2).getBitmap()); + Assert.assertEquals(mBitmap, ((BitmapDrawable) newIcon3).getBitmap()); } - @Test + @CalledByNativeJavaTest public void decorationTest_failedBitmapFetchDoesNotReplaceIcon() { - final String url = "http://site.com"; + final GURL url = new GURL("http://site.com"); final ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); final SuggestionTestHelper suggHelper = createSuggestion("", "", null, url); processSuggestion(suggHelper); verify(mImageFetcher) - .fetchImage(eq(url), anyString(), anyInt(), anyInt(), callback.capture()); + .fetchImage(eq(url.getSpec()), anyString(), anyInt(), anyInt(), callback.capture()); final Drawable oldIcon = suggHelper.getIcon(); callback.getValue().onResult(null); @@ -286,15 +288,15 @@ suggHelper.verifyReportedType(DECORATION_TYPE_ICON); } - @Test + @CalledByNativeJavaTest public void decorationTest_failedBitmapFetchDoesNotReplaceColor() { - final String url = "http://site.com"; + final GURL url = new GURL("http://site.com"); final ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); final SuggestionTestHelper suggHelper = createSuggestion("", "", "red", url); processSuggestion(suggHelper); verify(mImageFetcher) - .fetchImage(eq(url), anyString(), anyInt(), anyInt(), callback.capture()); + .fetchImage(eq(url.getSpec()), anyString(), anyInt(), anyInt(), callback.capture()); final Drawable oldIcon = suggHelper.getIcon(); callback.getValue().onResult(null); @@ -305,10 +307,10 @@ suggHelper.verifyReportedType(DECORATION_TYPE_COLOR); } - @Test + @CalledByNativeJavaTest public void decorationTest_updatedModelsAreRemovedFromPendingRequestsList() { ArgumentCaptor<Callback<Bitmap>> callback = ArgumentCaptor.forClass(Callback.class); - final String url = "http://site1.com"; + final GURL url = new GURL("http://site1.com"); final SuggestionTestHelper sugg1 = createSuggestion("", "", "", url); final SuggestionTestHelper sugg2 = createSuggestion("", "", "", url); @@ -317,7 +319,7 @@ processSuggestion(sugg2); verify(mImageFetcher) - .fetchImage(eq(url), anyString(), anyInt(), anyInt(), callback.capture()); + .fetchImage(eq(url.getSpec()), anyString(), anyInt(), anyInt(), callback.capture()); verify(mImageFetcher).fetchImage(anyString(), anyString(), anyInt(), anyInt(), any()); final Drawable icon1 = sugg1.getIcon(); @@ -325,7 +327,7 @@ // Invoke callback twice. If models were not erased, these should be updated. callback.getValue().onResult(null); - callback.getValue().onResult(mFakeBitmap); + callback.getValue().onResult(mBitmap); final Drawable newIcon1 = sugg1.getIcon(); final Drawable newIcon2 = sugg2.getIcon();
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 872221fe..cab1081 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-84.0.4112.0_rc-r1-merged.afdo.bz2 \ No newline at end of file +chromeos-chrome-amd64-84.0.4114.0_rc-r1-merged.afdo.bz2 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 144c1267..7c7d4b4 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -4960,9 +4960,6 @@ <message name="IDS_PLUGIN_VM_INSTALLER_DOWNLOAD_PROGRESS_WITHOUT_DOWNLOAD_SIZE_MESSAGE" desc="Text of the Plugin VM installer while downloading Plugin VM image, showing download progress when the full download size is not known."> <ph name="DOWNLOADED_SIZE">$1<ex>1.2 GB</ex></ph> </message> - <message name="IDS_PLUGIN_VM_INSTALLER_TIME_LEFT_MESSAGE" desc="Text of the Plugin VM installer that shows estimated time left before current installation stage ends."> - <ph name="TIME_LEFT">$1<ex>30 mins</ex></ph> left - </message> <message name="IDS_PLUGIN_VM_INSTALLER_CONTINUE_BUTTON" desc="Label for the button in the Plugin VM installer to continue installation."> Continue </message>
diff --git a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_TIME_LEFT_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_TIME_LEFT_MESSAGE.png.sha1 deleted file mode 100644 index 2e16724e..0000000 --- a/chrome/app/chromeos_strings_grdp/IDS_PLUGIN_VM_INSTALLER_TIME_LEFT_MESSAGE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -35a7f67d6407ee1a3f9295e6537b569982a3bf82 \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 4e4b3666..ffdf794 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -10235,8 +10235,11 @@ </message> <!-- WebAuthn authenticator internal user verification --> + <message name="IDS_WEBAUTHN_INLINE_ENROLLMENT_CANCEL_LABEL" desc="The label on a button allowing users to skip fingerprint registration when setting up a fingerprint enabled authenticator."> + Skip + </message> <message name="IDS_WEBAUTHN_UV_RETRY_TITLE" desc="The title on a dialog shown to the user when a previous attempt to verify their identity through fingerprints failed, and they are being asked to try again."> - Fingerprint not recognized + Fingerprint not recognized </message> <message name="IDS_WEBAUTHN_UV_RETRY_DESCRIPTION" desc="The description on a dialog shown to the user when a previous attempt to verify their identity through fingerprints failed, and they are being asked to try again."> Your fingerprint couldn't be recognized. Try again.
diff --git a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_INLINE_ENROLLMENT_CANCEL_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_INLINE_ENROLLMENT_CANCEL_LABEL.png.sha1 new file mode 100644 index 0000000..cd6533cf --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_INLINE_ENROLLMENT_CANCEL_LABEL.png.sha1
@@ -0,0 +1 @@ +e4f9dbff2938e8085df535dc500f6f5701a3a3b1 \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb index a5b15583..e192c822 100644 --- a/chrome/app/resources/chromium_strings_af.xtb +++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Begin weer</translation> <translation id="2805036593126168338">Chromium-bedryfstelsel kon nie jou wagwoorde sinkroniseer nie. Maak nou reg.</translation> <translation id="2847479871509788944">Verwyder uit Chromium …</translation> -<translation id="2886012850691518054">Opsioneel: Help om Chromium te verbeter deur gebruikstatistiek en omvalverslae outomaties na Google te stuur.</translation> <translation id="2910007522516064972">Meer oor Chromium</translation> <translation id="2977470724722393594">Chromium is op datum</translation> <translation id="2983934633046890458">Chromium probeer tans wagwoorde wysig.</translation>
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 543d07b..2bcce20 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">ዳግም አስጀምር</translation> <translation id="2805036593126168338">Chromium OS የእርስዎን የይለፍ ቃል ማስመር አልቻለም። አሁኑኑ ያስተካክሉ።</translation> <translation id="2847479871509788944">ከChromium አስወግድ...</translation> -<translation id="2886012850691518054">ከተፈለገ፦ የአጠቃቀም ስታትስቲክስ እና የብልሽት ሪፖርቶችን ወደ Google በራስ-ሰር በመላክ Chromium የተሻለ እንዲሆን ያግዙ።</translation> <translation id="2910007522516064972">ስለ &Chromium</translation> <translation id="2977470724722393594">Chromium የተዘመነ ነው</translation> <translation id="2983934633046890458">Chromium የይለፍ ቃላትን ለማርትዕ እየሞከረ ነው</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">የGoogle ኤ ፒ አይ ቁልፎች ይጎድላሉ። አንዳንድ የChromium ተግባራት ይሰናከላሉ።</translation> <translation id="3296368748942286671">Chromium ሲዘጋ የጀርባ መተግበሪያዎች ማሂዱን ይቀጥሉ</translation> <translation id="331951419404882060">በመለያ ሲገባ በነበረ ስህተት ምክንያት Chromium OS ውሂብዎን ማመሳሰል አልቻለም።</translation> +<translation id="347328004046849135">እርስዎ በተጠለፈ የይለፍ ቃል ሲገቡ Chromium ያሳውቀዎታል</translation> <translation id="3474745554856756813">ይሄ <ph name="ITEMS_COUNT" /> ንጥሎችን ከዚህ መሣሪያ ይሰርዛል። ውሂብዎን በኋላ ላይ ሰርስረው ለማውጣት እንደ <ph name="USER_EMAIL" /> ሆነው ወደ Chromium ይግቡ።</translation> <translation id="3509308970982693815">እባክዎ ሁሉንም የChromium መስኮቶችን ይዝጉና እንደገና ይሞክሩ።</translation> <translation id="3575459661164320785">በእርስዎ ኮምፒውተር ላይ ጎጂ ሶፍትዌር አለ። Chromium የእርስዎን አሰሳ እንደገና በጤናማነት እንዲሠራ ለማድረግ ሊያስወግደው፣ የእርስዎን ቅንብሮች እንደነበሩ ሊመልሳቸው እና ቅጥያዎችን ሊያሰናክል ይችላል።</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">የሆነው ሆኖ Chromium ይቁም?</translation> <translation id="4748217263233248895">ለChromium ልዩ የደህንነት ዝማኔ ተፈጻሚ ተደርጓል። አሁን ዳግም ያስጀምሩ እና የእርስዎን ትሮች ወደ ነበሩበት እንመልሳለን።</translation> <translation id="4750035648288509542">ሊዘመን ጥቂት ቀርቶታል! ማዘመን ለማጠናቀቅ Chromiumን ዳግም ያስጀምሩት። ማንነት የማያሳውቁ መስኮቶች ዳግም አይከፈቱም።</translation> +<translation id="4788777615168560705">Chromium የእርስዎን የይለፍ ቃላት መፈተሽ አይችልም። ከ24 ሰዓቶች በኋላ እንደገና ይሞክሩ ወይም <ph name="BEGIN_LINK" />በGoogle መለያዎ ውስጥ የይለፍ ቃላትን ይፈትሹ<ph name="END_LINK" />።</translation> <translation id="479167709087336770">ይህ በ Google ፍለጋ ውስጥ ጥቅም ላይ ጋር ተመሳሳይ የፊደል አራሚ ይጠቀማል። በአሳሽ ውስጥ የሚተይቡት ጽሑፍ ወደ Google ይላካል። ይህን ባህሪ ሁልጊዜ በቅንብሮች ውስጥ መለወጥ ይችላሉ።</translation> <translation id="4888717733111232871">Chromium ለmDNS ትራፊክ ለመፍቀድ የውስጥ ደንብ።</translation> <translation id="4943838377383847465">Chromium በጀርባ ሁነታ ላይ ነው።</translation> <translation id="4987820182225656817">እንግዳዎች ማንኛውንም ነገር ወደኋላ ሳይተዉ Chromium መጠቀም ይችላሉ።</translation> <translation id="4994636714258228724">እራስዎን በChromium ላይ ያክሉ</translation> +<translation id="5224391634244552924">ምንም የተቀመጡ የይለፍ ቃላት የሉም። እርስዎ የይለፍ ቃላትዎን ሲያስቀምጧቸው Chromium መፈተሽ ይችላል።</translation> <translation id="5277894862589591112">የእርስዎን ለውጦች ተፈጻሚ ለማድረግ፣ Chromiumን ዳግም ያስጀምሩ</translation> <translation id="5358375970380395591">በሚተዳደር መለያ እየገቡ ነው፣ እና አስተዳዳሪው በእርስዎ Chromium መገለጫ ላይ ቁጥጥር እየሰጡት ነው። እንደ እርስዎ መተግበሪያዎች፣ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ያሉ የእርስዎ Chromium ውሂብ እስከ መጨረሻው ከ<ph name="USER_NAME" /> ጋር የተያያዙ ይሆናሉ። ይህን ውሂብ በGoogle የመለያዎች Dashboard አማካኝነት ሊሰርዙት ይችላሉ፣ ነገር ግን ይህን ውሂብ ከሌላ መለያ ጋር ሊያጎዳኙት አይችሉም። <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromiumን በማዘመን ላይ (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS የእርስዎን ውሂብ ማመሳሰል አልቻለም። የእርስዎን የማመሳሰያ የይለፍ ሐረግ እባክዎ ያዘምኑ።</translation> <translation id="7067091210845072982">አንድ ምስል ጠቃሚ መግለጫ ከሌለው Chromium ለእርስዎ አንድ ለማቅረብ ይሞክራል። ዝርዝር መግለጫዎችን ለመፍጠር፣ ምስሎች ወደ Google ይላካሉ።</translation> <translation id="7196312274710523067">Chromiumን ማስጀመር አልተቻለም። እንደገና ይሞክሩ።</translation> +<translation id="7197677400338048821">Chromium የእርስዎን የይለፍ ቃላት መፈተሽ አይችልም። ከ24 ሰዓቶች በኋላ እንደገና ይሞክሩ።</translation> <translation id="7205698830395646142">በChromium ምናሌ ውስጥ ደብቅ</translation> <translation id="7223968959479464213">ተግባር መሪ - Chromium</translation> <translation id="731644333568559921">&Chromium ስርዓተ ክወናን አዘምን</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index ee23734..81df3b7 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">إعادة تشغيل</translation> <translation id="2805036593126168338">تعذّر على نظام التشغيل Chromium مزامنة كلمات المرور. إصلاح المشكلة الآن</translation> <translation id="2847479871509788944">إزالة من Chromium</translation> -<translation id="2886012850691518054">اختياري: ساعد في تحسين Chromium عن طريق إرسال إحصاءات الاستخدام وتقارير الأعطال إلى Google تلقائيًا.</translation> <translation id="2910007522516064972">حو&ل Chromium</translation> <translation id="2977470724722393594">Chromium محدّث</translation> <translation id="2983934633046890458">يحاول Chromium تعديل كلمات المرور.</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb index 99fa31c8..160d74c 100644 --- a/chrome/app/resources/chromium_strings_as.xtb +++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">পুনৰ লঞ্চ কৰক</translation> <translation id="2805036593126168338">Chromium OSএ আপোনাৰ পাছৱৰ্ডসমূহ ছিংক কৰিব নোৱাৰিলে। এতিয়াই সমাধান কৰক।</translation> <translation id="2847479871509788944">Chromiumৰপৰা আঁতৰাওক...</translation> -<translation id="2886012850691518054">ঐচ্ছিক: স্বয়ংক্ৰিয়ভাৱে Googleলৈ ব্যৱহাৰৰ পৰিসংখ্যা আৰু ক্ৰেশ্ব ৰিপ'ৰ্ট পঠিয়াই Chromiumক উন্নত কৰাত সহায় কৰক।</translation> <translation id="2910007522516064972">&Chromiumৰ বিষয়ে</translation> <translation id="2977470724722393594">Chromium একেবাৰে শেহতীয়া অৱস্থাত আছে</translation> <translation id="2983934633046890458">Chromiumএ পাছৱর্ডসমূহ সম্পাদনা কৰিবলৈ চেষ্টা কৰি আছে।</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API চাবিসমূহ নাই। Chromiumৰ কিছুমান কাৰ্যক্ষতা অক্ষম কৰা হ’ব।</translation> <translation id="3296368748942286671">Chromium বন্ধ কৰাৰ পিছতো নেপথ্যত এপ্সমূহ চলি থাকিবলৈ দিয়ক</translation> <translation id="331951419404882060">ছাইন ইন কৰোঁতে আসোঁৱাহ হোৱাৰ কাৰণে Chromium OSএ আপোনাৰ ডেটা ছিংক কৰিব নোৱাৰিলে।</translation> +<translation id="347328004046849135">আপুনি কোনো হেক কৰা পাছৱৰ্ডৰ জৰিয়তে ছাইন ইন কৰিলে Chromiumএ আপোনাক জাননী দিব</translation> <translation id="3474745554856756813">ইয়ে এই ডিভাইচটোৰ পৰা <ph name="ITEMS_COUNT" />টা বস্তু মচিব। আপোনাৰ ডেটা পাছত পুনৰুদ্ধাৰ কৰিবলৈ Chromiumত <ph name="USER_EMAIL" /> হিচাপে ছাইন ইন কৰক।</translation> <translation id="3509308970982693815">অনুগ্ৰহ কৰি Chromiumৰ সকলো ৱিণ্ড’ বন্ধ কৰি পুনৰ চেষ্টা কৰক।</translation> <translation id="3575459661164320785">আপোনাৰ কম্পিউটাৰত কোনো ক্ষতিকাৰক ছফ্টৱেৰ আছে। Chromiumএ আপোনাৰ ব্ৰাউজাৰে সাধাৰণভাৱে কাম কৰিবলৈ এইটো আঁতৰাব পাৰে, আপোনাৰ ছেটিং পুনঃস্থাপন কৰিব পাৰে আৰু এক্সটেনশ্বন অক্ষম কৰিব পাৰে।</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">যিয়েই কি নহ’লেও Chromium বন্ধ কৰিবনে?</translation> <translation id="4748217263233248895">Chromiumৰ এটা বিশেষ সুৰক্ষা আপডে’ট এইমাত্ৰ প্ৰয়োগ কৰা হৈছে। এতিয়াই ৰিষ্টাৰ্ট কৰক আৰু আমি আপোনাৰ টেববোৰ পুনঃস্থাপন কৰিম।</translation> <translation id="4750035648288509542">প্ৰায় আপ টু ডে’ট হৈছে! আপডে’ট হোৱাটো সম্পূৰ্ণ কৰিবলৈ Chromium পুনৰ লঞ্চ কৰক। ইনক’গনিট’ ৱিণ্ড’সমূহ পুনৰ খুলিব নোৱাৰিব।</translation> +<translation id="4788777615168560705">Chromiumএ আপোনাৰ পাছৱর্ডসমূহ পৰীক্ষা কৰিব নোৱাৰে। ২৪ ঘণ্টাৰ পাছত পুনৰ চেষ্টা কৰক অথবা <ph name="BEGIN_LINK" />আপোনাৰ Google একাউণ্টত পাছৱর্ডসমূহ পৰীক্ষা কৰক<ph name="END_LINK" />।</translation> <translation id="479167709087336770">এইটোৱে Google Searchত ব্যৱহৃত একেটা বানান পৰীক্ষকেই ব্যৱহাৰ কৰে। আপুনি ব্ৰাউজাৰত টাইপ কৰা পাঠ Googleলৈ পঠিওৱা হয়। আপুনি ছেটিংসমূহ-ত যিকোনো সময়তে এই আচৰণটো সলনি কৰিব পাৰে।</translation> <translation id="4888717733111232871">mDNS ট্ৰেফিকক অনুমতি দিবলৈ Chromium অন্তৰ্গামী নিয়ম।</translation> <translation id="4943838377383847465">Chromium নেপথ্য ম’ডত আছে।</translation> <translation id="4987820182225656817">অতিথিসকলে কোনো সুবিধা বাদ নিদিয়াকৈ Chromium ব্যৱহাৰ কৰিব পাৰে।</translation> <translation id="4994636714258228724">নিজকে Chromiumত যোগ কৰক</translation> +<translation id="5224391634244552924">ছেভ কৰা কোনো পাছৱৰ্ড নাই। আপুনি নিজৰ পাছৱর্ডসমূহ ছেভ কৰিলে Chromiumএ সেইবোৰ পৰীক্ষা কৰিব পাৰে।</translation> <translation id="5277894862589591112">আপুনি কৰা সলনি কার্যসমূহ প্ৰযোজ্য কৰিবলৈ Chromium পুনৰ লঞ্চ কৰক</translation> <translation id="5358375970380395591">আপুনি এটা পৰিচালিত একাউণ্টৰ জৰিয়তে ছাইন ইন কৰি আছে আৰু আপোনাৰ Chromium প্ৰ’ফাইলৰ জৰিয়তে ইয়াৰ প্ৰশাসনিক নিয়ন্ত্ৰণ দি আছে। আপোনাৰ এপ্, বুকমার্ক, ইতিহাস, পাছৱর্ড আৰু অন্য ছেটিংসমূহৰ দৰে নিজৰ Chromium ডেটা স্থায়ীভাৱে <ph name="USER_NAME" />ৰ সৈতে সংযুক্ত হ’ব। আপুনি Google একাউণ্ট ডেশ্বব’ৰ্ডৰ জৰিয়তে এই ডেটা মচিব পাৰিব কিন্তু আপুনি এই ডেটা অন্য একাউণ্টৰ সৈতে সংলগ্ন কৰিব নোৱাৰিব। <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium আপডে’ট কৰি থকা হৈছে (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OSএ আপোনাৰ ডেটা ছিংক কৰিব নোৱাৰিলে। অনুগ্ৰহ কৰি আপোনাৰ ছিংক পাছফ্ৰেজ আপডে'ট কৰক।</translation> <translation id="7067091210845072982">যদি কোনো প্ৰতিচ্ছবিত উপযোগী বিৱৰণ নাই তেন্তে Chromiumএ আপোনাক সেয়া প্ৰদান কৰিবলৈ চেষ্টা কৰিব। বিৱৰণ সৃষ্টি কৰিবলৈ প্ৰতিচ্ছবি Googleলৈ প্ৰেৰণ কৰা হয়।</translation> <translation id="7196312274710523067">Chromium লন্স কৰিব পৰা নগ’ল। পুনৰ চেষ্টা কৰক।</translation> +<translation id="7197677400338048821">Chromiumএ আপোনাৰ পাছৱর্ডসমূহ পৰীক্ষা কৰিব নোৱাৰে। ২৪ ঘণ্টাৰ পাছত পুনৰ চেষ্টা কৰক।</translation> <translation id="7205698830395646142">Chromium মেনুত লুকুৱাওক</translation> <translation id="7223968959479464213">কাৰ্য পৰিচালক - Chromium</translation> <translation id="731644333568559921">&Chromium OS আপডে’ট কৰক</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index 1587303..8bed041 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Yenidən başladın</translation> <translation id="2805036593126168338">Chromium OS parollarınızı sinxronizasiya edə bilmədi. İndi düzəliş edin.</translation> <translation id="2847479871509788944">Chromium'dan silin...</translation> -<translation id="2886012850691518054">Seçimə görə: İstifadə statistikası və xəta hesabatlarını avtomatik Google'a göndərməklə Chromium tətbiqini təkmilləşdirin.</translation> <translation id="2910007522516064972">Chromium haqqında</translation> <translation id="2977470724722393594">Chromium güncəldir</translation> <translation id="2983934633046890458">Chromium parolları redaktə etməyə çalışır.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Google API açarları çatışmır. Chromium'un bəzi funksionallığı deaktiv ediləcək.</translation> <translation id="3296368748942286671">Chromium bağlı olduqda arxa fon tətbiqləri işləsin?</translation> <translation id="331951419404882060">Giriş xətası səbəbindən Chromium OS datanızı sinxronizasiya edə bilmədi.</translation> +<translation id="347328004046849135">Oğurlanmış parol ilə daxil olduqda Chromium sizə bildiriş göndərəcək</translation> <translation id="3474745554856756813"><ph name="ITEMS_COUNT" /> element bu cihazdan silinəcək. Sonradan datanızı bərpa etmək üçün Chromiuma <ph name="USER_EMAIL" /> kimi daxil olun.</translation> <translation id="3509308970982693815">Bütün Chromium pəncərələrini bağlayın və yenidən cəhd edin.</translation> <translation id="3575459661164320785">Kompüterdə zərərli proqram təminatı var. Brauzerin normal şəkldə işləməsi üçün Chromium onu silə, ayarları bərpa edə və artırmaları deaktiv edə bilər.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Chromium'dan istənilən halda çıxılsın?</translation> <translation id="4748217263233248895">Chromium üçün xüsusi təhlükəsizlik yeniləməsi indicə tətbiq edildi. İndi yenidən başladın və açdığınız tablar bərpa ediləcək.</translation> <translation id="4750035648288509542">Güncəllənmək üzrədir! Güncəlləməni tamamlamaq üçün Chromium'u yenidən başladın. Anonim pəncərələr yenidən açılmayacaq.</translation> +<translation id="4788777615168560705">Chromium parollarınızı yoxlaya bilmir. 24 saatdan sonra yenidən cəhd edin və ya <ph name="BEGIN_LINK" />Google Hesabınızda parolları yoxlayın<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Bu, Google axtarışda istifadə edilən eyni orfoqrafiya yoxlayandan istifadə edir. Brauzerdə yazdığınız mətn Google'a göndərilir. Bunu istənilən vaxt ayarlardan dəyişə bilərsiniz.</translation> <translation id="4888717733111232871">mDNS trafikinə imkan vermək üçün Chromium üçün daxil olan qayda.</translation> <translation id="4943838377383847465">Chromium arxa fon rejimindədir.</translation> <translation id="4987820182225656817">Qonaqlar geridə heç nə buraxmadan Chromium istifadə edə bilər.</translation> <translation id="4994636714258228724">Özünüzü Chromium'a əlavə edin</translation> +<translation id="5224391634244552924">Yadda saxlanmış parol yoxdur. Parollarınızı yadda saxladıqda Chromium onları yoxlaya bilər.</translation> <translation id="5277894862589591112">Dəyişiklikləri tətbiq etmək üçün Chromium'u yenidən başladın</translation> <translation id="5358375970380395591">İdarə olunan hesabla daxil olursnuz və onun inzibati idarəetməsini Chromium profilinizə verirsiniz. Tətbiqləriniz, əlfəcinləriniz, tarixçəniz və digər ayarlarınız Chromimum datanızla birlikdə <ph name="USER_NAME" /> üzərinə həmişəlik bənd olacaq. Bu datanı Google Hesabları Paneli vasitəsilə silə bilərsiniz, lakin bu datanı digər hesabla əlaqəli edə bilməzsiniz. Mövcud Chrome datanızı ayrı saxlamaq üçün yeni profil yarada bilərsiniz. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium güncəllənir (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium OS datanızı sinxronizasiya edə bilmədi. Lütfən, Sinxronizasiya parol sözünü güncəlləşdirin.</translation> <translation id="7067091210845072982">Şəklin təsviri faydalı deyilsə, Chromium Sizin üçün təsviri təmin etməyə çalışacaq. Təsvir yaratmaq üçün şəkillər Google'a göndərilir.</translation> <translation id="7196312274710523067">Chromium başlamadı. Yenidən sınayın.</translation> +<translation id="7197677400338048821">Chromium parollarınızı yoxlaya bilmir. 24 saatdan sonra yenidən cəhd edin.</translation> <translation id="7205698830395646142">Chromium menyusunda gizlədin</translation> <translation id="7223968959479464213">Tapşırıq Meneceri - Chromium</translation> <translation id="731644333568559921">Chromium OS tətbiqini güncəlləşdirin</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index 38a0907e..0a684bad 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Перазапусціць</translation> <translation id="2805036593126168338">Сістэме Chromium OS не ўдалося сінхранізаваць паролі. Вырашыце праблему.</translation> <translation id="2847479871509788944">Выдаліць з Chromium...</translation> -<translation id="2886012850691518054">(Неабавязкова.) Дапамажыце палепшыць Chromium, дазволіўшы аўтаматычна адпраўляць у Google статыстыку выкарыстання і справаздачы аб збоях.</translation> <translation id="2910007522516064972">Пра &Chromium</translation> <translation id="2977470724722393594">Chromium абноўлены</translation> <translation id="2983934633046890458">Chromium спрабуе змяніць паролі.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Адсутнічаюць ключы Google API. Некаторыя функцыі Chromium будуць выключаны.</translation> <translation id="3296368748942286671">Працягваць выконваць фонавыя праграмы, калі Chromium закрыты</translation> <translation id="331951419404882060">Chromium OS не змог сінхранізаваць даныя з-за памылкі ўваходу.</translation> +<translation id="347328004046849135">Chromium адправіць вам апавяшчэнне, калі вы ўвойдзеце ва ўліковы запіс, выкарыстаўшы раскрыты пароль</translation> <translation id="3474745554856756813">З гэтай прылады будзе выдалена наступная колькасць элементаў: <ph name="ITEMS_COUNT" />. Каб потым атрымаць свае даныя, увайдзіце ў Chromium як <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Закрыйце ўсе вокны Chromium і паўтарыце спробу.</translation> <translation id="3575459661164320785">На камп'ютары знойдзена шкоднае ПЗ. Chromium можа яго выдаліць, аднавіць налады і выключыць пашырэнні, каб браўзер змог зноў нармальна працаваць.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Усё роўна закрыць Chromium?</translation> <translation id="4748217263233248895">Толькі што было прыменена спецыяльнае абнаўленне бяспекі для Chromium. Перазапусціце браўзер, і вашы ўкладкі будуць адноўлены.</translation> <translation id="4750035648288509542">Амаль гатова! Каб завяршыць абнаўленне, перазапусціце Chromium. Вокны ў рэжыме інкогніта не будуць адкрыты паўторна.</translation> +<translation id="4788777615168560705">Браўзеру Chromium не ўдаецца праверыць паролі. Паўтарыце спробу праз 24 гадзіны або <ph name="BEGIN_LINK" />праверце паролі ва Уліковым запісе Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Гэта функцыя выкарыстоўвае тую ж праверку правапісу, што ў Google Пошуку. Уведзены ў браўзер тэкст адпраўляецца ў Google. Гэта можна змяніць у наладах.</translation> <translation id="4888717733111232871">Уваходнае правіла для Chromium, якое дазваляе трафік mDNS.</translation> <translation id="4943838377383847465">Chromium працуе ў фонавым рэжыме.</translation> <translation id="4987820182225656817">Госці могуць выкарыстоўваць Chromium, не пакідаючы нічога пасля сябе.</translation> <translation id="4994636714258228724">Дадаць мяне ў Chromium</translation> +<translation id="5224391634244552924">Няма захаваных пароляў. Chromium можа правяраць толькі захаваныя паролі.</translation> <translation id="5277894862589591112">Каб прымяніць змяненні, перазапусціце Chromium</translation> <translation id="5358375970380395591">Вы ўваходзіце праз уліковы запіс пад кіраваннем, што дае адміністратару кантроль над вашым профілем у браўзеры Chromium. Даныя Chromium (праграмы, закладкі, гісторыя, паролі і іншыя налады) будуць назаўсёды прывязаны да ўліковага запісу <ph name="USER_NAME" />. Вы зможаце выдаліць гэтыя даныя праз панэль кіравання Уліковымі запісамі Google, але іх нельга будзе звязаць з іншым уліковым запісам. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium абнаўляецца (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Сістэме Chromium OS не ўдалося сінхранізаваць даныя. Абнавіце фразу-пароль для сінхранізацыі.</translation> <translation id="7067091210845072982">Калі відарыс не мае прыдатнага апісання, Chromium паспрабуе дадаць яго для вас. Каб стварыць апісанні, відарысы адпраўляюцца ў Google.</translation> <translation id="7196312274710523067">Не атрымалася запусціць Chromium. Паўтарыце спробу.</translation> +<translation id="7197677400338048821">Браўзеру Chromium не ўдаецца праверыць паролі. Паўтарыце спробу праз 24 гадзіны.</translation> <translation id="7205698830395646142">Схаваць у меню Chromium</translation> <translation id="7223968959479464213">Менеджар заданняў – Chromium</translation> <translation id="731644333568559921">Абнавіць &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index a8ab8b9d..94b8000 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Стартиране отново</translation> <translation id="2805036593126168338">Chromium OS не синхронизира паролите ви. Отстранете проблема.</translation> <translation id="2847479871509788944">Премахване от Chromium...</translation> -<translation id="2886012850691518054">По избор: Помогнете ни да подобрим Chromium, като автоматично изпращате на Google статистически данни за използването му и сигнали за сривове.</translation> <translation id="2910007522516064972">Всичко за &Chromium</translation> <translation id="2977470724722393594">Chromium е актуален</translation> <translation id="2983934633046890458">Chromium се опитва да редактира паролите.</translation> @@ -56,6 +55,7 @@ <translation id="328888136576916638">Ключовете на приложния програмен интерфейс (API) на Google липсват. Някои функции на Chromium ще бъдат деактивирани.</translation> <translation id="3296368748942286671">Да продължават да се изпълняват приложения на заден план, когато Chromium е затворен</translation> <translation id="331951419404882060">Chromium OS не можа да синхронизира данните ви поради грешка при влизане в профила.</translation> +<translation id="347328004046849135">Chromium ще ви уведоми, когато влизате в профил с компрометирана парола</translation> <translation id="3474745554856756813"><ph name="ITEMS_COUNT" /> елемента ще се изтрият от това устройство. За да извлечете данните си по-късно, влезте в Chromium като <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Моля, затворете всички прозорци на Chromium и опитайте отново.</translation> <translation id="3575459661164320785">На компютъра ви има опасен софтуер. Chromium може да го премахне, да възстанови настройките ви и да деактивира разширенията, така че браузърът отново да заработи нормално.</translation> @@ -91,11 +91,13 @@ <translation id="4746050847053251315">Искате ли да затворите Chromium въпреки това?</translation> <translation id="4748217263233248895">Току-що бе приложена специална актуализация за сигурност за Chromium. Рестартирайте сега – ще възстановим разделите ви.</translation> <translation id="4750035648288509542">Почти приключихме! Стартирайте отново Chromium, за да завършите актуализирането. Прозорците в режим „инкогнито“ няма да бъдат отворени отново.</translation> +<translation id="4788777615168560705">Chromium не може да провери паролите ви. Опитайте отново след 24 часа или <ph name="BEGIN_LINK" />ги проверете в профила си в Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Използва се същата услуга за проверка на правописа като в Google Търсене. Текстът, който въвеждате в браузъра, се изпраща до Google. Винаги можете да промените това поведение от настройките.</translation> <translation id="4888717733111232871">Правило за Chromium за допускане на входящия трафик за mDNS.</translation> <translation id="4943838377383847465">Chromium работи на заден план.</translation> <translation id="4987820182225656817">Гостите могат да използват Chromium, без да оставят следи.</translation> <translation id="4994636714258228724">Добавяне на вас към Chromium</translation> +<translation id="5224391634244552924">Няма запазени пароли. Chromium може да проверява паролите ви, когато ги запазите.</translation> <translation id="5277894862589591112">За да приложите промените си, рестартирайте Chromium</translation> <translation id="5358375970380395591">Влизате с управляван профил и давате на администратора му контрол над потребителския си профил в Chromium. Данните ви там, като например приложения, отметки, история, пароли и други настройки, ще се свържат за постоянно с/ъс <ph name="USER_NAME" />. Ще можете да ги изтриете чрез таблото за управление на Google Профили, но не и да ги свържете с друг профил. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium се актуализира (<ph name="PROGRESS_PERCENT" />)</translation> @@ -160,6 +162,7 @@ <translation id="7066436765290594559">Chromium OS не можа да синхронизира данните ви. Моля, актуализирайте пропуска си за синхронизиране.</translation> <translation id="7067091210845072982">Ако няма полезно описание за дадено изображение, Chromium ще се опита да предостави такова. За да бъдат създадени описания, съответните изображения се изпращат до Google.</translation> <translation id="7196312274710523067">Chromium не можа да се стартира. Опитайте отново.</translation> +<translation id="7197677400338048821">Chromium не може да провери паролите ви. Опитайте отново след 24 часа.</translation> <translation id="7205698830395646142">Скриване в менюто на Chromium</translation> <translation id="7223968959479464213">Диспечер на задачите – Chromium</translation> <translation id="731644333568559921">Актуализиране на &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 0f79da6..0811dd44 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">পুনঃশুরু</translation> <translation id="2805036593126168338">Chromium OS আপনার পাসওয়ার্ড সিঙ্ক করতে পারেনি। এখনই ঠিক করুন।</translation> <translation id="2847479871509788944">Chromium থেকে সরান...</translation> -<translation id="2886012850691518054">ঐচ্ছিক: অটোমেটিক Google-এ ব্যবহার পরিসংখ্যান এবং ক্র্যাশ রিপোর্ট পাঠিয়ে Chromium-কে আরও ভালো করতে সাহায্য করুন৷</translation> <translation id="2910007522516064972">&Chromium সম্পর্কে</translation> <translation id="2977470724722393594">Chromium আপ-টু-ডেট আছে</translation> <translation id="2983934633046890458">Chromium আপনার পাসওয়ার্ড এডিট করার অনুমতি চাইছে।</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index 4f27a0d..42d2e8a 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Ponovo pokreni</translation> <translation id="2805036593126168338">Chromium OS nije uspio sinhronizirati vaše lozinke. Ispravi sada.</translation> <translation id="2847479871509788944">Ukloni iz Chromiuma...</translation> -<translation id="2886012850691518054">Nije obavezno: Pomozite nam poboljšati Chromium automatskim slanjem Googleu statistika korištenja i izvještaja o padovima aplikacija.</translation> <translation id="2910007522516064972">O &Chromiumu</translation> <translation id="2977470724722393594">Chromium je ažuriran</translation> <translation id="2983934633046890458">Chromium pokušava urediti lozinke.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index d8520cda..28cd4db8 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Reinicia</translation> <translation id="2805036593126168338">Chromium OS no ha pogut sincronitzar les teves contrasenyes. Soluciona aquest problema.</translation> <translation id="2847479871509788944">Suprimeix de Chromium...</translation> -<translation id="2886012850691518054">Opcional: ajuda'ns a millorar Chromium enviant estadístiques d'ús i informes d'error a Google automàticament.</translation> <translation id="2910007522516064972">Quant a &Chromium</translation> <translation id="2977470724722393594">Chromium està actualitzat</translation> <translation id="2983934633046890458">Chromium està provant d'editar les contrasenyes.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index 5cab9ab4..3b379ff 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Restartovat</translation> <translation id="2805036593126168338">Chromium OS vaše hesla nemohl synchronizovat. Vyřešit.</translation> <translation id="2847479871509788944">Odstranit z prohlížeče Chromium...</translation> -<translation id="2886012850691518054">Volitelné: Pomozte Chromium zlepšit – posílejte automaticky společnosti Google statistiky o využívání a zprávy o selhání aplikace.</translation> <translation id="2910007522516064972">O prohlížeči &Chromium</translation> <translation id="2977470724722393594">Chromium je aktuální</translation> <translation id="2983934633046890458">Chromium se pokouší upravit hesla.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index e50cb2d7..1e4945c 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Genstart</translation> <translation id="2805036593126168338">Chromium OS kunne ikke synkronisere dine adgangskoder. Løs problemet nu.</translation> <translation id="2847479871509788944">Fjern fra Chromium...</translation> -<translation id="2886012850691518054">Valgfrit: Hjælp med at gøre Chromium bedre ved automatisk at sende forbrugsstatistik og nedbrudsrapporter til Google.</translation> <translation id="2910007522516064972">Om &Chromium</translation> <translation id="2977470724722393594">Chromium er opdateret</translation> <translation id="2983934633046890458">Chromium forsøger at redigere adgangskoder.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index 1dbfaf0..ab009ca 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Neu starten</translation> <translation id="2805036593126168338">Chromium OS konnte Ihre Passwörter nicht synchronisieren. Jetzt beheben.</translation> <translation id="2847479871509788944">Aus Chromium entfernen...</translation> -<translation id="2886012850691518054">Optional: Unterstützen Sie Google bei der Verbesserung von Chromium durch automatisches Senden von Nutzungsstatistiken und Absturzberichten.</translation> <translation id="2910007522516064972">Über &Chromium</translation> <translation id="2977470724722393594">Chromium ist auf dem neuesten Stand</translation> <translation id="2983934633046890458">Chromium versucht, Passwörter zu bearbeiten.</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index 18d6efe..b1dae69c 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Επανεκκίνηση</translation> <translation id="2805036593126168338">Το Chromium OS δεν μπόρεσε να συγχρονίσει τους κωδικούς πρόσβασής σας. Άμεση επιδιόρθωση.</translation> <translation id="2847479871509788944">Κατάργηση από το Chromium…</translation> -<translation id="2886012850691518054">Προαιρετικό: συμβάλετε στη βελτίωση του Chromium στέλνοντας αυτόματα στην Google στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων.</translation> <translation id="2910007522516064972">Σχετικά με το &Chromium</translation> <translation id="2977470724722393594">Το Chromium έχει ενημερωθεί</translation> <translation id="2983934633046890458">Το Chromium προσπαθεί να επεξεργαστεί κωδικούς πρόσβασης.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Λείπουν κλειδιά του Google API. Ορισμένες λειτουργίες του Google Chromium θα απενεργοποιηθούν.</translation> <translation id="3296368748942286671">Να συνεχίζεται η εκτέλεση εφαρμογών παρασκηνίου όταν το Chromium είναι κλειστό</translation> <translation id="331951419404882060">Το Chromium OS δεν μπόρεσε να συγχρονίσει τα δεδομένα σας λόγω σφάλματος κατά τη σύνδεση.</translation> +<translation id="347328004046849135">Το Chromium θα σας ειδοποιήσει όταν συνδεθείτε με έναν παραβιασμένο κωδικό πρόσβασης.</translation> <translation id="3474745554856756813">Με αυτήν την ενέργεια θα διαγραφούν <ph name="ITEMS_COUNT" /> στοιχεία από αυτήν τη συσκευή. Για να ανακτήσετε τα δεδομένα σας αργότερα, συνδεθείτε στο Chromium ως <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Κλείστε όλα τα παράθυρα του Chromium και δοκιμάστε ξανά.</translation> <translation id="3575459661164320785">Υπάρχει επιβλαβές λογισμικό στον υπολογιστή σας. Το Chromium μπορεί να το καταργήσει, να επαναφέρει τις ρυθμίσεις σας και να απενεργοποιήσει τις επεκτάσεις, προκειμένου το πρόγραμμα περιήγησής σας να επιστρέψει σε φυσιολογική λειτουργία.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Να τερματιστεί η λειτουργία του Chromium ούτως ή άλλως;</translation> <translation id="4748217263233248895">Μόλις εφαρμόστηκε μια ειδική ενημέρωση ασφαλείας για το Chromium. Επανεκκινήστε τώρα και θα γίνει επαναφορά των καρτελών σας.</translation> <translation id="4750035648288509542">Η ενημέρωση έχει σχεδόν ολοκληρωθεί! Κάντε επανεκκίνηση του Chromium για να ολοκληρωθεί η διαδικασία ενημέρωσης. Τα παράθυρα για ανώνυμη περιήγηση δεν θα ανοίξουν ξανά.</translation> +<translation id="4788777615168560705">Το Chromium δεν μπορεί να ελέγξει τους κωδικούς πρόσβασής σας. Δοκιμάστε ξανά μετά από 24 ώρες ή <ph name="BEGIN_LINK" />ελέγξτε τους κωδικούς πρόσβασης στον Λογαριασμό σας Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Αυτό χρησιμοποιεί τον ίδιο ορθογραφικό έλεγχο που χρησιμοποιείται στην Αναζήτηση Google. Το κείμενο που πληκτρολογείτε στο πρόγραμμα περιήγησης αποστέλλεται στην Google. Μπορείτε ανά πάσα στιγμή να αλλάξετε αυτήν τη συμπεριφορά στις ρυθμίσεις.</translation> <translation id="4888717733111232871">Εισερχόμενος κανόνας για το Chromium για να επιτρέπεται η κυκλοφορία του mDNS.</translation> <translation id="4943838377383847465">Το Chromium εκτελείται στο παρασκήνιο.</translation> <translation id="4987820182225656817">Οι επισκέπτες μπορούν να χρησιμοποιούν το Chromium χωρίς να αφήνουν κανένα ίχνος.</translation> <translation id="4994636714258228724">Προσθήκη του εαυτού σας στο Chromium</translation> +<translation id="5224391634244552924">Δεν υπάρχουν αποθηκευμένοι κωδικοί πρόσβασης. Το Chromium μπορεί να ελέγξει τους κωδικούς πρόσβασής σας όταν τους αποθηκεύσετε.</translation> <translation id="5277894862589591112">Για να εφαρμόσετε τις αλλαγές σας, επανεκκινήστε το Chromium</translation> <translation id="5358375970380395591">Είστε συνδεδεμένοι με έναν διαχειριζόμενο λογαριασμό και παραχωρείτε στο διαχειριστή του τον έλεγχο του προφίλ σας στο Chromium. Τα δεδομένα σας στο Chromium, όπως οι εφαρμογές, οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλες ρυθμίσεις θα συνδεθούν μόνιμα με το όνομα χρήστη <ph name="USER_NAME" />. Θα έχετε τη δυνατότητα να διαγράψετε αυτά τα δεδομένα μέσω του Πίνακα ελέγχου των Λογαριασμών Google, αλλά δεν θα μπορείτε να τα συσχετίσετε με άλλο λογαριασμό. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Ενημέρωση του Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Το Chromium OS δεν μπόρεσε να συγχρονίσει τα δεδομένα σας. Ενημερώστε τη φράση πρόσβασης συγχρονισμού.</translation> <translation id="7067091210845072982">Εάν μια εικόνα δεν έχει κάποια χρήσιμη περιγραφή, το Chromium θα προσπαθήσει να σας προσφέρει μια περιγραφή. Για τη δημιουργία περιγραφών, αποστέλλονται εικόνες στην Google.</translation> <translation id="7196312274710523067">Δεν ήταν δυνατή η εκκίνηση του Chromium. Προσπάθησε ξανά.</translation> +<translation id="7197677400338048821">Το Chromium δεν μπορεί να ελέγξει τους κωδικούς πρόσβασής σας. Δοκιμάστε ξανά σε 24 ώρες.</translation> <translation id="7205698830395646142">Απόκρυψη στο μενού του Chromium</translation> <translation id="7223968959479464213">Διαχείριση Εργασιών - Chromium</translation> <translation id="731644333568559921">Ενημέρωση &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index 1ac82af..1f7c089 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Relaunch</translation> <translation id="2805036593126168338">Chromium OS could not sync your passwords. Fix now.</translation> <translation id="2847479871509788944">Remove from Chromium...</translation> -<translation id="2886012850691518054">Optional: Help make Chrome better by automatically sending usage statistics and crash reports to Google.</translation> <translation id="2910007522516064972">About &Chromium</translation> <translation id="2977470724722393594">Chromium is up to date</translation> <translation id="2983934633046890458">Chromium is trying to edit passwords.</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index 316c8518..2222dce 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Reiniciar</translation> <translation id="2805036593126168338">El Sistema operativo Chromium no pudo sincronizar tus contraseñas. Soluciona el problema ahora.</translation> <translation id="2847479871509788944">Eliminar de Chromium…</translation> -<translation id="2886012850691518054">Opcional: Ayúdanos a mejorar Chromium enviando estadísticas de uso e informes de errores a Google de manera automática.</translation> <translation id="2910007522516064972">Acerca de &Chromium</translation> <translation id="2977470724722393594">Chromium está actualizado.</translation> <translation id="2983934633046890458">Chromium está intentando editar contraseñas.</translation> @@ -56,6 +55,7 @@ <translation id="328888136576916638">Faltan las claves de la API de Google. Se inhabilitarán algunas funciones de Chromium.</translation> <translation id="3296368748942286671">Continuar ejecutando aplicaciones en segundo plano cuando Chromium esté cerrado.</translation> <translation id="331951419404882060">El Sistema operativo Chromium no pudo sincronizar los datos porque se produjo un error de acceso.</translation> +<translation id="347328004046849135">Chromium te notificará cuando accedas con una contraseña hackeada</translation> <translation id="3474745554856756813">Esta acción borrará <ph name="ITEMS_COUNT" /> elementos de este dispositivo. Si más adelante deseas recuperar los datos, accede a tu cuenta en Chromium como <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Cierra todas las ventanas de Chromium e inténtalo de nuevo.</translation> <translation id="3575459661164320785">Tu computadora tiene software dañino. Chromium puede quitarlo, inhabilitar las extensiones y restablecer la configuración para que el navegador vuelva a funcionar correctamente.</translation> @@ -91,11 +91,13 @@ <translation id="4746050847053251315">¿Deseas salir de Chromium de todos modos?</translation> <translation id="4748217263233248895">Se acaba de instalar una actualización de seguridad especial para Chromium. Reinícialo ahora (se restablecerán tus pestañas).</translation> <translation id="4750035648288509542">Falta poco para finalizar el proceso. Reinicia Chromium para completar la actualización. No se volverán a abrir las ventanas de incógnito.</translation> +<translation id="4788777615168560705">Chromium no puede revisar las contraseñas. Vuelve a intentarlo dentro de 24 horas o <ph name="BEGIN_LINK" />revisa las contraseñas en tu Cuenta de Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Se usará el mismo corrector ortográfico que se emplea en la Búsqueda de Google. El texto que escribes en el navegador se envía a Google. Puedes modificar este comportamiento en la configuración en cualquier momento.</translation> <translation id="4888717733111232871">Regla de entrada para que Chromium permita el tráfico mDNS.</translation> <translation id="4943838377383847465">Chromium está en modo de segundo plano</translation> <translation id="4987820182225656817">Los invitados pueden utilizar Chromium sin dejar nada detrás.</translation> <translation id="4994636714258228724">Agregarte a Chromium</translation> +<translation id="5224391634244552924">No hay contraseñas guardadas. Chromium puede revisar las contraseñas cuando las guardas.</translation> <translation id="5277894862589591112">Para aplicar los cambios, vuelve a ejecutar Chromium</translation> <translation id="5358375970380395591">Estás por acceder con una cuenta administrada, lo que significa que proporcionarás al administrador el control sobre tu perfil de Chromium. Tus datos de Chromium, como las aplicaciones, los favoritos, el historial, las contraseñas y otros parámetros de configuración quedarán vinculados a <ph name="USER_NAME" /> de forma permanente. Podrás eliminar estos datos a través del Panel de control de Cuentas de Google, pero no podrás asociarlos a otra cuenta. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Actualizando Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -160,6 +162,7 @@ <translation id="7066436765290594559">El Sistema operativo Chromium no pudo sincronizar los datos. Actualiza la frase de contraseña de sincronización.</translation> <translation id="7067091210845072982">Si una imagen no tiene una descripción útil, Chromium intentará proporcionarte una. Para crear descripciones, se envían las imágenes a Google.</translation> <translation id="7196312274710523067">No se pudo iniciar Chromium. Vuelve a intentarlo.</translation> +<translation id="7197677400338048821">Chromium no puede revisar las contraseñas. Vuelve a intentarlo después de 24 horas.</translation> <translation id="7205698830395646142">Ocultar en el menú de Chromium</translation> <translation id="7223968959479464213">Administrador de tareas - Chromium</translation> <translation id="731644333568559921">Actualizar &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index 4638e7ea..b7122a7 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Reiniciar</translation> <translation id="2805036593126168338">Chromium OS no ha podido sincronizar las contraseñas. Soluciónalo ahora.</translation> <translation id="2847479871509788944">Desinstalar de Chromium...</translation> -<translation id="2886012850691518054">Opcional: ayudar a mejorar Chromium enviando automáticamente a Google estadísticas de uso e informes de errores</translation> <translation id="2910007522516064972">Información de &Chromium</translation> <translation id="2977470724722393594">Chromium está actualizado</translation> <translation id="2983934633046890458">Chromium está intentando cambiar contraseñas.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Faltan las claves de la API de Google. Se inhabilitarán algunas funciones de Chromium.</translation> <translation id="3296368748942286671">Seguir ejecutando aplicaciones en segundo plano al cerrar Chromium</translation> <translation id="331951419404882060">Chromium OS no ha podido sincronizar los datos debido a un error de inicio de sesión.</translation> +<translation id="347328004046849135">Chromium te avisará cuando inicies sesión con una contraseña vulnerada</translation> <translation id="3474745554856756813">Se eliminarán <ph name="ITEMS_COUNT" /> elementos de este dispositivo. Para recuperar tus datos en otro momento, inicia sesión en Chromium como <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Cierra todas las ventanas de Chromium e inténtalo de nuevo.</translation> <translation id="3575459661164320785">Se ha detectado software dañino en tu ordenador. Chromium puede eliminarlo, restaurar tu configuración y desactivar las extensiones para que el navegador vuelva a funcionar con normalidad.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">¿Quieres cerrar Chromium de todas formas?</translation> <translation id="4748217263233248895">Se acaba de instalar una actualización de seguridad especial para Chromium. Reinicia ahora y restauraremos las pestañas.</translation> <translation id="4750035648288509542">La actualización ya casi ha terminado. Reinicia Chromium para completar la actualización. Las ventanas de incógnito no se volverán a abrir.</translation> +<translation id="4788777615168560705">Chromium no puede comprobar tus contraseñas. Vuelve a intentarlo en 24 horas o <ph name="BEGIN_LINK" />comprueba las contraseñas en tu cuenta de Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Utiliza el mismo corrector ortográfico que se usa en la Búsqueda de Google. El texto que escribas en el navegador se enviará a Google. Puedes cambiar esta opción en cualquier momento desde los ajustes.</translation> <translation id="4888717733111232871">Regla entrante para que Chromium permita tráfico mDNS.</translation> <translation id="4943838377383847465">Chromium está en modo de segundo plano.</translation> <translation id="4987820182225656817">Los invitados pueden utilizar Chromium sin dejar nada atrás.</translation> <translation id="4994636714258228724">Añadirte a Chromium</translation> +<translation id="5224391634244552924">No hay ninguna contraseña guardada. Chromium puede comprobar tus contraseñas si las guardas.</translation> <translation id="5277894862589591112">Reinicia Chromium para aplicar los cambios</translation> <translation id="5358375970380395591">Vas a iniciar sesión con una cuenta gestionada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Chromium. Tus datos de Chromium como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociarlos a otra cuenta. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Actualizando Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS no ha podido sincronizar tus datos. Actualiza tu frase de contraseña de sincronización.</translation> <translation id="7067091210845072982">Si una imagen no tiene ninguna descripción útil, Chromium intentará proporcionártela. Para crear las descripciones, las imágenes se envían a Google.</translation> <translation id="7196312274710523067">No se ha podido iniciar Chromium. Inténtalo de nuevo.</translation> +<translation id="7197677400338048821">Chromium no puede comprobar tus contraseñas. Vuelve a intentarlo en 24 horas.</translation> <translation id="7205698830395646142">Ocultar en el menú de Chromium</translation> <translation id="7223968959479464213">Administrador de tareas - Chromium</translation> <translation id="731644333568559921">Actualizar &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index 07ebae9e..916523bc 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Taaskäivita</translation> <translation id="2805036593126168338">Chromium OS ei saanud teie paroole sünkroonida. Parandage kohe.</translation> <translation id="2847479871509788944">Chromiumist eemaldamine ...</translation> -<translation id="2886012850691518054">Valikuline: aidake muuta Chromiumi paremaks, saates Google'ile automaatselt kasutusstatistikat ja krahhiaruandeid.</translation> <translation id="2910007522516064972">Teave &Chromiumi kohta</translation> <translation id="2977470724722393594">Chromium on ajakohane</translation> <translation id="2983934633046890458">Chromium üritab paroole muuta.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Google API võtmed on puudu. Teatud Chromiumi funktsioonid keelatakse.</translation> <translation id="3296368748942286671">Jätka taustarakenduste käitamist pärast Chromiumi sulgemist</translation> <translation id="331951419404882060">Chromium OS ei saanud sisselogimisvea tõttu teie andmeid sünkroonida.</translation> +<translation id="347328004046849135">Chromium teavitab teid, kui logite sisse ohustatud parooliga</translation> <translation id="3474745554856756813">See kustutab seadmest <ph name="ITEMS_COUNT" /> üksust. Hiljem oma andmete toomiseks logige Chromiumi sisse kasutajana <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Sulgege kõik Chromiumi aknad ja proovige uuesti.</translation> <translation id="3575459661164320785">Teie arvutis on kahjulik tarkvara. Chromium saab selle eemaldada, taastada teie seaded ja keelata laiendused, et brauser töötaks jälle normaalselt.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Kas väljuda Chromiumist ikkagi?</translation> <translation id="4748217263233248895">Äsja rakendati Chromiumi spetsiaalne turvavärskendus. Taaskäivitage brauser, misjärel teie vahelehed taastatakse.</translation> <translation id="4750035648288509542">Peaaegu värskendatud! Värskendamise lõpuleviimiseks taaskäivitage Chromium. Inkognito aknaid ei avata uuesti.</translation> +<translation id="4788777615168560705">Chromium ei saa teie paroole kontrollida. Proovige uuesti 24 tunni pärast või <ph name="BEGIN_LINK" />kontrollige oma Google'i kontol paroole<ph name="END_LINK" />.</translation> <translation id="479167709087336770">See kasutab sama õigekirjakontrolli, mida kasutatakse Google'i otsingus. Brauseris sisestatav tekst saadetakse Google'ile. Seda käitumist saab seadetes alati muuta.</translation> <translation id="4888717733111232871">Sissetuleku reegel Chromiumile mDNS-liikluse lubamiseks.</translation> <translation id="4943838377383847465">Chromium on taustarežiimis.</translation> <translation id="4987820182225656817">Külastajad saavad kasutada Chromiumi jälgi jätmata.</translation> <translation id="4994636714258228724">Lisa Chromiumi</translation> +<translation id="5224391634244552924">Salvestatud paroole ei ole. Chromium saab teie paroole kontrollida, kui olete need salvestanud.</translation> <translation id="5277894862589591112">Muudatuste rakendamiseks käivitage Chromium uuesti</translation> <translation id="5358375970380395591">Logite sisse hallatud kontoga ja annate selle administraatorile üle Chromiumi profiili juhtimise. Teie Chromiumi andmed, näiteks rakendused, järjehoidjad, ajalugu, paroolid ja muud seaded seotakse jäädavalt kasutajaga <ph name="USER_NAME" />. Saate need andmed kustutada Google'i kontode juhtpaneeli kaudu, kuid te ei saa neid seostada teise kontoga. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromiumi värskendamine (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium OS ei saanud teie andmeid sünkroonida. Värskendage oma sünkroonimisparooli.</translation> <translation id="7067091210845072982">Kui pildil puudub kasulik kirjeldus, üritab Chromium selle ise luua. Kirjelduste loomiseks saadetakse pildid Google'ile.</translation> <translation id="7196312274710523067">Chromiumi ei õnnestunud käivitada. Proovige uuesti.</translation> +<translation id="7197677400338048821">Chromium ei saa teie paroole kontrollida. Proovige uuesti 24 tunni pärast.</translation> <translation id="7205698830395646142">Chromiumi menüüs peitmine</translation> <translation id="7223968959479464213">Tegumihaldur – Chromium</translation> <translation id="731644333568559921">Värskenda &Chromium OS-i</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index 9f42defc..b4fa183b 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Abiarazi berriro</translation> <translation id="2805036593126168338">Chromium OS sistema eragileak ezin izan ditu sinkronizatu pasahitzak. Konpondu arazoa.</translation> <translation id="2847479871509788944">Kendu Chromium-etik…</translation> -<translation id="2886012850691518054">Aukerakoa: lagundu Chromium hobetzen Google-ra erabilera-estatistikak eta hutsegite-txostenak automatikoki bidalita.</translation> <translation id="2910007522516064972">&Chromium arakatzaileari buruz</translation> <translation id="2977470724722393594">Eguneratuta dago Chromium</translation> <translation id="2983934633046890458">Pasahitzak editatzen saiatzen ari da Chromium.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index eb7c616..f5069081e 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">راهاندازی مجدد</translation> <translation id="2805036593126168338">سیستمعامل Chromium نتوانست گذرواژههایتان را همگامسازی کند. اکنون مشکل رفع شود.</translation> <translation id="2847479871509788944">حذف از Chromium...</translation> -<translation id="2886012850691518054">اختیاری: با ارسال خودکار آمار کاربرد و گزارشهای خرابی برنامه به Chromium، به پیشرفت Chrome کمک کنید.</translation> <translation id="2910007522516064972">درباره &Chromium</translation> <translation id="2977470724722393594">Chromium بهروز است</translation> <translation id="2983934633046890458">Chromium میخواهد گذرواژهها را ویرایش کند.</translation> @@ -57,6 +56,7 @@ <translation id="328888136576916638">کلیدهای Google API وجود ندارند. برخی از عملکردهای Chromium از کار خواهند افتاد.</translation> <translation id="3296368748942286671">ادامه اجرای برنامهها در پسزمینه هنگامیکه Chromium بسته میشود</translation> <translation id="331951419404882060">به دلیل وجود خطا در ورود به سیستم، سیستمعامل Chromium قادر به همگامسازی دادههای شما نبود.</translation> +<translation id="347328004046849135">وقتی با گذرواژهای لورفته به سیستم وارد میشوید، Chromium شما را مطلع میکند</translation> <translation id="3474745554856756813">این کار <ph name="ITEMS_COUNT" /> مورد را از این دستگاه حذف میکند. برای بازیابی دادههایتان در فرصتی دیگر، با <ph name="USER_EMAIL" /> به سیستم Chromium وارد شوید.</translation> <translation id="3509308970982693815">لطفاً همه پنجرههای Chromium را ببندید و دوباره سعی کنید.</translation> <translation id="3575459661164320785">نرمافزار مضری در رایانهتان وجود دارد. Chromium میتواند آن را بردارد، تنظیمات را بازیابی کند و افزونهها را غیرفعال کند تا عملکرد مرورگرتان دوباره عادی شود.</translation> @@ -92,11 +92,13 @@ <translation id="4746050847053251315">درهرصورت از Chromium خارج میشوید؟</translation> <translation id="4748217263233248895">لحظاتی پیش بهروزرسانی امنیتی ویژهای برای Chromium اعمال شد. هماکنون بازراهاندازی کنید و ما برگههایتان را بازیابی خواهیم کرد.</translation> <translation id="4750035648288509542">تقریباً بهروزرسانی شده است! برای اتمام بهروزرسانی، Chromium را راهاندازی مجدد کنید. پنجرههای ناشناس دوباره باز نخواهند شد.</translation> +<translation id="4788777615168560705">Chromium نمیتواند گذرواژههایتان را بررسی کند. بعد از ۲۴ ساعت دوباره امتحان کنید یا <ph name="BEGIN_LINK" />گذرواژهها را در «حساب Google» خود بررسی کنید<ph name="END_LINK" />.</translation> <translation id="479167709087336770">از همان غلطگیر املایی استفاده میکند که در جستجوی Google استفاده میشود. نوشتاری که در مرورگر تایپ کردهاید برای Google ارسال میشود. هروقت بخواهید میتوانید این رفتار را در تنظیمات تغییر دهید.</translation> <translation id="4888717733111232871">قانون ترافیک ورودی برای Chromium جهت اجازه به ترافیک mDNS.</translation> <translation id="4943838377383847465">Chromium در حالت پسزمینه است.</translation> <translation id="4987820182225656817">مهمانها می توانند از Chromium استفاده کنند بدون اینکه اثری از خود به جا بگذارند.</translation> <translation id="4994636714258228724">افرودن خودتان به Chromium</translation> +<translation id="5224391634244552924">گذرواژه ذخیرهشدهای وجود ندارد. Chromium زمانی میتواند گذرواژههایتان را بررسی کند که آنها را ذخیره کرده باشید.</translation> <translation id="5277894862589591112">برای اعمال تغییراتتان، Chromium را راهاندازی مجدد کنید</translation> <translation id="5358375970380395591">شما با حساب مدیریتشده وارد سیستم میشوید و به سرپرست آن اجازه کنترل بر نمایه Chromium خود را میدهید. دادههای Chromium شما شامل برنامهها، نشانکها، سابقه، گذرواژهها و سایر تنظیمات برای همیشه به <ph name="USER_NAME" /> مرتبط خواهد شد. میتوانید این دادهها را از طریق داشبورد حسابهای Google حذف کنید اما نمیتوانید این دادهها را به حساب دیگری مرتبط سازید. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">درحال بهروزرسانی Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -163,6 +165,7 @@ <translation id="7066436765290594559">سیستمعامل Chromium قادر به همگامسازی دادههای شما نبود. لطفاً رمز عبارتی همگامسازی خود را بهروز کنید.</translation> <translation id="7067091210845072982">اگر تصویری توضیح مفیدی نداشته باشد، Chromium توضیحی برای شما ارائه خواهد کرد. برای ایجاد توضیحات، تصاویر به Google ارسال میشود.</translation> <translation id="7196312274710523067">Chromium راهاندازی نشد. دوباره امتحان کنید.</translation> +<translation id="7197677400338048821">Chromium نمیتواند گذرواژههایتان را بررسی کند. بعد از ۲۴ ساعت دوباره امتحان کنید.</translation> <translation id="7205698830395646142">پنهان در منوی Chromium</translation> <translation id="7223968959479464213">مدیر فعالیتها - Chromium</translation> <translation id="731644333568559921">بهروزرسانی &سیستم عامل Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index 48df54e..5209a92 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Käynnistä uudelleen</translation> <translation id="2805036593126168338">Chromium-käyttöjärjestelmä ei voinut synkronoida salasanojasi. Korjaa nyt.</translation> <translation id="2847479871509788944">Poista Chromiumista…</translation> -<translation id="2886012850691518054">Valinnainen: Lähetä Googlelle automaattisesti käyttötilastoja ja virheraportteja Chromiumin kehittämiseksi.</translation> <translation id="2910007522516064972">Tietoja &Chromiumista</translation> <translation id="2977470724722393594">Chromium on ajan tasalla.</translation> <translation id="2983934633046890458">Chromium yrittää muuttaa salasanoja.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index 1504ffbe..64f9563 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Ilunsad Muli</translation> <translation id="2805036593126168338">Hindi ma-sync ng Chromium ang iyong mga password. Ayusin ngayon.</translation> <translation id="2847479871509788944">Alisin sa Chromium...</translation> -<translation id="2886012850691518054">Opsyonal: Tumulong na pahusayin ang Chromium sa pamamagitan ng awtomatikong pagpapadala sa Google ng mga istatistika ng paggamit at mga ulat ng pag-crash.</translation> <translation id="2910007522516064972">Tungkol sa &Chromium</translation> <translation id="2977470724722393594">Napapanahon ang Chromium</translation> <translation id="2983934633046890458">Sinusubukan ng Chromium na i-edit ang mga password.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Nawawala ang mga Google API key. Madi-disable ang ilang pagpapagana ng Chromium.</translation> <translation id="3296368748942286671">Patuloy na magpatakbo ng background na apps kapag nakasara ang Chromium</translation> <translation id="331951419404882060">Hindi ma-sync ng Chromium OS ang iyong data dahil sa isang error sa pagsa-sign in.</translation> +<translation id="347328004046849135">Aabisuhan ka ng Chromium kapag nag-sign in ka gamit ang isang nakompromisong password</translation> <translation id="3474745554856756813">Magde-delete ito ng <ph name="ITEMS_COUNT" /> (na) item sa device na ito. Upang makuha ang iyong data sa ibang pagkakataon, mag-sign in sa Chromium bilang <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Pakisara ang lahat ng window sa Chromium at subukang muli.</translation> <translation id="3575459661164320785">May mapaminsalang software sa iyong computer. Magagawa ng Chromium na alisin ito, i-restore ang iyong mga setting, at i-disable ang mga extension para muling mapagana nang normal ang browser mo.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Umalis pa rin sa Chromium?</translation> <translation id="4748217263233248895">Naglapat ng espesyal na update sa seguridad para sa Chromium. Mag-restart na at ire-restore namin ang iyong mga tab.</translation> <translation id="4750035648288509542">Malapit nang maging up to date! Ilunsad ulit ang Chromium para tapusin ang pag-update. Hindi bubukas ulit ang mga incognito window.</translation> +<translation id="4788777615168560705">Hindi masuri ng Chromium ang iyong mga password. Subukan ulit pagkalipas ng 24 na oras o <ph name="BEGIN_LINK" />suriin ang mga password sa iyong Google Account<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Ginagamit nito ang parehong spellchecker na ginagamit sa paghahanap sa Google. Ipinapadala sa Google ang text na tina-type mo sa browser. Puwede mong baguhin ang gawing ito sa mga setting sa lahat ng oras.</translation> <translation id="4888717733111232871">Inbound na panuntunan para sa Chromium upang payagan ang trapiko ng mDNS.</translation> <translation id="4943838377383847465">Nasa background mode ang Chromium.</translation> <translation id="4987820182225656817">Makakagamit ng Chromium ang mga bisita nang hindi nag-iiwan ng anumang bakas.</translation> <translation id="4994636714258228724">Idagdag ang iyong sarili sa Chromium</translation> +<translation id="5224391634244552924">Walang naka-save na password. Masusuri ng Chromium ang iyong mga password kapag na-save mo ang mga ito.</translation> <translation id="5277894862589591112">Para ilapat ang iyong mga pagbabago, muling ilunsad ang Chromium</translation> <translation id="5358375970380395591">Nagsa-sign in ka gamit ang isang pinamamahalaang account at nagbibigay sa administrator nito ng kontrol sa iyong profile sa Chromium. Permanenteng mauugnay ang iyong data sa Chromium, gaya ng iyong apps, mga bookmark, kasaysayan, password, at iba pang mga setting sa <ph name="USER_NAME" />. Matatanggal mo ang data na ito sa Google Accounts Dashboard, ngunit hindi mo maiuugnay ang data na ito sa isa pang account. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Ina-update ang Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Hindi ma-sync ng Chromium OS ang iyong data. Paki-update ang iyong Passphrase sa pag-sync.</translation> <translation id="7067091210845072982">Kung hindi sapat ang deskripsyon ng isang larawan, susubukan ng Chromium na ayusin ito para sa iyo. Para gumawa ng mga deskripsyon, ipinapadala ang mga larawan sa Google.</translation> <translation id="7196312274710523067">Hindi mailunsad ang Chromium. Subukang muli.</translation> +<translation id="7197677400338048821">Hindi masuri ng Chromium ang iyong mga password. Subukan ulit pagkalipas ng 24 na oras.</translation> <translation id="7205698830395646142">Itago sa Menu ng Chromium</translation> <translation id="7223968959479464213">Task Manager - Chromium</translation> <translation id="731644333568559921">I-update ang &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb index be4bc3bd..318f000 100644 --- a/chrome/app/resources/chromium_strings_fr-CA.xtb +++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Redémarrer</translation> <translation id="2805036593126168338">Chromium OS n'a pas pu synchroniser vos mots de passe. Corrigez le problème maintenant.</translation> <translation id="2847479871509788944">Supprimer de Chromium...</translation> -<translation id="2886012850691518054">Facultatif : aidez-nous à améliorer Chromium en envoyant automatiquement des statistiques d'utilisation et des rapports d'erreur à Google.</translation> <translation id="2910007522516064972">À propos de &Chromium</translation> <translation id="2977470724722393594">Chromium est à jour</translation> <translation id="2983934633046890458">Chromium essaie de modifier les mots de passe.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index 7254640..758ece1 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -40,7 +40,6 @@ <translation id="2799223571221894425">Relancer</translation> <translation id="2805036593126168338">Impossible de synchroniser vos mots de passe dans Chromium OS. Corrigez le problème maintenant.</translation> <translation id="2847479871509788944">Supprimer de Chromium</translation> -<translation id="2886012850691518054">Facultatif : aidez-nous à améliorer Chromium en envoyant automatiquement des statistiques d'utilisation et des rapports d'erreur à Google.</translation> <translation id="2910007522516064972">À propos de &Chromium</translation> <translation id="2977470724722393594">Chromium est à jour</translation> <translation id="2983934633046890458">Chromium tente de modifier les mots de passe.</translation> @@ -59,6 +58,7 @@ <translation id="328888136576916638">Les clés API Google sont manquantes. Certaines fonctionnalités de Chromium vont être désactivées.</translation> <translation id="3296368748942286671">Poursuivre l'exécution des applications en arrière-plan après la fermeture de Chromium</translation> <translation id="331951419404882060">Impossible de synchroniser vos données dans Chromium OS, car une erreur s'est produite lors de la connexion.</translation> +<translation id="347328004046849135">Chromium vous avertira si vous vous connectez avec un mot de passe compromis</translation> <translation id="3474745554856756813">Cette action aura pour effet de supprimer <ph name="ITEMS_COUNT" /> éléments de cet appareil. Pour récupérer vos données ultérieurement, connectez-vous à Chromium en tant que <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Veuillez fermer toutes les fenêtres de Chromium, puis réessayer.</translation> <translation id="3575459661164320785">Un logiciel malveillant a été détecté sur votre ordinateur. Chromium peut le supprimer, restaurer vos paramètres et désactiver les extensions pour que votre navigateur fonctionne de nouveau normalement.</translation> @@ -94,11 +94,13 @@ <translation id="4746050847053251315">Quitter Chromium quand même ?</translation> <translation id="4748217263233248895">Une mise à jour spéciale de sécurité pour Chromium vient d'être installée. Veuillez redémarrer le navigateur. Vos onglets seront restaurés.</translation> <translation id="4750035648288509542">Presque à jour ! Relancez Chromium pour terminer la mise à jour. Sachez que les fenêtres de navigation privée ne seront pas rouvertes.</translation> +<translation id="4788777615168560705">Chromium ne parvient pas à vérifier vos mots de passe. Réessayez dans 24 heures ou <ph name="BEGIN_LINK" />vérifiez les mots de passe enregistrés dans votre compte Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Le correcteur orthographique utilisé est le même que celui employé dans la recherche Google. Le texte que vous saisissez dans le navigateur est envoyé à Google. Vous pouvez toujours modifier ce comportement dans les paramètres.</translation> <translation id="4888717733111232871">Règle de trafic entrant pour Chromium autorisant le trafic mDNS</translation> <translation id="4943838377383847465">Chromium est exécuté en mode arrière-plan</translation> <translation id="4987820182225656817">Les invités peuvent utiliser Chromium sans laisser aucune trace.</translation> <translation id="4994636714258228724">Ajouter un utilisateur à Chromium</translation> +<translation id="5224391634244552924">Aucun mot de passe enregistré. Chromium ne peut vérifier vos mots de passe que si vous les enregistrez.</translation> <translation id="5277894862589591112">Pour appliquer vos modifications, relancez Chromium</translation> <translation id="5358375970380395591">Vous vous connectez avec un compte géré et donnez le contrôle de votre profil Chromium à son administrateur. Vos données Chromium, telles que les applications, les favoris, l'historique, les mots de passe et les autres paramètres, vont être définitivement associées à <ph name="USER_NAME" />. Vous pouvez supprimer ces données via le tableau de bord des comptes Google, mais vous ne pouvez pas les associer à un autre compte. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Mise à jour de Chromium (<ph name="PROGRESS_PERCENT" />)…</translation> @@ -165,6 +167,7 @@ <translation id="7066436765290594559">Impossible de synchroniser vos données dans Chromium OS. Veuillez mettre à jour votre phrase secrète de synchronisation.</translation> <translation id="7067091210845072982">Si une image n'est pas accompagnée d'une description utile, Chromium essaiera de vous en proposer une. Pour nous permettre de créer des descriptions, les images sont envoyées à Google.</translation> <translation id="7196312274710523067">Impossible de lancer Chromium. Réessayez.</translation> +<translation id="7197677400338048821">Chromium ne parvient pas à vérifier vos mots de passe. Réessayez dans 24 heures.</translation> <translation id="7205698830395646142">Masquer dans le menu Chromium</translation> <translation id="7223968959479464213">Gestionnaire de tâches – Chromium</translation> <translation id="731644333568559921">Mettre à jour &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb index 0090e4b1..c40809f 100644 --- a/chrome/app/resources/chromium_strings_gl.xtb +++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Iniciar de novo</translation> <translation id="2805036593126168338">Chromium OS non puido sincronizar os teus contrasinais. Corríxeo agora.</translation> <translation id="2847479871509788944">Eliminar de Chromium...</translation> -<translation id="2886012850691518054">Opcional: axuda a mellorar Chromium mediante o envío automático de estatísticas de uso e informes de erros a Google.</translation> <translation id="2910007522516064972">Acerca de &Chromium</translation> <translation id="2977470724722393594">Chromium está actualizado</translation> <translation id="2983934633046890458">Chromium está tentando editar contrasinais.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 24f96e98..4fdde24 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">ફરીથી લોંચ કરો</translation> <translation id="2805036593126168338">Chromium OS તમારા પાસવર્ડને સિંક કરી શક્યું નથી. હમણાં જ સુધારો.</translation> <translation id="2847479871509788944">Chromium માંથી દૂર કરો...</translation> -<translation id="2886012850691518054">વૈકલ્પિક: ઉપયોગનાં આંકડાઓ અને ક્રૅશ રીપોર્ટ્સ ઑટોમૅટિક રીતે Googleને મોકલીને Chromium ને વધુ સારું બનાવવમાં સહાય કરો.</translation> <translation id="2910007522516064972">&Chromium વિશે</translation> <translation id="2977470724722393594">Chromium અપ ટૂ ડેટ છે</translation> <translation id="2983934633046890458">Chromium પાસવર્ડમાં ફેરફાર કરવાનો પ્રયાસ કરે છે.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API કીઝ ખૂટે છે. Chromium ની કેટલીક કાર્યક્ષમતા અક્ષમ થશે.</translation> <translation id="3296368748942286671">જ્યારે Chromium બંધ થાય ત્યારે પૃષ્ઠભૂમિ ઍપ્લિકેશનો ચલાવવાનું ચાલુ રાખો</translation> <translation id="331951419404882060">સાઇન ઇનમાં ભૂલ આવવાને કારણે Chromium તમારા ડેટાને સિંક કરી શક્યું નથી.</translation> +<translation id="347328004046849135">જ્યારે તમે ચેડાં કરવામાં આવેલા પાસવર્ડ વડે સાઇન ઇન કરશો ત્યારે Chromium તમને સૂચિત કરશે</translation> <translation id="3474745554856756813">આ, <ph name="ITEMS_COUNT" /> આઇટમને આ ડિવાઇસમાંથી ડિલીટ કરશે. પછીથી તમારો ડેટા ફરીથી મેળવવા માટે, Chromium માં <ph name="USER_EMAIL" /> તરીકે સાઇન ઇન કરો.</translation> <translation id="3509308970982693815">કૃપા કરીને બધી Chromium વિંડોઝ બંધ કરો અને ફરીથી પ્રયાસ કરો.</translation> <translation id="3575459661164320785">તમારા કમ્પ્યુટરમાં નુકસાનકારક સૉફ્ટવેર છે. Chromium તે કાઢી શકે છે, તમારું સેટિંગ પાછું મેળવી શકે છે અને એક્સ્ટેંશન બંધ કરી શકે છે જેથી તમારું બ્રાઉઝર ફરી સામાન્ય રીતે કામ કરી શકે.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">છતાં પણ Chromium બંધ કરવું છે?</translation> <translation id="4748217263233248895">Chromium માટેનું એક વિશિષ્ટ સુરક્ષા અપડેટ હમણાં જ લાગુ કરવામાં આવ્યું. હવે ફરી શરૂ કરો અને અમે તમારાં ટૅબની પુનઃસ્થાપના કરીશું.</translation> <translation id="4750035648288509542">લગભગ અપ ટૂ ડેટ છે! અપડેટ કરવાનું સમાપ્ત કરવા માટે Chromium ફરી શરૂ કરો. છૂપી વિંડો ફરીથી ખૂલશે નહીં.</translation> +<translation id="4788777615168560705">Chromium તમારા પાસવર્ડ ચેક કરી શકતું નથી. 24 કલાક પછી ફરી પ્રયાસ કરજો અથવા <ph name="BEGIN_LINK" />તમારા Google એકાઉન્ટમાં પાસવર્ડ ચેક કરો<ph name="END_LINK" />.</translation> <translation id="479167709087336770">આ પણ Google શોધમાં જે જોડણી તપાસનારનો ઉપયોગ થાય છે તેનો જ ઉપયોગ કરે છે. તમે બ્રાઉઝરમાં ટાઇપ કરો છો તે ટેક્સ્ટ Googleને મોકલવામાં આવે છે. તમે સેટિંગમાં આ વર્તણૂકને હંમેશાં બદલી શકો છો.</translation> <translation id="4888717733111232871">mDNS ટ્રાફિકને મંજૂરી આપવા Chromium માટે ઇનબાઉન્ડ નિયમ.</translation> <translation id="4943838377383847465">Chromium પૃષ્ઠભૂમિ મોડમાં છે.</translation> <translation id="4987820182225656817">અતિથિઓ કંઈપણ પાછળ છોડ્યાં વિના Chromium નો ઉપયોગ કરી શકે છે.</translation> <translation id="4994636714258228724">સ્વયંને Chromium માં ઉમેરો</translation> +<translation id="5224391634244552924">કોઈ સાચવેલા પાસવર્ડ નથી. જ્યારે તમે તમારા પાસવર્ડ સાચવો ત્યારે Chromium તેને ચેક કરી શકે છે.</translation> <translation id="5277894862589591112">તમારા ફેરફારો લાગુ કરવા માટે, Chromiumને ફરી લૉન્ચ કરો</translation> <translation id="5358375970380395591">તમે મેનેજ કરેલા એકાઉન્ટ સાથે સાઇન ઇન કરી રહ્યાં છો અને તમારી Chromium પ્રોફાઇલ પર એનું એડમિન નિયંત્રણ આપી રહ્યાં છો. તમારો Chromium ડેટા, જેમ કે ઍપ, બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને બીજા સેટિંગ, કાયમ માટે <ph name="USER_NAME" /> થી બંધાયેલ રહેશે. તમે Google એકાઉન્ટ ડૅશબોર્ડથી આ ડેટાને કાઢી શકશો, પરંતુ તમે આ ડેટાને બીજા એકાઉન્ટ સાથે સાંકળી શકશો નહિ. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium અપડેટ થઈ રહ્યું છે (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS તમારા ડેટાને સિંક કરી શક્યું નથી. કૃપા કરીને તમારા સિંક પાસફ્રેઝને અપડેટ કરો.</translation> <translation id="7067091210845072982">જો છબીમાં ઉપયોગી વર્ણન ન હોય, તો Chromium તમને વર્ણન પૂરું પાડવાનો પ્રયાસ કરશે. વર્ણન બનાવવા માટે, Googleને છબીઓ મોકલવામાં આવે છે.</translation> <translation id="7196312274710523067">Chromium લૉન્ચ કરી શકાયું નથી. ફરી પ્રયાસ કરો.</translation> +<translation id="7197677400338048821">Chromium તમારા પાસવર્ડ ચેક કરી શકતું નથી. 24 કલાક પછી ફરી પ્રયાસ કરો.</translation> <translation id="7205698830395646142">Chromium મેનૂમાં છુપાવો</translation> <translation id="7223968959479464213">કાર્ય વ્યવસ્થાપક - Chromium</translation> <translation id="731644333568559921">&Chromium OSને અપડેટ કરો</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index 928fb6b..084b661 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">फिर से लॉन्च करें</translation> <translation id="2805036593126168338">क्रोमियम OS आपके पासवर्ड सिंक नहीं कर सका. अभी ठीक करें.</translation> <translation id="2847479871509788944">क्रोमियम से निकालें...</translation> -<translation id="2886012850691518054">वैकल्पिक: अपने आप इस्तेमाल के आंकड़े और खराबी रिपोर्ट Google को भेजकर Chrome को बेहतर बनाने में मदद करें.</translation> <translation id="2910007522516064972">&क्रोमियम के बारे में</translation> <translation id="2977470724722393594">क्रोमियम अप टू डेट है</translation> <translation id="2983934633046890458">क्रोमियम, पासवर्ड में बदलाव करने की कोशिश कर रहा है.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Google API (एपीआई) कुंजियां मौजूद नहीं हैं. क्रोमियम के कुछ फ़ंक्शन बंद कर दिए जाएंगे.</translation> <translation id="3296368748942286671">जब क्रोमियम बंद हो तब पृष्ठभूमि ऐप्लिकेशन चलाना जारी रखें</translation> <translation id="331951419404882060">प्रवेश करने संबंधी गड़बड़ी के कारण क्रोमियम OS आपका डेटा समन्वयित नहीं कर सका.</translation> +<translation id="347328004046849135">जब आप किसी हैक या चोरी हो चुके पासवर्ड से साइन इन करेंगे, तब क्रोमियम आपको इसकी सूचना देगा</translation> <translation id="3474745554856756813">ऐसा करने से इस डिवाइस से <ph name="ITEMS_COUNT" /> आइटम मिट जाएंगे. बाद में अपना डेटा पाने के लिए, Chromium में <ph name="USER_EMAIL" /> के रूप में साइन इन करें.</translation> <translation id="3509308970982693815">कृपया सभी क्रोमियम विंडो बंद करें और फिर से प्रयास करें.</translation> <translation id="3575459661164320785">आपके कंप्यूटर पर नुकसान पहुंचाने वाला सॉफ़्टवेयर है. क्रोमियम उसे हटा सकता है, आपकी सेटिंग को बहाल कर सकता है, और एक्सटेंशन को बंद कर सकता है, ताकि आपका ब्राउज़र फिर सामान्य रूप से काम करने लगे.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">फिर भी क्रोमियम छोड़ें?</translation> <translation id="4748217263233248895">क्रोमियम के लिए एक खास सुरक्षा अपडेट अभी लागू किया गया था. अभी रीस्टार्ट करें और हम आपके टैब बहाल कर देंगे.</translation> <translation id="4750035648288509542">करीब-करीब अपडेट हो गया है! अपडेट पूरा करने के लिए क्रोमियम को फिर से लॉन्च करें. गुप्त विंडो फिर से नहीं खुलेंगी.</translation> +<translation id="4788777615168560705">क्रोमियम आपके पासवर्ड की जांच नहीं कर सकता. 24 घंटे बाद कोशिश करें या <ph name="BEGIN_LINK" />अपने Google खाते के पासवर्ड की जांच करें<ph name="END_LINK" />.</translation> <translation id="479167709087336770">इसमें स्पेलिंग जाँचने वाली उसी सुविधा का इस्तेमाल होता है जिसका इस्तेमाल 'Google सर्च' में किया जाता है. आप ब्राउज़र में जो भी लेख लिखते हैं उसे Google को भेजा जाता है. आप 'सेटिंग' में जाकर इसे कभी भी बदल सकते हैं.</translation> <translation id="4888717733111232871">mDNS ट्रैफ़िक की अनुमति देने के लिए क्रोमियम के लिए इनबाउंड नियम.</translation> <translation id="4943838377383847465">क्रोमियम पृष्ठभूमि मोड में है.</translation> <translation id="4987820182225656817">अतिथि कुछ भी छोड़े बिना क्रोमियम का उपयोग कर सकते हैं.</translation> <translation id="4994636714258228724">स्वयं को क्रोमियम में जोड़ें</translation> +<translation id="5224391634244552924">कोई भी पासवर्ड सेव नहीं किया गया है. आप जब अपने पासवर्ड सेव करते हैं, तो क्रोमियम उनकी जांच कर सकता है.</translation> <translation id="5277894862589591112">अपने बदलाव लागू करने के लिए, क्रोमियम को फिर से लॉन्च करें</translation> <translation id="5358375970380395591">आप प्रबंधित खाते से साइन इन कर रहे हैं और उसके एडमिन को अपनी क्रोमियम प्रोफ़ाइल पर नियंत्रण दे रहे हैं. आपका क्रोमियम डेटा, जैसे आपके ऐप्लिकेशन, बुकमार्क, इतिहास, पासवर्ड, और दूसरे सेटिंग स्थायी रूप से <ph name="USER_NAME" /> से जुड़ जाएंगे. आप Google खाता डैशबोर्ड के ज़रिए इस डेटा को मिटा सकेंगे, लेकिन आप किसी अन्य खाते से इस डेटा को जोड़ नहीं सकेंगे. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">क्रोमियम अपडेट हो रहा है (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">क्रोमियम OS आपका डेटा सिंक नहीं कर सका. कृपया अपना सिंक 'पासफ़्रेज़' अपडेट करें.</translation> <translation id="7067091210845072982">अगर किसी इमेज के बारे में मददगार जानकारी मौजूद नहीं है, तो 'क्रोमियम' उसके बारे में जानकारी देने की कोशिश करेगा. जानकारी तैयार करने के लिए, इमेज Google को भेजी जाती हैं.</translation> <translation id="7196312274710523067">Chromium लॉन्च नहीं किया जा सका. फिर से कोशिश करें.</translation> +<translation id="7197677400338048821">क्रोमियम आपके पासवर्ड की जांच नहीं कर सकता. 24 घंटे बाद कोशिश करें.</translation> <translation id="7205698830395646142">क्रोमियम मेन्यू में छिपाएं</translation> <translation id="7223968959479464213">काम का प्रबंधक - क्रोमियम</translation> <translation id="731644333568559921">क्रोमियम OS अपडेट करें</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index 5a8338c4..64209d3 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Pokreni ponovo</translation> <translation id="2805036593126168338">OS Chromium nije mogao sinkronizirati vaše zaporke. Ispravite to odmah.</translation> <translation id="2847479871509788944">Ukloni iz Chromiuma...</translation> -<translation id="2886012850691518054">Dodatno: pomognite nam da poboljšamo Chromium automatskim slanjem statistike o upotrebi i izvješća o padu programa Googleu.</translation> <translation id="2910007522516064972">O pregledniku &Chromium</translation> <translation id="2977470724722393594">Chromium je ažuran</translation> <translation id="2983934633046890458">Chromium pokušava urediti zaporke.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Nedostaju ključevi Google API-ja. Neke funkcije Chromiuma bit će onemogućene.</translation> <translation id="3296368748942286671">Nastavi izvršavati pozadinske aplikacije po zatvaranju preglednika Chromium</translation> <translation id="331951419404882060">OS Chromium nije mogao sinkronizirati vaše podatke zbog pogreške prilikom prijave.</translation> +<translation id="347328004046849135">Chrome će vas obavijestiti kada se prijavite ugroženom zaporkom</translation> <translation id="3474745554856756813">Time će se izbrisati sljedeći broj stavki s uređaja: <ph name="ITEMS_COUNT" />. TDa biste kasnije dohvatili svoje podatke, prijavite se na Chromium kao <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Zatvorite sve prozore preglednika Chromium i pokušajte ponovo.</translation> <translation id="3575459661164320785">Na računalu imate štetni softver. Chromium ga može ukloniti, vratiti vaše postavke i onemogućiti proširenja kako bi vaš preglednik ponovo funkcionirao normalno.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Želite li ipak zatvoriti Chromium?</translation> <translation id="4748217263233248895">Upravo je primijenjeno posebno sigurnosno ažuriranje za Chromium. Ponovo pokrenite sustav i vratit ćemo vaše kartice.</translation> <translation id="4750035648288509542">Ažuriranje je skoro gotovo! Ponovo pokrenite Chromium da biste završili ažuriranje. Anonimni prozori neće se ponovno otvoriti.</translation> +<translation id="4788777615168560705">Chromium ne može provjeriti vaše zaporke. Pokušajte ponovno nakon 24 sata ili <ph name="BEGIN_LINK" />provjerite zaporke na svojem Google računu<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Upotrebljava istu provjeru pravopisa koja se upotrebljava na Google pretraživanju. Tekst koji unesete u preglednik šalje se Googleu. To ponašanje možete promijeniti u postavkama kad god želite.</translation> <translation id="4888717733111232871">Ulazno pravilo kako bi Chromium dopustio mDNS promet.</translation> <translation id="4943838377383847465">Chromium radi u pozadini.</translation> <translation id="4987820182225656817">Gosti mogu upotrebljavati Chromium bez ostavljanja tragova o upotrebi.</translation> <translation id="4994636714258228724">Dodajte sebe kao korisnika Chromiuma</translation> +<translation id="5224391634244552924">Nema nijedne spremljene zaporke. Chromium može provjeriti vaše zaporke kad ih spremite.</translation> <translation id="5277894862589591112">Da bi se vaše promjene primijenile, ponovo pokrenite Chromium</translation> <translation id="5358375970380395591">Prijavljujete se upravljanim računom i dajete administratoru kontrolu nad svojim profilom u sustavu Chromium. Vaši podaci u sustavu Chromium, primjerice, aplikacije, oznake, povijest, zaporke i ostale postavke, trajno će se povezati s korisnikom <ph name="USER_NAME" />. Moći ćete izbrisati te podatke putem Nadzorne ploče Google računa, ali ih nećete moći povezati s nekim drugim računom. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Ažuriranje Chromiuma (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">OS Chromium nije mogao sinkronizirati vaše podatke. Ažurirajte svoju zaporku za sinkronizaciju.</translation> <translation id="7067091210845072982">Ako slika nema koristan opis, Chromium će ga pokušati pružiti. Da bi se izradili opisi, slike se šalju Googleu.</translation> <translation id="7196312274710523067">Pokretanje Chromiuma nije uspjelo. Pokušajte ponovo.</translation> +<translation id="7197677400338048821">Chromium ne može provjeriti vaše zaporke. Pokušajte ponovno nakon 24 sata.</translation> <translation id="7205698830395646142">Sakrij u izborniku Chromiuma</translation> <translation id="7223968959479464213">Upravitelj zadataka – Chromium</translation> <translation id="731644333568559921">Ažuriranje OS-a &Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index 60ec3c6..3500abb 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Újraindítás</translation> <translation id="2805036593126168338">A Chromium OS nem tudta szinkronizálni az Ön jelszavait. Javítsa most.</translation> <translation id="2847479871509788944">Eltávolítás a Chromiumból…</translation> -<translation id="2886012850691518054">Opcionális: Segítsen a Chromium fejlesztésében azáltal, hogy automatikusan elküldi a használati statisztikákat és hibajelentéseket a Google-nak.</translation> <translation id="2910007522516064972">A &Chromium névjegye</translation> <translation id="2977470724722393594">A Chromium naprakész</translation> <translation id="2983934633046890458">A Chromium szerkeszteni próbálja a jelszavakat.</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb index fa4a4fc1..d0b878a 100644 --- a/chrome/app/resources/chromium_strings_hy.xtb +++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Վերագործարկել</translation> <translation id="2805036593126168338">Chromium OS-ը չկարողացավ համաժամացնել ձեր գաղտնաբառերը։ Շտկել խնդիրը։</translation> <translation id="2847479871509788944">Հեռացնել Chromium-ից...</translation> -<translation id="2886012850691518054">Կամընտիր. Օգնեք բարելավել Chromium-ը՝ ավտոմատ Google-ին ուղարկելով օգտագործման վիճակագրությունները և խափանումների մասին հաշվետվությունները:</translation> <translation id="2910007522516064972">&Chromium-ի մասին</translation> <translation id="2977470724722393594">Chromium-ը թարմացված է</translation> <translation id="2983934633046890458">Chromium-ը փորձում է փոխել գաղտնաբառերը:</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index 013c97ba..6c2287d 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Luncurkan Ulang</translation> <translation id="2805036593126168338">Chromium OS tidak dapat menyinkronkan sandi Anda. Perbaiki sekarang.</translation> <translation id="2847479871509788944">Buang dari Chromium...</translation> -<translation id="2886012850691518054">Opsional: Bantu menjadikan Chrome lebih baik dengan mengirim statistik penggunaan dan laporan kerusakan secara otomatis ke Google.</translation> <translation id="2910007522516064972">Tentang &Chromium</translation> <translation id="2977470724722393594">Chromium sudah diperbarui</translation> <translation id="2983934633046890458">Chromium mencoba mengedit sandi.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Kunci API Google tidak ada. Beberapa fungsi Chromium tidak akan berfungsi.</translation> <translation id="3296368748942286671">Lanjutkan aplikasi yang berjalan di latar belakang jika Chromium ditutup</translation> <translation id="331951419404882060">Chromium OS tidak dapat menyinkronkan data Anda karena kesalahan saat masuk.</translation> +<translation id="347328004046849135">Chromium akan memberi tahu Anda saat Anda login dengan sandi yang telah dibobol</translation> <translation id="3474745554856756813">Tindakan ini akan menghapus <ph name="ITEMS_COUNT" /> item dari perangkat. Untuk mengambil data nanti, login ke Chromium sebagai <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Tutup semua jendela Chromium dan coba lagi.</translation> <translation id="3575459661164320785">Ada software berbahaya di komputer Anda. Chromium dapat menghapusnya, memulihkan setelan Anda, dan menonaktifkan ekstensi agar browser berfungsi kembali secara normal.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Tetap tutup Chromium?</translation> <translation id="4748217263233248895">Update keamanan khusus untuk Chromium baru saja diterapkan. Mulai ulang Chromium sekarang dan kami akan memulihkan tab Anda.</translation> <translation id="4750035648288509542">Update hampir selesai. Luncurkan ulang Chromium untuk menyelesaikan update. Jendela Samaran tidak akan dibuka kembali.</translation> +<translation id="4788777615168560705">Chromium tidak dapat memeriksa sandi Anda. Coba lagi setelah 24 jam atau <ph name="BEGIN_LINK" />periksa sandi di Akun Google Anda<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Tindakan ini akan menggunakan pemeriksa ejaan yang sama dengan yang digunakan di penelusuran Google. Teks yang Anda ketikkan di browser dikirim ke Google. Anda dapat mengubah perilaku ini di setelan.</translation> <translation id="4888717733111232871">Inbound rule untuk Chromium guna mengizinkan lalu lintas mDNS.</translation> <translation id="4943838377383847465">Chromium berjalan di mode latar belakang.</translation> <translation id="4987820182225656817">Tamu dapat menggunakan Chromium tanpa meninggalkan apa pun.</translation> <translation id="4994636714258228724">Tambahkan diri Anda ke Chromium</translation> +<translation id="5224391634244552924">Tidak ada sandi yang tersimpan. Chromium dapat memeriksa sandi saat Anda menyimpannya.</translation> <translation id="5277894862589591112">Untuk menerapkan perubahan Anda, luncurkan ulang Chromium</translation> <translation id="5358375970380395591">Anda masuk dengan akun terkelola dan memberikan administratornya kontrol atas profil Chromium Anda. Data Chromium Anda, seperti aplikasi, bookmark, histori, sandi, dan setelan lain selamanya akan dikaitkan ke <ph name="USER_NAME" />. Anda dapat menghapus data ini melalui Dasbor Akun Google, namun Anda tidak akan dapat mengaitkan data ini dengan akun yang lain. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Memperbarui Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium OS tidak dapat menyinkronkan data Anda. Perbarui frasa sandi Sinkronisasi Anda.</translation> <translation id="7067091210845072982">Jika gambar tidak memiliki deskripsi yang berguna, Chromium akan mencoba memberikan deskripsi untuk Anda. Untuk membuat deskripsi, gambar akan dikirim ke Google.</translation> <translation id="7196312274710523067">Tidak dapat meluncurkan Chromium. Harap coba lagi.</translation> +<translation id="7197677400338048821">Chromium tidak dapat memeriksa sandi Anda. Coba lagi setelah 24 jam.</translation> <translation id="7205698830395646142">Sembunyikan di Menu Chromium</translation> <translation id="7223968959479464213">Pengelola Tugas - Chromium</translation> <translation id="731644333568559921">Pembaruan &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb index da3baff6..faf9a15 100644 --- a/chrome/app/resources/chromium_strings_is.xtb +++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Endurræsa</translation> <translation id="2805036593126168338">Chromium OS gat ekki samstillt aðgangsorðin þín. Laga núna.</translation> <translation id="2847479871509788944">Fjarlægja úr Chromium...</translation> -<translation id="2886012850691518054">Valfrjálst: Hjálpaðu til við að bæta Chromium með því að senda sjálfkrafa talnagögn um notkun og tilkynningar um hrun til Google.</translation> <translation id="2910007522516064972">Um &Chromium</translation> <translation id="2977470724722393594">Chromium er uppfært</translation> <translation id="2983934633046890458">Chromium er að reyna að breyta aðgangsorðum.</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index bf31e34e..35fece8 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Riavvia</translation> <translation id="2805036593126168338">Impossibile sincronizzare le password in Chromium OS. Risolvi subito il problema.</translation> <translation id="2847479871509788944">Rimuovi da Chromium...</translation> -<translation id="2886012850691518054">Facoltativo: aiutaci a migliorare Chromium inviando automaticamente a Google statistiche sull'utilizzo e rapporti sugli arresti anomali.</translation> <translation id="2910007522516064972">Informazioni su &Chromium</translation> <translation id="2977470724722393594">Chromium è aggiornato</translation> <translation id="2983934633046890458">Chromium sta cercando di modificare le password.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Mancano le chiavi dell'API di Google. Alcune funzionalità di Chromium verranno disattivate.</translation> <translation id="3296368748942286671">Continua a eseguire applicazioni in background dopo la chiusura di Chromium</translation> <translation id="331951419404882060">Impossibile sincronizzare i dati in Chromium OS a causa di un errore durante l'accesso.</translation> +<translation id="347328004046849135">Chromium ti invierà una notifica quando accederai con una password compromessa</translation> <translation id="3474745554856756813">Verranno eliminati <ph name="ITEMS_COUNT" /> elementi da questo dispositivo. Per recuperare i dati in un secondo momento, accedi a Chromium come <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Chiudi tutte le finestre di Chromium e riprova.</translation> <translation id="3575459661164320785">È stato rilevato software dannoso sul tuo computer. Chromium può rimuoverlo, ripristinare le tue impostazioni e disattivare le estensioni per ristabilire il normale funzionamento del browser.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Vuoi chiudere comunque Chromium?</translation> <translation id="4748217263233248895">È stato appena applicato un aggiornamento di sicurezza speciale per Chromium. Riavvia ora e le schede verranno ripristinate.</translation> <translation id="4750035648288509542">Aggiornamento quasi terminato. Riavvia Chromium per terminare l'aggiornamento. Le finestre di navigazione in incognito non verranno riaperte.</translation> +<translation id="4788777615168560705">Chromium non può controllare le tue password. Riprova tra 24 ore oppure <ph name="BEGIN_LINK" />controlla le password nel tuo Account Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Viene usato lo stesso controllo ortografico utilizzato nella Ricerca Google. Il testo che digiti nel browser viene inviato a Google. Puoi modificare questo comportamento in qualsiasi momento nelle impostazioni.</translation> <translation id="4888717733111232871">Regola inbound per consentire il traffico mDNS in Chromium.</translation> <translation id="4943838377383847465">Chromium è in modalità background.</translation> <translation id="4987820182225656817">Gli ospiti possono utilizzare Chromium senza lasciare tracce.</translation> <translation id="4994636714258228724">Aggiungiti a Chromium</translation> +<translation id="5224391634244552924">Nessuna password salvata. Chromium può controllare le password quando le salvi.</translation> <translation id="5277894862589591112">Riavvia Chromium per applicare le modifiche</translation> <translation id="5358375970380395591">Stai per accedere con un account gestito e per dare al relativo amministratore il controllo del tuo profilo Chromium. I tuoi dati di Chromium, come app, Preferiti, cronologia, password e altre impostazioni, verranno collegati definitivamente a <ph name="USER_NAME" />. Potrai eliminare questi dati tramite la Dashboard di Google Account, ma non potrai associare questi dati a un altro account. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Aggiornamento di Chromium in corso (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Impossibile sincronizzare i dati in Chromium OS. Aggiorna la passphrase di sincronizzazione.</translation> <translation id="7067091210845072982">Se un'immagine è senza descrizione utile, Chromium proverà a fornirne una. Per la creazione delle descrizioni, le immagini vengono inviate a Google.</translation> <translation id="7196312274710523067">Impossibile avviare Chromium. Riprova.</translation> +<translation id="7197677400338048821">Chromium non può controllare le tue password. Riprova tra 24 ore.</translation> <translation id="7205698830395646142">Nascondi in menu Chromium</translation> <translation id="7223968959479464213">Task Manager - Chromium</translation> <translation id="731644333568559921">Aggiorna &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index 1275687..6aa090e 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">הפעל מחדש</translation> <translation id="2805036593126168338">מערכת Chromium OS לא הצליחה לסנכרן את הסיסמאות שלך. לפתרון הבעיה עכשיו.</translation> <translation id="2847479871509788944">הסר מ-Chromium...</translation> -<translation id="2886012850691518054">אופציונלי: עזור לנו לשפר את Chromium באמצעות שליחת נתוני שימוש ודוחות קריסה אל Google באופן אוטומטי.</translation> <translation id="2910007522516064972">מידע על &Chromium</translation> <translation id="2977470724722393594">Chromium מעודכן</translation> <translation id="2983934633046890458">Chromium מנסה לערוך את הסיסמאות.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index 59159ed..9655621 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">再起動</translation> <translation id="2805036593126168338">Chromium OS でパスワードを同期できませんでした。今すぐ問題を修正してください。</translation> <translation id="2847479871509788944">Chromium から削除...</translation> -<translation id="2886012850691518054">オプション: 使用状況データと障害レポートを Google に自動送信して Chromium の機能向上に役立てる。</translation> <translation id="2910007522516064972">Chromium について(&C)</translation> <translation id="2977470724722393594">Chromium は最新版です</translation> <translation id="2983934633046890458">Chromium でパスワードを編集しようとしています。</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Google API キーが欠落しています。Chromium の一部の機能は無効になります。</translation> <translation id="3296368748942286671">Chromium を閉じた際にバックグラウンド アプリの処理を続行する</translation> <translation id="331951419404882060">ログイン時にエラーが発生したため、Chromium OS はデータを同期できませんでした。</translation> +<translation id="347328004046849135">不正使用されたパスワードでログインした場合、Chromium で通知します</translation> <translation id="3474745554856756813">このデバイスから <ph name="ITEMS_COUNT" /> 件の項目を削除します。後でデータを取得するには、<ph name="USER_EMAIL" /> として Chromium にログインしてください。</translation> <translation id="3509308970982693815">すべての Chromium ウィンドウを閉じてからもう一度お試しください。</translation> <translation id="3575459661164320785">お使いのパソコンに有害なソフトウェアが見つかりました。Chromium では、ブラウザを正常な動作に戻すためにこのソフトウェアを削除し、設定を復元して、拡張機能を無効化することができます。</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">今すぐ Chromium を終了しますか?</translation> <translation id="4748217263233248895">Chromium の特別なセキュリティ アップデートが適用されました。今すぐ再起動してください。タブは復元されます。</translation> <translation id="4750035648288509542">アップデートが適用されました。更新を完了するには Chromium を再起動してください。再起動後、シークレット ウィンドウは自動的に開きません。</translation> +<translation id="4788777615168560705">Chromium でパスワードを確認できません。24 時間後にもう一度お試しいただくか、<ph name="BEGIN_LINK" />Google アカウントでパスワードをご確認ください<ph name="END_LINK" />。</translation> <translation id="479167709087336770">Google 検索と同じスペルチェックが使用されます。ブラウザに入力したテキストは Google に送信されます。この動作はいつでも設定で変更できます。</translation> <translation id="4888717733111232871">mDNS トラフィックを許可する Chromium のインバウンド ルールです。</translation> <translation id="4943838377383847465">Chromium はバックグラウンド モードです。</translation> <translation id="4987820182225656817">ゲスト ユーザーは、記録を残さずに Chromium を使用できます。</translation> <translation id="4994636714258228724">Chromium に自分を追加</translation> +<translation id="5224391634244552924">保存されているパスワードがありません。パスワードを保存すると、Chromium で確認できるようになります。</translation> <translation id="5277894862589591112">変更を適用するには Chromium を再起動してください</translation> <translation id="5358375970380395591">現在、管理対象アカウントでログインしており、あなたの Chromium プロフィールを管理者が制御できる状態になっています。あなたの Chromium データ(アプリ、ブックマーク、履歴、パスワードなどの設定)は永続的に <ph name="USER_NAME" /> に関連付けられます。このデータは Google アカウントのダッシュボードを介して削除できますが、このデータを別のアカウントに関連付けることはできなくなります。<ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium を更新しています(<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium OS はデータを同期できませんでした。同期パスフレーズを更新してください。</translation> <translation id="7067091210845072982">画像に有効な説明が設定されていない場合に、Chromium で説明を自動的に生成できるよう Google に画像が送信されます。</translation> <translation id="7196312274710523067">Chromium を起動できませんでした。もう一度お試しください。</translation> +<translation id="7197677400338048821">Chromium でパスワードを確認できません。24 時間後にもう一度お試しください。</translation> <translation id="7205698830395646142">Chromium メニューで非表示</translation> <translation id="7223968959479464213">タスク マネージャ - Chromium</translation> <translation id="731644333568559921">Chromium OS を更新(&C)</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb index 2de30193..af24578 100644 --- a/chrome/app/resources/chromium_strings_ka.xtb +++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">ხელახლა გაშვება</translation> <translation id="2805036593126168338">Chromium OS-მა ვერ მოახერხა თქვენი პაროლების სინქრონიზაცია. შეასწორეთ ახლავე.</translation> <translation id="2847479871509788944">Chromium-იდან ამოღება...</translation> -<translation id="2886012850691518054">არასავალდებულო: დაგვეხმარეთ Chromium-ის გაუმჯობესებაში, გამოყენების სტატისტიკისა და შეცდომების შესახებ მოხსენების Google-ში ავტომატური გაგზავნის გზით.</translation> <translation id="2910007522516064972">Chromium-ის შ&ესახებ</translation> <translation id="2977470724722393594">Chromium განახლებულია</translation> <translation id="2983934633046890458">Chromium ცდილობს პაროლების რედაქტირებას.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API გასაღები გამოტოვებულია. Chromium-ის ზოგიერთი ფუნქცია გამორთული იქნება.</translation> <translation id="3296368748942286671">ფონური პროგრამების გაშვების გაგრძელება, როდესაც Chromium იხურება</translation> <translation id="331951419404882060">Chromium OS-მა ვერ დაასინქრონა თქვენი მონაცემები შესვლის შეცდომის გამო.</translation> +<translation id="347328004046849135">Chromium შეგატყობინებთ, როცა სისტემაში გატეხილი პაროლით შეხვალთ</translation> <translation id="3474745554856756813">ეს მოქმედება წაშლის <ph name="ITEMS_COUNT" /> ერთეულს ამ მოწყობილობიდან. თქვენი მონაცემების მოგვიანებით მისაღებად, შედით Chromium-ში, როგორც <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">დახურეთ Chromium-ის ყველა ფანჯარა და ხელახლა სცადეთ.</translation> <translation id="3575459661164320785">თქვენს კომპიუტერზე აღმოჩენილია საზიანო პროგრამული უზრუნველყოფა. Chromium-ს შეუძლია მისი ამოშლა, თქვენი პარამეტრების აღდგენა და გაფართოებების გათიშვა, რომ ბრაუზერმა კვლავ ნორმალურად იმუშაოს.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">მაინც გსურთ Chromium-იდან გასვლა?</translation> <translation id="4748217263233248895">Chromium-ს ეს-ესაა მიესადაგა უსაფრთხოების საგანგებო განახლება. გადატვირთეთ ის ახლავე (თქვენი ჩანართები აღდგება).</translation> <translation id="4750035648288509542">ყველაფერი თითქმის მზადაა! განახლების დასასრულებლად ხელახლა გაუშვით Chromium. ინკოგნიტო ფანჯრები ხელახლა არ გაიხსნება.</translation> +<translation id="4788777615168560705">Chromium ვერ ახერხებს პაროლების შემოწმებას. ცადეთ 24 საათში ან <ph name="BEGIN_LINK" />შეამოწმეთ პაროლები თქვენს Google ანგარიშში<ph name="END_LINK" />.</translation> <translation id="479167709087336770">ეს ფუნქცია იყენებს მართლწერის იმ შემმოწმებელს, რომელიც გამოიყენება Google Search-ში. ბრაუზერში თქვენ მიერ აკრეფილი ტექსტი ეგზავნება Google-ს. ამ ქცევის შეცვლა ნებისმიერ დროს შეგიძლიათ პარამეტრებიდან.</translation> <translation id="4888717733111232871">Chromium-ის შემავალი წესი დაუშვას mDNS მოძრაობა.</translation> <translation id="4943838377383847465">Chromium ფონურ რეჟიმშია.</translation> <translation id="4987820182225656817">სტუმრებს შეუძლიათ Chromium-ის გამოყენება და მისი ყველა ფუნქციით სარგებლობა.</translation> <translation id="4994636714258228724">საკუთარი თავის დამატება Chromium-ში</translation> +<translation id="5224391634244552924">შენახული პაროლები არ არის. პაროლების შემოწმებას Chromium შეძლებს მათი შენახვის შემდეგ.</translation> <translation id="5277894862589591112">ცვლილებების მისასადაგებლად ხელახლა გაუშვით Chromium</translation> <translation id="5358375970380395591">მართული ანგარიშით შედიხართ სისტემაში და ადმინისტრატორს თქვენს Chromium-ის პროფილზე კონტროლს აძლევთ. თქვენი Chromium ის მონაცემები როგორიცაა თქვენი აპლიკაციები, სანიშნები, ისტორიები, პაროლები, და სხვა პარამეტრები მუდმივად მიბმული გახდება <ph name="USER_NAME" />-თან. ამ მონაცემების წაშლას Google ანგარიშის საინფორმაციო დაფის გზით შეძლებთ, მაგრამ შეუძლებელი იქნება ამ მონაცემების სხვა ანგარიშთან გაერთიანება. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">მიმდინარეობს Chromium-ის განახლება (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS-მა ვერ დაასინქრონა თქვენი მონაცემები. განაახლეთ სინქრონიზაციის საიდუმლო ფრაზა.</translation> <translation id="7067091210845072982">თუ სურათს არ ექნება სასარგებლო აღწერილობა, Chromium შეეცდება მის უზრუნველყოფას. აღწერილობების შესაქმნელად სურათები იგზავნება Google-ში.</translation> <translation id="7196312274710523067">Chromium-ის გაშვება ვერ მოხერხდა. ცადეთ ხელახლა.</translation> +<translation id="7197677400338048821">Chromium ვერ ახერხებს პაროლების შემოწმებას. ცადეთ 24 საათში.</translation> <translation id="7205698830395646142">Chromium-ის მენიუში დამალვა</translation> <translation id="7223968959479464213">დავალებათა მენეჯერი - Chromium</translation> <translation id="731644333568559921">&Chromium OS-ის განახლება</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb index 06f5db78..3a1dca8 100644 --- a/chrome/app/resources/chromium_strings_kk.xtb +++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Қайта іске қосу</translation> <translation id="2805036593126168338">Chromium OS құпия сөздеріңізді синхрондай алмады. Қазір түзетіңіз.</translation> <translation id="2847479871509788944">Chromium жүйесінен алып тастау…</translation> -<translation id="2886012850691518054">Қосымша: Google компаниясына пайдалану статистикасы мен жаңылыс есептерін автоматты түрде жіберу арқылы Chromium қызметін жақсартуға көмектесіңіз.</translation> <translation id="2910007522516064972">&Chromium туралы</translation> <translation id="2977470724722393594">Chromium жаңартылған</translation> <translation id="2983934633046890458">Chromium браузері құпия сөздерді өзгерткісі келеді.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API пернелері жоқ. Кейбір Chromium функциялары өшіріледі.</translation> <translation id="3296368748942286671">Chromium жабылғанда, фондық қолданбаларды пайдалануды жалғастыру</translation> <translation id="331951419404882060">Кіру кезіндегі қате себебінен Chromium OS деректеріңізді синхрондай алмайды.</translation> +<translation id="347328004046849135">Ұрланған құпия сөзбен кірген кезде, Chromium сізге хабарлайды.</translation> <translation id="3474745554856756813">Құрылғыдан <ph name="ITEMS_COUNT" /> элемент жойылады. Деректерді кейінірек алу үшін Chromium браузеріне <ph name="USER_EMAIL" /> болып кіріңіз.</translation> <translation id="3509308970982693815">Барлық Chromium терезелерін жауып, әрекетті қайталап көріңіз.</translation> <translation id="3575459661164320785">Компьютеріңізде зиянды бағдарламалық құрал бар. Chromium браузері оны өшіріп, параметрлеріңізді қалпына келтіреді де, кеңейтімдерді ажыратады. Соның арқасында браузеріңіз қалыпты жұмысын жалғастырады.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Chromium браузерінен бәрібір шығасыз ба?</translation> <translation id="4748217263233248895">Chromium браузеріне қазір ғана қауіпсіздік бойынша арнайы жаңартылған нұсқа қолданылды. Оны қазір қайта ашсаңыз, қойындылар қалпына келтіріледі.</translation> <translation id="4750035648288509542">Дайын болып қалды! Жаңарту үшін Chromium браузерін қайта іске қосыңыз. Инкогнито терезелері қайта ашылмайды.</translation> +<translation id="4788777615168560705">Chromium сіздің құпия сөздеріңізді тексере алмай жатыр. 24 сағаттан кейін қайталап көріңіз немесе <ph name="BEGIN_LINK" />құпия сөздерді Google есептік жазбасынан тексеріңіз<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Google Search қызметіндегі емлені тексеру құралы пайдаланылады. Браузерде терілген мәтін Google-ға жіберіледі. Мұны параметрлерде өзгертуіңізге болады.</translation> <translation id="4888717733111232871">mDNS трафигіне рұқсат беретін Chromium кіріс ережесі.</translation> <translation id="4943838377383847465">Chromium фондық режимде.</translation> <translation id="4987820182225656817">Қонақтар Chromium қолданбасын ешқандай дерек қалдырмай пайдалана алады.</translation> <translation id="4994636714258228724">Chromium жүйесіне өзіңізді қосу</translation> +<translation id="5224391634244552924">Ешқандай құпия сөз сақталмаған. Құпия сөздер сақталған кезде, Chromium оларды тексере алады.</translation> <translation id="5277894862589591112">Өзгерістер енуі үшін, Chromium браузерін қайта қосыңыз</translation> <translation id="5358375970380395591">Бақыланатын есептік жазба арқылы кірдіңіз және оның әкімшілік бөлігін Chromium профилі арқылы басқару мүмкіндігін бердіңіз. Қолданбалар, бетбелгілер, журнал, құпия сөздер сияқты Chromium деректеріңіз және басқа параметрлер біржола <ph name="USER_NAME" /> пайдаланушысына байланыстырылады. Бұл деректерді Google есептік жазба бақылау тақтасы арқылы жоя аласыз, бірақ бұл деректерді басқа есептік жазбамен байланыстыра алмайсыз. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium жаңартылуда (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS деректеріңізді синхрондай алмайды. Синхрондау құпия фразасын жаңартыңыз.</translation> <translation id="7067091210845072982">Егер суреттің пайдалы сипаттамасы болмаса, Chromium оны өзі ұсынып көреді. Сипаттамалар жасау үшін суреттер Google-ға жіберіледі.</translation> <translation id="7196312274710523067">Chromium браузері қосылмады. Қайталап көріңіз.</translation> +<translation id="7197677400338048821">Chromium сіздің құпия сөздеріңізді тексере алмай жатыр. 24 сағаттан кейін қайталап көріңіз.</translation> <translation id="7205698830395646142">Chromium мәзірінде жасыру</translation> <translation id="7223968959479464213">Тапсырмалар реттегіші – Chromium</translation> <translation id="731644333568559921">&Chromium OS жаңарту</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb index 64acd54b..696d085 100644 --- a/chrome/app/resources/chromium_strings_km.xtb +++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">បើកដំណើរការឡើងវិញ</translation> <translation id="2805036593126168338">Chromium OS មិនអាចធ្វើសមកាលកម្មពាក្យសម្ងាត់របស់អ្នកបានទេ។ ដោះស្រាយឥឡូវនេះ។</translation> <translation id="2847479871509788944">ដកចេញពី Chromium...</translation> -<translation id="2886012850691518054">ស្រេចចិត្ត៖ ជួយធ្វើឲ្យ Chromium ប្រសើរជាងមុនដោយការផ្ញើស្ថិតិការប្រើប្រាស់ និងរបាយការណ៍ការគាំងទៅ Google ដោយស្វ័យប្រវត្តិ។</translation> <translation id="2910007522516064972">អំពី Chromium</translation> <translation id="2977470724722393594">Chromium នេះជាកំណែថ្មីហើយ</translation> <translation id="2983934633046890458">Chromium កំពុងព្យាយាមកែពាក្យសម្ងាត់។</translation> @@ -61,6 +60,7 @@ <translation id="328888136576916638">សោ Google API បានបាត់។ មុខងារមួយចំនួននៃ Chromium នឹងត្រូវបានបិទដំណើរការ។</translation> <translation id="3296368748942286671">បន្តដំណើរការកម្មវិធីផ្ទៃខាងក្រោយ នៅពេល Chromium ត្រូវបានបិទ</translation> <translation id="331951419404882060">Chromium OS មិនអាចធ្វើសមកម្មទិន្នន័យរបស់អ្នកទេដោយសារកំហុសឆ្គងការចូល។</translation> +<translation id="347328004046849135">Chromium នឹងជូនដំណឹងទៅអ្នក នៅពេលអ្នកចូលគណនីដោយប្រើពាក្យសម្ងាត់ដែលរងការលុកលុយ</translation> <translation id="3474745554856756813">វានឹងលុបធាតុ <ph name="ITEMS_COUNT" /> ចេញពីឧបករណ៍នេះ។ ដើម្បីទាញយកទិន្នន័យរបស់អ្នកមកវិញនៅពេលក្រោយ សូមចូលទៅកាន់ Chromium ជា <ph name="USER_EMAIL" /> ។</translation> <translation id="3509308970982693815">សូមបិទផ្ទាំង Chromium ទាំងអស់ ហើយព្យាយាមម្តងទៀត។</translation> <translation id="3575459661164320785">មានកម្មវិធីបង្កគ្រោះថ្នាក់នៅលើកុំព្យូទ័ររបស់អ្នក។ Chrome អាចលុបវា ហើយស្តារការកំណត់របស់អ្នក ដើម្បីធ្វើឱ្យកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកដំណើរការធម្មតាឡើងវិញ។ Chromium អាចលុបកម្មវិធីនេះ ស្ដារការកំណត់របស់អ្នក និងបិទកម្មវិធីបន្ថែម ដើម្បីធ្វើឱ្យកម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកដំណើរការជាធម្មតាឡើងវិញ។</translation> @@ -96,11 +96,13 @@ <translation id="4746050847053251315">នៅតែចង់ចាកចេញពី Chromium ឬ?</translation> <translation id="4748217263233248895">ការធ្វើបច្ចុប្បន្នភាពផ្នែកសុវត្ថិភាពពិសេសសម្រាប់ Chromium ទើបតែត្រូវបានអនុវត្ត។ សូមចាប់ផ្ដើមឡើងវិញឥឡូវនេះ នោះយើងនឹងស្ដារផ្ទាំងរបស់អ្នក។</translation> <translation id="4750035648288509542">ជិតដំឡើងកំណែរួចរាល់ហើយ! សូមចាប់ផ្ដើម Chromium ឡើងវិញ ដើម្បីបញ្ចប់ការដំឡើងកំណែ។ ផ្ទាំងឯកជននឹងមិនបើកឡើងវិញទេ។</translation> +<translation id="4788777615168560705">Chromium មិនអាចពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀតក្រោយរយៈពេល 24 ម៉ោង ឬ<ph name="BEGIN_LINK" />ពិនិត្យពាក្យសម្ងាត់នៅក្នុងគណនី Google របស់អ្នក<ph name="END_LINK" />។</translation> <translation id="479167709087336770">វាប្រើមុខងារពិនិត្យអក្ខរាវិរុទ្ធដូចគ្នា ដែលប្រើក្នុងការស្វែងរកនៅលើ Google ។ អក្សរដែលអ្នកវាយបញ្ចូលនៅក្នុងកម្មវិធីរុករកតាមអ៊ីនធឺណិតត្រូវបានផ្ញើទៅ Google ។ អ្នកអាចផ្លាស់ប្ដូរសកម្មភាពនេះនៅក្នុងការកំណត់បានជានិច្ច។</translation> <translation id="4888717733111232871">វិន័យត្រលប់ចូលសម្រាប់ Chromium ដើម្បីអនុញ្ញាតចរាចរណ៍ mDNS។</translation> <translation id="4943838377383847465">Chromium នៅក្នុងរបៀបផ្ទៃខាងក្រោយ។</translation> <translation id="4987820182225656817">ភ្ញៀវអាចប្រើ Chromium ដោយមិនមានបន្សល់ទុកអ្វីឡើយ។</translation> <translation id="4994636714258228724">បន្ថែមខ្លួនអ្នកទៅ Chromium</translation> +<translation id="5224391634244552924">គ្មានពាក្យសម្ងាត់ដែលបានរក្សាទុកទេ។ Chromium អាចពិនិត្យពាក្យសម្ងាត់របស់អ្នក នៅពេលអ្នករក្សាទុកពាក្យសម្ងាត់ទាំងនោះ។</translation> <translation id="5277894862589591112">ដើម្បីអនុវត្តការផ្លាស់ប្ដូររបស់អ្នក សូមចាប់ផ្ដើម Chromium ឡើងវិញ</translation> <translation id="5358375970380395591">អ្នកកំពុងចូលជាមួយគណនីដែលបានគ្រប់គ្រង ហើយផ្តល់ឲ្យអ្នកគ្រប់គ្រងនូវការគ្រប់គ្រងលើទម្រង់ Chromium របស់អ្នក។ ទិន្នន័យ Chromium របស់អ្នក ដូចជាកម្មវិធី គេហទំព័រ ប្រវត្តិ ពាក្យសម្ងាត់ និងការកំណត់ផ្សេងទៀតរបស់អ្នកនឹងភ្ជាប់ជាមួយ <ph name="USER_NAME" /> ជាអចិន្ត្រៃយ៍។ អ្នកនឹងអាចលុបទិន្នន័យនេះតាមរយៈ Google Accounts Dashboard ប៉ុន្តែអ្នកនឹងមិនអាចភ្ជាប់ទិន្នន័យនេះជាមួយគណនីដ៏ទៃទៀតឡើយ។ <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">កំពុងអាប់ដេត Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -167,6 +169,7 @@ <translation id="7066436765290594559">Chromium OS មិនអាចធ្វើសមកម្មទិន្នន័យរបស់អ្នកទេ។ សូមធ្វើបច្ចុប្បន្នភាពឃ្លាសម្ងាត់ សមកម្ម របស់អ្នក។</translation> <translation id="7067091210845072982">ប្រសិនបើរូបភាពមិនមានការពណ៌នាដែលមានប្រយោជន៍ Chromium នឹងព្យាយាមផ្ដល់ការពណ៌នាដែលមានប្រយោជន៍សម្រាប់អ្នក។ រូបភាពត្រូវបានផ្ញើទៅ Google ដើម្បីបង្កើតការពណ៌នា។</translation> <translation id="7196312274710523067">មិនអាចចាប់ផ្ដើម Chromium បានទេ។ សូមព្យាយាមម្ដងទៀត។</translation> +<translation id="7197677400338048821">Chromium មិនអាចពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀតក្រោយរយៈពេល 24 ម៉ោង។</translation> <translation id="7205698830395646142">លាក់នៅក្នុងម៉ឺនុយ Chromium</translation> <translation id="7223968959479464213">កម្មវិធីគ្រប់គ្រងភារកិច្ច - Chromium</translation> <translation id="731644333568559921">ធ្វើបច្ចុប្បន្នភាព Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index 1a59d7cc..f1bd818 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">ಮರುಪ್ರಾರಂಭಿಸು</translation> <translation id="2805036593126168338">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chromium OS ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಈಗಲೇ ಸರಿಪಡಿಸಿ.</translation> <translation id="2847479871509788944">Chromium ನಿಂದ ತೆಗೆದುಹಾಕಿ...</translation> -<translation id="2886012850691518054">ಐಚ್ಚಿಕ: Google ಗೆ ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಕ್ರ್ಯಾಷ್ ವರದಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವುದರಿಂದ Chromium ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ.</translation> <translation id="2910007522516064972">&Chromium ಕುರಿತು</translation> <translation id="2977470724722393594">Chromium ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ</translation> <translation id="2983934633046890458">Chromium, ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಎಡಿಟ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ.</translation> @@ -56,6 +55,7 @@ <translation id="328888136576916638">Google API ಕೀಗಳು ಕಾಣೆಯಾಗಿವೆ. Chromium ನ ಕೆಲವು ಕಾರ್ಯವಿಧಾನಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="3296368748942286671">Chromium ಮುಚ್ಚಿದಾಗ ರನ್ ಆಗುತ್ತಿರುವ ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಮುಂದುವರಿಸು</translation> <translation id="331951419404882060">ಸೈನ್ ಇನ್ ಮಾಡುವಲ್ಲಿ ದೋಷವಿರುವ ಕಾರಣ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chromium OS ಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ.</translation> +<translation id="347328004046849135">ಅಪಾಯಕ್ಕೀಡಾದ ಪಾಸ್ವರ್ಡ್ ಬಳಸಿ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗ, Chromium ನಿಮಗೆ ಸೂಚನೆ ನೀಡುತ್ತದೆ</translation> <translation id="3474745554856756813">ಈ ಸಾಧನದಿಂದ <ph name="ITEMS_COUNT" /> ಐಟಂಗಳನ್ನು ಇದು ಅಳಿಸುತ್ತದೆ. ನಂತರ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಮರುಪಡೆಯಲು, <ph name="USER_EMAIL" /> ನಂತೆ Chromium ಗೆ ಸೈನ್ಇನ್ ಮಾಡಿ.</translation> <translation id="3509308970982693815">ದಯವಿಟ್ಟು ಎಲ್ಲಾ Chromium ವಿಂಡೋಗಳನ್ನು ಮುಚ್ಚಿರಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="3575459661164320785">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್ವೇರ್ ಕಂಡುಬಂದಿದೆ. Chromium ಅದನ್ನು ತೆಗೆದುಹಾಕಬಹುದು, ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ಪುನಃ ಸಾಮಾನ್ಯವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವಂತೆ ಮಾಡಲು ವಿಸ್ತರಣೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು.</translation> @@ -91,11 +91,13 @@ <translation id="4746050847053251315">ಹೇಗಿದ್ದರೂ Chromium ಅನ್ನು ಮುಚ್ಚುವುದೇ?</translation> <translation id="4748217263233248895">Chromium ಗೆ ವಿಶೇಷ ಸುರಕ್ಷತೆಯ ಅಪ್ಡೇಟ್ ಅನ್ನು ಈಗ ತಾನೇ ಅನ್ವಯಿಸಲಾಗಿದೆ. ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳನ್ನು ನಾವು ಮರುಸ್ಥಾಪಿಸುತ್ತೇವೆ.</translation> <translation id="4750035648288509542">ಬಹುತೇಕ ಅಪ್ ಟು ಡೇಟ್ ಆಗಿದೆ! ಅಪ್ಡೇಟ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು Chromium ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ. ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ಮರಳಿ ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.</translation> +<translation id="4788777615168560705">Chromium ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. 24 ಗಂಟೆಗಳ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ <ph name="BEGIN_LINK" />ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿರುವ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ<ph name="END_LINK" />.</translation> <translation id="479167709087336770">ಇದು Google ಹುಡುಕಾಟದಲ್ಲಿ ಬಳಸಲಾದ ಅದೇ ಕಾಗುಣಿತ ಪರೀಕ್ಷೆಯನ್ನು ಬಳಸುತ್ತದೆ. ನೀವು ಬ್ರೌಸರ್ನಲ್ಲಿ ಟೈಪ್ ಮಾಡುವ ಪಠ್ಯವನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ. ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನೀವು ಈ ವರ್ತನೆಯನ್ನು ಯಾವಾಗ ಬೇಕಾದರೂ ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="4888717733111232871">mDNS ಟ್ರಾಫಿಕ್ಗೆ ಅನುಮತಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ Chromium ಗೆ ಒಳಬರುವ ನಿಯಮ.</translation> <translation id="4943838377383847465">Chromium ಹಿನ್ನೆಲೆ ಮೋಡ್ನಲ್ಲಿದೆ.</translation> <translation id="4987820182225656817">ಅತಿಥಿಗಳು ಏನನ್ನೂ ಉಳಿಸದೆಯೇ Chromium ಬಳಸಬಹುದು.</translation> <translation id="4994636714258228724">ನೀವಾಗಿಯೇ Chromium ಗೆ ಸೇರಿಕೊಳ್ಳಿ</translation> +<translation id="5224391634244552924">ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಿಲ್ಲ. ನೀವು ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಿದಾಗ, Chromium ಅವುಗಳನ್ನು ಪರಿಶೀಲಿಸಬಹುದು.</translation> <translation id="5277894862589591112">ನಿಮ್ಮ ಬದಲಾವಣೆಗಳನ್ನು ಅನ್ವಯಿಸಲು, Chromium ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ</translation> <translation id="5358375970380395591">ನೀವು ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುತ್ತಿರುವಿರಿ ಮತ್ತು ನಿಮ್ಮ Chromium ಪ್ರೊಫೈಲ್ ಮೂಲಕ ಅದರ ನಿರ್ವಾಹಕ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು, ಹಾಗೂ ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳಂತಹ ನಿಮ್ಮ Chromium ಡೇಟಾವನ್ನು <ph name="USER_NAME" /> ಅವರಿಗೆ ಶಾಶ್ವತವಾಗಿ ಬಂಧಿಸಲಾಗುತ್ತದೆ. Google ಖಾತೆಗಳ ಡ್ಯಾಶ್ಬೋರ್ಡ್ ಮೂಲಕ ಈ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯ, ಆದರೆ ಬೇರೊಂದು ಖಾತೆಯೊಂದಿಗೆ ಈ ಡೇಟಾವನ್ನು ಸಂಯೋಜಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ (<ph name="PROGRESS_PERCENT" />)</translation> @@ -160,6 +162,7 @@ <translation id="7066436765290594559">ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chromium OS ಗೆ ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಸಿಂಕ್ ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ.</translation> <translation id="7067091210845072982">ಚಿತ್ರದಲ್ಲಿ ಉಪಯುಕ್ತ ವಿವರಣೆಯು ಇಲ್ಲದಿದ್ದರೆ, Chromium ನಿಮಗಾಗಿ ಒಂದು ವಿವರಣೆಯನ್ನು ಒದಗಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ವಿವರಣೆಗಳನ್ನು ರಚಿಸಲು, ಚಿತ್ರಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="7196312274710523067">Chromium ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> +<translation id="7197677400338048821">Chromium ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. 24 ಗಂಟೆಗಳ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="7205698830395646142">Chromium ಮೆನುವಿನಲ್ಲಿ ಮರೆಮಾಡು</translation> <translation id="7223968959479464213">ಕಾರ್ಯನಿರ್ವಾಹಕ - Chromium</translation> <translation id="731644333568559921">&Chromium OS ಅನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index 890b10d..47f0b5e 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">다시 시작</translation> <translation id="2805036593126168338">Chromium OS에서 비밀번호를 동기화할 수 없습니다. 지금 문제를 해결해 주세요.</translation> <translation id="2847479871509788944">Chromium에서 제거...</translation> -<translation id="2886012850691518054">선택사항: 사용 통계 및 비정상 종료 보고서가 Google로 자동 전송되도록 선택하시면 Chromium을 개선하는 데 도움이 됩니다.</translation> <translation id="2910007522516064972">Chromium 정보</translation> <translation id="2977470724722393594">Chromium이 최신 버전임</translation> <translation id="2983934633046890458">Chromium에서 비밀번호를 수정하려고 합니다.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API 키가 누락되었습니다. Chromium의 일부 기능이 사용 중지됩니다.</translation> <translation id="3296368748942286671">Chromium 종료 후에도 백그라운드 앱을 계속 실행</translation> <translation id="331951419404882060">로그인 중 오류가 발생하여 Chromium OS에서 데이터를 동기화하지 못했습니다.</translation> +<translation id="347328004046849135">유출된 비밀번호로 로그인하면 Chromium에서 알림을 표시합니다.</translation> <translation id="3474745554856756813">항목 <ph name="ITEMS_COUNT" />개가 기기에서 삭제됩니다. 나중에 데이터를 가져오려면 Chromium에 <ph name="USER_EMAIL" />(으)로 로그인하세요.</translation> <translation id="3509308970982693815">Chromium 창을 모두 닫고 다시 시도해 보세요.</translation> <translation id="3575459661164320785">컴퓨터에 유해한 소프트웨어가 있습니다. Chromium에서 유해한 소프트웨어를 삭제하고, 설정을 복원하고, 확장 프로그램을 사용 중지하여 브라우저가 다시 정상적으로 작동하도록 할 수 있습니다.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Chromium을 종료하시겠습니까?</translation> <translation id="4748217263233248895">Chromium 특별 보안 업데이트를 방금 적용했습니다. 다시 시작하면 탭이 복원됩니다.</translation> <translation id="4750035648288509542">업데이트가 거의 완료되었습니다. 업데이트를 마치려면 Chromium을 다시 실행하세요. 시크릿 창은 다시 열리지 않습니다.</translation> +<translation id="4788777615168560705">Chromium에서 비밀번호를 확인할 수 없습니다. 24시간 후에 다시 시도해 보거나 <ph name="BEGIN_LINK" />Google 계정에서 비밀번호를 확인<ph name="END_LINK" />하세요.</translation> <translation id="479167709087336770">Google 검색과 동일한 맞춤법 검사기가 사용됩니다. 브라우저에 입력되는 텍스트는 Google로 전송됩니다. 설정에서 언제든지 이 동작을 변경할 수 있습니다.</translation> <translation id="4888717733111232871">Chromium이 mDNS 트래픽을 허용하는 인바운드 규칙입니다.</translation> <translation id="4943838377383847465">Chromium이 백그라운드 모드로 실행 중입니다.</translation> <translation id="4987820182225656817">게스트로 사용 기록을 남기지 않고 Chromium을 사용할 수 있습니다.</translation> <translation id="4994636714258228724">Chromium에 본인 추가</translation> +<translation id="5224391634244552924">저장된 비밀번호가 없습니다. 비밀번호를 저장하면 Chromium에서 확인할 수 있습니다.</translation> <translation id="5277894862589591112">변경사항을 적용하려면 Chromium을 다시 실행하세요.</translation> <translation id="5358375970380395591">관리 계정으로 로그인하고 Chromium 프로필에 대한 관리자 제어권을 부여하려고 합니다. 앱, 북마크, 방문 기록, 비밀번호 및 기타 설정 등 Chromium 데이터가 <ph name="USER_NAME" /> 계정에 영구적으로 연결됩니다. 이후 이 데이터를 Google 계정 대시보드에서 삭제할 수는 있지만 다른 계정에 연결할 수는 없습니다. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium 업데이트 중(<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS에서 데이터를 동기화하지 못했습니다. 동기화 암호를 업데이트하세요.</translation> <translation id="7067091210845072982">이미지에 유용한 설명이 없으면 Chromium에서 자동으로 설명을 제공하려고 시도합니다. 설명을 생성하기 위해 이미지가 Google로 전송됩니다.</translation> <translation id="7196312274710523067">Chromium을 실행할 수 없습니다. 다시 시도해 보세요.</translation> +<translation id="7197677400338048821">Chromium에서 비밀번호를 확인할 수 없습니다. 24시간 후 다시 시도해 보세요.</translation> <translation id="7205698830395646142">Chromium 메뉴에서 숨기기</translation> <translation id="7223968959479464213">작업 관리자 - Chromium</translation> <translation id="731644333568559921">Chrome OS 업데이트</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index 1b0cfc6..972063b3 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Кайра ишке киргизүү</translation> <translation id="2805036593126168338">Chromium OS сырсөздөрүңүздү шайкештештире албай койду. Азыр оңдоо.</translation> <translation id="2847479871509788944">Chromium'дан чыгарып салуу…</translation> -<translation id="2886012850691518054">Кошумча: Google'га автоматтык түрдө колдонуу статистикасын жөнөтүп, каталар жөнүндө кабар берүү менен, Chromium'ду өркүндөтүүгө кол кабыш кылыңыз.</translation> <translation id="2910007522516064972">&Chromium жөнүндө</translation> <translation id="2977470724722393594">Chromium жаңыртылган</translation> <translation id="2983934633046890458">Chromium cырсөздөрдү өзгөртүүгө аракет кылууда.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API ачкычтары жок болуп жатат. Chromium'дун айрым функциялары өчүрүлөт.</translation> <translation id="3296368748942286671">Chromium жабылганда фондук колдонмолор иштей берсин</translation> <translation id="331951419404882060">Chromium OS кирүү катасынан улам дайын-даректериңизди шайкештештире албай койду.</translation> +<translation id="347328004046849135">Chromium уурдалган сырсөз менен киргениңизде эскертет</translation> <translation id="3474745554856756813">Ушуну менен түзмөктөгү <ph name="ITEMS_COUNT" /> нерсе өчүрүлөт. Дайын-даректериңизди кийинчерээк чыгарып алуу үчүн Chromium'га <ph name="USER_EMAIL" /> аккаунту менен кириңиз.</translation> <translation id="3509308970982693815">Бардык Chromium терезелерин жаап, дагы аракет кылып көрүңүз.</translation> <translation id="3575459661164320785">Компьютериңизде кооптуу программа бар. Серепчиңизди кайра ойдогудай иштетүү үчүн, Chromium аны алып салып, жөндөөлөрдү калыбына келтирип, кеңейтүүлөрдү өчүрө алат.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Баары бир Chromium'ду токтотосузбу?</translation> <translation id="4748217263233248895">Жаңы эле Chromium үчүн өзгөчө коопсуздук жаңыртуулары орнотулду. Өтмөктөрдү калыбына келтирүү үчүн аны өчүрүп-күйгүзүңүз.</translation> <translation id="4750035648288509542">Жаңыртылганы аз калды! Жаңыртууну аягына чыгаруу үчүн Chromium'ду кайра иштетиңиз. Жашыруун терезелер кайра ачылбайт.</translation> +<translation id="4788777615168560705">Chromium сырсөздөрүңүздү текшере албай жатат. 24 сааттан кийин кайра аракет кылыңыз же <ph name="BEGIN_LINK" />Google аккаунтуңуздагы сырсөздөрдү текшериңиз<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Ал Google Издөөдө колдонулган орфографияны текшерүүчү программаны колдонот. Серепчиде терилген текстти Google кызматтарына жөнөтүп турат. Бул параметрди каалаган убакта жөндөөлөргө өтүп, өзгөртүп койсоңуз болот.</translation> <translation id="4888717733111232871">mDNS трафигине уруксат берүү үчүн Chromium'дун кирүү эрежеси.</translation> <translation id="4943838377383847465">Chromium фондук режимде.</translation> <translation id="4987820182225656817">Коноктор Chromium'ду артында эч нерсе калтырбай колдоно алышат.</translation> <translation id="4994636714258228724">Өзүңүздү Chromium'га кошуңуз</translation> +<translation id="5224391634244552924">Сакталган сырсөздөр жок. Сырсөздөрүңүздү сактаганда Chromium аларды текшере алат.</translation> <translation id="5277894862589591112">Өзгөртүүлөрдү киргизүү үчүн Chromium'ду кайра иштетиңиз</translation> <translation id="5358375970380395591">Башкарылган аккаунт менен кирип, анын администраторуна Chromiun профилиңизди көзөмөлдөө мүмкүнчүлүгүн берип жатасыз. Колдонмолоруңуз, кыстармалар, таржымал, сырсөздөр жана башка жөндөөлөр сыяктуу Chromium дайын-даректериңиз эми биротоло <ph name="USER_NAME" /> менен байланып калат. Бул дайындарды Google Каттоо эсептеринин Жеке кеңсеси аркылуу жок кылсаңыз болот, бирок башка аккаунтка байланыштыра албайсыз.<ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium жаңыртылууда (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS дайын-даректериңизди шайкештештире албай койду. Шайкештештирүүнүн купуя сөз айкашын жаңыртыңыз.</translation> <translation id="7067091210845072982">Эгер сүрөттөрдүн түшүндүрмөсү жок болсо, Chromium аны түшүндүрүп берүүгө аракет кылат. Түшүндүрмөлөрдү даярдоо үчүн, сүрөттөр Google'га жөнөтүлөт.</translation> <translation id="7196312274710523067">Chromium иштетилбей койду. Кайталап көрүңүз.</translation> +<translation id="7197677400338048821">Chromium сырсөздөрүңүздү текшере албай жатат. 24 сааттан кийин кайра аракет кылыңыз.</translation> <translation id="7205698830395646142">Chromium менюсунда жашыруу</translation> <translation id="7223968959479464213">Тапшырмаларды башкаргыч – Chromium</translation> <translation id="731644333568559921">Chromium OS &жаңыртуу</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index 35837cf9..1e8fad4 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">ເລີ່ມເປີດໃຊ້ໃໝ່</translation> <translation id="2805036593126168338">Chromium OS ບໍ່ສາມາດຊິ້ງຂໍ້ມູນລະຫັດຜ່ານຂອງທ່ານໄດ້. ແກ້ໄຂຕອນນີ້ເລີຍ.</translation> <translation id="2847479871509788944">ເອົາອອກຈາກ Chromium...</translation> -<translation id="2886012850691518054">ເລືອກໄດ້: ຊ່ວຍເຮັດໃຫ້ Chromium ດີກ່ວາ່ ໂດຍການສົ່ງສະຖິຕິການໃຊ້ ແລະລາຍງານການຂັດຂ້ອງຫາ Google ໂດຍອັດຕະໂນມັດ.</translation> <translation id="2910007522516064972">ກ່ຽວກັບ Chromium</translation> <translation id="2977470724722393594">Chromium ແມ່ນເວີຊັນໃໝ່ຫຼ້າສຸດແລ້ວ</translation> <translation id="2983934633046890458">Chromium ກຳລັງພະຍາຍາມແກ້ໄຂລະຫັດຜ່ານ.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 0b1c4f6..393e6133 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Paleisti iš naujo</translation> <translation id="2805036593126168338">„Chromium“ OS nepavyko sinchronizuoti jūsų slaptažodžių. Ištaisykite dabar.</translation> <translation id="2847479871509788944">Pašalinti iš „Chromium“...</translation> -<translation id="2886012850691518054">Pasirenkama: padėkite tobulinti „Chromium“ automatiškai siųsdami „Google“ naudojimo statistiką ir strigčių ataskaitas.</translation> <translation id="2910007522516064972">Apie &„Chromium“</translation> <translation id="2977470724722393594">„Chromium“ naujausios versijos</translation> <translation id="2983934633046890458">„Chromium“ bando redaguoti slaptažodžius.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Trūksta „Google“ API raktų. Bus išjungtos kai kurios „Chromium“ funkcijos.</translation> <translation id="3296368748942286671">Toliau vykdyti fonines programas, kai „Chromium“ uždaroma</translation> <translation id="331951419404882060">„Chromium“ OS negali sinchronizuoti duomenų, nes prisijungiant įvyko klaida.</translation> +<translation id="347328004046849135">„Chromium“ praneš jums, kai prisijungsite naudodami pažeistą slaptažodį</translation> <translation id="3474745554856756813">Atlikus šį veiksmą iš šio įrenginio bus ištrinti elementai (<ph name="ITEMS_COUNT" />). Jei vėliau norėsite gauti duomenis, prisijunkite prie „Chromium“ kaip <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Uždarykite visus „Chromium“ langus ir bandykite dar kartą.</translation> <translation id="3575459661164320785">Kompiuteryje yra kenkėjiškos programinės įrangos. „Chromium“ gali ją pašalinti, atkurti nustatymus ir išjungti plėtinius, kad naršyklė vėl veiktų įprastai.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Vis tiek išeiti iš „Chromium“?</translation> <translation id="4748217263233248895">Ką tik pritaikytas specialus „Chromium“ skirtas saugos naujinys. Paleiskite naršyklę iš naujo ir atkursime visus skirtukus.</translation> <translation id="4750035648288509542">Beveik atnaujinta! Paleiskite „Chromium“ iš naujo, kad būtų užbaigtas naujinimas. Inkognito langai nebus atidaryti iš naujo.</translation> +<translation id="4788777615168560705">„Chromium“ negali patikrinti jūsų slaptažodžių. Bandykite dar kartą po 24 val. arba <ph name="BEGIN_LINK" />patikrinkite slaptažodžius „Google“ paskyroje<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Naudojamas tas pats rašybos tikrinimas kaip ir „Google“ paieškoje. Tekstas, kurį įvedate naršyklėje, nusiunčiamas „Google“. Šį veikimą visada galite pakeisti nustatymuose.</translation> <translation id="4888717733111232871">„Chromium“ skirta taisyklė, pagal kurią leidžiamas mDNS srautas.</translation> <translation id="4943838377383847465">„Chromium“ veikia fono režimu.</translation> <translation id="4987820182225656817">Svečiai gali naudoti „Chromium“ nepalikdami jokių duomenų.</translation> <translation id="4994636714258228724">Pridėkite save prie „Chromium“</translation> +<translation id="5224391634244552924">Nėra išsaugotų slaptažodžių. „Chromium“ gali tikrinti jūsų slaptažodžius, kai juos išsaugote.</translation> <translation id="5277894862589591112">Norėdami pritaikyti pakeitimus, paleiskite „Chromium“ iš naujo</translation> <translation id="5358375970380395591">Prisijungiate su valdoma paskyra ir leidžiate jos administratoriui valdyti jūsų „Chromium“ profilį. „Chromium“ duomenys, pvz., programos, žymės, istorija, slaptažodžiai ir kiti nustatymai, bus visam laikui susieti su <ph name="USER_NAME" />. Galėsite ištrinti šiuos duomenis naudodami „Google“ paskyrų informacijos suvestinę, bet negalėsite susieti šių duomenų su kita paskyra. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Atnaujinama „Chromium“ (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">„Chromium“ OS negali sinchronizuoti duomenų. Atnaujinkite sinchronizavimo slaptafrazę.</translation> <translation id="7067091210845072982">Jei nebus naudingo vaizdo aprašo, „Chromium“ bandys jums jį pateikti. Kad būtų galima kurti aprašus, vaizdai siunčiami į sistemą „Google“.</translation> <translation id="7196312274710523067">Nepavyko paleisti „Chromium“. Bandykite dar kartą.</translation> +<translation id="7197677400338048821">„Chromium“ negali patikrinti jūsų slaptažodžių. Bandykite dar kartą po 24 val.</translation> <translation id="7205698830395646142">Paslėpti „Chromium“ meniu elementą</translation> <translation id="7223968959479464213">Užduočių tvarkytuvė – „Chromium“</translation> <translation id="731644333568559921">&„Chromium“ OS naujinys</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index da9db67..2b0ca8a8 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Restartēt</translation> <translation id="2805036593126168338">Chromium OS nevarēja sinhronizēt jūsu paroles. Novērsiet problēmu jau tūlīt.</translation> <translation id="2847479871509788944">Noņemšana no pārlūka Chromium...</translation> -<translation id="2886012850691518054">Izvēles: palīdziet uzlabot Chromium, automātiski nosūtot lietojuma statistiku un avārijas pārskatus uzņēmumam Google.</translation> <translation id="2910007522516064972">Par &Chromium</translation> <translation id="2977470724722393594">Chromium ir atjaunināts</translation> <translation id="2983934633046890458">Chromium mēģina rediģēt paroles.</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb index 3045ece..cba34a3 100644 --- a/chrome/app/resources/chromium_strings_mk.xtb +++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Рестартирај</translation> <translation id="2805036593126168338">Chromium OS не можеше да ги синхронизира вашите лозинки. Поправете сега.</translation> <translation id="2847479871509788944">Отстрани од Chromium</translation> -<translation id="2886012850691518054">Изборно: помогнете да го подобриме Chromium со автоматско испраќање статистика на користење и извештаи за падови на Google.</translation> <translation id="2910007522516064972">За &Chromium</translation> <translation id="2977470724722393594">Chromium е ажуриран</translation> <translation id="2983934633046890458">Chromium се обидува да измени лозинки.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Клучевите Google API недостасуваат. Некои функции на Chromium ќе бидат оневозможени.</translation> <translation id="3296368748942286671">Продолжи со извршување на заднинските апликации кога Chromium е затворен</translation> <translation id="331951419404882060">Chromium OS не можеше да ги синхронизира вашите податоци поради грешка при најавување.</translation> +<translation id="347328004046849135">Chromium ќе ве извести ако се најавите со компромитирана лозинка</translation> <translation id="3474745554856756813">Ова ќе избрише <ph name="ITEMS_COUNT" /> ставки од уредов. За да ги вратите вашите податоци подоцна, најавете се на Chromium како <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Затворете ги сите прозорци на Chromium и обидете се повторно.</translation> <translation id="3575459661164320785">Има штетен софтвер на вашиот компјутер. Chromium може да го отстрани, да ги врати вашите поставки и да ги оневозможи екстензиите за да му овозможи на вашиот прелистувач повторно да функционира нормално.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Сепак да се напушти Chromium?</translation> <translation id="4748217263233248895">Тукушто применивме посебно безбедносно ажурирање за Chromium. Рестартирајте сега и ќе ви ги вратиме картичките.</translation> <translation id="4750035648288509542">Речиси сте готови! Рестартирајте го Chromium за да заврши ажурирањето. Прозорците „Инкогнито“ нема да се отворат повторно.</translation> +<translation id="4788777615168560705">Chromium не може да ги провери вашите лозинки. Обидете се пак по 24 часа или <ph name="BEGIN_LINK" />проверете ги лозинките во сметката на Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Услугава ја користи истата проверка на правопис што се користи и во „Пребарување на Google“. Текстот што ќе го напишете во прелистувачот се испраќа до Google. Ваквото однесување може да го смените во поставки во секое време.</translation> <translation id="4888717733111232871">Дојдовно правило за Chromium да дозволи mDNS сообраќај.</translation> <translation id="4943838377383847465">Chromium е во заднински режим.</translation> <translation id="4987820182225656817">Гостите може да го користат Chromium без оставање никакви траги зад нив.</translation> <translation id="4994636714258228724">Додај се себеси на Chromium</translation> +<translation id="5224391634244552924">Немате зачувани лозинки. Chromium може да ги проверува вашите лозинки ако ги зачувате.</translation> <translation id="5277894862589591112">За да се применат измените, рестартирајте го Chromium</translation> <translation id="5358375970380395591">Се пријавувате со управувана сметка и му давате контрола на администраторот над вашиот профил на Chromium. Вашите податоци на Chromium, како на пример ваши апликации, обележувачи, историја, лозинки и други поставки ќе бидат трајно поврзани со <ph name="USER_NAME" />. Може да ги бришете овие податоци преку информациската табла со сметки на Google, но нема да може да ги поврзувате овие податоци со друга сметка. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium се ажурира (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS не можеше да ги синхронизира вашите податоци. Ажурирајте ја пристапната фраза за Синхронизација.</translation> <translation id="7067091210845072982">Ако сликата нема корисен опис, Chromium ќе се обиде да ви обезбеди опис. За да се создаваат описи, сликите се испраќаат до Google.</translation> <translation id="7196312274710523067">Не можеше да се стартува Chromium. Обидете се повторно.</translation> +<translation id="7197677400338048821">Chromium не може да ги провери вашите лозинки. Обидете се пак по 24 часа.</translation> <translation id="7205698830395646142">Сокриј во мени на Chromium</translation> <translation id="7223968959479464213">Управник со задачи - Chromium</translation> <translation id="731644333568559921">Ажурирај &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index 22775ff..b5fdc1e 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation> <translation id="2805036593126168338">Chromium OS-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ സമന്വയിപ്പിക്കാനായില്ല. ഇപ്പോൾ പരിഹരിക്കുക.</translation> <translation id="2847479871509788944">Chromium-ൽ നിന്ന് നീക്കംചെയ്യുക...</translation> -<translation id="2886012850691518054">ഓപ്ഷണൽ: ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോർട്ടുകളും Google-ലേക്ക് സ്വയമേവ അയയ്ക്കുന്നതിലൂടെ Chromium-ത്തിനെ മികച്ചതാക്കി മാറ്റാൻ സഹായിക്കുക.</translation> <translation id="2910007522516064972">&Chromium-നെക്കുറിച്ച്</translation> <translation id="2977470724722393594">Chromium അപ്ടുഡേറ്റാണ്</translation> <translation id="2983934633046890458">പാസ്വേഡുകൾ എഡിറ്റ് ചെയ്യാൻ Chromium ശ്രമിക്കുന്നു.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API കീകൾ നഷ്ടമായി. Chromium-ന്റെ ചില പ്രവർത്തനങ്ങൾ പ്രവർത്തനരഹിതമാകും.</translation> <translation id="3296368748942286671">Chromium അടയ്ക്കുമ്പോൾ അപ്ലിക്കേഷനുകൾ പശ്ചാത്തലത്തിൽ പ്രവർത്തിക്കുന്നത് തുടരുക</translation> <translation id="331951419404882060">സൈൻ ഇൻ ചെയ്യുന്നതിലെ പിശക് കാരണം Chromium OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല.</translation> +<translation id="347328004046849135">അപഹരിക്കപ്പെട്ട പാസ്വേഡ് ഉപയോഗിച്ച് നിങ്ങൾ സൈൻ ഇൻ ചെയ്യുമ്പോൾ Chromium നിങ്ങളെ അറിയിക്കും</translation> <translation id="3474745554856756813">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും <ph name="ITEMS_COUNT" /> ഇനങ്ങൾ ഇല്ലാതാക്കും. പിന്നീട് നിങ്ങളുടെ വിവരങ്ങൾ വീണ്ടെടുക്കാൻ, <ph name="USER_EMAIL" /> എന്നയാളായി Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="3509308970982693815">എല്ലാ Chromium വിൻഡോകളും അടച്ചതിനുശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="3575459661164320785">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ദോഷകരമായ സോഫ്റ്റ്വെയറുണ്ട്. നിങ്ങളുടെ ബ്രൗസർ വീണ്ടും സാധാരണ രീതിയിൽ പ്രവർത്തിക്കാൻ, Chromium-ന് ഇത് നീക്കം ചെയ്യാനും ക്രമീകരണം പുനഃസ്ഥാപിക്കാനും വിപുലീകരണം പ്രവർത്തനരഹിതമാക്കാനുമാവും.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">എന്തായാലും Chromium-ത്തിൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="4748217263233248895">Chromium-നുള്ള ഒരു പ്രത്യേക സുരക്ഷാ അപ്ഡേറ്റ് പ്രയോഗിച്ചിരിക്കുന്നു. ഇപ്പോൾ റീസ്റ്റാർട്ട് ചെയ്യുക, ഞങ്ങൾ നിങ്ങളുടെ ടാബുകൾ പുനഃസ്ഥാപിക്കും.</translation> <translation id="4750035648288509542">എകദേശം അപ് റ്റു ഡേറ്റാണ്! അപ്ഡേറ്റ് ചെയ്യൽ പൂർത്തിയാക്കുന്നതിന് Chromium വീണ്ടും ആരംഭിക്കുക. അദൃശ്യ വിൻഡോകൾ വീണ്ടും തുറക്കില്ല.</translation> +<translation id="4788777615168560705">Chromium-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. 24 മണിക്കൂറിന് ശേഷം വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ <ph name="BEGIN_LINK" />നിങ്ങളുടെ Google അക്കൗണ്ടിലെ പാസ്വേഡുകൾ പരിശോധിക്കുക<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Google തിരയലിൽ ഉപയോഗിക്കുന്ന അതേ സ്പെൽ ചെക്കർ ഇത് ഉപയോഗിക്കുന്നു. ബ്രൗസറിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്സ്റ്റ് Google-ന് അയയ്ക്കുന്നു. ക്രമീകരണത്തിൽ എപ്പോഴും ഈ രീതി മാറ്റാനാകും.</translation> <translation id="4888717733111232871">mDNS ട്രാഫിക്ക് അനുവദിക്കാൻ Chromium-നുള്ള ഇൻബൗണ്ട് നയം.</translation> <translation id="4943838377383847465">Chromium പശ്ചാത്തല മോഡിലാണ്.</translation> <translation id="4987820182225656817">അതിഥികൾക്ക് ഒന്നും ശേഷിപ്പിക്കാതെ തന്നെ Chromium ഉപയോഗിക്കാനാകും.</translation> <translation id="4994636714258228724">Chromium-ലേക്ക് സ്വയം ചേരുക</translation> +<translation id="5224391634244552924">സംരക്ഷിച്ച പാസ്വേഡുകളൊന്നുമില്ല. നിങ്ങളുടെ പാസ്വേഡുകൾ സംരക്ഷിക്കുകയാണങ്കിൽ, Chromium-ന് അവ പരിശോധിക്കാനാവും.</translation> <translation id="5277894862589591112">നിങ്ങളുടെ മാറ്റങ്ങൾ ബാധകമാക്കാൻ Chromium സമാരംഭിക്കുക</translation> <translation id="5358375970380395591">നിങ്ങൾ ഒരു നിയന്ത്രിത അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്ത് അതിന്റെ അഡ്മിന് നിങ്ങളുടെ Chromium പ്രൊഫൈലിന്റെ നിയന്ത്രണം നൽകുന്നു. നിങ്ങളുടെ ആപ്പുകൾ, ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണങ്ങൾ എന്നിവ പോലെയുള്ള Chromium ഡാറ്റ <ph name="USER_NAME" /> എന്നതുമായി ശാശ്വതമായി ബന്ധിപ്പിച്ചതായിത്തീരും. Google അക്കൗണ്ട്സ് ഡാഷ്ബോർഡ് വഴി നിങ്ങൾക്ക് ഈ ഡാറ്റ ഇല്ലാതാക്കാനാകുമെങ്കിലും, ഈ ഡാറ്റ മറ്റൊരു അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്താനാകില്ല. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium അപ്ഡേറ്റുചെയ്യുന്നു, (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS-ന് നിങ്ങളുടെ ഡാറ്റ സമന്വയിപ്പിക്കാനായില്ല. സമന്വയ പാസ്ഫ്രെയ്സ് അപ്ഡേറ്റ് ചെയ്യുക.</translation> <translation id="7067091210845072982">ചിത്രത്തിൽ ഉപകാരപ്രദമായ വിവരണമില്ലെങ്കിൽ നിങ്ങൾക്കായി ഒരു വിവരണം നൽകാൻ Chromium ശ്രമിക്കും. വിവരണങ്ങൾ സൃഷ്ടിക്കാൻ, ചിത്രങ്ങൾ Google-ലേക്ക് അയയ്ക്കുന്നു.</translation> <translation id="7196312274710523067">Chromium ലോഞ്ച് ചെയ്യാനായില്ല. വീണ്ടും ശ്രമിക്കുക.</translation> +<translation id="7197677400338048821">Chromium-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. 24 മണിക്കൂറിന് ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="7205698830395646142">Chromium മെനുവിൽ മറയ്ക്കുക</translation> <translation id="7223968959479464213">ടാസ്ക് മാനേജർ - Chromium</translation> <translation id="731644333568559921">&Chromium OS അപ്ഡേറ്റ് ചെയ്യുക</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index 473eb955a..29c2fda 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Дахин эхлүүлэх</translation> <translation id="2805036593126168338">Chromium үйлдлийн систем таны нууц үгийг синк хийж чадсангүй. Одоо засна уу.</translation> <translation id="2847479871509788944">Chromium-аас устгах ...</translation> -<translation id="2886012850691518054">Заавал биш: Хэрэглээний статистик мэдээ болон алдаа ослын тайланг автоматаар Google рүү илгээж, Chromium-ыг улам сайжруулахад тусална уу.</translation> <translation id="2910007522516064972">Chromium-ын тухай</translation> <translation id="2977470724722393594">Chromium-г шинэчилсэн байна</translation> <translation id="2983934633046890458">Chromium нууц үгсийг засахаар оролдож байна.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Google-ийн API түлхүүр байхгүй байна. Chromium-ийн зарим функц идэвхгүй болно.</translation> <translation id="3296368748942286671">Chromium-ийг хаахад ард байгаа програмуудыг ажиллуулсан хэвээр бай.</translation> <translation id="331951419404882060">Нэвтэрэхэд алдаа гарсны улмаас Chromium OS таны датаг синхрончилж чадсангүй.</translation> +<translation id="347328004046849135">Таныг алдагдсан нууц үгээр нэвтрэх үед Chromium танд мэдэгдэнэ</translation> <translation id="3474745554856756813">Энэ нь төхөөрөмжөөс <ph name="ITEMS_COUNT" /> зүйл устгана. Өгөгдлөө дараа сэргээхийн тулд Chromium-д <ph name="USER_EMAIL" />-р нэвтэрнэ үү.</translation> <translation id="3509308970982693815">Chromium-н бүх цонхыг хаасны дараагаар дахин хандана уу.</translation> <translation id="3575459661164320785">Таны компьютер дээр аюултай программ хангамж байна. Chromium таны хөтчийн ажиллагааг дахин хэвийн болгохын тулд үүнийг устгах, таны тохиргоог сэргээх болон өргөтгөлүүдийг идэвхгүй болгох боломжтой.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Ямар ч байсан Chromium-г орхих уу?</translation> <translation id="4748217263233248895">Chromium-н аюулгүй байдлын тусгай шинэчлэлт хийгдэж дууслаа. Одоо дахин эхлүүлнэ үү. Бид таны табыг сэргээх болно.</translation> <translation id="4750035648288509542">Шинэчилж дуусаж байна! Шинэчлэлтийг дуусгахын тулд Chromium-г дахин ачаална уу. Нууцлалтай цонхыг дахин нээхгүй.</translation> +<translation id="4788777615168560705">Chromium таны нууц үгсийг шалгах боломжгүй байна. 24 цагийн дараа дахин оролдоно уу эсвэл <ph name="BEGIN_LINK" />өөрийн Google Бүртгэл дэх нууц үгсийг шалгана уу<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Энэ нь Google хайлтад ашигладаг зөв бичгийн ижил алдаа шалгагчийг ашигладаг. Таны хөтчид бичсэн текстийг Google-д илгээдэг. Та энэ ажиллах төлөвийг хүссэн үедээ тохиргоонд өөрчилж болно</translation> <translation id="4888717733111232871">MDNS урсгалыг зөвшөөрөхийн тулд Chromium-д зориулсан хөндлөнгийн дүрэм.</translation> <translation id="4943838377383847465">Chromium нь суурь горимд байна.</translation> <translation id="4987820182225656817">Зочид Chromium-ийг ашигласнаар хамгийн сүүлийн үеийн мэдээллийг авна.</translation> <translation id="4994636714258228724">Өөрийгөө Chromium руу нэмэх</translation> +<translation id="5224391634244552924">Хадгалсан ямар ч нууц үг алга. Таныг нууц үгсээ хадгалах үед Chromium тэднийг шалгах боломжтой.</translation> <translation id="5277894862589591112">Өөрчлөлтөө хэрэгжүүлэхийн тулд Chromium-г дахин ажиллуулна уу</translation> <translation id="5358375970380395591">Та удирдан ажиллаж буй хаягт нэвтэрч байгаагаас гадна таны Chromium профайлыг хянах эрхийг системийн ажилтанд шилжүүлж байна. Таны апп, хавчуурга, түүх, нууц үг болон бусад тохиргоо гэх мэт таны Chromium өгөгдлийг <ph name="USER_NAME" />-тэй холбох болно. Та энэхүү өгөгдлийг Google Accounts Dashboard-р дамжуулан устгах боломжтой боловч та энэхүү өгөгдлийн өөр хаягтай холбох боломжгүй байна. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium-г шинэчилж байна (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium OS нь таны өгөгдлийг sync хийж чадсангүй. Sync-ын нэвтрэх хэллэгээ шинэчилнэ үү.</translation> <translation id="7067091210845072982">Хэрэв зурагт хэрэгтэй тайлбар байхгүй бол Chromium танд тайлбар өгөхөөр оролдох болно. Тайлбар үүсгэхийн тулд зургийг Google-д илгээнэ.</translation> <translation id="7196312274710523067">Chromium-г эхлүүлж чадсангүй. Дахин оролдоно уу.</translation> +<translation id="7197677400338048821">Chromium таны нууц үгсийг шалгах боломжгүй байна. 24 цагийн дараа дахин оролдоно уу.</translation> <translation id="7205698830395646142">Chromium цэсэнд нуух</translation> <translation id="7223968959479464213">Бодлогын менежер - Chromium</translation> <translation id="731644333568559921">Шинэчлэлт & Chromium үйлдлийн систем</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index ac7d16f..4906fb8e 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -40,7 +40,6 @@ <translation id="2799223571221894425">पुन्हा लाँच करा</translation> <translation id="2805036593126168338">Chromium OS तुमचे पासवर्ड सिंक करू शकले नाही. आता निराकरण करा.</translation> <translation id="2847479871509788944">Chromium मधून काढून टाका...</translation> -<translation id="2886012850691518054">पर्यायी: वापर आकडेवारी आणि क्रॅश अहवाल Google कडे आपोआप पाठवून Chromium ला अधिक चांगले करण्यात मदत करा.</translation> <translation id="2910007522516064972">&Chromium बद्दल</translation> <translation id="2977470724722393594">Chromium अद्ययावत आहे</translation> <translation id="2983934633046890458">Chromium पासवर्ड संपादित करण्याचा प्रयत्न करत आहे.</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index aad4f3c9..a541d36b 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Lancarkan semula</translation> <translation id="2805036593126168338">OS Chromium tidak dapat menyegerakkan kata laluan anda. Betulkan sekarang.</translation> <translation id="2847479871509788944">Alih keluar daripada Chromium...</translation> -<translation id="2886012850691518054">Pilihan: Bantu jadikan Chromium lebih baik dengan menghantar statistik penggunaan dan laporan ranap kepada Google secara automatik.</translation> <translation id="2910007522516064972">Mengenai &Chromium</translation> <translation id="2977470724722393594">Chromium telah dikemas kini</translation> <translation id="2983934633046890458">Chromium cuba mengedit kata laluan.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index 4c49d89..9b93d4d5 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -42,7 +42,6 @@ <translation id="2799223571221894425">ပြန်လည်ဖွင့်တင်ရန်</translation> <translation id="2805036593126168338">Chromium OS က သင့်စကားဝှက်များကို စင့်ခ်လုပ်၍မရပါ။ ယခု ပြင်ဆင်ပါ။</translation> <translation id="2847479871509788944">Chromium ထဲမှ ဖယ်ရှားရန်</translation> -<translation id="2886012850691518054">လိုချင်မှ လုပ်ရန်: Google ထံသို့ သုံးစွဲမှု စာရင်းအင်းများ နှင့် ပျက်စီးမှု အစီရင်ခံစာများကို အလိုအလျောက် ပို့ပေးခြင်းဖြင့် Chromium ကို ပိုကောင်းလာအေင် ကူညီပေးပါ။</translation> <translation id="2910007522516064972">Chromium အကြောင်း</translation> <translation id="2977470724722393594">Chroumium ကို အပ်ဒိတ်လုပ်ထားပြီးပါပြီ</translation> <translation id="2983934633046890458">Chromium သည် စကားဝှက်များကို တည်းဖြတ်ရန်ကြိုးပမ်းနေသည်။</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb index 457deb6e..8fb85b62 100644 --- a/chrome/app/resources/chromium_strings_ne.xtb +++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">पुन: सुरुवात गर्नुहोस्</translation> <translation id="2805036593126168338">Chromium OS ले तपाईंका पासवर्डहरू सिंक गर्न सकेन। अहिले नै समाधान गर्नुहोस्</translation> <translation id="2847479871509788944">Chromium बाट हटाउनुहोस् ...</translation> -<translation id="2886012850691518054">वैकल्पिक: स्वचालित रूपमा गूगललाई उपयोगिता तथ्याङ्क तथा क्र्यास प्रतिवेदन पठाएर क्रोमियमलाई राम्रो बनाउन मद्दत गर्नुहोस्।</translation> <translation id="2910007522516064972">&क्रोमियमको बारेमा</translation> <translation id="2977470724722393594">Chromium अद्यावधिक छ</translation> <translation id="2983934633046890458">Chromium ले पासवर्डहरू सम्पादन गर्ने प्रयास गरिरहेको छ।</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index 6ece146..9624ac29 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Opnieuw starten</translation> <translation id="2805036593126168338">Chromium OS kan je wachtwoorden niet synchroniseren. Los dit nu op.</translation> <translation id="2847479871509788944">Verwijderen uit Chromium…</translation> -<translation id="2886012850691518054">Optioneel: help Chromium beter te maken door automatisch gebruiksstatistieken en crashmeldingen naar Google te verzenden.</translation> <translation id="2910007522516064972">Over &Chromium</translation> <translation id="2977470724722393594">Chromium is up-to-date</translation> <translation id="2983934633046890458">Chromium probeert wachtwoorden te bewerken.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index 1ce6672..3122aac 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Start på nytt</translation> <translation id="2805036593126168338">Chromium OS kunne ikke synkronisere passordene dine. Løs dette nå.</translation> <translation id="2847479871509788944">Fjern fra Chromium</translation> -<translation id="2886012850691518054">Valgfritt: Bidra til å gjøre Chromium bedre ved å sende brukerstatistikk og krasjrapporter automatisk til Google.</translation> <translation id="2910007522516064972">Om &Chromium</translation> <translation id="2977470724722393594">Chromium er oppdatert</translation> <translation id="2983934633046890458">Chromium prøver å redigere passord.</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb index 4f878519..bd00771 100644 --- a/chrome/app/resources/chromium_strings_or.xtb +++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ</translation> <translation id="2805036593126168338">Chromium OS ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡଗୁଡ଼ିକୁ ସିଙ୍କ୍ କରିପାରିଲା ନାହିଁ। ବର୍ତ୍ତମାନ ସମାଧାନ କରନ୍ତୁ।</translation> <translation id="2847479871509788944">Chromiumରୁ କାଢ଼ିଦିଅନ୍ତୁ...</translation> -<translation id="2886012850691518054">ଇଚ୍ଛାଧୀନ: ସ୍ୱଚାଳିତରୂପେ Googleକୁ ବ୍ୟବହାରର ପରିସଂଖ୍ୟାନ ଏବଂ କ୍ରାସ୍ ରିପୋର୍ଟ ପଠାଇ, Chromiumକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ।</translation> <translation id="2910007522516064972">&Chromium ବିଷୟରେ</translation> <translation id="2977470724722393594">Chromium ଅପ୍-ଟୁ-ଡେଟ୍ ଅଛି</translation> <translation id="2983934633046890458">Chromium ପାସୱାର୍ଡଗୁଡ଼ିକୁ ଏଡିଟ୍ କରିବାକୁ ଚେଷ୍ଟା କରୁଛି।</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 26586ff..7b05700 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">ਰੀਲੌਂਚ ਕਰੋ</translation> <translation id="2805036593126168338">Chromium OS ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦਾ ਸਮਕਾਲੀਕਰਨ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਹੁਣੇ ਠੀਕ ਕਰੋ।</translation> <translation id="2847479871509788944">Chromium ਤੋਂ ਹਟਾਓ...</translation> -<translation id="2886012850691518054">ਵਿਕਲਪਿਕ: Chromium ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰਨ ਲਈ Google ਨੂੰ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਵਰਤੋਂ ਅੰਕੜੇ ਅਤੇ ਕ੍ਰੈਸ਼ ਰਿਪੋਰਟਾਂ ਭੇਜੋ।</translation> <translation id="2910007522516064972">&Chromium ਬਾਰੇ</translation> <translation id="2977470724722393594">Chromium ਅੱਪ ਟੂ ਡੇਟ ਹੈ</translation> <translation id="2983934633046890458">Chromium ਪਾਸਵਰਡਾਂ ਦਾ ਸੰਪਾਦਨ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ।</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Google API ਕੁੰਜੀਆਂ ਮੌਜੂਦ ਨਹੀਂ ਹਨ। Chromium ਦੀ ਕੁਝ ਫੰਕਸ਼ਨੈਲਿਟੀ ਬੰਦ ਕੀਤੀ ਜਾਵੇਗੀ।</translation> <translation id="3296368748942286671">ਪਿਛੋਕੜ ਐਪਸ ਚਲਾਉਣਾ ਜਾਰੀ ਰੱਖੋ ਜਦੋਂ Chromium ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾਏ</translation> <translation id="331951419404882060">Chromium OS ਸਾਈਨ-ਇਨ ਕਰਨ ਵੇਲੇ ਇੱਕ ਗੜਬੜ ਹੋਣ ਦੇ ਕਾਰਨ ਤੁਹਾਡਾ ਡਾਟਾ ਸਿੰਕ ਨਹੀਂ ਕਰ ਸਕਿਆ।</translation> +<translation id="347328004046849135">ਤੁਹਾਡੇ ਵੱਲੋਂ ਕਿਸੇ ਛੇੜਛਾੜ ਵਾਲੇ ਪਾਸਵਰਡ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰਨ 'ਤੇ Chromium ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕਰੇਗਾ</translation> <translation id="3474745554856756813">ਇਸ ਨਾਲ ਇਸ ਡੀਵਾਈਸ ਤੋਂ <ph name="ITEMS_COUNT" /> ਆਈਟਮਾਂ ਮਿਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ। ਬਾਅਦ ਵਿੱਚ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, Chromium 'ਤੇ <ph name="USER_EMAIL" /> ਵਜੋਂ ਸਾਈਨ-ਇਨ ਕਰੋ।</translation> <translation id="3509308970982693815">ਕਿਰਪਾ ਕਰਕੇ ਸਾਰੀਆਂ Chromium windows ਬੰਦ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="3575459661164320785">ਤੁਹਾਡੇ ਕੰਪਿਊਟਰ ਵਿੱਚ ਹਾਨੀਕਾਰਕ ਸਾਫ਼ਟਵੇਅਰ ਹੈ। Chromium ਇਸਨੂੰ ਹਟਾ ਸਕਦਾ ਹੈ, ਤੁਹਾਡੀਆਂ ਸੈਟਿੰਗਾਂ ਮੁੜ-ਬਹਾਲ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਦੁਬਾਰਾ ਆਮ ਵਾਂਗ ਕੰਮ ਕਰਨ ਲਈ ਐਕਸਟੈਂਸ਼ਨਾਂ ਬੰਦ ਕਰ ਸਕਦਾ ਹੈ।</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">ਕੀ ਫਿਰ ਵੀ Chromium ਨੂੰ ਛੱਡਣਾ ਹੈ?</translation> <translation id="4748217263233248895">Chromium ਲਈ ਇੱਕ ਖਾਸ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਹੁਣੇ ਲਾਗੂ ਕੀਤਾ ਗਿਆ ਸੀ। ਹੁਣੇ ਇਸਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ ਅਸੀਂ ਤੁਹਾਡੀਆਂ ਟੈਬਾਂ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰਾਂਗੇ।</translation> <translation id="4750035648288509542">ਲਗਭਗ ਅੱਪ-ਟੂ-ਡੇਟ! ਅੱਪਡੇਟ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ Chromium ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ। ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਦੁਬਾਰਾ ਨਹੀਂ ਖੁੱਲ੍ਹੇਗੀ।</translation> +<translation id="4788777615168560705">Chromium ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ। 24 ਘੰਟਿਆਂ ਬਾਅਦ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ <ph name="BEGIN_LINK" />ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰੋ<ph name="END_LINK" />।</translation> <translation id="479167709087336770">ਇਹ Google ਖੋਜ ਵੇਲੇ ਵਰਤੇ ਜਾਣ ਵਾਲੇ ਸਪੈੱਲ-ਚੈਕਰ ਨੂੰ ਹੀ ਵਰਤਦਾ ਹੈ। ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤੀ ਜਾਣ ਵਾਲੀ ਲਿਖਤ Google ਨੂੰ ਭੇਜੀ ਜਾਵੇਗੀ। ਤੁਸੀਂ ਹਮੇਸ਼ਾਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਇਸ ਵਤੀਰੇ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="4888717733111232871">mDNS ਟ੍ਰੈਫਿਕ ਦੀ ਆਗਿਆ ਦੇਣ ਲਈ Chromium ਲਈ ਇਨਬਾਊਂਡ ਨਿਯਮ।</translation> <translation id="4943838377383847465">Chromium ਪਿਛੋਕੜ ਮੋਡ ਵਿੱਚ ਹੈ।</translation> <translation id="4987820182225656817">ਮਹਿਮਾਨ ਕੁਝ ਵੀ ਪਿੱਛੇ ਛੱਡੇ ਬਿਨਾਂ Chromium ਵਰਤ ਸਕਦੇ ਹਨ।</translation> <translation id="4994636714258228724">ਖੁਦ ਨੂੰ Chromium ਵਿੱਚ ਜੋੜੋ</translation> +<translation id="5224391634244552924">ਕੋਈ ਰੱਖਿਅਤ ਕੀਤਾ ਪਾਸਵਰਡ ਨਹੀਂ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨ 'ਤੇ Chromium ਉਹਨਾਂ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦਾ ਹੈ।</translation> <translation id="5277894862589591112">ਆਪਣੀਆਂ ਤਬਦੀਲੀਆਂ ਲਾਗੂ ਕਰਨ ਲਈ, Chromium ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ</translation> <translation id="5358375970380395591">ਤੁਸੀਂ ਇੱਕ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰ ਰਹੇ ਹੋ ਅਤੇ ਇਸ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਆਪਣੇ Chromium ਪ੍ਰੋਫਾਈਲ ਦਾ ਕੰਟਰੋਲ ਦੇ ਰਹੇ ਹੋ। ਤੁਹਾਡਾ Chromium ਡਾਟਾ, ਜਿਵੇਂ ਕਿ ਤੁਹਾਡੀਆਂ ਐਪਾਂ, ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡ, ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ <ph name="USER_NAME" /> ਨਾਲ ਸਥਾਈ ਤੌਰ 'ਤੇ ਜੋੜੇ ਜਾਣਗੇ। ਤੁਸੀਂ ਇਸ ਡਾਟੇ ਨੂੰ Google ਖਾਤੇ ਡੈਸ਼ਬੋਰਡ ਰਾਹੀਂ ਮਿਟਾ ਸਕੋਗੇ, ਪਰ ਤੁਸੀਂ ਇਸ ਡਾਟੇ ਨੂੰ ਦੂਜੇ ਖਾਤੇ ਨਾਲ ਨਹੀਂ ਜੋੜ ਸਕੋਗੇ। <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS ਤੁਹਾਡਾ ਡਾਟਾ ਸਿੰਕ ਨਹੀਂ ਕਰ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣਾ ਸਿੰਕ ਪਾਸਫਰੇਜ਼ ਅੱਪਡੇਟ ਕਰੋ।</translation> <translation id="7067091210845072982">ਜੇ ਕਿਸੇ ਚਿੱਤਰ ਦਾ ਲਾਭਕਾਰੀ ਵਰਣਨ ਨਹੀਂ ਹੈ, ਤਾਂ Chromium ਤੁਹਾਡੇ ਲਈ ਇੱਕ ਵਰਣਨ ਮੁਹੱਈਆ ਕਰਵਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਵਰਣਨ ਬਣਾਉਣ ਲਈ, ਚਿੱਤਰ Google ਨੂੰ ਭੇਜੇ ਜਾਂਦੇ ਹਨ।</translation> <translation id="7196312274710523067">Chromium ਨੂੰ ਲਾਂਚ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> +<translation id="7197677400338048821">Chromium ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ। 24 ਘੰਟਿਆਂ ਬਾਅਦ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="7205698830395646142">Chromium ਮੀਨੂ ਵਿੱਚ ਲੁਕਾਓ</translation> <translation id="7223968959479464213">ਕੰਮ ਪ੍ਰਬੰਧਕ - Chromium</translation> <translation id="731644333568559921">Chromium OS ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index 48631aa..9057e7b 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Uruchom ponownie</translation> <translation id="2805036593126168338">System operacyjny Chromium nie może zsynchronizować haseł. Napraw teraz.</translation> <translation id="2847479871509788944">Usuń z Chromium...</translation> -<translation id="2886012850691518054">Opcjonalnie: pomóż nam udoskonalać Chromium, wysyłając do Google statystyki użytkowania i raporty o awariach.</translation> <translation id="2910007522516064972">&Chromium – informacje</translation> <translation id="2977470724722393594">Masz aktualną wersję Chromium</translation> <translation id="2983934633046890458">Chromium próbuje edytować hasła.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index 28c9290..dd28791 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Reiniciar</translation> <translation id="2805036593126168338">O Chromium OS não pôde sincronizar suas senhas. Corrigir agora.</translation> <translation id="2847479871509788944">Remover do Chromium</translation> -<translation id="2886012850691518054">Opcional: Ajude a tornar o Chromium melhor enviando automaticamente as estatísticas de uso e os relatórios de erros ao Google.</translation> <translation id="2910007522516064972">Sobre o &Chromium</translation> <translation id="2977470724722393594">O Chromium está atualizado</translation> <translation id="2983934633046890458">O Chromium está tentando editar senhas.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index d3ac2f0..283b036f 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Reiniciar</translation> <translation id="2805036593126168338">O Chromium OS não conseguiu sincronizar as suas palavras-passe. Corrija agora.</translation> <translation id="2847479871509788944">Remover do Chromium...</translation> -<translation id="2886012850691518054">Opcional: ajude a melhorar o Chromium enviando automaticamente estatísticas de utilização e relatórios de falhas para a Google.</translation> <translation id="2910007522516064972">Acerca do &Chromium</translation> <translation id="2977470724722393594">O Chromium está atualizado</translation> <translation id="2983934633046890458">O Chromium está a tentar editar palavras-passe.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index ef1466fa..462ac0e 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Repornește</translation> <translation id="2805036593126168338">Sistemul de operare Chromium nu a putut sincroniza parolele. Remediază acum.</translation> <translation id="2847479871509788944">Elimină din Chromium...</translation> -<translation id="2886012850691518054">Opțional: contribuie la îmbunătățirea Chromium prin trimiterea automată de statistici privind utilizarea și rapoarte de blocare la Google.</translation> <translation id="2910007522516064972">Despre &Chromium</translation> <translation id="2977470724722393594">Chromium este actualizat</translation> <translation id="2983934633046890458">Chromium încearcă să modifice parolele.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index 8c481bae..9b0106d0 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Перезапустить</translation> <translation id="2805036593126168338">Не удалось синхронизировать пароли. Войдите, чтобы исправить эту ошибку.</translation> <translation id="2847479871509788944">Удалить из Chromium</translation> -<translation id="2886012850691518054">(Необязательно) Помогите сделать Chromium лучше, автоматически отправляя статистику использования и отчеты об ошибках в Google.</translation> <translation id="2910007522516064972">О &Chromium</translation> <translation id="2977470724722393594">Вы используете последнюю версию Chromium</translation> <translation id="2983934633046890458">Chromium пытается изменить пароли</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb index bb05c2d..a9e437a 100644 --- a/chrome/app/resources/chromium_strings_si.xtb +++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">නැවත දියත් කරන්න</translation> <translation id="2805036593126168338">Chromium OS හට ඔබේ මුරපද සමමුහූර්ත කිරීමට නොහැකි විය. දැන් නිරාකරණ කරන්න.</translation> <translation id="2847479871509788944">Chromium වෙතින් ඉවත් කරන්න...</translation> -<translation id="2886012850691518054">වෛකල්පිත: Google වෙත ස්වයංක්රීයව භාවිත සංඛ්යා ලේඛන සහ කඩිනම් වාර්තා යවමින් Chromium වඩා යහපත් කර ගැනීමට උපකාර කරන්න.</translation> <translation id="2910007522516064972">&Chromium පිළිබඳ</translation> <translation id="2977470724722393594">Chromium යාවත්කාලීනයි</translation> <translation id="2983934633046890458">Chromium මුරපද සංස්කරණ කිරීමට උත්සාහ කරයි.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index 6b1fee9b..51f5084c 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Znova spustiť</translation> <translation id="2805036593126168338">Systému Chromium OS sa nepodarilo synchronizovať vaše heslá. Opraviť.</translation> <translation id="2847479871509788944">Odstrániť z prehliadača Chromium...</translation> -<translation id="2886012850691518054">Voliteľné: Pomôžte vylepšiť služby prehliadača Chromium tým, že nastavíte automatické odosielanie štatistík používania a správ o zlyhaní spoločnosti Google.</translation> <translation id="2910007522516064972">Informácie o prehliadači &Chromium</translation> <translation id="2977470724722393594">Prehliadač Chromium bol aktualizovaný</translation> <translation id="2983934633046890458">Chromium sa pokúša upraviť heslá.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Chýbajú kľúče rozhrania Google API. Niektoré funkcie prehliadača Google Chromium budú zakázané.</translation> <translation id="3296368748942286671">Po zatvorení prehliadača Chromium ponechať spustené aplikácie na pozadí</translation> <translation id="331951419404882060">Systému OS Chromium sa nepodarilo synchronizovať vaše údaje, pretože sa pri prihlasovaní vyskytla chyba.</translation> +<translation id="347328004046849135">Chromium vás upozorní, keď sa prihlásite pomocou prelomeného hesla</translation> <translation id="3474745554856756813">Táto akcia odstráni zo zariadenia niekoľko položiek (počet: <ph name="ITEMS_COUNT" />). Ak budete chcieť svoje údaje neskôr opäť načítať, prihláste sa do prehliadača Chromium ako <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Zatvorte všetky okná prehliadača Chromium a skúste to znova.</translation> <translation id="3575459661164320785">V počítači máte škodlivý softvér. Chromium ho môže odstrániť, obnoviť nastavenia a deaktivovať rozšírenia, aby prehliadač znova normálne fungoval.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Chcete Chromium napriek tomu ukončiť?</translation> <translation id="4748217263233248895">Práve bola použitá mimoriadna bezpečnostná aktualizácia pre prehliadač Chromium. Zmeny sa prejavia až po jeho reštartovaní (vaše karty sa automaticky obnovia).</translation> <translation id="4750035648288509542">Takmer aktualizované. Aktualizáciu dokončíte reštartovaním prehliadača Chromium. Okná inkognito sa neotvoria.</translation> +<translation id="4788777615168560705">Chromium nemôže skontrolovať heslá. Skúste to znova o 24 hodín alebo <ph name="BEGIN_LINK" />skontrolujte heslá vo svojom účte Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Využíva rovnaký nástroj na kontrolu pravopisu, aký sa používa vo Vyhľadávaní Google. Text zadaný do prehliadača sa odošle Googlu. Toto správanie môžete zmeniť v nastaveniach.</translation> <translation id="4888717733111232871">Pravidlo pre prichádzajúce prenosy pre prehliadač Chromium, ktoré povoľuje prenos dát mDNS.</translation> <translation id="4943838377383847465">Chromium je v režime na pozadí.</translation> <translation id="4987820182225656817">Hostia môžu používať prehliadač Chromium bez toho, aby po sebe zanechali akékoľvek informácie.</translation> <translation id="4994636714258228724">Pridajte si účet do prehliadača Chromium</translation> +<translation id="5224391634244552924">Žiadne uložené heslá. Chromium môže skontrolovať heslá, keď ich uložíte.</translation> <translation id="5277894862589591112">Ak chcete zmeny použiť, spustite Chromium znova</translation> <translation id="5358375970380395591">Prihlasujete sa pomocou spravovaného účtu a jeho správcovi dávate kontrolu nad vaším profilom Chromium. Vaše údaje prehliadača Chromium, ako sú aplikácie, záložky, história, heslá a iné nastavenia, sa natrvalo priradia k účtu <ph name="USER_NAME" />. Tieto údaje budete môcť odstrániť len pomocou panela Dashboard v Účtoch Google, ale nebudete ich môcť priradiť k inému účtu. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Aktualizuje sa Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Systému OS Chromium sa nepodarilo synchronizovať vaše údaje. Aktualizujte prístupovú frázu synchronizácie.</translation> <translation id="7067091210845072982">Ak obrázok nemá užitočný popis, Chromium sa vám ho pokúsi poskytnúť. Obrázky sa odosielajú Googlu, aby bolo možné vytvoriť popisy.</translation> <translation id="7196312274710523067">Chromium sa nepodarilo spustiť. Skúste to znova.</translation> +<translation id="7197677400338048821">Chromium nemôže skontrolovať heslá. Skúste to znova o 24 hodín.</translation> <translation id="7205698830395646142">Skryť v Ponuke Chromium</translation> <translation id="7223968959479464213">Správca úloh – Chromium</translation> <translation id="731644333568559921">Aktualizovať systém &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 84c20cec3..373bb0a 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Vnovičen zagon</translation> <translation id="2805036593126168338">OS Chromium ni mogel sinhronizirati gesel. Odpravite težavo.</translation> <translation id="2847479871509788944">Odstranitev iz Chromiuma ...</translation> -<translation id="2886012850691518054">Izbirno: Pomagajte izboljšati Chromium, tako da Googlu samodejno pošiljate statistične podatke o uporabi in poročila o zrušitvah.</translation> <translation id="2910007522516064972">O &Chromiumu</translation> <translation id="2977470724722393594">Chromium je posodobljen</translation> <translation id="2983934633046890458">Chromium poskuša urejati gesla.</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb index 17256b35..2a996fe 100644 --- a/chrome/app/resources/chromium_strings_sq.xtb +++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Nis sërish</translation> <translation id="2805036593126168338">Sistemi operativ Chromium nuk mund t'i sinkronizonte fjalëkalimet e tua. Rregulloje tani.</translation> <translation id="2847479871509788944">Hiqe nga Chromium...</translation> -<translation id="2886012850691518054">Opsionale: Ndihmo në përmirësimin e Chromium duke i dërguar automatikisht Google statistika përdorimi dhe raporte të ndërprerjeve aksidentale.</translation> <translation id="2910007522516064972">Rreth &Chromium</translation> <translation id="2977470724722393594">Chromium është i përditësuar</translation> <translation id="2983934633046890458">Chromium po përpiqet t'i modifikojë fjalëkalimet.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Çelësat API të Google mungojnë. Disa funksione të Chromium do të çaktivizohen.</translation> <translation id="3296368748942286671">Vazhdo funksionimin e aplikacioneve në sfond kur Chromium është i mbyllur</translation> <translation id="331951419404882060">Sistemi operativ i Chromium nuk mundi të sinkronizonte të dhënat e tua për shkak të një gabimi në identifikim.</translation> +<translation id="347328004046849135">Chromium do të të njoftojë kur të identifikohesh me një fjalëkalim të komprometuar</translation> <translation id="3474745554856756813">Kjo do të fshijë <ph name="ITEMS_COUNT" /> artikuj nga kjo pajisje. Për t'i marrë më vonë të dhënat, identifikohu te Chromium si <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Mbyll të gjitha dritaret e Chromium dhe provo sërish.</translation> <translation id="3575459661164320785">Ka një softuer keqdashës në kompjuterin tënd. Chromium mund ta heqë atë, të restaurojë cilësimet e tua dhe të çaktivizojë shtesat për të bërë që shfletuesi yt të punojë përsëri si normalisht.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Dëshiron ta mbyllësh Chromium gjithsesi?</translation> <translation id="4748217263233248895">Sapo është zbatuar një përditësim special i sigurisë për Chromium. Rinise tani dhe do të restaurojmë skedat e tua.</translation> <translation id="4750035648288509542">Pothuajse u përditësua! Hap përsëri Chromium për të përfunduar përditësimin. Dritaret "e fshehta" nuk do të hapen.</translation> +<translation id="4788777615168560705">Chromium nuk mund t'i kontrollojë fjalëkalimet e tua. Provo përsëri pas 24 orësh ose <ph name="BEGIN_LINK" />kontrollo fjalëkalimet në "Llogarinë tënde të Google"<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Kjo përdor të njëjtin kontrollues drejtshkrimor që përdoret në kërkimin e Google. Teksti që shkruan në shfletues dërgohet te Google. Mund ta ndryshosh këtë sjellje gjithmonë te cilësimet.</translation> <translation id="4888717733111232871">Rregulli hyrës për Chromium për të lejuar trafikun mDNS.</translation> <translation id="4943838377383847465">Chromium është në modalitetin e sfondit.</translation> <translation id="4987820182225656817">Vizitorët mund të përdorin Chromium pa lënë asgjë prapa.</translation> <translation id="4994636714258228724">Shtoje veten te Chromium</translation> +<translation id="5224391634244552924">Nuk ka asnjë fjalëkalim të ruajtur. Chromium mund t'i kontrollojë fjalëkalimet e tua kur ti i ruan ato.</translation> <translation id="5277894862589591112">Për të zbatuar ndryshimet, rinis Chromium</translation> <translation id="5358375970380395591">Po identifikohesh me një llogari të menaxhuar dhe po i jep administratorit të saj kontroll mbi profilin tënd të Chromium. Të dhënat e tua të Chromium, siç janë aplikacionet, faqeshënuesit, fjalëkalimet dhe cilësime të tjera do të lidhen në mënyrë të përhershme me <ph name="USER_NAME" />. Ti do të jesh në gjendje t'i fshish këto të dhëna përmes Panelit të llogarive të Google, por nuk do të jesh në gjendje t'i shoqërosh këto të dhëna me një llogari tjetër. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Po përditëson Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Sistemi operativ Chromium nuk mund t'i sinkronizonte të dhënat e tua. Përditëso frazën tënde të kalimit për Sinkronizimin.</translation> <translation id="7067091210845072982">Nëse një imazh nuk ka një përshkrim të dobishëm, Chromium do të përpiqet të të japë një përshkrim. Për të krijuar përshkrime, imazhet dërgohen te Google.</translation> <translation id="7196312274710523067">Chromium nuk mund të hapej. Provo përsëri.</translation> +<translation id="7197677400338048821">Chromium nuk mund t'i kontrollojë fjalëkalimet e tua. Provo përsëri pas 24 orësh.</translation> <translation id="7205698830395646142">Fshih në Menynë e Chromium-it</translation> <translation id="7223968959479464213">Menaxheri i detyrave - Chromium</translation> <translation id="731644333568559921">Përditëso sistemin operativ Chromium</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb index 49e4ade..95a38b4 100644 --- a/chrome/app/resources/chromium_strings_sr-Latn.xtb +++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Ponovo pokreni</translation> <translation id="2805036593126168338">Chromium OS nije uspeo da sinhronizuje lozinke. Rešite problem.</translation> <translation id="2847479871509788944">Ukloni iz Chromium-a...</translation> -<translation id="2886012850691518054">Opcionalno: Pomozite da poboljšamo Chromium tako što ćete Google-u automatski slati statistiku korišćenja i izveštaje o otkazivanju.</translation> <translation id="2910007522516064972">O &Chromium-u</translation> <translation id="2977470724722393594">Chromium je ažuriran</translation> <translation id="2983934633046890458">Chromium pokušava da izmeni lozinke.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Nedostaju šifre za Google API. Neke funkcije Chromium-a će biti onemogućene.</translation> <translation id="3296368748942286671">Nastavi sa pokretanjem aplikacija u pozadini kada se Chromium zatvori</translation> <translation id="331951419404882060">Chromium OS ne može da sinhronizuje podatke zbog greške pri prijavljivanju.</translation> +<translation id="347328004046849135">Chromium će vas obavestiti kada se prijavite pomoću ugrožene lozinke</translation> <translation id="3474745554856756813">Ovim ćete izbrisati <ph name="ITEMS_COUNT" /> stavke(i) sa ovog uređaja. Da biste kasnije vratili podatke, prijavite se u Chromium kao <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Zatvorite sve Chromium prozore i pokušajte ponovo.</translation> <translation id="3575459661164320785">Na računaru postoji štetan softver. Chromium može da ga ukloni, vrati podešavanja i onemogući dodatke da bi pregledač mogao ponovo da radi uobičajeno.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Želite li ipak da zatvorite Chromium?</translation> <translation id="4748217263233248895">Posebno bezbednosno ažuriranje za Chromium je upravo primenjeno. Restartujte ga i vratićemo vam kartice.</translation> <translation id="4750035648288509542">Skoro je ažuriran! Ponovo pokrenite Chromium da biste dovršili ažuriranje. Prozori bez arhiviranja se neće ponovo otvoriti.</translation> +<translation id="4788777615168560705">Chromium ne može da vam proverava lozinke. Probajte ponovo posle 24 sata ili <ph name="BEGIN_LINK" />proverite lozinke na Google nalogu<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Koristi istu proveru pravopisa kao Google pretraga. Tekst koji unesete u pregledač se šalje Google-u. To uvek možete da promenite u podešavanjima.</translation> <translation id="4888717733111232871">Pravilo za dolazni saobraćaj za Chromium da bi se omogućio mDNS saobraćaj.</translation> <translation id="4943838377383847465">Chromium je u pozadinskom režimu.</translation> <translation id="4987820182225656817">Gosti mogu da koriste Chromium a da ne ostavljaju nikakve tragove.</translation> <translation id="4994636714258228724">Dodajte sebe u Chromium</translation> +<translation id="5224391634244552924">Nema sačuvanih lozinki. Chromium može da proverava lozinke kada ih sačuvate.</translation> <translation id="5277894862589591112">Da biste primenili promene, ponovo pokrenite Chromium</translation> <translation id="5358375970380395591">Prijavljujete se pomoću naloga kojim se upravlja i dajete njegovom administratoru kontrolu nad Chromium profilom. Chromium podaci, kao što su aplikacije, obeleživači, istorija, lozinke i druga podešavanja, biće trajno povezani sa nalogom <ph name="USER_NAME" />. Moći ćete da izbrišete te podatke preko Kontrolne table Google naloga, ali nećete moći da ih povežete sa nekim drugim nalogom. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Ažuriranje Chromium-a (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium OS ne može da sinhronizuje podatke. Ažurirajte pristupnu frazu za Sinhronizaciju.</translation> <translation id="7067091210845072982">Ako slika nema koristan opis, Chromium će probati da vam ga pruži. Slike se šalju Google-u radi pravljenja opisa.</translation> <translation id="7196312274710523067">Nije moguće pokrenuti Chromium. Pokušajte ponovo.</translation> +<translation id="7197677400338048821">Chromium ne može da vam proverava lozinke. Probajte ponovo za 24 sata.</translation> <translation id="7205698830395646142">Sakrij u Chromium meniju</translation> <translation id="7223968959479464213">Menadžer zadataka – Chromium</translation> <translation id="731644333568559921">Ažuriraj &Chromium OS</translation> @@ -224,7 +227,7 @@ <translation id="8803635938069941624">Chromium OS uslovi</translation> <translation id="8821041990367117597">Chromium ne može da sinhronizuje podatke zato što su podaci za prijavljivanje na nalog zastareli.</translation> <translation id="8862326446509486874">Nemate odgovarajuća prava za instalaciju na nivou sistema. Probajte ponovo da pokrenete program za instalaciju, ovoga puta kao administrator.</translation> -<translation id="8897323336392112261">Kontroliše i stranicu koja se prikazuje kada pokrenete Chromium ili kliknete na dugme Početna.</translation> +<translation id="8897323336392112261">Kontroliše i stranicu koja se prikazuje kada pokrenete Chromium ili kliknete na dugme Početak.</translation> <translation id="8907580949721785412">Chromium pokušava da prikaže lozinke. Unesite lozinku za Windows da biste to omogućili.</translation> <translation id="8941642502866065432">Ne možete da ažurirate Chromium</translation> <translation id="8974095189086268230">Chromium OS omogućava dodatni <ph name="BEGIN_LINK_CROS_OSS" />softver otvorenog koda<ph name="END_LINK_CROS_OSS" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index fe82faf..425d1bb 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Поново покрени</translation> <translation id="2805036593126168338">Chromium ОС није успео да синхронизује лозинке. Решите проблем.</translation> <translation id="2847479871509788944">Уклони из Chromium-а...</translation> -<translation id="2886012850691518054">Опционално: Помозите да побољшамо Chromium тако што ћете Google-у аутоматски слати статистику коришћења и извештаје о отказивању.</translation> <translation id="2910007522516064972">О &Chromium-у</translation> <translation id="2977470724722393594">Chromium је ажуриран</translation> <translation id="2983934633046890458">Chromium покушава да измени лозинке.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Недостају шифре за Google API. Неке функције Chromium-а ће бити онемогућене.</translation> <translation id="3296368748942286671">Настави са покретањем апликација у позадини када се Chromium затвори</translation> <translation id="331951419404882060">Chromium ОС не може да синхронизује податке због грешке при пријављивању.</translation> +<translation id="347328004046849135">Chromium ће вас обавестити када се пријавите помоћу угрожене лозинке</translation> <translation id="3474745554856756813">Овим ћете избрисати <ph name="ITEMS_COUNT" /> ставке(и) са овог уређаја. Да бисте касније вратили податке, пријавите се у Chromium као <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Затворите све Chromium прозоре и покушајте поново.</translation> <translation id="3575459661164320785">На рачунару постоји штетан софтвер. Chromium може да га уклони, врати подешавања и онемогући додатке да би прегледач могао поново да ради уобичајено.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Желите ли ипак да затворите Chromium?</translation> <translation id="4748217263233248895">Посебно безбедносно ажурирање за Chromium је управо примењено. Рестартујте га и вратићемо вам картице.</translation> <translation id="4750035648288509542">Скоро је ажуриран! Поново покрените Chromium да бисте довршили ажурирање. Прозори без архивирања се неће поново отворити.</translation> +<translation id="4788777615168560705">Chromium не може да вам проверава лозинке. Пробајте поново после 24 сата или <ph name="BEGIN_LINK" />проверите лозинке на Google налогу<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Користи исту проверу правописа као Google претрага. Текст који унесете у прегледач се шаље Google-у. То увек можете да промените у подешавањима.</translation> <translation id="4888717733111232871">Правило за долазни саобраћај за Chromium да би се омогућио mDNS саобраћај.</translation> <translation id="4943838377383847465">Chromium је у позадинском режиму.</translation> <translation id="4987820182225656817">Гости могу да користе Chromium а да не остављају никакве трагове.</translation> <translation id="4994636714258228724">Додајте себе у Chromium</translation> +<translation id="5224391634244552924">Нема сачуваних лозинки. Chromium може да проверава лозинке када их сачувате.</translation> <translation id="5277894862589591112">Да бисте применили промене, поново покрените Chromium</translation> <translation id="5358375970380395591">Пријављујете се помоћу налога којим се управља и дајете његовом администратору контролу над Chromium профилом. Chromium подаци, као што су апликације, обележивачи, историја, лозинке и друга подешавања, биће трајно повезани са налогом <ph name="USER_NAME" />. Моћи ћете да избришете те податке преко Контролне табле Google налога, али нећете моћи да их повежете са неким другим налогом. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Ажурирање Chromium-а (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">Chromium ОС не може да синхронизује податке. Ажурирајте приступну фразу за Синхронизацију.</translation> <translation id="7067091210845072982">Ако слика нема користан опис, Chromium ће пробати да вам га пружи. Слике се шаљу Google-у ради прављења описа.</translation> <translation id="7196312274710523067">Није могуће покренути Chromium. Покушајте поново.</translation> +<translation id="7197677400338048821">Chromium не може да вам проверава лозинке. Пробајте поново за 24 сата.</translation> <translation id="7205698830395646142">Сакриј у Chromium менију</translation> <translation id="7223968959479464213">Менаџер задатака – Chromium</translation> <translation id="731644333568559921">Ажурирај &Chromium ОС</translation> @@ -224,7 +227,7 @@ <translation id="8803635938069941624">Chromium ОС услови</translation> <translation id="8821041990367117597">Chromium не може да синхронизује податке зато што су подаци за пријављивање на налог застарели.</translation> <translation id="8862326446509486874">Немате одговарајућа права за инсталацију на нивоу система. Пробајте поново да покренете програм за инсталацију, овога пута као администратор.</translation> -<translation id="8897323336392112261">Контролише и страницу која се приказује када покренете Chromium или кликнете на дугме Почетна.</translation> +<translation id="8897323336392112261">Контролише и страницу која се приказује када покренете Chromium или кликнете на дугме Почетак.</translation> <translation id="8907580949721785412">Chromium покушава да прикаже лозинке. Унесите лозинку за Windows да бисте то омогућили.</translation> <translation id="8941642502866065432">Не можете да ажурирате Chromium</translation> <translation id="8974095189086268230">Chromium ОС омогућава додатни <ph name="BEGIN_LINK_CROS_OSS" />софтвер отвореног кода<ph name="END_LINK_CROS_OSS" />.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index c010276..50cf994 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Starta om</translation> <translation id="2805036593126168338">Det gick inte att synkronisera lösenord i Chromium OS. Åtgärda nu.</translation> <translation id="2847479871509788944">Ta bort från Chromium …</translation> -<translation id="2886012850691518054">Valfritt: Hjälp till att göra Chromium bättre genom att automatiskt skicka användningsstatistik och felrapporter till Google.</translation> <translation id="2910007522516064972">Om &Chromium</translation> <translation id="2977470724722393594">Chromium är uppdaterat</translation> <translation id="2983934633046890458">Lösenorden i Chromium redigeras.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index 219af7a..b3d60990 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Funga na ufungue</translation> <translation id="2805036593126168338">Mfumo wa Uendeshaji wa Chromium umeshindwa kusawazisha manenosiri yako. Rekebisha sasa.</translation> <translation id="2847479871509788944">Ondoa kwenye Chromium...</translation> -<translation id="2886012850691518054">Si lazima: Saidia kuboresha Chromium kwa kutumia Google takwimu za matumizi na ripoti wakati wowote huduma hii inapoacha kufanya kazi.</translation> <translation id="2910007522516064972">Kuhusu Chromium</translation> <translation id="2977470724722393594">Chromium imesasishwa</translation> <translation id="2983934633046890458">Chromium inajaribu kubadilisha manenosiri.</translation> @@ -97,7 +96,7 @@ <translation id="4748217263233248895">Sasisho maalum la usalama wa Chromium limewekwa sasa hivi. Ifunge kisha uifungue na tutarejesha vichupo vyako.</translation> <translation id="4750035648288509542">Inaelekea kukamilisha mchakato wa kusasisha! Fungua tena Chromium ili ukamilishe mchakato wa kusasisha. Haitafungua upya madirisha fiche.</translation> <translation id="4788777615168560705">Chromium imeshindwa kukagua manenosiri yako. Jaribu tena baada ya saa 24 au <ph name="BEGIN_LINK" />kagua manenosiri katika Akaunti yako ya Google<ph name="END_LINK" />.</translation> -<translation id="479167709087336770">Huduma hii hutumia kikagua maendelezo sawa na kinachotumika kwenye Huduma ya Tafuta na Google. Maandishi unayoandika kwenye kivinjari yanatumwa kwa Google. Unaweza kubadilisha hali hii katika mipangilio wakati wowote.</translation> +<translation id="479167709087336770">Huduma hii hutumia kikagua tahajia sawa na kinachotumika kwenye Huduma ya Tafuta na Google. Maandishi unayoandika kwenye kivinjari yanatumwa kwa Google. Unaweza kubadilisha hali hii katika mipangilio wakati wowote.</translation> <translation id="4888717733111232871">Sheria ya ndani ya Chromium ili kuruhusu trafiki ya mDNS.</translation> <translation id="4943838377383847465">Chromium iko katika hali ya chini chini.</translation> <translation id="4987820182225656817">Walioalikwa wanaweza kutumia Chromium bila kuacha kitu chochote nyuma.</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index 7d3c2cbe6c..364246da 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">மீண்டும் தொடங்கு</translation> <translation id="2805036593126168338">உங்கள் கடவுச்சொற்களை Chromium OSஸால் ஒத்திசைக்க முடியவில்லை. இப்போதே சரிசெய்யுங்கள்.</translation> <translation id="2847479871509788944">Chromium இலிருந்து அகற்று...</translation> -<translation id="2886012850691518054">விருப்பத்தேர்வு: பயன்பாட்டு புள்ளிவிவரங்களையும், சிதைவு அறிக்கைகளையும் Google க்கு தானாகவே அனுப்புவதன் மூலம் Chromium ஐ இன்னும் சிறந்ததாக்க உதவுக.</translation> <translation id="2910007522516064972">&Chromium அறிமுகம்</translation> <translation id="2977470724722393594">Chromium புதுப்பித்த நிலையில் உள்ளது</translation> <translation id="2983934633046890458">Chromium கடவுச்சொற்களைத் திருத்த முயல்கிறது.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Google API விசைகள் காணப்படவில்லை. Chromium இன் சில செயல்பாடுகள் முடக்கப்படும்.</translation> <translation id="3296368748942286671">Chromium ஐ மூடியபிறகு, பின்புலப் பயன்பாடுகளைத் தொடர்ந்து இயக்கு</translation> <translation id="331951419404882060">உள்நுழைவதில் ஏற்பட்ட பிழை காரணமாக உங்கள் தரவை Chromium OS ஆல் ஒத்திசைக்க முடியவில்லை.</translation> +<translation id="347328004046849135">களவாடப்பட்ட கடவுச்சொல்லைக் கொண்டு நீங்கள் உள்நுழையும்போது Chromium அது குறித்து உங்களுக்குத் தெரியப்படுத்தும்</translation> <translation id="3474745554856756813">வெளியேறினால், இந்தச் சாதனத்திலிருந்து <ph name="ITEMS_COUNT" /> உருப்படிகள் நீக்கப்படும். பின்னர் தரவை மீட்டமைக்க, Chromium இல் <ph name="USER_EMAIL" /> எனும் முகவரியின் மூலம் உள்நுழையவும்.</translation> <translation id="3509308970982693815">அனைத்து Chromium சாளரங்களையும் மூடி, பின்னர் முயலவும்.</translation> <translation id="3575459661164320785">உங்கள் கம்ப்யூட்டரில் தீங்கிழைக்கும் மென்பொருள் உள்ளது. உங்கள் உலாவி மீண்டும் வழக்கம் போல வேலை செய்ய, Chromium அதை அகற்றி, உங்கள் அமைப்புகளை மீட்டமைத்து, நீட்டிப்புகளை முடக்கும்.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Chromium இலிருந்து வெளியேறவா?</translation> <translation id="4748217263233248895">Chromiumமுக்கான சிறப்புப் பாதுகாப்புப் புதுப்பிப்பு சற்றுமுன் இயக்கப்பட்டது. இப்போது Chromiumமை மீண்டும் தொடங்கவும், உங்கள் தாவல்களை மீண்டும் காண்பிப்போம்.</translation> <translation id="4750035648288509542">கிட்டத்தட்ட புதுப்பிக்கப்பட்ட நிலையில் உள்ளது! புதுப்பித்தலை முடிக்க Chromiumமை மீண்டும் தொடங்கவும். மறைநிலை சாளரங்கள் மீண்டும் திறக்காது.</translation> +<translation id="4788777615168560705">Chromium உலாவியால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியவில்லை. 24 மணிநேரத்திற்குப் பிறகு மீண்டும் முயலவும் அல்லது <ph name="BEGIN_LINK" />உங்கள் Google கணக்கில் கடவுச்சொற்களைச் சரிபார்க்கவும்<ph name="END_LINK" />.</translation> <translation id="479167709087336770">இது Google தேடலில் பயன்படுத்தப்படும் அதே பிழைதிருத்தியைப் பயன்படுத்துகிறது. உலாவியில் நீங்கள் உள்ளிடும் உரை Googleளுக்கு அனுப்பப்படும். இதை அமைப்புகளில் எப்போது வேண்டுமானாலும் மாற்றலாம்.</translation> <translation id="4888717733111232871">mDNS ட்ராஃபிக்கை அனுமதிப்பதற்கான, Chromium க்கான உள்வரும் விதி.</translation> <translation id="4943838377383847465">Chromium பின்புல பயன்முறையில் இயங்குகிறது.</translation> <translation id="4987820182225656817">எதையும் விட்டுசெல்லாமல் கெஸ்ட் பயனர்கள் Chromium ஐப் பயன்படுத்தலாம்.</translation> <translation id="4994636714258228724">உங்களை Chromium இல் சேர்க்கவும்</translation> +<translation id="5224391634244552924">சேமித்த கடவுச்சொற்கள் எதுவுமில்லை. நீங்கள் அவற்றைச் சேமிக்கும்போது Chromium உலாவியால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியும்.</translation> <translation id="5277894862589591112">உங்கள் மாற்றங்களைச் செயல்படுத்த, Chromiumமை மீண்டும் தொடங்கவும்</translation> <translation id="5358375970380395591">நீங்கள் நிர்வகிக்கப்படும் கணக்கு மூலம் உள்நுழைகிறீர்கள், மேலும் அதன் நிர்வாகிக்கு உங்கள் Chromium சுயவிவரத்தின் கட்டுப்பாட்டை வழங்குகிறீர்கள். உங்கள் ஆப்ஸ், புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் போன்ற உங்கள் Chromium தரவு மற்றும் பிற அமைப்புகள் நிரந்தரமாக <ph name="USER_NAME" /> உடன் இணைக்கப்படும். இந்தத் தரவை Google கணக்குகளின் டாஷ்போர்டு வழியாக நீக்க முடியும், ஆனால் இந்தத் தரவை வேறொரு கணக்குடன் தொடர்புபடுத்த முடியாது. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromiumஐப் புதுப்பிக்கிறது (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium OS ஆல் உங்கள் தரவை ஒத்திசைக்க முடியவில்லை. உங்கள் ஒத்திசைவு கடவுச்சொற்றொடரைப் புதுப்பிக்கவும்.</translation> <translation id="7067091210845072982">ஒரு படத்திற்குப் பயனுள்ள விளக்கம் இல்லாதபட்சத்தில் Chromium உங்களுக்காக அதை வழங்க முயலும். விளக்கங்களை உருவாக்குவதற்காக படங்கள் Googleளுக்கு அனுப்பப்படும்.</translation> <translation id="7196312274710523067">Chromiumஐத் தொடங்க முடியவில்லை. மீண்டும் முயலவும்.</translation> +<translation id="7197677400338048821">Chromium உலாவியால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியவில்லை. 24 மணிநேரத்திற்குப் பிறகு முயலவும்.</translation> <translation id="7205698830395646142">Chromium மெனுவில் மறை</translation> <translation id="7223968959479464213">செயல் நிர்வாகி - Chromium</translation> <translation id="731644333568559921">&Chromium OS ஐப் புதுப்பி</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index d353d8e..3c9074c 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">మళ్లీ ప్రారంభించు</translation> <translation id="2805036593126168338">Chromium OS మీ పాస్వర్డ్లను సింక్ చేయలేకపోయింది. ఇప్పుడే సమస్యను పరిష్కరించండి.</translation> <translation id="2847479871509788944">Chromium నుండి తీసివేయి...</translation> -<translation id="2886012850691518054">ఐచ్ఛికం: Googleకు వినియోగ గణాంకాలను, క్రాష్ నివేదికలను ఆటోమేటిక్గా పంపడం ద్వారా Chromiumను మరింత మెరుగుపరచడానికి సహాయం చేస్తుంది.</translation> <translation id="2910007522516064972">&Chromium గురించి</translation> <translation id="2977470724722393594">Chromium తాజాగా ఉంది</translation> <translation id="2983934633046890458">Chromium పాస్వర్డ్లను ఎడిట్ చేయడానికి ప్రయత్నిస్తోంది.</translation> @@ -56,6 +55,7 @@ <translation id="328888136576916638">Google API కీలు లేవు. Chromium కార్యాచరణలో కొంత భాగం నిలిపివేయబడుతుంది.</translation> <translation id="3296368748942286671">Chromium మూసివేయబడినప్పుడు నేపథ్య అనువర్తనాలను అమలు చేయడాన్ని కొనసాగించు</translation> <translation id="331951419404882060">సైన్ ఇన్ చేయడంలో ఎర్రర్ ఏర్పడినందున Chromium OS మీ డేటాను సింక్ చేయలేకపోయింది.</translation> +<translation id="347328004046849135">చోరీకి గురైన పాస్వర్డ్తో మీరు సైన్ ఇన్ చేసినప్పుడు Chromium మీకు తెలియజేస్తుంది</translation> <translation id="3474745554856756813">ఇది ఈ పరికరం నుండి <ph name="ITEMS_COUNT" /> అంశాలను తొలగిస్తుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, Chromiumకు <ph name="USER_EMAIL" /> లాగా సైన్ ఇన్ చేయండి.</translation> <translation id="3509308970982693815">దయచేసి అన్ని Chromium విండోలను మూసివేసి, మళ్లీ ప్రయత్నించండి.</translation> <translation id="3575459661164320785">మీ కంప్యూటర్లో మీ భద్రతకు హాని కలిగించే సాఫ్ట్వేర్ ఉంది. మీ బ్రౌజర్ని మళ్లీ సాధారణంగా పని చేసేలా చేయడానికి Chromium దానిని తీసివేసి, మీ సెట్టింగ్లను పునరుద్ధరించి, ఎక్స్టెన్షన్లను నిలిపివేయగలదు.</translation> @@ -91,11 +91,13 @@ <translation id="4746050847053251315">ఏదేమైనా Chromiumని మూసివేయాలా?</translation> <translation id="4748217263233248895">Chromiumకి సంబంధించిన ప్రత్యేక భద్రతా అప్డేట్ వర్తింపజేయబడింది. ఇప్పుడే పునఃప్రారంభించండి, మేము మీ ట్యాబ్లను పునరుద్ధరిస్తాము.</translation> <translation id="4750035648288509542">దాదాపుగా తాజాగా ఉంది! అప్డేట్ చేయడాన్ని పూర్తి చేయడానికి Chromiumను మళ్లీ ప్రారంభించండి. అజ్ఞాత విండోలు మళ్లీ తెరవబడవు.</translation> +<translation id="4788777615168560705">Chromium మీ పాస్వర్డ్లను చెక్ చేయలేకపోయింది. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి లేదా <ph name="BEGIN_LINK" />మీ Google ఖాతాలో పాస్వర్డ్లను చెక్ చేయండి<ph name="END_LINK" />.</translation> <translation id="479167709087336770">ఇది Google శోధనలో ఉపయోగించే అదే స్పెల్ చెకర్ను ఉపయోగిస్తుంది. మీరు బ్రౌజర్లో టైప్ చేసే వచనాన్ని Googleకు పంపుతుంది. మీరు ఈ ప్రవర్తనను తర్వాత ఎప్పుడైనా సెట్టింగ్లలో మార్చవచ్చు.</translation> <translation id="4888717733111232871">mDNS ట్రాఫిక్ను అనుమతించడానికి Chromium ఇన్బౌండ్ నియమం.</translation> <translation id="4943838377383847465">Chromium నేపథ్య మోడ్లో ఉంది.</translation> <translation id="4987820182225656817">అతిథులు ఎటువంటి చరిత్రను వదలకుండానే Chromiumను ఉపయోగించవచ్చు.</translation> <translation id="4994636714258228724">Chromiumకు మిమ్మల్ని జోడించుకోండి</translation> +<translation id="5224391634244552924">సేవ్ చేసిన పాస్వర్డ్లు లేవు. మీరు మీ పాస్వర్డ్లను సేవ్ చేసినప్పుడు Chromium వాటిని చెక్ చేయగలదు.</translation> <translation id="5277894862589591112">మీ మార్పులను వర్తింపజేయడానికి, Chromiumని పునఃప్రారంభించండి</translation> <translation id="5358375970380395591">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Chromium ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chromium డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium నవీకరించబడుతోంది (<ph name="PROGRESS_PERCENT" />)</translation> @@ -162,6 +164,7 @@ <translation id="7066436765290594559">Chromium OS మీ డేటాను సింక్ చేయలేకపోయింది. దయచేసి మీ సింక్ రహస్య పదబంధాన్ని అప్డేట్ చేయండి.</translation> <translation id="7067091210845072982">చిత్రంలో ఉపయోగకరమైన వివరణ లేకుంటే, మీ కోసం ఒక వివరణను అందించడానికి Chromium ప్రయత్నిస్తుంది. వివరణలను సృష్టించడానికి, చిత్రాలు Googleకు పంపబడతాయి.</translation> <translation id="7196312274710523067">Chromiumను ప్రారంభించడం సాధ్యపడలేదు. మళ్లీ ప్రయత్నించండి.</translation> +<translation id="7197677400338048821">Chromium మీ పాస్వర్డ్లను చెక్ చేయలేకపోయింది. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి.</translation> <translation id="7205698830395646142">Chromium మెనూలో దాచండి</translation> <translation id="7223968959479464213">విధి నిర్వాహకుడు - Chromium</translation> <translation id="731644333568559921">&Chromium OSను అప్డేట్ చేయండి</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index 72b0e19..5c78f2b 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">เปิดใหม่</translation> <translation id="2805036593126168338">Chromium OS ซิงค์รหัสผ่านของคุณไม่ได้ แก้ไขเลย</translation> <translation id="2847479871509788944">นำออกจาก Chromium...</translation> -<translation id="2886012850691518054">ตัวเลือก: ช่วยปรับปรุง Chromium ให้ดีขึ้นโดยการส่งสถิติการใช้งานและรายงานข้อขัดข้องไปยัง Google โดยอัตโนมัติ</translation> <translation id="2910007522516064972">เกี่ยวกับ &Chromium</translation> <translation id="2977470724722393594">Chromium อัปเดตแล้ว</translation> <translation id="2983934633046890458">Chromium กำลังพยายามแก้ไขรหัสผ่าน</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 9bedab4..abea2637 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Yeniden başlat</translation> <translation id="2805036593126168338">Chromium OS, şifrelerinizi senkronize edemedi. Şimdi düzelt.</translation> <translation id="2847479871509788944">Chromium'dan kaldır...</translation> -<translation id="2886012850691518054">İsteğe Bağlı: Kullanıcı istatistiklerini ve kilitlenme raporlarını Google'a otomatik olarak göndererek Chromium'u iyileştirmemize yardımcı olun.</translation> <translation id="2910007522516064972">&Chromium hakkında</translation> <translation id="2977470724722393594">Chromium güncel durumda</translation> <translation id="2983934633046890458">Chromium şifreleri düzenlemeye çalışıyor.</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index abb5133..60ad0aa 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Перезапустити</translation> <translation id="2805036593126168338">ОС Chromium не вдалося синхронізувати ваші паролі. Виправити.</translation> <translation id="2847479871509788944">Видалити з Chromium…</translation> -<translation id="2886012850691518054">Додатково: допоможіть покращити Chromium, автоматично надсилаючи статистику використання та звіти про аварійне завершення роботи в Google.</translation> <translation id="2910007522516064972">Про &Chromium</translation> <translation id="2977470724722393594">У вас остання версія Chromium</translation> <translation id="2983934633046890458">Chromium намагається змінити паролі.</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index fb13d88..2632b80 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">دوبارہ شروع کریں</translation> <translation id="2805036593126168338">Chromium OS آپ کے پاس ورڈز کی مطابقت پذیری نہیں کر سکا۔ ابھی درست کریں۔</translation> <translation id="2847479871509788944">Chromium سے ہٹائیں…</translation> -<translation id="2886012850691518054">اختیاری: Google کو استعمال کے اعداد و شمار اور کریش رپورٹس خودکار طور پر بھیج کر Chromium کو بہتر بنانے میں مدد کریں۔</translation> <translation id="2910007522516064972">Chromium& کے بارے میں</translation> <translation id="2977470724722393594">Chromium اپ ٹو ڈیٹ ہے</translation> <translation id="2983934633046890458">Chromium پاس ورڈز میں ترمیم کرنے کی کوشش کر رہا ہے۔</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb index 64679f0..99120e9b 100644 --- a/chrome/app/resources/chromium_strings_uz.xtb +++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Qaytadan ishga tushirish</translation> <translation id="2805036593126168338">Chromium OS tizimidagi parollaringiz sinxronlanmadi. Tuzatish.</translation> <translation id="2847479871509788944">Chromium‘dan o‘chirish...</translation> -<translation id="2886012850691518054">Ixtiyoriy: Google’ga foydalanish statistikasi va ishdan chiqish hisobotlarini jo‘natish orqali Chromium’ni takomillashtirishga yordam bering</translation> <translation id="2910007522516064972">&Chromium haqida</translation> <translation id="2977470724722393594">Siz Chromium brauzerining eng oxirgi versiyasidan foydalanyapsiz.</translation> <translation id="2983934633046890458">Chromium parollarni tahrirlashga urinmoqda.</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index b8c80c3..9a8ab8e 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">Chạy lại</translation> <translation id="2805036593126168338">Chromium OS không thể đồng bộ hóa mật khẩu của bạn. Khắc phục ngay.</translation> <translation id="2847479871509788944">Xóa khỏi Chromium...</translation> -<translation id="2886012850691518054">Tùy chọn: giúp cải thiện Chromium bằng cách tự động gửi thống kê sử dụng và báo cáo sự cố cho Google.</translation> <translation id="2910007522516064972">Giới thiệu về &Chromium</translation> <translation id="2977470724722393594">Chromium đã được cập nhật</translation> <translation id="2983934633046890458">Chromium đang cố gắng chỉnh sửa mật khẩu.</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">Khóa API của Google bị thiếu. Một số chức năng của Chromium sẽ bị tắt.</translation> <translation id="3296368748942286671">Tiếp tục chạy các ứng dụng dưới nền khi Chromium bị đóng</translation> <translation id="331951419404882060">Chromium OS không thể đồng bộ hóa dữ liệu của bạn do lỗi khi đăng nhập.</translation> +<translation id="347328004046849135">Chromium sẽ thông báo cho bạn khi bạn đăng nhập bằng mật khẩu bị lộ</translation> <translation id="3474745554856756813">Thao tác này sẽ xóa <ph name="ITEMS_COUNT" /> mục khỏi thiết bị này. Để truy xuất dữ liệu của bạn sau, hãy đăng nhập vào Chromium dưới dạng <ph name="USER_EMAIL" />.</translation> <translation id="3509308970982693815">Hãy đóng tất cả cửa sổ Chromium và thử lại.</translation> <translation id="3575459661164320785">Máy tính của bạn có phần mềm độc hại. Chromium có thể xóa phần mềm này, khôi phục các tùy chọn cài đặt của bạn và tắt tiện ích để giúp trình duyệt hoạt động lại bình thường.</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">Bạn vẫn muốn thoát khỏi Chromium?</translation> <translation id="4748217263233248895">Chromium vừa áp dụng một bản cập nhật bảo mật đặc biệt. Vui lòng khởi động lại ngay bây giờ và chúng tôi sẽ khôi phục các tab của bạn.</translation> <translation id="4750035648288509542">Sắp cập nhật xong rồi! Hãy chạy lại Chromium để hoàn tất quá trình cập nhật. Các cửa sổ ẩn danh sẽ không mở lại.</translation> +<translation id="4788777615168560705">Chromium không thể kiểm tra mật khẩu của bạn. Hãy thử lại sau 24 giờ hoặc <ph name="BEGIN_LINK" />kiểm tra các mật khẩu trong Tài khoản Google của bạn<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Dịch vụ này sử dụng cùng một trình kiểm tra chính tả dùng trong Google Tìm kiếm. Thông tin bạn nhập vào trình duyệt sẽ được gửi tới Google. Bạn luôn có thể thay đổi hành động này trong phần cài đặt.</translation> <translation id="4888717733111232871">Quy tắc kết nối để Chromium cho phép lưu lượng truy cập mDNS.</translation> <translation id="4943838377383847465">Chromium đang chạy trong nền.</translation> <translation id="4987820182225656817">Khách có thể sử dụng Chromium mà không phải thoát khỏi bất cứ nội dung nào.</translation> <translation id="4994636714258228724">Thêm chính bạn vào Chromium</translation> +<translation id="5224391634244552924">Bạn chưa lưu mật khẩu nào. Chromium có thể kiểm tra các mật khẩu của bạn khi bạn lưu các mật khẩu đó.</translation> <translation id="5277894862589591112">Để áp dụng các mục thay đổi của bạn, hãy chạy lại Chromium</translation> <translation id="5358375970380395591">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát cấu hình Chromium của bạn. Dữ liệu Chromium của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn được liên kết với <ph name="USER_NAME" />. Bạn có thể xóa dữ liệu này thông qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Đang cập nhật Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium OS không thể đồng bộ hóa dữ liệu của bạn. Vui lòng cập nhật cụm mật khẩu Đồng bộ hóa của bạn.</translation> <translation id="7067091210845072982">Chromium sẽ cố gắng mô tả cho bạn những hình ảnh không có nội dung mô tả hữu ích. Để tạo nội dung mô tả, các hình ảnh sẽ được gửi đến Google.</translation> <translation id="7196312274710523067">Không thể mở Chromium. Hãy thử lại.</translation> +<translation id="7197677400338048821">Chromium không thể kiểm tra mật khẩu của bạn. Hãy thử lại sau 24 giờ.</translation> <translation id="7205698830395646142">Ẩn trong menu Chromium</translation> <translation id="7223968959479464213">Trình quản lý tác vụ - Chromium</translation> <translation id="731644333568559921">Cập nhật &Chromium OS</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index a833c708..631107c 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">重新启动</translation> <translation id="2805036593126168338">Chromium 操作系统无法同步您的密码。请立即修正。</translation> <translation id="2847479871509788944">从Chromium中移除…</translation> -<translation id="2886012850691518054">可选:将使用情况统计信息和崩溃报告自动发送给 Google,帮助我们完善 Chromium。</translation> <translation id="2910007522516064972">关于 Chromium(&C)</translation> <translation id="2977470724722393594">Chromium 已是最新版本</translation> <translation id="2983934633046890458">Chromium 正在尝试修改密码。</translation> @@ -58,6 +57,7 @@ <translation id="328888136576916638">缺少 Google API 密钥,因此 Chromium 的部分功能将无法使用。</translation> <translation id="3296368748942286671">关闭 Chromium 后继续运行后台应用</translation> <translation id="331951419404882060">登录时出现错误,Chromium操作系统无法同步您的数据。</translation> +<translation id="347328004046849135">当您使用已泄露的密码登录时,Chromium 会通知您</translation> <translation id="3474745554856756813">这会从这台设备上删除 <ph name="ITEMS_COUNT" /> 项内容。如果日后想要检索您的数据,届时请以 <ph name="USER_EMAIL" /> 的身份登录 Chromium。</translation> <translation id="3509308970982693815">请关闭所有 Chromium 窗口并重试。</translation> <translation id="3575459661164320785">您的计算机上存在有害软件。Chromium 可以移除该软件、恢复您的设置并停用扩展程序,以确保您的浏览器能够重新正常运行。</translation> @@ -93,11 +93,13 @@ <translation id="4746050847053251315">仍要退出 Chromium?</translation> <translation id="4748217263233248895">Chromium 刚刚应用了一项特殊的安全更新。请立即重启,以便系统恢复您的标签页。</translation> <translation id="4750035648288509542">离最新版本只有一步之遥了!重新启动 Chromium 即可完成更新。无痕式窗口不会自动重新打开。</translation> +<translation id="4788777615168560705">Chromium 无法检查您的密码。请过 24 小时再试,或者<ph name="BEGIN_LINK" />检查您的 Google 帐号中的密码<ph name="END_LINK" />。</translation> <translation id="479167709087336770">这项服务会使用 Google 搜索所用的拼写检查工具。您在浏览器中输入的文字会被发送给 Google。您随时可在“设置”中更改此行为。</translation> <translation id="4888717733111232871">Chromium的入站规则,允许mDNS流量。</translation> <translation id="4943838377383847465">Chromium处于后台运行模式。</translation> <translation id="4987820182225656817">访客使用Chromium不会留下任何痕迹。</translation> <translation id="4994636714258228724">将您自己添加到Chromium</translation> +<translation id="5224391634244552924">尚未保存任何密码。您需要先保存密码才能使用 Chromium 的密码检查功能。</translation> <translation id="5277894862589591112">要想应用您的更改,请重新启动 Chromium</translation> <translation id="5358375970380395591">您目前登录的帐号是一个托管帐号,该帐号的管理员将能够控制您的 Chromium 个人资料。您的 Chromium 数据(例如您的应用、书签、历史记录、密码和其他设置)将永远与 <ph name="USER_NAME" /> 相关联。您可以通过 Google 帐号信息中心删除这些数据,但无法将这些数据与其他帐号相关联。<ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">正在更新 Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -164,6 +166,7 @@ <translation id="7066436765290594559">Chromium操作系统无法同步您的数据。请更新您的同步密码。</translation> <translation id="7067091210845072982">如果图片缺少有用的说明,则 Chromium 会尝试为您提供一条说明。为便于创建说明,系统会将图片发送给 Google。</translation> <translation id="7196312274710523067">无法启动 Chromium。请重试。</translation> +<translation id="7197677400338048821">Chromium 无法检查您的密码。请过 24 小时再试。</translation> <translation id="7205698830395646142">在 Chromium 菜单中隐藏</translation> <translation id="7223968959479464213">任务管理器 - Chromium</translation> <translation id="731644333568559921">更新 Chromium 操作系统(&C)</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index 2b83525..e00191b 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">重新啟動</translation> <translation id="2805036593126168338">Chromium OS 無法同步您的密碼。請立即修正。</translation> <translation id="2847479871509788944">從 Chromium 中移除…</translation> -<translation id="2886012850691518054">選擇性:將使用統計資料及當機報告自動傳送給 Google,助我們一臂之力,讓 Chromium 更臻完美。</translation> <translation id="2910007522516064972">關於 Chromium(&C)</translation> <translation id="2977470724722393594">Chromium 已是最新版本</translation> <translation id="2983934633046890458">Chromium 正在嘗試編輯密碼。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index e98803b58..076a5ac 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -39,7 +39,6 @@ <translation id="2799223571221894425">重新啟動</translation> <translation id="2805036593126168338">Chromium 作業系統無法同步處理你的密碼。立即修正。</translation> <translation id="2847479871509788944">從 Chromium 中移除...</translation> -<translation id="2886012850691518054">選用:將使用統計資料及當機報告自動傳送給 Google,助我們一臂之力,讓 Chromium 更臻完美。</translation> <translation id="2910007522516064972">關於 Chromium(&C)</translation> <translation id="2977470724722393594">Chromium 目前是最新版本</translation> <translation id="2983934633046890458">Chromium 正在嘗試編輯密碼。</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index 8787b6b..0706832 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -41,7 +41,6 @@ <translation id="2799223571221894425">Qalisa kabusha</translation> <translation id="2805036593126168338">I-Chromium OS ayikwazanga ukuvumelanisa amaphasiwedi wakho. Lungisa manje.</translation> <translation id="2847479871509788944">Susa kusuka ku-Chromium...</translation> -<translation id="2886012850691518054">Ongakukhetha: Siza wenze i-Chromium ibe ngcono ngokuthumela ngokuzenzakalela izibalo zokusetshenziswa nemibiko yokuphahlazeka ku-Google.</translation> <translation id="2910007522516064972">Mayelana ne-&Chromium</translation> <translation id="2977470724722393594">I-Chromium isesikhathini samanje</translation> <translation id="2983934633046890458">I-Chromium izama ukuhlela amaphasiwedi.</translation> @@ -60,6 +59,7 @@ <translation id="328888136576916638">Okhiye be-Google API abekho. Okunye ukusebenza kwe-Chromium kuzokhutshazwa.</translation> <translation id="3296368748942286671">Qhubeka usebenzise izinhlelo zokusebenza ezingemuva uma i-Chromium ivaliwe</translation> <translation id="331951419404882060">I-Chromium OS ayikwazanga ukuvumelanisa idatha yakho yenxa yephutha lokungena ngemvume.</translation> +<translation id="347328004046849135">I-Chromium izokwazisa uma ungena ngemvume ngephasiwedi eyonakalisiwe</translation> <translation id="3474745554856756813">Lokhu kuzobuyekeza izinto ezingu-<ph name="ITEMS_COUNT" /> kusuka kule divayisi. Ukuze ubuyise idatha yakho, ngena ngemvume ku-<ph name="USER_EMAIL" /> njengo.</translation> <translation id="3509308970982693815">Sicela uvale wonke amawindi we-Chromium uphinde uzame futhi.</translation> <translation id="3575459661164320785">Kunesofthiwe eyingozi kwikhompyutha yakho. I-Chromium ingayisusa, ibuyise izilungiselelo zakho, futhi ikhubaze izandiso ukwenza isiphequluli sakho sisebenze kahle futhi.</translation> @@ -95,11 +95,13 @@ <translation id="4746050847053251315">Phuma ku-Chromium noma kunjalo?</translation> <translation id="4748217263233248895">Isibuyekezo esibalulekile sokuvikela se-Chromium sisanda kufakwa. Qalisa kabusha manje bese sizobuyisela amathebhu akho.</translation> <translation id="4750035648288509542">Icishe isisesikhathini! Qalisa kabusha i-Chromium ukuqeda ukubuyekeza. Ama-modi e-Incognito ngeke aze aphinde avuleke.</translation> +<translation id="4788777615168560705">I-Chromium ayikwazi ukuhlola iphasiwedi yakho. Zama futhi ngemva kwamahora angu-24 noma <ph name="BEGIN_LINK" />hlola amaphasiwedi ku-akhawunti yakho ye-Google<ph name="END_LINK" />.</translation> <translation id="479167709087336770">Lokhu kusebenzisa isihloli sokupeleta esifanayo naleso esisetshenziswe kusesho lwe-Google. Umbhalo owuthayiphayo kusiphequluli uthunyelwa ku-Google. Ungahlala ushintsha le mpatho kuzilungiselelo.</translation> <translation id="4888717733111232871">Umyalo obambeke ngaphakathi we-Chromium wokuvumela ithrafikhi ye-mDNS.</translation> <translation id="4943838377383847465">I-Chromium kumodi yasemuva.</translation> <translation id="4987820182225656817">Izihambeli zingasebenzisa i-Chromium ngaphandle kokushiya noma yini ngemuva.</translation> <translation id="4994636714258228724">Zingeze ngokwakho ku-Chromium</translation> +<translation id="5224391634244552924">Awekho amaphasiwedi alondoloziwe. I-Chromium ingahlola amaphasiwedi akho lapho uwalondoloza khona.</translation> <translation id="5277894862589591112">Ukuze ufake izinguquko zakho, qalisa kabusha i-Chromium</translation> <translation id="5358375970380395591">Ungena ngemvume nge-akhawunti ephethwe futhi unikeza umlawuli wayo ukulawula okungaphezulu kwephrofayela yakho ye-Chromium. Idatha yakho ye-Chromium, efana nezinhlelo zakho zokusebenza, amabhukhimakhi, umlando, amaphasiwedi, nezinye izilungiselelo zizoboshezelwa unaphakade ku-<ph name="USER_NAME" />. Uzokwazi ukususa le datha nge-Ideshibhodi yama-Akhawunti we-Google, kodwa ngeke uze ukwazi ukuhlobanisa le datha nenye i-akhawunti. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Ibuyekeza i-Chromium (<ph name="PROGRESS_PERCENT" />)</translation> @@ -166,6 +168,7 @@ <translation id="7066436765290594559">I-Chromium OS ayikwazanga ukuvumelanisa idatha yakho. Sicela ubuyekeze umushwana wakho wokungena wokuvumelanisa.</translation> <translation id="7067091210845072982">Uma isithombe singanayo incazelo ephelele, i-Chromium izozama ukukunikezela eyodwa. Ukuze udale izincazelo, izithombe zithunyelwa ku-Google.</translation> <translation id="7196312274710523067">Ayikwazanga ukuqalisa i-Chromium. Zama futhi.</translation> +<translation id="7197677400338048821">I-Chromium ayikwazi ukuhlola iphasiwedi yakho. Zama futhi emva kwamahora angu-24.</translation> <translation id="7205698830395646142">Fihla kumenyu ye-Chromium</translation> <translation id="7223968959479464213">Isiphathi somsebenzi - I-Chromium</translation> <translation id="731644333568559921">Buyekeza i-&Chromium OS</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 0a588686..fd11fd0 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -4002,7 +4002,6 @@ <translation id="6365411474437319296">Voeg familie en vriende by</translation> <translation id="636850387210749493">Onderneminginskrywing</translation> <translation id="6370021412472292592">Kon nie manifes laai nie.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Verander wagwoord}other{Verander wagwoorde}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Probeer weer</translation> <translation id="6377268785556383139">1 resultaat vir "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 221be82..3be7b93 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">የህትመት አገልጋይ</translation> <translation id="1805967612549112634">ፒን ያረጋግጡ</translation> <translation id="1806335016774576568">ወደ ሌላ ክፍት መተግበሪያ ይቀይሩ</translation> +<translation id="1809483812148634490">እርስዎ ከGoogle Play ያወረዷቸው መተግበሪያዎች ከዚህ Chromebook ይሰረዛሉ። + <ph name="LINE_BREAKS1" /> + እንዲሁም እንደ ፊልሞች፣ የቴሌቪዥን ትርኢቶች፣ ሙዚቃ፣ መጽሐፍት ወይም ሌሎች የውስጠ-መተግበሪያ ግዢዎች ያሉ እርስዎ የገዟቸው ይዘቶች ሊሰረዙ ይችላሉ። + <ph name="LINE_BREAKS2" /> + ይህ በሌሎች መሣሪያዎች ላይ ባሉ መተግበሪያዎች ወይም ይዘት ላይ ተጽዕኖ አያሳርፍባቸውም።</translation> <translation id="1809734401532861917">የእኔን እልባቶች፣ ታሪክ፣ የይለፍ ቃሎች እና ሌሎች ቅንብሮችን ወደ <ph name="USER_EMAIL_ADDRESS" /> አክል</translation> <translation id="1813278315230285598">ግልጋሎቶች</translation> <translation id="18139523105317219">EDI ፓርቲ ስም</translation> @@ -1392,6 +1397,7 @@ <translation id="2825848369316359348">በደህንነት ቁልፍዎ ጀርባ ላይ የታተመውን ስም ያግኙ</translation> <translation id="2828650939514476812">ወደ Wi-Fi አውታረ መረብ አገናኝ</translation> <translation id="2835294513443818940">ይህ ፋይል ደህንነቱ በተጠበቀ ሁኔታ ሊወርድ አይችልም።</translation> +<translation id="2835547721736623118">የንግግር ማወቂያ አገልግሎት</translation> <translation id="2836269494620652131">ብልሽት</translation> <translation id="2836635946302913370">በዚህ ተጠቃሚ ስም መግባት በአስተዳዳሪዎ ተሰናክሏል።</translation> <translation id="283669119850230892">የ<ph name="NETWORK_ID" /> አውታረ መረብን ለመጠቀም መጀመሪያ ከበይነመረቡ ጋር ያለዎትን ግንኙነት ከታች ያጠናቅቁ።</translation> @@ -1536,6 +1542,7 @@ <translation id="3019285239893817657">የንዑስ ገጽ አዝራር</translation> <translation id="3020183492814296499">አቋራጮች</translation> <translation id="3020990233660977256">መለያ ቁጥር፦ <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">ባትሪ ላይ ሳለ</translation> <translation id="3021066826692793094">ቢራቢሮ</translation> <translation id="3021678814754966447">የፍሬም መነሻ &አሳይ</translation> <translation id="3022978424994383087">አልሰማሁትም።</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">ምትኬ ወደ Google Drive ያስቀምጡ። በማንኛውም ጊዜ ውሂብ በቀላሉ ወደነበሩበት ይመልሱ ወይም መሣሪያን ይቀይሩ። ይህ ምትኬ የመተግበሪያ ውሂብን ያካትታል። ምትኬዎች ወደ Google ተሰቅለዋል እና የልጅዎን የGoogle መለያ የይለፍ ቃል በመጠቀም ተመስጥረዋል።</translation> <translation id="4634771451598206121">እንደገና ይግቡ...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> ለእንግዳ ተጠቃሚዎች አይገኝም።</translation> +<translation id="4635444580397524003">የLinux ምትኬ በተሳካ ሁኔታ ወደነበረበት ተመልሷል።</translation> <translation id="4636930964841734540">መረጃ</translation> <translation id="4637083375689622795">ተጨማሪ እርምጃዎች፣ <ph name="EMAIL" /></translation> <translation id="4638930039313743000">የADB ስህተትን ማረሚያ አንቃ</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">የላቁ የአታሚ አማራጮችን አሳይ</translation> <translation id="4891089016822695758">የቅድመ-ይሁንታ ሙከራ መድረክ</translation> <translation id="4892229439761351791">ጣቢያ ብሉቱዝን መጠቀም ይችላል</translation> +<translation id="489258173289528622">ባትሪ ላይ ሳለ የስራ መፍታት እርምጃ</translation> <translation id="4893336867552636863">ይሄ የአሰሳ ውሂብዎን ለዘለዓለም ከዚህ መሣሪያ ይሰርዘዋል።</translation> <translation id="4893522937062257019">በማያ ገጽ ቁልፉ ላይ</translation> <translation id="489454699928748701">ጣቢያዎች የእንቅስቃሴ ዳሳሾችን እንዲጠቀሙ ይፍቀዱ</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">የማረሚያ ባህሪያትን ያንቁ</translation> <translation id="5864195618110239517">የሚለካ ግንኙነት ተጠቀም</translation> <translation id="5864471791310927901">የDHCP ፍለጋ አልተሳካም</translation> +<translation id="5864754048328252126">ኃይል እየሞላ ሳለ የስራ መፍታት እርምጃ</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> በቅርቡ ባለበት ይቆማል</translation> <translation id="586567932979200359"><ph name="PRODUCT_NAME" />ን ከዲስክ ምስሉ እያሄዱ ነው። ኮምፒውተርዎ ላይ መጫን ያለ ዲስክ ምስሉ እንዲያሂዱት ያስችልዎታል፣ እና እንደተዘመነ መቆየቱን ያረጋግጣል።</translation> <translation id="5865733239029070421">የአጠቃቀም ስታስቲክስን እና የብልሽት ሪፖርቶችን በራስ-ሰር ወደ Google ይልካል</translation> @@ -3810,6 +3820,7 @@ <translation id="6120205520491252677">ይህን ገጽ የመነሻ ገጹ ላይ ይሰኩት...</translation> <translation id="6122081475643980456">የበይነመረብ ግንኙነትዎ ቁጥጥር እየተደረገበት ነው</translation> <translation id="6122095009389448667">ይህ ጣቢያ ቅንጥብ ሰሌዳውን እንዳያይ መታገዱን ቀጥል</translation> +<translation id="6122831415929794347">የጥንቃቄ አሰሳ ይጥፋ?</translation> <translation id="6122875415561139701">የመጻፍ ክወና በዚህ ላይ አይፈቀድም፦ «<ph name="DEVICE_NAME" />»።</translation> <translation id="6124650939968185064">የሚከተሉት ቅጥያዎች በዚህ ቅጥያ ላይ ይወሰናሉ፦</translation> <translation id="6124698108608891449">ይህ ጣቢያ ተጨማሪ ፈቃዶችን ይፈልጋል።</translation> @@ -3987,7 +3998,6 @@ <translation id="6365411474437319296">ቤተሰብ እና ጓደኛዎች ያክሉ</translation> <translation id="636850387210749493">የድርጅት ምዝገባ</translation> <translation id="6370021412472292592">ማሳያን መጫን አልተቻለም።</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{የይለፍ ቃል ይለውጡ}one{የይለፍ ቃላትን ይለውጡ}other{የይለፍ ቃላት ንይለውጡ}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">እንደገና ይሞክሩ</translation> <translation id="6377268785556383139">ለ«<ph name="SEARCH_TEXT" />» 1 ውጤት</translation> @@ -4013,6 +4023,7 @@ <translation id="6408118934673775994">ውሂብዎን በ<ph name="WEBSITE_1" />፣ <ph name="WEBSITE_2" /> እና <ph name="WEBSITE_3" /> ላይ ያነብባል እና ይቀይራል</translation> <translation id="6410257289063177456">የምስል ፋይሎች</translation> <translation id="6410328738210026208">ሰርጥ ቀይር እና Powerwash</translation> +<translation id="6410390304316730527">የጥንቃቄ አሰሳ እንደ ተንኮል-አዘል ሶፍትዌር መጫን ያለ አደገኛ ነገር እንዲያደርጉ ወይም እንደ የይለፍ ቃላት፣ ስልክ ቁጥሮች ወይም ክሬዲት ካርዶች ያለ የግል መረጃን እንዲገልጡ እርስዎን ሊያታልሉዎ ከሚችሉ አጥቂዎች ይጠብቀዎታል። ካጠፉት ያልተለመደ ወይም ስማቸው ጥሩ ያልሆኑ ጣቢያዎችን ሲያስሱ ይጠንቀቁ።</translation> <translation id="6410668567036790476">የፍለጋ ፕሮግራም ያክሉ</translation> <translation id="641081527798843608">የርዕሰ ጉዳይ ተዛማጅ</translation> <translation id="6412673304250309937">በChrome ላይ የተከማቹ ድህንነታቸው ያልተጠበቁ ጣቢያዎች ዝርዝር ጋር ዩአርኤሎችን ይፈትሻል። አንድ ጣቢያ የእርስዎን የይለፍ ቃል ለመስረቅ ከሞከረ ወይም ጎጂ ፋይል ካወረደ Chrome እንዲሁም የገጽ ይዘትን ክፍሎችም ጨምሮ ዩአርኤሎችን ወደ የጥንቃቄ አሰሳ መላክ ሊልክ ይችላል።</translation> @@ -5937,6 +5948,7 @@ <translation id="8951256747718668828">በስህተት ምክንያት እንደ ነበረ መመለስ ሊጠናቀቅ አልተቻለም</translation> <translation id="8951465597020890363">የሆነው ሆኖ ከእንግዳ ሁነታ ይወጣ?</translation> <translation id="8952831374766033534">የውቅረት አማራጭ አይደገፍም፦ <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">ባትሪ በመሙላት ላይ ሳለ</translation> <translation id="895347679606913382">በመጀመር ላይ…</translation> <translation id="8957762313041272117">የቀጥታ ስርጭት መግለጫ ጽሑፍ</translation> <translation id="895944840846194039">የJavaScript ማህደረ ትውስታ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 9d959e6a..68b47d0 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -4000,7 +4000,6 @@ <translation id="6365411474437319296">إضافة العائلة والأصدقاء</translation> <translation id="636850387210749493">التسجيل في المؤسسة</translation> <translation id="6370021412472292592">تعذر تحميل البيان.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{تغيير كلمة المرور}zero{تغيير كلمات المرور}two{تغيير كلمتَيّ المرور}few{تغيير كلمات المرور}many{تغيير كلمات المرور}other{تغيير كلمات المرور}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">إعادة المحاولة</translation> <translation id="6377268785556383139">نتيجة بحث واحدة عن "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 826493fd..f20c6e4 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">প্ৰিণ্ট ছার্ভাৰ</translation> <translation id="1805967612549112634">পিন নিশ্চিত কৰক</translation> <translation id="1806335016774576568">অন্য এটা খোল খাই থকা এপলৈ সলনি কৰক</translation> +<translation id="1809483812148634490">আপুনি Google Playৰ পৰা ডাউনল’ড কৰা এপ্সমূহ এই Chromebookৰ পৰা মচা হ’ব। + <ph name="LINE_BREAKS1" /> + আপুনি ক্ৰয় কৰা সমল যেনে চলচ্চিত্র, টিভি শ্ব', সংগীত, কিতাপ অথবা অন্য এপত কৰা ক্ৰয়সমূহো মচা হ’ব পাৰে। + <ph name="LINE_BREAKS2" /> + ই অন্য ডিভাইচসমূহত থকা এপ্সমূহ অথবা সমলৰ ওপৰত প্ৰভাৱ নেপেলায়।</translation> <translation id="1809734401532861917">মোৰ বুকমাৰ্ক, সন্ধান ইতিহাস, পাছৱৰ্ড আৰু অন্য ছেটিংসমূহ <ph name="USER_EMAIL_ADDRESS" />ত যোগ কৰক</translation> <translation id="1813278315230285598">সেৱা</translation> <translation id="18139523105317219">EDI পাৰ্টিৰ নাম</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">আপোনাৰ সুৰক্ষা চাবিটোৰ পিছফালে ছপা থকা নামটো বিচাৰক</translation> <translation id="2828650939514476812">ৱাই-ফাই নেটৱৰ্কৰ সৈতে সংযোগ কৰক</translation> <translation id="2835294513443818940">এই ফাইলটো সুৰক্ষিতভাৱে ডাউনল’ড কৰিব নোৱাৰি।</translation> +<translation id="2835547721736623118">কণ্ঠস্বৰ চিনাক্তকৰণ সেৱা</translation> <translation id="2836269494620652131">ক্ৰেশ্ব</translation> <translation id="2836635946302913370">আপোনাৰ প্ৰশাসকে এই ব্যৱহাৰকাৰীৰ নামটোৰে ছাইন ইন কৰাটো অক্ষম কৰি থৈছে।</translation> <translation id="283669119850230892">নেটৱর্ক <ph name="NETWORK_ID" /> ব্যৱহাৰ কৰিবলৈ প্ৰথমে তলৰ ইণ্টাৰনেটৰ সৈতে আপোনাৰ সংযোগ সম্পূর্ণ কৰক।</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">উপ-পৃষ্ঠাৰ বুটাম</translation> <translation id="3020183492814296499">শ্বৰ্টকাট</translation> <translation id="3020990233660977256">ক্ৰমিক নম্বৰ: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">বেটাৰীত থকাৰ সময়ত</translation> <translation id="3021066826692793094">পখিলা</translation> <translation id="3021678814754966447">&ফ্ৰে’মৰ উৎস চাওক</translation> <translation id="3022978424994383087">কি ক'লে বুজি নাপালোঁ।</translation> @@ -2726,6 +2733,7 @@ <translation id="4633757335284074492">Google Driveত বেক আপ লওক। ডেটা সহজে পুনঃস্থাপন কৰক অথবা যিকোনো সময়তে ডিভাইচ সলনি কৰক। এই বেকআপত এপ্ ডেটা আছে। বেকআপসমূহ Googleত আপল’ড কৰা হয় আৰু আপোনাৰ Google একাউণ্টৰ পাছৱৰ্ড ব্যৱহাৰ কৰি এনক্ৰিপ্ট কৰা হয়।</translation> <translation id="4634771451598206121">আকৌ ছাইন ইন কৰক…</translation> <translation id="4635398712689569051">অতিথি ব্যৱহাৰকাৰীৰ বাবে <ph name="PAGE_NAME" /> উপলব্ধ নহয়।</translation> +<translation id="4635444580397524003">Linuxৰ বেকআপ সফলতাৰে পুনঃস্থাপন কৰা হৈছে</translation> <translation id="4636930964841734540">তথ্য</translation> <translation id="4637083375689622795">অধিক কার্য, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB ডিবাগিং সক্ষম কৰক</translation> @@ -2901,6 +2909,7 @@ <translation id="4890773143211625964">প্ৰিণ্টাৰৰ উন্নত বিকল্প দেখুৱাওক</translation> <translation id="4891089016822695758">বিটা ফৰাম</translation> <translation id="4892229439761351791">ছাইটে ব্লুটুথ ব্যৱহাৰ কৰিব পাৰে</translation> +<translation id="489258173289528622">বেটাৰীত থকাৰ সময়ত একো কাৰ্যকলাপ নকৰাকৈ থকা</translation> <translation id="4893336867552636863">এই কাৰ্যই এই ডিভাইচটোৰ পৰা আপোনাৰ ব্ৰাউজিং ডেটা স্থায়ীভাৱে মচি পেলাব।</translation> <translation id="4893522937062257019">লক স্ক্ৰীণত</translation> <translation id="489454699928748701">ছাইটসমূহক ম'শ্বন ছেন্সৰসমূহ ব্যৱহাৰ কৰিবলৈ অনুমতি দিয়ক</translation> @@ -3606,6 +3615,7 @@ <translation id="5863445608433396414">ডিবাগিং সুবিধাসমূহ সক্ষম কৰক</translation> <translation id="5864195618110239517">নিৰিখ-নিৰ্দিষ্ট সংযোগ ব্যৱহাৰ কৰক</translation> <translation id="5864471791310927901">DHCP বিচাৰিব পৰা নগ’ল।</translation> +<translation id="5864754048328252126">চার্জ কৰাৰ সময়ত অন্য একো কাৰ্যকলাপ নকৰাকৈ থকা</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> সোনকালে পজ হ’ব</translation> <translation id="586567932979200359">আপুনি <ph name="PRODUCT_NAME" />ক ইয়াৰ ডিস্কৰ প্ৰতিচ্ছবিৰ পৰা চলাই আছে। আপোনাৰ কম্পিউটাৰত এইটো ইনষ্টল কৰিলে আপুনি ইয়াক ডিস্কৰ প্ৰতিচ্ছবিৰ অবিহনেই ব্যৱহাৰ কৰিব পাৰিব আৰু এই কার্যই এইটো আপ-টু-ডে’ট ৰখাটো সুনিশ্চিত কৰে।</translation> <translation id="5865733239029070421">Googleলৈ স্বয়ংক্ৰিয়ভাৱে ব্যৱহাৰৰ পৰিসংখ্যা আৰু ক্ৰেশ্ব ৰিপ’ৰ্ট পঠিয়াই</translation> @@ -3804,6 +3814,7 @@ <translation id="6120205520491252677">আৰম্ভণিতে দেখা পোৱা স্ক্ৰীণত এই পৃষ্ঠাটো পিন কৰক...</translation> <translation id="6122081475643980456">আপোনাৰ ইণ্টাৰনেট সংযোগ পৰীক্ষা কৰি থকা হৈছে</translation> <translation id="6122095009389448667">এই ছাইটটোৱে ক্লিপব’ৰ্ড চোৱাটো অৱৰোধ কৰি ৰাখক</translation> +<translation id="6122831415929794347">সুৰক্ষিত ব্ৰাউজিং অফ কৰিবনে?</translation> <translation id="6122875415561139701">ইয়াত লিখনৰ লগত জড়িত কাৰ্যকলাপৰ অনুমতি নাই: "<ph name="DEVICE_NAME" />"।</translation> <translation id="6124650939968185064">তলত উল্লেখ কৰা এক্সটেনশ্বনসমূহে এই এক্সটেনশ্বনৰ ওপৰত নির্ভৰ কৰে :</translation> <translation id="6124698108608891449">এই ছাইটটোৰ বাবে অধিক অনুমতিৰ আৱশ্যক।</translation> @@ -3981,7 +3992,6 @@ <translation id="6365411474437319296">পৰিয়াল আৰু বন্ধুবর্গক যোগ কৰক</translation> <translation id="636850387210749493">এন্টাৰপ্ৰাইজৰ পঞ্জীয়ন</translation> <translation id="6370021412472292592">মেনিফেষ্ট ল’ড কৰিব পৰা নগ’ল।</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{পাছৱৰ্ড সলনি কৰক}one{পাছৱৰ্ডসমূহ সলনি কৰক}other{পাছৱৰ্ডসমূহ সলনি কৰক}}</translation> <translation id="6374077068638737855">আইচৱিজল</translation> <translation id="6374469231428023295">আকৌ চেষ্টা কৰক</translation> <translation id="6377268785556383139">’<ph name="SEARCH_TEXT" />’ৰ বাবে পোৱা ১টা ফলাফল</translation> @@ -4007,6 +4017,7 @@ <translation id="6408118934673775994">আপোনাৰ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> আৰু <ph name="WEBSITE_3" />ত থকা ডেটা পঢ়ে আৰু সলনি কৰে</translation> <translation id="6410257289063177456">প্ৰতিচ্ছবিৰ ফাইল</translation> <translation id="6410328738210026208">চ্চেনেল আৰু পাৱাৰৱাশ্ব সলনি কৰক</translation> +<translation id="6410390304316730527">সুৰক্ষিত ব্ৰাউজিঙে আপোনাক এনে আক্ৰমণকাৰীসকলৰ পৰা সুৰক্ষা প্ৰদান কৰে, যিসকলে আপোনাৰ দ্বাৰা কিছুমান বিপজ্জনক কাম কৰাবলৈ চেষ্টা কৰিব পাৰে, যেনে কোনো ছফ্টৱেৰ ইনষ্টল কৰোৱা অথবা আপোনাৰ ব্যক্তিগত তথ্য (উদাহৰণস্বৰূপে, পাছৱর্ড, ফ’ন নম্বৰ অথবা ক্ৰেডিট কার্ড) ফাদিল কৰা। আপুনি যদি এইটো বন্ধ কৰি ৰাখে তেন্তে আপুনি অচিনাকী অথবা অখ্যাত ছাইটসমূহ ব্ৰাউজ কৰাৰ সময়ত সাবধান হওক।</translation> <translation id="6410668567036790476">সন্ধানৰ ইঞ্জিন যোগ কৰক</translation> <translation id="641081527798843608">বিষয়ৰ মিল</translation> <translation id="6412673304250309937">Chromeত ষ্ট'ৰ কৰি ৰখা অসুৰক্ষিত ছাইটসমূহৰ এখন সূচীৰ সৈতে URLসমূহ পৰীক্ষা কৰে। যদি কোনোবা ছাইটে আপোনাৰ পাছৱর্ড চুৰি কৰিবলৈ চেষ্টা কৰে অথবা আপুনি কোনো ক্ষতিকাৰক ফাইল ডাউনল'ড কৰাৰ সময়ত Chromeএ পৃষ্ঠাৰ সমলৰ বিটসমূহকে ধৰি URLসমূহ সুৰক্ষিত ব্ৰাউজিঙলৈ পঠিয়াব পাৰে।</translation> @@ -5919,6 +5930,7 @@ <translation id="8951256747718668828">কোনো আসোঁৱাহৰ বাবে পুনঃস্থাপন সম্পূৰ্ণ কৰিব পৰা নগ'ল</translation> <translation id="8951465597020890363">যিকোনো প্ৰকাৰে অতিথি ম’ডৰ পৰা বাহিৰ হ’বনে?</translation> <translation id="8952831374766033534">কনফিগাৰেশ্বনৰ বিকল্পটো সমর্থিত নহয়: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">চার্জ কৰি থকাৰ সময়ত</translation> <translation id="895347679606913382">আৰম্ভ কৰি থকা হৈছে...</translation> <translation id="8957762313041272117">লাইভ কেপশ্বন</translation> <translation id="895944840846194039">JavaScript মেম’ৰী</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index d4a15f3e..e268523 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -608,6 +608,11 @@ <translation id="1805888043020974594">Çap serveri</translation> <translation id="1805967612549112634">PIN kodu təsdiq edin</translation> <translation id="1806335016774576568">Başqa bir açıq tətbiqə dəyişin</translation> +<translation id="1809483812148634490">Google Play'dən endirdiyiniz tətbiqlər bu Chromebook'dan silinəcək. + <ph name="LINE_BREAKS1" /> + Satın aldığınız film, TV şou, musiqi, kitab kimi məzmunlar və digər tətbiqdaxili alışlar da silinə bilər. + <ph name="LINE_BREAKS2" /> + Bu, digər cihazlardakı tətbiq və dataya təsir etmir.</translation> <translation id="1809734401532861917">Əlfəcin, tarixçə, parol və digər ayarlarımı <ph name="USER_EMAIL_ADDRESS" /> ünvanına əlavə edin</translation> <translation id="1813278315230285598">Xidmətlər</translation> <translation id="18139523105317219">EDI Partiya Adı</translation> @@ -1388,6 +1393,7 @@ <translation id="2825848369316359348">Təhlükəsizlik açarının arxasında çap edilən adı seçin</translation> <translation id="2828650939514476812">Wi-Fi şəbəkəsinə qoşulun</translation> <translation id="2835294513443818940">Bu faylı təhlükəsiz şəkildə endirmək mümkün deyil.</translation> +<translation id="2835547721736623118">Nitq tanınması xidməti</translation> <translation id="2836269494620652131">Qəza</translation> <translation id="2836635946302913370">Bu istifadəçi adı ilə giriş aministratorunuz tərəfindən deaktiv edilib.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> şəbəkəsini istifadə etmək üçün ilk öncə internet bağlantınızı tamamlayın.</translation> @@ -1532,6 +1538,7 @@ <translation id="3019285239893817657">Alt səhifə düyməsi</translation> <translation id="3020183492814296499">Qısayollar</translation> <translation id="3020990233660977256">Seriya Nömrəsi: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Batareyadan istifadə edilən zaman</translation> <translation id="3021066826692793094">Kəpənək</translation> <translation id="3021678814754966447">&Çərçivə mənbəsinə baxın</translation> <translation id="3022978424994383087">Tərcümə etmək alınmadı.</translation> @@ -2726,6 +2733,7 @@ <translation id="4633757335284074492">Google Diskə yedəkləyin. İstənilən vaxt datanı asanlıqla bərpa edin və ya cihazı dəyişin. Bu yedəkləməyə tətbiq datası daxildir. Yedəkləmələr Google'a yüklənir və uşağınızın Google Hesabı parolundan istifadə etməklə şifrlənir.</translation> <translation id="4634771451598206121">Yenidən daxil olun</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> Qonaq istifadəçilər üçün əlçatan deyil.</translation> +<translation id="4635444580397524003">Linux yedəkləməsi uğurla bərpa edildi.</translation> <translation id="4636930964841734540">İnfo</translation> <translation id="4637083375689622795">Daha çox əməliyyat, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB sazlamasını aktiv edin</translation> @@ -2901,6 +2909,7 @@ <translation id="4890773143211625964">Qabaqcıl printer seçimlərini göstərin</translation> <translation id="4891089016822695758">Beta forumu</translation> <translation id="4892229439761351791">Sayt Bluetooth istifadə edə bilər</translation> +<translation id="489258173289528622">Batareyadan istifadə edilən zaman cihaz fəaliyyətsiz qaldıqda ediləcək əməliyyat</translation> <translation id="4893336867552636863">Brauzinq datanızı bu cihazdan həmişəlik siləcək.</translation> <translation id="4893522937062257019">Ekran kilidində</translation> <translation id="489454699928748701">Saytların hərəkət sensorundan istifadə etməsinə icazə verin</translation> @@ -3607,6 +3616,7 @@ <translation id="5863445608433396414">Debaq funksiyalarını aktiv edin</translation> <translation id="5864195618110239517">Limitli bağlantıdan istifadə edin</translation> <translation id="5864471791310927901">DHCP axtarış uğursuz oldu</translation> +<translation id="5864754048328252126">Şarj edilən zaman cihaz fəaliyyətsiz qaldıqda ediləcək əməliyyat</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> tezliklə dayanacaq</translation> <translation id="586567932979200359"><ph name="PRODUCT_NAME" /> məhsulunu onun disk obrazindan işlədirsiniz. Onun kompüterə quraşdırılması disk obrazı olmadan işlətməyinizə imkan verəcək və həmişə güncəl qalmasını sağlayacaq.</translation> <translation id="5865733239029070421">İstifadə statistikası və qəza raportlarını avtomatik Google'a göndərir</translation> @@ -3804,6 +3814,7 @@ <translation id="6120205520491252677">Ekrana başlamaq üçün bu səhifəni sancın...</translation> <translation id="6122081475643980456">İnternet bağlantınıza nəzarət olunur</translation> <translation id="6122095009389448667">Bu saytın buferə girişini bloklamağa davam edin</translation> +<translation id="6122831415929794347">Təhlükəsiz Baxış deaktiv edilsin?</translation> <translation id="6122875415561139701">Bu cihazda yazı əməliyyatına icazə verilmir: "<ph name="DEVICE_NAME" /> ".</translation> <translation id="6124650939968185064">Aşağıdakı artırmalar bu artırmadan asılıdır:</translation> <translation id="6124698108608891449">Bu sayt daha çox icazə tələb edir.</translation> @@ -3981,7 +3992,6 @@ <translation id="6365411474437319296">Ailə və dostlarınızı əlavə edin</translation> <translation id="636850387210749493">Sahibkarlıq qeydiyyatı</translation> <translation id="6370021412472292592">Manifesti endirmək alınmadı.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Parolu dəyişin}other{Parolları dəyişin}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Yenidən cəhd edin</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" üçün 1 nəticə</translation> @@ -4007,6 +4017,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> və <ph name="WEBSITE_3" /> üzərində datanızı oxuyun və dəyişin</translation> <translation id="6410257289063177456">Təsvir Faylları</translation> <translation id="6410328738210026208">Kanal və Zavod sıfırlamasını dəyişin</translation> +<translation id="6410390304316730527">Təhlükəsiz Baxış sizi zərərli proqram təminatı quraşdırmaq və ya parol, telefon nömrəsi, kredit kartı kimi şəxsi məlumatlarınızı aşkar etmək kimi təhlükəli əməliyyatlara sövq etmək üçün aldada biləcək hücumlardan qoruyur. Bu xüsusiyyəti söndürsəniz, tanış və ya məşhur olmayan saytlara baxarkən ehtiyatlı olun.</translation> <translation id="6410668567036790476">Axtarış sistemi əlavə edin</translation> <translation id="641081527798843608">Subyekt uyğunluğu</translation> <translation id="6412673304250309937">URL'ləri Chrome'da saxlanılan təhlükəli saytların siyahısı ilə yoxlayır. Sayt parolunuzu oğurlamağa çalışdıqda və ya zərərli fayl endirdiyinizdə Chrome səhifə məzmunundan kiçik nümunələr də daxil olmaqla, URL'ləri Təhlükəsiz Baxışa göndərə bilər.</translation> @@ -5923,6 +5934,7 @@ <translation id="8951256747718668828">Xəta baş verdiyinə görə bərpa tamamlanmadı</translation> <translation id="8951465597020890363">İstənilən halda qonaq rejimindən çıxılsın?</translation> <translation id="8952831374766033534">Konfiqurasiya seçimi dəstəklənmir: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Şarj edilən zaman</translation> <translation id="895347679606913382">Başlayır...</translation> <translation id="8957762313041272117">Canlı altyazı</translation> <translation id="895944840846194039">JavaScript yaddaşı</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index f408b5b..d2ceb28 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Сервер друку</translation> <translation id="1805967612549112634">Увядзіце PIN-код яшчэ раз</translation> <translation id="1806335016774576568">Пераключыцца на іншую адкрытую праграму</translation> +<translation id="1809483812148634490">Праграмы, якія вы спампавалі з Google Play, будуць выдалены з гэтай прылады Chromebook. + <ph name="LINE_BREAKS1" /> + Таксама можа быць выдалена змесціва, якое вы набылі, – напрыклад, фільмы, тэлеперадачы, музыка, кнігі і іншае купленае з праграм. + <ph name="LINE_BREAKS2" /> + Гэта не паўплывае на праграмы і змесціва на іншых прыладах.</translation> <translation id="1809734401532861917">Дадаць мае закладкі, гісторыю, паролі і іншыя налады ў <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Сэрвісы</translation> <translation id="18139523105317219">Імя боку EDI</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Знайдзіце назву на адваротным баку ключа бяспекі</translation> <translation id="2828650939514476812">Падключэнне да сеткі Wi-Fi</translation> <translation id="2835294513443818940">Бяспечна спампаваць гэты файл нельга.</translation> +<translation id="2835547721736623118">Сэрвіс распазнавання маўлення</translation> <translation id="2836269494620652131">Збой</translation> <translation id="2836635946302913370">Уваход пад гэтым іменем карыстальніка выключаны адміністратарам.</translation> <translation id="283669119850230892">Каб выкарыстоўваць сетку <ph name="NETWORK_ID" />, спачатку завяршыце падключэнне да інтэрнэту (гл. ніжэй).</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Кнопка пераходу на ўкладзеную старонку</translation> <translation id="3020183492814296499">Спалучэнні клавіш</translation> <translation id="3020990233660977256">Серыйны нумар: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Пры працы ад акумулятара</translation> <translation id="3021066826692793094">Матылёк</translation> <translation id="3021678814754966447">&Прагляд крыніцы фрэйма</translation> <translation id="3022978424994383087">Незразумела.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Рэзервовае капіраванне на Google Дыск. Лёгка аднаўляйце даныя і пераносьце іх на іншыя прылады. У рэзервовую копію ўваходзяць даныя праграм. Рэзервовыя копіі запампоўваюцца ў Google і шыфруюцца пад паролем ад Уліковага запісу Google дзіцяці.</translation> <translation id="4634771451598206121">Увайсці яшчэ раз...</translation> <translation id="4635398712689569051">Старонка <ph name="PAGE_NAME" /> недаступная для гасцявых карыстальнікаў.</translation> +<translation id="4635444580397524003">Рэзервовая копія Linux адноўлена.</translation> <translation id="4636930964841734540">Інфармацыя</translation> <translation id="4637083375689622795">Іншыя дзеянні, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Уключыць адладку ADB</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Паказаць пашыраныя параметры друку</translation> <translation id="4891089016822695758">Форум бэта-версіі</translation> <translation id="4892229439761351791">Сайт можа выкарыстоўваць Bluetooth</translation> +<translation id="489258173289528622">Пры бяздзейнасці падчас працы ад акумулятара</translation> <translation id="4893336867552636863">Гэта дзеянне незваротна выдаліць з прылады даныя прагляду старонак у інтэрнэце.</translation> <translation id="4893522937062257019">На экране блакіроўкі</translation> <translation id="489454699928748701">Дазволіць сайтам выкарыстоўваць датчыкі руху</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">Уключыць функцыі адладкі</translation> <translation id="5864195618110239517">Выкарыстоўваць падключэнне з улікам трафіка</translation> <translation id="5864471791310927901">Не ўдалося выканаць пошук DHCP</translation> +<translation id="5864754048328252126">Пры бяздзейнасці падчас зарадкі</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> хутка прыпыніцца</translation> <translation id="586567932979200359"><ph name="PRODUCT_NAME" /> працуе з вобраза дыска. Калі ўсталяваць праграму на камп'ютар, вы зможаце запускаць яе без вобраза, і яна будзе рэгулярна абнаўляцца.</translation> <translation id="5865733239029070421">Аўтаматычна адпраўляе ў Google статыстыку выкарыстання і справаздачы аб збоях</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">Замацаваць гэту старонку на пачатковым экране...</translation> <translation id="6122081475643980456">Ваша падключэнне да інтэрнэту кантралюецца</translation> <translation id="6122095009389448667">Працягваць блакіраваць гэтаму сайту доступ да буфера абмену</translation> +<translation id="6122831415929794347">Выключыць Бяспечны прагляд?</translation> <translation id="6122875415561139701">Аперацыя запісу забаронена на прыладзе "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Наступныя пашырэнні залежаць ад гэтага пашырэння:</translation> <translation id="6124698108608891449">Гэтаму сайту патрэбны дадатковыя дазволы.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Дадаванне членаў сям'і і сяброў</translation> <translation id="636850387210749493">Рэгістрацыя для арганізацый</translation> <translation id="6370021412472292592">Не ўдалося загрузіць маніфест.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Змяніць пароль}one{Змяніць паролі}few{Змяніць паролі}many{Змяніць паролі}other{Змяніць паролі}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Паўтарыць спробу</translation> <translation id="6377268785556383139">1 вынік па запыце "<ph name="SEARCH_TEXT" />"</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">Прагляд і змена вашых даных на сайтах <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> і <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Файлы відарысаў</translation> <translation id="6410328738210026208">Змяніць версію і прымяніць Powerwash</translation> +<translation id="6410390304316730527">Функцыя "Бяспечны прагляд" абараняе ад зламыснікаў, якія могуць падмануць вас і прымусіць зрабіць што-небудзь небяспечнае – напрыклад, усталяваць шкоднае праграмнае забеспячэнне або выдаць асабістую інфармацыю (паролі, нумары тэлефонаў або даныя крэдытных картак і падобнае). Калі вы выключыце гэту функцыю, будзьце асабліва ўважлівымі пры наведванні незнаёмых сайтаў і сайтаў з няпэўнай рэпутацыяй.</translation> <translation id="6410668567036790476">Дадаванне пошукавай сістэмы</translation> <translation id="641081527798843608">Супадзенне суб'екта</translation> <translation id="6412673304250309937">Правярае, ці знаходзяцца URL-адрасы ў спісе небяспечных сайтаў, захаваным у Chrome. Пры спробе сайта выкрасці пароль або пры спампоўванні шкоднага файла браўзер Chrome можа таксама адпраўляць у Бяспечны прагляд URL-адрасы, уключаючы фрагменты змесціва старонкі.</translation> @@ -5935,6 +5946,7 @@ <translation id="8951256747718668828">Аднаўленне не ўдалося завяршыць з-за памылкі</translation> <translation id="8951465597020890363">Усё роўна выйсці з гасцявога рэжыму?</translation> <translation id="8952831374766033534">Параметр канфігурацыі не падтрымліваецца: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Падчас зарадкі</translation> <translation id="895347679606913382">Пачынаецца...</translation> <translation id="8957762313041272117">Імгненныя субцітры</translation> <translation id="895944840846194039">Памяць JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 1263cb7..0102cc4f 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">Сървър за отпечатване</translation> <translation id="1805967612549112634">Потвърждаване на ПИН кода</translation> <translation id="1806335016774576568">Превключване към друго отворено приложение</translation> +<translation id="1809483812148634490">Приложенията, които сте изтеглили от Google Play, ще бъдат изтрити от този Chromebook. + <ph name="LINE_BREAKS1" /> + Купеното от вас съдържание, като например филми, телевизионни предавания, музика, книги или други покупки в приложения, може също да бъде изтрито. + <ph name="LINE_BREAKS2" /> + Това действие няма ефект върху приложения или съдържание на други устройства.</translation> <translation id="1809734401532861917">Добавяне на моите отметки, история, пароли и други настройки към <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Услуги</translation> <translation id="18139523105317219">Име на EDI страна</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">Намерете името, отпечатано на гърба на ключа за сигурност</translation> <translation id="2828650939514476812">Свързване с Wi-Fi мрежата</translation> <translation id="2835294513443818940">Този файл не може да се изтегли по сигурен начин.</translation> +<translation id="2835547721736623118">Услуга за разпознаване на говор</translation> <translation id="2836269494620652131">Срив</translation> <translation id="2836635946302913370">Влизането с това потребителско име е деактивирано от администратора ви.</translation> <translation id="283669119850230892">За да използвате мрежата <ph name="NETWORK_ID" />, първо завършете свързването си с интернет по-долу.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">Бутон за подстраница</translation> <translation id="3020183492814296499">Клавишни комбинации</translation> <translation id="3020990233660977256">Сериен номер: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">На батерия</translation> <translation id="3021066826692793094">Пеперуда</translation> <translation id="3021678814754966447">&Преглед на изходния код на рамката</translation> <translation id="3022978424994383087">Не разбрахме това.</translation> @@ -2732,6 +2739,7 @@ <translation id="4633757335284074492">Създаване на резервно копие в Google Диск. По всяко време можете лесно да възстановите данните на устройството или да го замените с друго. Резервното копие включва данните на приложенията. Резервните копия се качват в Google и се шифроват посредством паролата за профила на детето ви в Google.</translation> <translation id="4634771451598206121">Влизане отново...</translation> <translation id="4635398712689569051">Страницата „<ph name="PAGE_NAME" />“ не е достъпна за гости.</translation> +<translation id="4635444580397524003">Възстановяването на резервното копие на Linux бе успешно.</translation> <translation id="4636930964841734540">Информация</translation> <translation id="4637083375689622795">Още действия, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Активиране на отстраняването на грешки през ADB</translation> @@ -2907,6 +2915,7 @@ <translation id="4890773143211625964">Показване на разширените опции за принтера</translation> <translation id="4891089016822695758">Форум за бета версията</translation> <translation id="4892229439761351791">Сайтът може да използва Bluetooth</translation> +<translation id="489258173289528622">Действие при неактивност, когато устройството работи на батерия</translation> <translation id="4893336867552636863">Данните за сърфирането ви ще се изтрият за постоянно от това устройство.</translation> <translation id="4893522937062257019">На заключения екран</translation> <translation id="489454699928748701">Разрешаване на сайтовете да използват сензорите за движение</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">Активиране на функциите за отстраняване на грешки</translation> <translation id="5864195618110239517">Използване на връзка с отчитане</translation> <translation id="5864471791310927901">Търсенето на DHCP сървър не бе успешно</translation> +<translation id="5864754048328252126">Действие при неактивност, когато устройството се зарежда</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> скоро ще бъде на пауза</translation> <translation id="586567932979200359">Изпълнявате <ph name="PRODUCT_NAME" /> от образа му на диска. Инсталирането му на вашия компютър ви позволява да го използвате без този образ и гарантира, че ще бъде актуализиран.</translation> <translation id="5865733239029070421">Автоматично изпраща до Google статистически данни за използването на Chrome и сигнали за сривове</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">Фиксиране на тази страница в стартовия екран...</translation> <translation id="6122081475643980456">Връзката ви с интернет се контролира</translation> <translation id="6122095009389448667">Този сайт да продължи да няма достъп за преглед на буферната памет</translation> +<translation id="6122831415929794347">Да се изключи ли „Безопасно сърфиране“?</translation> <translation id="6122875415561139701">Операцията за запис не е разрешена на: <ph name="DEVICE_NAME" />.</translation> <translation id="6124650939968185064">От това разширение зависят следните разширения:</translation> <translation id="6124698108608891449">За този сайт са необходими още разрешения.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Добавяне на близки и приятели</translation> <translation id="636850387210749493">Корпоративно записване</translation> <translation id="6370021412472292592">Манифестът не можа да се зареди.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Промяна на паролата}other{Промяна на паролите}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Нов опит</translation> <translation id="6377268785556383139">1 резултат за „<ph name="SEARCH_TEXT" />“</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">Четене и промяна на данните ви в/ъв <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Графични файлове</translation> <translation id="6410328738210026208">Промяна на канала и Powerwash</translation> +<translation id="6410390304316730527">Функцията „Безопасно сърфиране“ ви защитава от хакери, които могат да ви подведат да направите нещо опасно, като например да инсталирате софтуер или да разкриете лична информация (напр. пароли, телефонни номера или кредитни карти). Ако я изключите, внимавайте, когато посещавате непознати или ненадеждни сайтове.</translation> <translation id="6410668567036790476">Добавяне на търсеща машина</translation> <translation id="641081527798843608">Съвпадение на субекта</translation> <translation id="6412673304250309937">Проверка на URL адресите в съхраняван в Chrome списък с опасни сайтове. Ако сайт се опита да открадне паролата ви или изтеглите опасен файл от сайт, Chrome може също така да изпрати до „Безопасно сърфиране“ URL адресите и част от съдържанието на страницата.</translation> @@ -5936,6 +5947,7 @@ <translation id="8951256747718668828">Възстановяването не можа да завърши поради грешка</translation> <translation id="8951465597020890363">Да се излезе ли от режима на гост въпреки това?</translation> <translation id="8952831374766033534">Конфигурационната опция не се поддържа: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">При зареждане</translation> <translation id="895347679606913382">Стартира...</translation> <translation id="8957762313041272117">Надписи на живо</translation> <translation id="895944840846194039">Памет за JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index bcce544..4298580 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -186,7 +186,7 @@ <translation id="1235458158152011030">পরিচিত নেটওয়ার্কগুলি</translation> <translation id="123578888592755962">ডিস্ক পূর্ণ</translation> <translation id="1238191093934674082">VPN খুলুন</translation> -<translation id="1239439601391236986">ব্যক্তিগত তথ্য ইনপুটের সাজেশন টগল করুন</translation> +<translation id="1239439601391236986">ব্যক্তিগত তথ্য ইনপুট করার ক্ষেত্রে সাজেশন টগল করুন</translation> <translation id="1239594683407221485">Files অ্যাপে ডিভাইসের কন্টেন্ট ঘুরে দেখুন।</translation> <translation id="124116460088058876">আরও ভাষা</translation> <translation id="1241753985463165747">চালু করলে বর্তমান ওয়েবসাইটের সব ডেটা পড়ে ও পরিবর্তন করে</translation> @@ -1985,7 +1985,7 @@ <translation id="3629631988386925734">Smart Lock চালু করতে আপনার পাসওয়ার্ড লিখুন। পরের বার, আপনার ফোন <ph name="DEVICE_TYPE" /> আনলক করবে। সেটিংসে গিয়ে Smart Lock বন্ধ করতে পারবেন।</translation> <translation id="3630132874740063857">আপনার ফোন</translation> <translation id="3630995161997703415">যেকোনও সময় ব্যবহার করার জন্য এই সাইটটিকে আপনার শেল্ফে যোগ করুন</translation> -<translation id="3633309367764744750">পৃষ্ঠার তথ্য আগে থেকেই ফেচ করা হয়, এর মধ্যে সেই পৃষ্ঠাগুলিও আছে যেগুলিতে আপনি এখনও যাননি। যদি আপনি কুকিকে অনুমতি দিয়ে রাখেন, তাহলে ফেচ করা তথ্যে কুকি থাকতে পারে।</translation> +<translation id="3633309367764744750">পৃষ্ঠার তথ্য আগে থেকেই ফেচ করা হয়, এর মধ্যে সেই পৃষ্ঠাগুলিও পড়ে যেগুলিতে আপনি এখনও যাননি। যদি আপনি কুকি ব্যবহারের অনুমতি দিয়ে রাখেন, তাহলে ফেচ করা তথ্যে কুকি থাকতে পারে।</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />টির মধ্যে <ph name="NETWORK_INDEX" /> নম্বর নেটওয়ার্ক, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, অ্যাডমিনিস্ট্রেটর ম্যানেজ করে, বিবরণ</translation> <translation id="3635241501480133979">এই ডেটা আপনার সংস্থার নিরাপত্তার নীতি লঙ্ঘন করেছে, তাই এটি এখানে টেনে এনে রাখা যাবে না।</translation> <translation id="3635353578505343390">Google-এ মতামত জানান</translation> @@ -3990,7 +3990,6 @@ <translation id="6365411474437319296">পরিবার এবং বন্ধুদের যোগ করুন</translation> <translation id="636850387210749493">এন্টারপ্রাইজ নথিভুক্তিকরণ</translation> <translation id="6370021412472292592">ম্যানিফেস্ট লোড করা যাবে না।</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{পাসওয়ার্ড পরিবর্তন করুন}one{পাসওয়ার্ড পরিবর্তন করুন}other{পাসওয়ার্ডগুলি পরিবর্তন করুন}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">আবার চেষ্টা করুন</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />'-এর জন্য ১টি ফলাফল</translation> @@ -4020,7 +4019,7 @@ <translation id="641081527798843608">বিষয়ের মিল</translation> <translation id="6412673304250309937">Chrome-এ স্টোর করা নিরাপদ নয় এমন সাইটের তালিকা থেকে সাইটগুলির ইউআরএল পরীক্ষা করে দেখে। যদি কোনও সাইট আপনার পাসওয়ার্ড চুরি করার চেষ্টা করে বা আপনি কোনও ক্ষতিকারক ফাইল ডাউনলোড করলে, Safe Browsing-এ Chrome পৃষ্ঠার কিছু কন্টেন্ট সহ ইউআরএলও হয়ত পাঠাতে পারে।</translation> <translation id="6412931879992742813">নতুন ছদ্মবেশী উইন্ডো</translation> -<translation id="6413591858632097328">এটি <ph name="ORIGIN_NAME" />-এর স্টোর করা সব ডেটা ও কুকি এবং এর ইনস্টল করা সমস্ত অ্যাপ মুছে দেবে।</translation> +<translation id="6413591858632097328">এটি করলে, <ph name="ORIGIN_NAME" />-এর স্টোর করা সব ডেটা ও কুকি এবং এর ইনস্টল করা সমস্ত অ্যাপ মুছে যাবে।</translation> <translation id="641469293210305670">অ্যাপ ও আপডেটগুলি ইনস্টল করুন</translation> <translation id="6414888972213066896">এই পৃষ্ঠাটিতে যাওয়া ঠিক হবে কিনা সেই বিষয়ে আপনি আপনার অভিভাবকের অনুমতি নিন৷</translation> <translation id="6415900369006735853">আপনার ফোনের মাধ্যমে ইন্টারনেটে কানেক্ট করুন</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 08539e6..bd770a56 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Dodajte porodicu i prijatelje</translation> <translation id="636850387210749493">Prijava preduzeća</translation> <translation id="6370021412472292592">Manifest nije učitan.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Promijenite lozinku}one{Promijenite lozinke}few{Promijenite lozinke}other{Promijenite lozinke}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Pokušaj ponovo</translation> <translation id="6377268785556383139">1 rezultat za pojam "'<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index e56bea9..59f6436f 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -4000,7 +4000,6 @@ <translation id="6365411474437319296">Afegiu familiars i amics</translation> <translation id="636850387210749493">Inscripció empresarial</translation> <translation id="6370021412472292592">No s'ha pogut carregar el manifest.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Canvia la contrasenya}other{Canvia les contrasenyes}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Torna-ho a provar</translation> <translation id="6377268785556383139">1 resultat per a "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 6a4b507..5f20b4a 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">Přidání rodiny a přátel</translation> <translation id="636850387210749493">Registrace podniku</translation> <translation id="6370021412472292592">Načtení manifestu se nezdařilo.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Změnit heslo}few{Změnit hesla}many{Změnit hesla}other{Změnit hesla}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Zkusit znovu</translation> <translation id="6377268785556383139">1 výsledek pro dotaz <ph name="SEARCH_TEXT" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index d8545ca2..7cba4ab2 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -4002,7 +4002,6 @@ <translation id="6365411474437319296">Tilføj familie og venner</translation> <translation id="636850387210749493">Tilmelding af virksomhed</translation> <translation id="6370021412472292592">Manifestet kunne ikke indlæses.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Skift adgangskode}one{Skift adgangskode}other{Skift adgangskoder}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Prøv igen</translation> <translation id="6377268785556383139">1 resultat for "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 8be4b84b..4d9e2121 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1511,7 +1511,7 @@ <translation id="2987620471460279764">Text, der über ein anderes Gerät geteilt wurde</translation> <translation id="2989474696604907455">Nicht angeschlossen</translation> <translation id="2989786307324390836">DER-verschlüsselte Binärdatei, Einzelzertifikat</translation> -<translation id="2992931425024192067">Alle Benachrichtigungen anzeigen</translation> +<translation id="2992931425024192067">Gesamten Benachrichtigungsinhalt anzeigen</translation> <translation id="2993517869960930405">App-Info</translation> <translation id="2996286169319737844">Daten sind mit Ihrer Synchronisierungspassphrase verschlüsselt. Davon ausgenommen sind Zahlungsmethoden oder Adressen von Google Pay.</translation> <translation id="2996722619877761919">Entlang der langen Seite wenden</translation> @@ -3997,7 +3997,6 @@ <translation id="6365411474437319296">Kontakte hinzufügen</translation> <translation id="636850387210749493">Unternehmensanmeldung</translation> <translation id="6370021412472292592">Manifest konnte nicht geladen werden.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Passwort ändern}other{Passwörter ändern}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Erneut versuchen</translation> <translation id="6377268785556383139">1 Ergebnis für "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 4a30d46..566c2ae 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Διακομιστής εκτύπωσης</translation> <translation id="1805967612549112634">Επιβεβαίωση PIN</translation> <translation id="1806335016774576568">Εναλλαγή σε άλλη ανοικτή εφαρμογή</translation> +<translation id="1809483812148634490">Οι εφαρμογές που έχετε κατεβάσει από το Google Play θα διαγραφούν από αυτό το Chromebook. + <ph name="LINE_BREAKS1" /> + Το περιεχόμενο που έχετε αγοράσει, όπως ταινίες, τηλεοπτικές εκπομπές, μουσική, βιβλία ή άλλες αγορές εντός εφαρμογής ενδέχεται να διαγραφούν εξίσου. + <ph name="LINE_BREAKS2" /> + Αυτό δεν επηρεάζει εφαρμογές ή περιεχόμενο σε άλλες συσκευές.</translation> <translation id="1809734401532861917">Προσθήκη των σελιδοδεικτών, του ιστορικού, των κωδικών πρόσβασης και άλλων ρυθμίσεών μου στον λογαριασμό <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Υπηρεσίες</translation> <translation id="18139523105317219">Όνομα μέρους EDI</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Βρείτε το όνομα που αναγράφεται στο πίσω μέρος του κλειδιού ασφαλείας σας</translation> <translation id="2828650939514476812">Σύνδεση σε δίκτυο Wi-Fi</translation> <translation id="2835294513443818940">Δεν είναι δυνατή η λήψη αυτού του αρχείου με ασφάλεια.</translation> +<translation id="2835547721736623118">Υπηρεσία αναγνώρισης ομιλίας</translation> <translation id="2836269494620652131">Σφάλμα</translation> <translation id="2836635946302913370">Η σύνδεση με αυτό το όνομα χρήστη έχει απενεργοποιηθεί από τον διαχειριστή σας.</translation> <translation id="283669119850230892">Για τη χρήση του δικτύου <ph name="NETWORK_ID" />, πρώτα ολοκληρώστε τη σύνδεσή σας στο διαδίκτυο παρακάτω.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Κουμπί δευτερεύουσας σελίδας</translation> <translation id="3020183492814296499">Συντομεύσεις</translation> <translation id="3020990233660977256">Σειριακός αριθμός: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Κατά τη χρήση μπαταρίας</translation> <translation id="3021066826692793094">Πεταλούδα</translation> <translation id="3021678814754966447">&Προβολή Πηγαίου Κώδικα Πλαισίου</translation> <translation id="3022978424994383087">Δεν έγινε κατανοητό.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Δημιουργία αντιγράφων ασφαλείας στο Google Drive. Επαναφέρετε τα δεδομένα ή αλλάξτε συσκευή ανά πάσα στιγμή με ευκολία. Αυτό το αντίγραφο ασφαλείας περιλαμβάνει δεδομένα εφαρμογών. Τα δεδομένα μεταφορτώνονται στην Google και κρυπτογραφούνται χρησιμοποιώντας τον κωδικό πρόσβασης του Λογαριασμού Google του παιδιού σας.</translation> <translation id="4634771451598206121">Συνδεθείτε ξανά...</translation> <translation id="4635398712689569051">Η σελίδα <ph name="PAGE_NAME" /> δεν είναι διαθέσιμη σε επισκέπτες.</translation> +<translation id="4635444580397524003">Έγινε επιτυχής επαναφορά του αντιγράφου ασφαλείας Linux.</translation> <translation id="4636930964841734540">Πληροφορίες</translation> <translation id="4637083375689622795">Περισσότερες ενέργειες, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Ενεργοποίηση του εντοπισμού και της διόρθωσης σφαλμάτων ADB</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Εμφάνιση σύνθετων επιλογών εκτυπωτή</translation> <translation id="4891089016822695758">Φόρουμ για την έκδοση beta</translation> <translation id="4892229439761351791">Ο ιστότοπος μπορεί να χρησιμοποιεί Βluetooth.</translation> +<translation id="489258173289528622">Ενέργεια αδράνειας κατά τη χρήση μπαταρίας</translation> <translation id="4893336867552636863">Με αυτήν την ενέργεια θα διαγραφούν οριστικά τα δεδομένα περιήγησής σας από αυτή τη συσκευή.</translation> <translation id="4893522937062257019">Στην οθόνη κλειδώματος</translation> <translation id="489454699928748701">Να επιτρέπεται στους ιστοτόπους η χρήση αισθητήρων κίνησης</translation> @@ -3615,6 +3624,7 @@ <translation id="5863445608433396414">Ενεργοποίηση λειτουργιών εντοπισμού σφαλμάτων</translation> <translation id="5864195618110239517">Χρήση σύνδεσης με ογκοχρέωση</translation> <translation id="5864471791310927901">Αποτυχία αναζήτησης DHCP</translation> +<translation id="5864754048328252126">Ενέργεια αδράνειας κατά τη φόρτιση</translation> <translation id="5865508026715185451">Η εφαρμογή <ph name="APP_NAME" /> θα τεθεί σύντομα σε παύση.</translation> <translation id="586567932979200359">Εκτελείτε το <ph name="PRODUCT_NAME" /> από την εικόνα δίσκου. Αν το εγκαταστήσετε στον υπολογιστή σας, θα μπορείτε να το εκτελείτε χωρίς την εικόνα δίσκου και θα παραμένει ενημερωμένο.</translation> <translation id="5865733239029070421">Αποστέλλει αυτόματα στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων στην Google</translation> @@ -3814,6 +3824,7 @@ <translation id="6120205520491252677">Καρφίτσωμα αυτής της σελίδας στην Οθόνη έναρξης…</translation> <translation id="6122081475643980456">Η σύνδεσή σας στο διαδίκτυο παρακολουθείται</translation> <translation id="6122095009389448667">Συνέχεια αποκλεισμού αυτού του ιστοτόπου από την προβολή του πρόχειρου</translation> +<translation id="6122831415929794347">Απενεργοποίηση Ασφαλούς περιήγησης;</translation> <translation id="6122875415561139701">Η λειτουργία εγγραφής δεν επιτρέπεται στη συσκευή: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Οι ακόλουθες επεκτάσεις εξαρτώνται από αυτήν την επέκταση:</translation> <translation id="6124698108608891449">Αυτός ο ιστότοπος χρειάζεται περισσότερες άδειες.</translation> @@ -3991,7 +4002,6 @@ <translation id="6365411474437319296">Προσθήκη οικογένειας και φίλων</translation> <translation id="636850387210749493">Εγγραφή επιχείρησης</translation> <translation id="6370021412472292592">Δεν ήταν δυνατή η φόρτωση της δήλωσης.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Αλλαγή κωδικού πρόσβασης}other{Αλλαγή κωδικών πρόσβασης}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Δοκιμάστε ξανά</translation> <translation id="6377268785556383139">1 αποτέλεσμα για την αναζήτηση "<ph name="SEARCH_TEXT" />"</translation> @@ -4017,6 +4027,7 @@ <translation id="6408118934673775994">Διαβάστε και αλλάξτε τα δεδομένα σας στο <ph name="WEBSITE_1" />, στο <ph name="WEBSITE_2" /> και το <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Αρχεία εικόνας</translation> <translation id="6410328738210026208">Αλλαγή καναλιού και Powerwash</translation> +<translation id="6410390304316730527">Η Ασφαλής περιήγηση σάς προστατεύει από υπευθύνους επίθεσης που μπορεί να σας εξαπατήσουν να κάνετε κάτι επικίνδυνο, όπως εγκατάσταση κακόβουλου λογισμικού ή αποκάλυψη προσωπικών στοιχείων όπως κωδικούς πρόσβασης, αριθμούς τηλεφώνου ή στοιχεία πιστωτικών καρτών. Εάν την απενεργοποιήσετε, να είστε προσεκτικοί κατά την περιήγηση σε άγνωστους ή μη αξιόπιστους ιστοτόπους.</translation> <translation id="6410668567036790476">Προσθήκη μηχανής αναζήτησης</translation> <translation id="641081527798843608">Αντιστοιχία θέματος</translation> <translation id="6412673304250309937">Ελέγχει αν τα URL περιλαμβάνονται στην λίστα μη ασφαλών ιστοτόπων που είναι αποθηκευμένη στο Chrome. Εάν ένας ιστότοπος προσπαθήσει να κλέψει τον κωδικό σας ή όταν κάνετε λήψη ενός επιβλαβούς αρχείου, το Chrome μπορεί επίσης να στείλει URL, καθώς και τμήματα του περιεχομένου της σελίδας, στην Ασφαλή περιήγηση.</translation> @@ -5935,6 +5946,7 @@ <translation id="8951256747718668828">Δεν ήταν δυνατή η ολοκλήρωση επαναφοράς λόγω σφάλματος</translation> <translation id="8951465597020890363">Έξοδος από κατάσταση επισκέπτη ούτως ή άλλως;</translation> <translation id="8952831374766033534">Δεν υποστηρίζεται η επιλογή διαμόρφωσης: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Κατά τη φόρτιση</translation> <translation id="895347679606913382">Έναρξη...</translation> <translation id="8957762313041272117">Ζωντανοί υπότιτλοι</translation> <translation id="895944840846194039">Μνήμη JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 4f5e96c..f3d33ac9 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Add family and friends</translation> <translation id="636850387210749493">Enterprise enrolment</translation> <translation id="6370021412472292592">Could not load manifest.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Change password}other{Change passwords}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Try Again</translation> <translation id="6377268785556383139">1 result for '<ph name="SEARCH_TEXT" />'</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 7f8c6357..3d20e90 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">Servidor de impresión</translation> <translation id="1805967612549112634">Confirmar PIN</translation> <translation id="1806335016774576568">Pasar a otra app abierta</translation> +<translation id="1809483812148634490">Las apps que descargaste de Google Play se borrarán de esta Chromebook. + <ph name="LINE_BREAKS1" /> + Es posible que también se borre el contenido que compraste, como películas, programas de TV, música, libros y otras compras directas desde la aplicación. + <ph name="LINE_BREAKS2" /> + Esta acción no afecta las apps ni el contenido que se encuentra en otros dispositivos.</translation> <translation id="1809734401532861917">Agregar mis favoritos, historial, contraseñas y otras opciones de configuración a <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Servicios</translation> <translation id="18139523105317219">Nombre de parte EDI</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">Busca el nombre impreso en la parte posterior de la llave de seguridad</translation> <translation id="2828650939514476812">Conectarse a la red Wi-Fi</translation> <translation id="2835294513443818940">No se puede descargar este archivo de forma segura.</translation> +<translation id="2835547721736623118">Servicio de reconocimiento de voz</translation> <translation id="2836269494620652131">Fallo</translation> <translation id="2836635946302913370">El administrador ha inhabilitado el inicio de sesión para este nombre de usuario.</translation> <translation id="283669119850230892">Para utilizar la red <ph name="NETWORK_ID" />, primero debes establecer la conexión a Internet que se especifica a continuación.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">Botón de la subpágina</translation> <translation id="3020183492814296499">Combinación de teclas</translation> <translation id="3020990233660977256">Número de serie: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Mientras se usa la batería</translation> <translation id="3021066826692793094">Mariposa</translation> <translation id="3021678814754966447">&Ver fuente del marco</translation> <translation id="3022978424994383087">No entendí.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">Crea una copia de seguridad en Google Drive. Restablece datos o cambia de dispositivo en cualquier momento con facilidad. Se incluyen datos de las apps. Las copias de seguridad se encriptan con la contraseña de la Cuenta de Google de tu hijo y se suben a Google.</translation> <translation id="4634771451598206121">Volver a acceder...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> no está disponible para los usuarios invitados.</translation> +<translation id="4635444580397524003">La copia de seguridad de Linux se restableció correctamente.</translation> <translation id="4636930964841734540">Información</translation> <translation id="4637083375689622795">Más acciones, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Habilitar depuración mediante ADB</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">Mostrar opciones de impresión avanzadas</translation> <translation id="4891089016822695758">Foro de la versión Beta</translation> <translation id="4892229439761351791">El sitio puede usar la conexión Bluetooth</translation> +<translation id="489258173289528622">Acción de inactividad mientras se usa la batería</translation> <translation id="4893336867552636863">Esta acción borrará permanentemente los datos de navegación de este dispositivo.</translation> <translation id="4893522937062257019">En la pantalla bloqueada</translation> <translation id="489454699928748701">Permitir que los sitios usen los sensores de movimiento</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">Habilitar funciones de depuración</translation> <translation id="5864195618110239517">Usar la conexión de uso medido</translation> <translation id="5864471791310927901">Falló la búsqueda de DHCP</translation> +<translation id="5864754048328252126">Acción de inactividad durante la carga</translation> <translation id="5865508026715185451">Pronto se pausará <ph name="APP_NAME" /></translation> <translation id="586567932979200359">Estás ejecutando <ph name="PRODUCT_NAME" /> desde la imagen de disco. Instalarlo en tu computadora te permite ejecutarlo sin la imagen de disco y garantiza que se mantenga actualizado.</translation> <translation id="5865733239029070421">Envía automáticamente informes de fallos y estadísticas de uso a Google</translation> @@ -3810,6 +3820,7 @@ <translation id="6120205520491252677">Fijar esta página a la Pantalla de inicio...</translation> <translation id="6122081475643980456">Se está controlando tu conexión a Internet</translation> <translation id="6122095009389448667">Seguir impidiendo que este sitio vea el portapapeles</translation> +<translation id="6122831415929794347">¿Quieres desactivar la Navegación segura?</translation> <translation id="6122875415561139701">No se permite la operación de escritura en: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Las siguientes extensiones dependen de esta extensión:</translation> <translation id="6124698108608891449">Este sitio necesita más permisos.</translation> @@ -3987,7 +3998,6 @@ <translation id="6365411474437319296">Agregar familiares y amigos</translation> <translation id="636850387210749493">Registro de empresa</translation> <translation id="6370021412472292592">No se pudo cargar el manifiesto.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Cambiar contraseña}other{Cambiar contraseñas}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Volver a intentar</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation> @@ -4013,11 +4023,12 @@ <translation id="6408118934673775994">Leer y modificar tus datos en <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> y <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Archivos de imagen</translation> <translation id="6410328738210026208">Cambiar canal y Powerwash</translation> +<translation id="6410390304316730527">La Navegación segura te protege de los atacantes que pueden engañarte para que hagas algo peligroso, como instalar software o divulgar información personal (p. ej., contraseñas, números de teléfono o tarjetas de crédito). Si la desactivas, ten cuidado cuando navegues en sitios desconocidos o sospechosos.</translation> <translation id="6410668567036790476">Agregar motor de búsqueda</translation> <translation id="641081527798843608">Coincidencia de asunto</translation> <translation id="6412673304250309937">Revisa las URL con una lista de sitios no seguros almacenados en Chrome. Si un sitio intenta robar tu contraseña, o cuando descargas un archivo dañino, es posible que Chrome también envíe las URL, con partes del contenido de la página, a la Navegación segura.</translation> <translation id="6412931879992742813">Nueva ventana de incógnito</translation> -<translation id="6413591858632097328">Esta acción borrará todos los datos y cookies que almacenó <ph name="ORIGIN_NAME" /> y sus apps instaladas.</translation> +<translation id="6413591858632097328">Esta acción borrará todas las cookies y los datos almacenados por <ph name="ORIGIN_NAME" /> y sus apps instaladas.</translation> <translation id="641469293210305670">Instalar actualizaciones y apps</translation> <translation id="6414888972213066896">Les preguntaste a tus padres si puedes visitar este sitio</translation> <translation id="6415900369006735853">Conéctate a Internet a través de tu teléfono</translation> @@ -5933,6 +5944,7 @@ <translation id="8951256747718668828">No se pudo completar el restablecimiento debido a un error</translation> <translation id="8951465597020890363">¿Quieres salir del modo de invitado de todas formas?</translation> <translation id="8952831374766033534">No se admite la opción de configuración: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Mientras se carga</translation> <translation id="895347679606913382">Iniciando...</translation> <translation id="8957762313041272117">Subtitulado instantáneo</translation> <translation id="895944840846194039">Memoria de JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 8bf7f90e..15c0b91 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -463,7 +463,7 @@ <translation id="1616206807336925449">Esta extensión no requiere permisos especiales.</translation> <translation id="1616298854599875024">No se ha podido importar la extensión "<ph name="IMPORT_NAME" />" porque no es un módulo compartido</translation> <translation id="1618268899808219593">C&entro de ayuda</translation> -<translation id="1620307519959413822">La contraseña no es correcta. Vuelve a intentarlo o haz clic en He olvidado la contraseña para restablecerla.</translation> +<translation id="1620307519959413822">La contraseña no es correcta. Vuelve a intentarlo o haz clic en "¿Has olvidado la contraseña?" para restablecerla.</translation> <translation id="1620510694547887537">Cámara</translation> <translation id="1623132449929929218">Las imágenes no están disponibles en este momento. Vuelve a conectarte a Internet para ver colecciones de fondos de pantalla.</translation> <translation id="1627276047960621195">Descriptores de archivo</translation> @@ -612,6 +612,11 @@ <translation id="1805888043020974594">Servidor de impresión</translation> <translation id="1805967612549112634">Confirmar PIN</translation> <translation id="1806335016774576568">Cambiar a otra aplicación abierta</translation> +<translation id="1809483812148634490">Las aplicaciones que hayas descargado de Google Play se eliminarán de este Chromebook. + <ph name="LINE_BREAKS1" /> + Es posible que también se elimine el contenido que hayas comprado, como películas, series de TV, música, libros u otras compras en la aplicación. + <ph name="LINE_BREAKS2" /> + Esto no afecta a las aplicaciones ni al contenido de otros dispositivos.</translation> <translation id="1809734401532861917">Añadir mis marcadores, mi historial, mis contraseñas y otras opciones de configuración a <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Servicios</translation> <translation id="18139523105317219">Nombre de parte EDI</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">El nombre está en la parte trasera de la llave de seguridad</translation> <translation id="2828650939514476812">Conectar a la red Wi-Fi</translation> <translation id="2835294513443818940">Este archivo no se puede descargar de forma segura.</translation> +<translation id="2835547721736623118">Servicio de reconocimiento de voz</translation> <translation id="2836269494620652131">Error</translation> <translation id="2836635946302913370">El administrador ha inhabilitado el inicio de sesión para este nombre de usuario.</translation> <translation id="283669119850230892">Para utilizar la red <ph name="NETWORK_ID" />, primero debes establecer la conexión a Internet que se especifica a continuación.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Botón de página secundaria</translation> <translation id="3020183492814296499">Combinaciones de teclas</translation> <translation id="3020990233660977256">Número de serie: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Con batería</translation> <translation id="3021066826692793094">Mariposa</translation> <translation id="3021678814754966447">&Ver fuente del marco</translation> <translation id="3022978424994383087">No te he entendido.</translation> @@ -1991,7 +1998,7 @@ <translation id="3635241501480133979">Estos datos infringen las políticas de seguridad de tu organización y no se pueden soltar.</translation> <translation id="3635353578505343390">Enviar comentarios a Google</translation> <translation id="3636096452488277381">Hola, <ph name="USER_GIVEN_NAME" />.</translation> -<translation id="3636766455281737684"><ph name="PERCENTAGE" />% - <ph name="TIME" /> hasta agotar la batería</translation> +<translation id="3636766455281737684"><ph name="PERCENTAGE" /> % - <ph name="TIME" /> hasta agotar la batería</translation> <translation id="3637682276779847508">La tarjeta SIM se inhabilitará de forma permanente si no introduces el código PUK correcto.</translation> <translation id="3640214691812501263">¿Añadir <ph name="EXTENSION_NAME" /> para <ph name="USER_NAME" />?</translation> <translation id="3640613767643722554">Enseña al Asistente a reconocer tu voz</translation> @@ -2206,7 +2213,7 @@ <translation id="3888550877729210209">Tomando notas con <ph name="LOCK_SCREEN_APP_NAME" /></translation> <translation id="3892414795099177503">Añadir OpenVPN / L2TP...</translation> <translation id="3893536212201235195">Leer y cambiar tu configuración de accesibilidad</translation> -<translation id="3893630138897523026">ChromeVox (mensajes de voz)</translation> +<translation id="3893630138897523026">ChromeVox (síntesis de voz)</translation> <translation id="3893764153531140319"><ph name="DOWNLOADED_SIZE" />/<ph name="DOWNLOAD_SIZE" /></translation> <translation id="3894123633473837029">Incluir el historial reciente del Asistente mediante Sherlog. Puede contener datos de identidad y ubicación e información de depuración. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> <translation id="3894427358181296146">Añadir carpeta</translation> @@ -2732,6 +2739,7 @@ <translation id="4633757335284074492">Crea copias de seguridad en Google Drive. Recupera datos de forma sencilla o cambia de dispositivo en cualquier momento. Esta copia de seguridad incluye datos de aplicaciones. Los archivos de las copias de seguridad se suben a Google y se cifran con la contraseña de la cuenta de Google de tu hijo.</translation> <translation id="4634771451598206121">Volver a iniciar sesión...</translation> <translation id="4635398712689569051">La página <ph name="PAGE_NAME" /> no está disponible para los usuarios invitados.</translation> +<translation id="4635444580397524003">Copia de seguridad de Linux restaurada correctamente.</translation> <translation id="4636930964841734540">Información</translation> <translation id="4637083375689622795">Más acciones, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Habilitar depuración adb</translation> @@ -2907,6 +2915,7 @@ <translation id="4890773143211625964">Mostrar opciones avanzadas de la impresora</translation> <translation id="4891089016822695758">Foro beta</translation> <translation id="4892229439761351791">El sitio web puede usar el Bluetooth</translation> +<translation id="489258173289528622">Modo de inactividad con batería</translation> <translation id="4893336867552636863">Se eliminarán de forma permanente los datos de navegación del dispositivo.</translation> <translation id="4893522937062257019">En la pantalla de bloqueo</translation> <translation id="489454699928748701">Permitir que los sitios web usen los sensores de movimiento</translation> @@ -3613,6 +3622,7 @@ <translation id="5863445608433396414">Habilitar funciones de depuración</translation> <translation id="5864195618110239517">Usar conexión de uso medido</translation> <translation id="5864471791310927901">Error de búsqueda de DHCP</translation> +<translation id="5864754048328252126">Modo de inactividad durante la carga</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> se pausará pronto</translation> <translation id="586567932979200359">Estás ejecutando <ph name="PRODUCT_NAME" /> desde la imagen de disco. Al instalar la aplicación en tu ordenador, podrás ejecutarla sin la imagen de disco y, de esta forma, te asegurarás de que siempre esté actualizada.</translation> <translation id="5865733239029070421">Envía automáticamente estadísticas de uso e informes sobre fallos a Google</translation> @@ -3812,6 +3822,7 @@ <translation id="6120205520491252677">Fijar esta página en la pantalla de inicio...</translation> <translation id="6122081475643980456">Tu conexión a Internet está siendo controlada</translation> <translation id="6122095009389448667">Seguir impidiendo que este sitio web vea el portapapeles</translation> +<translation id="6122831415929794347">¿Desactivar Navegación Segura?</translation> <translation id="6122875415561139701">No se permite la operación de escritura en "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Las siguientes extensiones dependen de esta extensión:</translation> <translation id="6124698108608891449">Este sitio web necesita más permisos.</translation> @@ -3989,7 +4000,6 @@ <translation id="6365411474437319296">Añadir familiares y amigos</translation> <translation id="636850387210749493">Registro de empresa</translation> <translation id="6370021412472292592">No se ha podido cargar el archivo de manifiesto.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Cambiar contraseña}other{Cambiar contraseñas}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Volver a intentarlo</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation> @@ -4015,6 +4025,7 @@ <translation id="6408118934673775994">Leer y modificar tus datos en <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> y <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Archivos de imagen</translation> <translation id="6410328738210026208">Cambiar canal y Powerwash</translation> +<translation id="6410390304316730527">La función Navegación Segura te protege frente a atacantes que pueden intentar engañarte para que realices alguna acción peligrosa, como instalar software malicioso o revelar información personal, incluidas contraseñas, números de teléfono o tarjetas de crédito. Si desactivas esta función, debes tener cuidado al navegar por sitios web desconocidos o que no sean de confianza.</translation> <translation id="6410668567036790476">Añadir motor de búsqueda</translation> <translation id="641081527798843608">Coincidencia de asunto</translation> <translation id="6412673304250309937">Comprueba las URL guardadas en Chrome con una lista de sitios web que no son seguros. Si un sitio web intenta robarte la contraseña o te descargas un archivo dañino, puede que Chrome también envíe URL, así como fragmentos de contenido de la página, a Navegación Segura.</translation> @@ -5935,6 +5946,7 @@ <translation id="8951256747718668828">No se ha podido completar la restauración debido a un error</translation> <translation id="8951465597020890363">¿Quieres salir del modo invitados de todas formas?</translation> <translation id="8952831374766033534">Opción de configuración no admitida: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Durante la carga</translation> <translation id="895347679606913382">Iniciando...</translation> <translation id="8957762313041272117">Subtítulos instantáneos</translation> <translation id="895944840846194039">Memoria de JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index c3913bb0..4ea76df 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Prindiserver</translation> <translation id="1805967612549112634">Kinnitage PIN-kood</translation> <translation id="1806335016774576568">Lülita teisele avatud rakendusele</translation> +<translation id="1809483812148634490">Google Playst alla laaditud rakendused kustutatakse sellest Chromebookist. + <ph name="LINE_BREAKS1" /> + Teie ostetud sisu (nt filmid, telesaated, muusika, raamatud või muud rakendusesisesed ostud) võidakse samuti kustutada. + <ph name="LINE_BREAKS2" /> + See ei mõjuta muudes seadmetes olevaid rakendusi ega sisu.</translation> <translation id="1809734401532861917">Lisa minu järjehoidjad, ajalugu, paroolid ja muud seaded e-posti aadressile <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Teenused</translation> <translation id="18139523105317219">EDI-osapoole nimi</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Leidke nimi, mis on prinditud turvavõtme tagaküljele</translation> <translation id="2828650939514476812">WiFi-võrguga ühendamine</translation> <translation id="2835294513443818940">Seda faili ei saa turvaliselt alla laadida.</translation> +<translation id="2835547721736623118">Kõnetuvastuse teenus</translation> <translation id="2836269494620652131">Krahh</translation> <translation id="2836635946302913370">Teie administraator on keelanud selle kasutajanimega sisselogimise.</translation> <translation id="283669119850230892">Võrgu <ph name="NETWORK_ID" /> kasutamiseks looge esmalt ühendus Internetiga.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Alamlehe nupp</translation> <translation id="3020183492814296499">Otseteed</translation> <translation id="3020990233660977256">Seerianumber: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Aku kasutamisel</translation> <translation id="3021066826692793094">Liblikas</translation> <translation id="3021678814754966447">&Vaata raami allikat</translation> <translation id="3022978424994383087">Ei saanud aru.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Andmete varundamine Google Drive'i. Teil on alati võimalik andmed hõlpsalt taastada või seadet vahetada. Varukoopia hõlmab rakenduste andmeid. Varukoopiad laaditakse Google'isse üles ja krüpteeritakse teie lapse Google'i konto parooliga.</translation> <translation id="4634771451598206121">Logi uuesti sisse ...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> ei ole külaliskasutajatele saadaval.</translation> +<translation id="4635444580397524003">Linuxi varunduse taastamine õnnestus.</translation> <translation id="4636930964841734540">Teave</translation> <translation id="4637083375689622795">Veel toiminguid, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Luba ADB silumine</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Kuva printeri täpsemad valikud</translation> <translation id="4891089016822695758">Beeta foorum</translation> <translation id="4892229439761351791">Sait saab kasutada Bluetoothi</translation> +<translation id="489258173289528622">Toiming Tegevusetu aku kasutamisel</translation> <translation id="4893336867552636863">See kustutab teie sirvimisandmed sellest seadmest jäädavalt.</translation> <translation id="4893522937062257019">Lukustuskuval</translation> <translation id="489454699928748701">Luba saitidel kasutada liikumisandureid</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">Silumisfunktsioonide lubamine</translation> <translation id="5864195618110239517">Kasuta mahupõhist ühendust</translation> <translation id="5864471791310927901">DHCP otsing nurjus</translation> +<translation id="5864754048328252126">Toiming Tegevusetu laadimise ajal</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> peatatakse varsti</translation> <translation id="586567932979200359">Käitate <ph name="PRODUCT_NAME" />'i selle kettakujutiselt. Arvutisse installides saate seda käitada ilma kettakujutiseta ja see tagab ajakohasuse.</translation> <translation id="5865733239029070421">Google'ile saadetakse automaatselt kasutusstatistikat ja krahhiaruandeid</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">Kinnita see leht avakuvale ...</translation> <translation id="6122081475643980456">Teie Interneti-ühendust juhitakse</translation> <translation id="6122095009389448667">Blokeeri jätkuvalt selle saidi jaoks lõikelaua nägemine</translation> +<translation id="6122831415929794347">Kas lülitada Google'i ohutu sirvimine välja?</translation> <translation id="6122875415561139701">Kirjutamistoiming pole seadmes „<ph name="DEVICE_NAME" />” lubatud.</translation> <translation id="6124650939968185064">Sellest laiendusest sõltuvad järgmised laiendused:</translation> <translation id="6124698108608891449">See sait vajab rohkem lube.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Pere ja sõprade lisamine</translation> <translation id="636850387210749493">Ettevõtte registreerimine</translation> <translation id="6370021412472292592">Manifesti laadimine ebaõnnestus.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Muuda parooli}other{Muuda paroole}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Proovi uuesti</translation> <translation id="6377268785556383139">1 tulemus otsingule „<ph name="SEARCH_TEXT" />”</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">Andmete lugemine ja muutmine veebisaidil <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ja <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Pildifailid</translation> <translation id="6410328738210026208">Muuda kanalit ja Powerwashi</translation> +<translation id="6410390304316730527">Google'i ohutu sirvimine kaitseb teid ründajate eest, kes võivad teid meelitada ohtlikele tegevustele, nagu pahatahtliku tarkvara installimine või isiklike andmete (nt paroolid, telefoninumbrid või krediitkaarditeave) avaldamine. Kui lülitate selle välja, olge võõraste või halva mainega saitide külastamisel ettevaatlik.</translation> <translation id="6410668567036790476">Otsingumootori lisamine</translation> <translation id="641081527798843608">Teema vaste</translation> <translation id="6412673304250309937">Kontrollib URL-e Chrome'i talletatud ohtlike saitide loendi alusel. Kui sait üritab teie parooli varastada või laadite alla kahjuliku faili, võib Chrome saata URL-id ja lehe sisu osad teenusesse Google'i ohutu sirvimine.</translation> @@ -5936,6 +5947,7 @@ <translation id="8951256747718668828">Taastamist ei saanud vea tõttu lõpule viia</translation> <translation id="8951465597020890363">Kas väljuda siiski külalisrežiimist?</translation> <translation id="8952831374766033534">Seadistamisvalikut ei toetata: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Laadimise ajal</translation> <translation id="895347679606913382">Alustamine...</translation> <translation id="8957762313041272117">Reaalajas subtiitrid</translation> <translation id="895944840846194039">JavaScripti mälu</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index 8991dce4..705b953 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Gehitu senideak eta lagunak</translation> <translation id="636850387210749493">Erregistratu erakundean</translation> <translation id="6370021412472292592">Ezin izan da manifestua kargatu.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Aldatu pasahitza}other{Aldatu pasahitzak}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Saiatu berriro</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" bilaketak emaitza bat du</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index ea9fd4b..d911122e 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">سرور چاپ</translation> <translation id="1805967612549112634">تأیید پین</translation> <translation id="1806335016774576568">رفتن به برنامه باز دیگر</translation> +<translation id="1809483812148634490">برنامههایی که از Google Play بارگیری کردید، از این Chromebook حذف میشوند. + <ph name="LINE_BREAKS1" /> + محتوایی که خریداری کردهاید (مثل فیلم، نمایش تلویزیونی، موسیقی، کتاب، یا خریدهای درونبرنامه دیگر) نیز ممکن است حذف شوند. + <ph name="LINE_BREAKS2" /> + این فرآیند بر برنامهها یا محتوای موجود در دستگاههای دیگر تأثیری نمیگذارد.</translation> <translation id="1809734401532861917">نشانکها، سابقه، گذرواژهها و سایر تنظیماتم به <ph name="USER_EMAIL_ADDRESS" /> اضافه شود</translation> <translation id="1813278315230285598">سرویسها</translation> <translation id="18139523105317219">نام طرف EDI</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">نام چاپشده در پشت کلید امنیتیتان را پیدا کنید</translation> <translation id="2828650939514476812">اتصال به شبکه Wi-Fi</translation> <translation id="2835294513443818940">نمیتوان این فایل را بهطور ایمن بارگیری کرد.</translation> +<translation id="2835547721736623118">سرویس تشخیص گفتار</translation> <translation id="2836269494620652131">خرابی</translation> <translation id="2836635946302913370">ورود به سیستم با این نام کاربری توسط سرپرست شما غیرفعال شده است.</translation> <translation id="283669119850230892">برای استفاده از شبکه <ph name="NETWORK_ID" />، ابتدا اتصال به اینترنت را در زیر تکمیل کنید.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">دکمه صفحه فرعی</translation> <translation id="3020183492814296499">میانبرها</translation> <translation id="3020990233660977256">شمارهٔ سریال: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">هنگام استفاده از باتری</translation> <translation id="3021066826692793094">پروانه</translation> <translation id="3021678814754966447">&نمای منبع قاب</translation> <translation id="3022978424994383087">متوجه نشدم.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">در Google Drive پشتیبانگیری کنید. بهآسانی دادهها را بازیابی کنید یا هرزمان خواستید دستگاه را عوض کنید. این نسخه پشتیبان حاوی دادههای برنامه است. پشتیبانها در Google بارگذاری میشوند و با گذرواژه «حساب Google» فرزندتان رمزگذاری میشوند.</translation> <translation id="4634771451598206121">ورود مجدد به سیستم...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> برای کاربران مهمان دردسترس نیست.</translation> +<translation id="4635444580397524003">پشتیبان Linux باموفقیت بازیابی شد.</translation> <translation id="4636930964841734540">اطلاعات</translation> <translation id="4637083375689622795">کنشهای دیگر، <ph name="EMAIL" /></translation> <translation id="4638930039313743000">فعالسازی اشکالزدایی ADB (پل اشکالزدایی Android)</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">نمایش گزینههای چاپگر پیشرفته</translation> <translation id="4891089016822695758">تالار گفتمان بتا</translation> <translation id="4892229439761351791">سایت میتواند از بلوتوث استفاده کند</translation> +<translation id="489258173289528622">کنش راکد هنگام استفاده از باتری</translation> <translation id="4893336867552636863">این کار داده مرور شما را برای همیشه از روی این دستگاه حذف میکند.</translation> <translation id="4893522937062257019">در صفحه قفل</translation> <translation id="489454699928748701">سایتها میتوانند از حسگرهای حرکتی استفاده کنند</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">فعال کردن ویژگیهای رفع اشکال</translation> <translation id="5864195618110239517">استفاده از اتصال محدود</translation> <translation id="5864471791310927901">بررسی DHCP انجام نشد</translation> +<translation id="5864754048328252126">کنش راکد هنگام شارژ شدن</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> بهزودی متوقف میشود</translation> <translation id="586567932979200359">شما <ph name="PRODUCT_NAME" /> را از تصویر دیسک آن اجرا میکنید. با نصب آن روی رایانه میتوانید آن را بدون تصویر دیسک اجرا کنید، و مطمئن شوید که به روز نگه داشته خواهد شد.</translation> <translation id="5865733239029070421">بهطور خودکار آمار کاربرد و گزارشهای خرابی را به Google ارسال میکند</translation> @@ -3810,6 +3820,7 @@ <translation id="6120205520491252677">پین کردن این صفحه به صفحه شروع…</translation> <translation id="6122081475643980456">اتصال اینترنت شما کنترل میشود</translation> <translation id="6122095009389448667">دسترسی این سایت به بریدهدان همچنان مسدود باشد</translation> +<translation id="6122831415929794347">«مرور ایمن» خاموش شود؟</translation> <translation id="6122875415561139701">عملیات نوشتن در این دستگاه مجاز نیست: «<ph name="DEVICE_NAME" />».</translation> <translation id="6124650939968185064">افزودنههای زیر به این برنامه افزودنی وابسته هستند:</translation> <translation id="6124698108608891449">این سایت به مجوزهای بیشتری نیاز دارد.</translation> @@ -3987,7 +3998,6 @@ <translation id="6365411474437319296">افزودن خانواده و دوستان</translation> <translation id="636850387210749493">ثبتنام شرکت</translation> <translation id="6370021412472292592">مانیفیست بارگیری نشد.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{تغییر گذرواژه}one{تغییر گذرواژهها}other{تغییر گذرواژهها}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">دوباره امتحان کنید</translation> <translation id="6377268785556383139">۱ نتیجه برای «<ph name="SEARCH_TEXT" />»</translation> @@ -4013,6 +4023,7 @@ <translation id="6408118934673775994">خواندن و تغییر دادههایتان در <ph name="WEBSITE_1" />، <ph name="WEBSITE_2" /> و <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">فایلهای تصویری</translation> <translation id="6410328738210026208">تغییر کانال و پاکسازی</translation> +<translation id="6410390304316730527">«مرور ایمن» از شما در برابر مهاجمانی محافظت میکند که ممکن است فریبتان دهند تا کارهای خطرناکی انجام دهید؛ ازجمله نصب نرمافزار مخرب یا افشای اطلاعات شخصی مثل گذرواژهها، شمارههای تماس، یا کارتهای اعتباری. اگر «مرور ایمن» را خاموش میکنید، هنگام مرور کردن در سایتهای ناآشنا یا نامعتبر احتیاط کنید.</translation> <translation id="6410668567036790476">افزودن موتور جستجو</translation> <translation id="641081527798843608">مطابقت موضوع</translation> <translation id="6412673304250309937">نشانیهای وب را با فهرست سایتهای ناامنی که در Chrome ذخیره شده است مقایسه میکند. اگر سایتی تلاش کند گذرواژه شما را بهسرقت ببرد، یا وقتی فایل مخربی بارگیری میکنید، Chrome ممکن است نشانیهای وب را نیز به همراه بخشهای کوچکی از محتوای صفحه، به «مرور ایمن» ارسال کند.</translation> @@ -5933,6 +5944,7 @@ <translation id="8951256747718668828">خطایی رخ داد و بازیابی کامل نشد</translation> <translation id="8951465597020890363">درهرصورت از حالت مهمان خارج میشوید؟</translation> <translation id="8952831374766033534">گزینه پیکربندی پشتیبانی نمیشود: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">هنگام شارژ شدن</translation> <translation id="895347679606913382">در حال شروع...</translation> <translation id="8957762313041272117">زیرنویس زنده</translation> <translation id="895944840846194039">حافطه جاوا اسکریپت</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index e38d3cf..bd13beac 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4000,7 +4000,6 @@ <translation id="6365411474437319296">Lisää perheenjäseniä ja kavereita</translation> <translation id="636850387210749493">Yritysversion käyttöönotto</translation> <translation id="6370021412472292592">Luettelon lataaminen epäonnistui.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Vaihda salasana}other{Vaihda salasanoja}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Yritä uudelleen</translation> <translation id="6377268785556383139">1 tulos: <ph name="SEARCH_TEXT" /></translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 19019c3..e5ef07bf 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Server sa pag-print</translation> <translation id="1805967612549112634">Kumpirmahin ang PIN</translation> <translation id="1806335016774576568">Lumipat sa isa pang nakabukas na app</translation> +<translation id="1809483812148634490">Made-delete sa Chromebook na ito ang mga app na na-download mo mula sa Google Play. + <ph name="LINE_BREAKS1" /> + Posible ring ma-delete ang content na binili mo gaya ng mga pelikula, palabas sa TV, musika, aklat o iba pang in-app na pagbili. + <ph name="LINE_BREAKS2" /> + Hindi nito maaapektuhan ang mga app o content sa iba pang device.</translation> <translation id="1809734401532861917">Idagdag ang aking mga bookmark, history, mga password, at iba pang setting sa <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Services</translation> <translation id="18139523105317219">EDI Party Name</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Hanapin ang pangalang naka-print sa likod ng iyong security key</translation> <translation id="2828650939514476812">Kumonekta sa Wi-Fi network</translation> <translation id="2835294513443818940">Hindi ligtas na mada-download ang file na ito.</translation> +<translation id="2835547721736623118">Serbisyo ng pagkilala sa speech</translation> <translation id="2836269494620652131">Nag-crash</translation> <translation id="2836635946302913370">Hindi pinagana ng iyong administrator ang pag-sign in gamit ang username na ito.</translation> <translation id="283669119850230892">Upang gamitin ang network na <ph name="NETWORK_ID" />, kumpletuhin muna ang iyong koneksyon sa Internet sa ibaba.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Button ng subpage</translation> <translation id="3020183492814296499">Mga Shortcut</translation> <translation id="3020990233660977256">Serial Number: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Habang ginagamit ang baterya</translation> <translation id="3021066826692793094">Paruparo</translation> <translation id="3021678814754966447">&Tingnan ang Pinagmulan ng Frame</translation> <translation id="3022978424994383087">Hindi iyon nakuha.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">I-back up sa Google Drive. Walang hirap na mag-restore ng data o lumipat ng device anumang oras. Kasama sa backup na ito ang data ng app. Ang mga backup ay ina-upload sa Google at ine-encrypt gamit ang password sa Google Account ng iyong anak.</translation> <translation id="4634771451598206121">Muling mag-sign in...</translation> <translation id="4635398712689569051">Hindi available ang <ph name="PAGE_NAME" /> sa mga Bisitang user.</translation> +<translation id="4635444580397524003">Matagumpay na na-restore ang backup ng Linux.</translation> <translation id="4636930964841734540">Impormasyon</translation> <translation id="4637083375689622795">Higit pang pagkilos, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">I-enable ang pag-debug ng ADB</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Ipakita ang mga advanced na opsyon sa printer</translation> <translation id="4891089016822695758">Forum sa Beta</translation> <translation id="4892229439761351791">Puwedeng gumamit ng Bluetooth ang site</translation> +<translation id="489258173289528622">Idle na pagkilos habang ginagamit ang baterya</translation> <translation id="4893336867552636863">Permanente nitong ide-delete ang iyong data sa pag-browse sa device na ito.</translation> <translation id="4893522937062257019">Sa lock screen</translation> <translation id="489454699928748701">Payagan ang mga site na gumamit ng mga sensor ng paggalaw</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">I-enable ang mga feature para sa pagde-debug</translation> <translation id="5864195618110239517">Gumamit ng nakametrong koneksyon</translation> <translation id="5864471791310927901">Nabigo ang paghanap ng DHCP</translation> +<translation id="5864754048328252126">Idle na pagkilos habang nagcha-charge</translation> <translation id="5865508026715185451">Malapit nang mag-pause ang <ph name="APP_NAME" /></translation> <translation id="586567932979200359">Pinapatakbo mo ang <ph name="PRODUCT_NAME" /> mula sa larawan nito sa disk. Ang pag-install nito ay magbibigay-daan sa iyong patakbuhin ito nang walang larawan ng disk, at makakatiyak na pananatilihin itong napapanahon.</translation> <translation id="5865733239029070421">Awtomatikong nagpapadala sa Google ng mga istatistika ng paggamit at ulat ng pag-crash</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">I-pin ang pahinang ito screen ng Simula...</translation> <translation id="6122081475643980456">Kinokontrol ang iyong koneksyon sa Internet</translation> <translation id="6122095009389448667">Patuloy na i-block ang site na ito sa pagtingin sa clipboard</translation> +<translation id="6122831415929794347">I-off ang Ligtas na Pag-browse?</translation> <translation id="6122875415561139701">Hindi pinapahintulutan ang write na operation sa: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Nakadepende ang mga sumusunod na extension sa extension na ito:</translation> <translation id="6124698108608891449">Kailangan ng site na ito ng higit pang pahintulot.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Magdagdag ng pamilya at mga kaibigan</translation> <translation id="636850387210749493">Pagpapatala ng negosyo</translation> <translation id="6370021412472292592">Hindi mai-load ang manifest.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Palitan ang password}one{Palitan ang mga password}other{Palitan ang mga password}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Subukang Muli</translation> <translation id="6377268785556383139">1 resulta para sa '<ph name="SEARCH_TEXT" />'</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">Basahin at baguhin ang iyong data sa <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> at <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Mga File ng Larawan</translation> <translation id="6410328738210026208">Baguhin ang channel at Powerwash</translation> +<translation id="6410390304316730527">Pinoprotektahan ka ng Ligtas na Pag-browse laban sa mga attacker na posibleng manlinlang sa iyong gumawa ng anumang mapanganib na bagay tulad ng pag-install ng nakakapinsalang software o paghahayag ng personal na impormasyon tulad ng mga password, numero ng telepono, o credit card. Kung io-off mo ito, maging maingat kapag nagba-browse sa mga hindi pamilyar o hindi mapagkakatiwalaang site.</translation> <translation id="6410668567036790476">Magdagdag ng search engine</translation> <translation id="641081527798843608">Pagtugma ng paksa</translation> <translation id="6412673304250309937">Sinusuri ang mga URL sa pamamagitan ng listahan ng mga hindi ligtas na site na naka-store sa Chrome. Kung susubukan ng site na nakawin ang iyong password, o kapag nag-download ka ng mapaminsalang file, posible ring magpadala ang Chrome sa Ligtas na Pag-browse ng mga URL, kabilang ang ilang content ng page</translation> @@ -5938,6 +5949,7 @@ <translation id="8951256747718668828">Hindi makumpleto ang pag-restore dahil sa error</translation> <translation id="8951465597020890363">Lumabas pa rin sa guest mode?</translation> <translation id="8952831374766033534">Hindi sinusuportahan ang opsyon sa configuration: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Habang nagcha-charge</translation> <translation id="895347679606913382">Nagsisimula...</translation> <translation id="8957762313041272117">Instant Caption</translation> <translation id="895944840846194039">Memory ng JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index d60670a..de4bbb6f 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -4002,7 +4002,6 @@ <translation id="6365411474437319296">Ajouter des membres de la famille et des amis</translation> <translation id="636850387210749493">Inscription d'entreprise</translation> <translation id="6370021412472292592">Échec de chargement du fichier manifeste.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Changer le mot de passe}one{Changer le mot de passe}other{Changer les mots de passe}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Réessayer</translation> <translation id="6377268785556383139">1 résultat trouvé pour « <ph name="SEARCH_TEXT" /> »</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index ed9c6df..c6ce310 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Serveur d'impression</translation> <translation id="1805967612549112634">Confirmer le code</translation> <translation id="1806335016774576568">Passer à une autre application ouverte</translation> +<translation id="1809483812148634490">Les applications que vous avez téléchargées depuis Google Play seront supprimées de ce Chromebook. + <ph name="LINE_BREAKS1" /> + De même, les contenus que vous avez achetés, tels que les films, les séries TV, les titres musicaux, les livres ou tout autre achat via une application risquent d'être supprimés. + <ph name="LINE_BREAKS2" /> + En revanche, cette opération n'a pas d'incidence sur les applications ou le contenu figurant sur d'autres appareils.</translation> <translation id="1809734401532861917">Ajouter mes favoris, mon historique, mes mots de passe et d'autres paramètres au compte <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Services</translation> <translation id="18139523105317219">Nom de partie EDI</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Localisez le nom imprimé au dos de votre clé de sécurité</translation> <translation id="2828650939514476812">Se connecter au réseau Wi-Fi</translation> <translation id="2835294513443818940">Impossible de télécharger ce fichier de manière sécurisée.</translation> +<translation id="2835547721736623118">Service de reconnaissance vocale</translation> <translation id="2836269494620652131">Blocage</translation> <translation id="2836635946302913370">Impossible de se connecter avec ce nom d'utilisateur, car il a été désactivé par votre administrateur.</translation> <translation id="283669119850230892">Pour utiliser le réseau <ph name="NETWORK_ID" />, finalisez d'abord la connexion à Internet ci-dessous</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Bouton pour accéder à la sous-page</translation> <translation id="3020183492814296499">Raccourcis</translation> <translation id="3020990233660977256">Numéro de série : <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Lorsque l'appareil est sur batterie</translation> <translation id="3021066826692793094">Papillon</translation> <translation id="3021678814754966447">&Afficher le code source du cadre</translation> <translation id="3022978424994383087">Je n'ai pas compris.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Sauvegarder dans Google Drive. Restaurez les données ou changez d'appareil facilement et à tout moment. Les données des applications sont également sauvegardées. Les sauvegardes sont importées dans Google et chiffrées à l'aide du mot de passe du compte Google de votre enfant.</translation> <translation id="4634771451598206121">Nouvelle connexion...</translation> <translation id="4635398712689569051">La page <ph name="PAGE_NAME" /> n'est pas accessible aux utilisateurs invités.</translation> +<translation id="4635444580397524003">La sauvegarde Linux a bien été restaurée.</translation> <translation id="4636930964841734540">Infos</translation> <translation id="4637083375689622795">Autres actions, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Activer le débogage ADB</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Afficher les paramètres d'imprimante avancés</translation> <translation id="4891089016822695758">Forum bêta</translation> <translation id="4892229439761351791">Le site peut utiliser le Bluetooth</translation> +<translation id="489258173289528622">Lorsque l'appareil est inactif et fonctionne sur batterie</translation> <translation id="4893336867552636863">Cette action aura pour effet de supprimer définitivement vos données de navigation de cet appareil.</translation> <translation id="4893522937062257019">Sur l'écran de verrouillage</translation> <translation id="489454699928748701">Autoriser les sites à utiliser les capteurs de mouvement</translation> @@ -3615,6 +3624,7 @@ <translation id="5863445608433396414">Activer les fonctionnalités de débogage</translation> <translation id="5864195618110239517">Utiliser une connexion facturée à l'usage</translation> <translation id="5864471791310927901">Échec de la vérification DHCP</translation> +<translation id="5864754048328252126">Lorsque l'appareil est inactif et en charge</translation> <translation id="5865508026715185451">L'application <ph name="APP_NAME" /> sera bientôt suspendue</translation> <translation id="586567932979200359">Vous exécutez <ph name="PRODUCT_NAME" /> à partir de son image disque. Si vous l'installez sur votre ordinateur, vous pourrez l'utiliser sans image disque et bénéficierez de mises à jour automatiques.</translation> <translation id="5865733239029070421">Envoie automatiquement des statistiques d'utilisation et des rapports d'erreur à Google</translation> @@ -3814,6 +3824,7 @@ <translation id="6120205520491252677">Épingler cette page à l'écran de démarrage…</translation> <translation id="6122081475643980456">Une extension a pris le contrôle de votre connexion Internet</translation> <translation id="6122095009389448667">Continuer à empêcher ce site de voir le contenu du presse-papiers</translation> +<translation id="6122831415929794347">Désactiver la navigation sécurisée ?</translation> <translation id="6122875415561139701">L'opération d'écriture n'est pas autorisée sur l'appareil <ph name="DEVICE_NAME" />.</translation> <translation id="6124650939968185064">Les extensions suivantes dépendent de cette extension :</translation> <translation id="6124698108608891449">Ce site a besoin d'autres autorisations.</translation> @@ -3991,7 +4002,6 @@ <translation id="6365411474437319296">Ajouter des proches</translation> <translation id="636850387210749493">Inscription d'entreprise</translation> <translation id="6370021412472292592">Impossible de charger le fichier manifeste.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Modifier le mot de passe}one{Change passwords}other{Modifier les mots de passe}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Réessayer</translation> <translation id="6377268785556383139">1 résultat pour "<ph name="SEARCH_TEXT" />"</translation> @@ -4017,6 +4027,7 @@ <translation id="6408118934673775994">Accéder aux données des sites <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" />, et les modifier</translation> <translation id="6410257289063177456">Fichiers image</translation> <translation id="6410328738210026208">Changer de version et Powerwash</translation> +<translation id="6410390304316730527">La fonctionnalité Navigation sécurisée vous protège contre les pirates informatiques qui pourraient vous inciter à effectuer des opérations dangereuses, comme installer des logiciels malveillants ou divulguer des informations personnelles (mots de passe, numéros de téléphone ou numéros de carte de crédit, par exemple). Si vous la désactivez, faites preuve de vigilance lorsque vous consultez des sites Web inconnus ou peu fiables.</translation> <translation id="6410668567036790476">Ajouter un moteur de recherche</translation> <translation id="641081527798843608">Correspondance d'objet</translation> <translation id="6412673304250309937">Il vérifie les URL d'après une liste de sites dangereux stockée dans Chrome. Si un site tente de voler votre mot de passe ou si vous téléchargez un fichier dangereux, Chrome peut également envoyer les URL concernées, y compris des extraits du contenu de pages, à la fonctionnalité de navigation sécurisée.</translation> @@ -5937,6 +5948,7 @@ <translation id="8951256747718668828">Échec de la restauration en raison d'une erreur</translation> <translation id="8951465597020890363">Voulez-vous vraiment quitter le mode Invité ?</translation> <translation id="8952831374766033534">Option de configuration non disponible : <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Lorsque l'appareil est en charge</translation> <translation id="895347679606913382">Démarrage...</translation> <translation id="8957762313041272117">Sous-titres instantanés</translation> <translation id="895944840846194039">Mémoire JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index d007b7f..a7486d6 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -186,7 +186,7 @@ <translation id="1235458158152011030">Redes coñecidas</translation> <translation id="123578888592755962">Disco cheo</translation> <translation id="1238191093934674082">Abrir VPN</translation> -<translation id="1239439601391236986">Mostrar suxestións de información persoal</translation> +<translation id="1239439601391236986">Mostrar suxestións de información persoal ao escribir</translation> <translation id="1239594683407221485">Explora o contido do dispositivo na aplicación Ficheiros.</translation> <translation id="124116460088058876">Máis idiomas</translation> <translation id="1241753985463165747">Ler e cambiar todos os teus datos no sitio web actual cando se invoque</translation> @@ -817,7 +817,7 @@ <translation id="2090165459409185032">Para recuperar a información da túa conta, accede a: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Configuración de seguranza do sistema</translation> <translation id="2091887806945687916">Son</translation> -<translation id="2096478741073211388">As suxestións de información persoal axúdanche a escribir máis rápido ao suxerirche o nome, enderezo ou número de teléfono cando escribes algunhas palabras específicas. Só ti podes ver as túas propias suxestións privadas e personalizadas para a túa conta.</translation> +<translation id="2096478741073211388">As suxestións de información persoal axúdanche a escribir máis rápido ao suxerirche o teu nome, enderezo ou número de teléfono cando escribes algunhas palabras específicas. Só ti podes ver as túas propias suxestións privadas e personalizadas para a túa conta.</translation> <translation id="2096715839409389970">Borrar cookies de terceiros</translation> <translation id="2097372108957554726">Tes que iniciar sesión en Chrome para rexistrar novos dispositivos</translation> <translation id="2099172618127234427">Vas activar as funcións de depuración de Chrome OS que configurarán o daemon sshd e activarán o arranque desde unidades USB.</translation> @@ -4000,7 +4000,6 @@ <translation id="6365411474437319296">Engadir familia e amigos</translation> <translation id="636850387210749493">Inscrición corporativa</translation> <translation id="6370021412472292592">Erro ao cargar o manifesto.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Cambiar contrasinal}other{Cambiar contrasinais}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Tentar de novo</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index c3e7ed9d..1a009e2 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -608,6 +608,11 @@ <translation id="1805888043020974594">પ્રિન્ટ સર્વર</translation> <translation id="1805967612549112634">પિન કન્ફર્મ કરો</translation> <translation id="1806335016774576568">અન્ય ખુલ્લી ઍપ પર સ્વિચ કરો</translation> +<translation id="1809483812148634490">Google Play પરથી તમે ડાઉનલોડ કરેલી બધી ઍપ આ Chromebookમાંથી ડિલીટ કરવામાં આવશે. + <ph name="LINE_BREAKS1" /> + મૂવી, ટીવી શો, મ્યુઝિક, પુસ્તકો અથવા ઍપમાંની ખરીદીઓ જેવું તમે ખરીદેલું કન્ટેન્ટ પણ ડિલીટ કરવામાં આવી શકે છે. + <ph name="LINE_BREAKS2" /> + આમ કરવાથી, અન્ય ડિવાઇસ પરની ઍપ અથવા કન્ટેન્ટને કોઈ અસર થતી નથી.</translation> <translation id="1809734401532861917">મારા બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને અન્ય સેટિંગ્સને <ph name="USER_EMAIL_ADDRESS" /> માં ઉમેરો</translation> <translation id="1813278315230285598">સેવાઓ</translation> <translation id="18139523105317219">EDI પાર્ટી નામ</translation> @@ -1389,6 +1394,7 @@ <translation id="2825848369316359348">તમારા સુરક્ષા કોડની પાછળની બાજુ પર પ્રિન્ટ કરેલું નામ શોધો</translation> <translation id="2828650939514476812">વાઇ-ફાઇ નેટવર્ક પર કનેક્ટ કરો</translation> <translation id="2835294513443818940">આ ફાઇલ સુરક્ષિતપણે ડાઉનલોડ કરી શકાતી નથી.</translation> +<translation id="2835547721736623118">વાણી ઓળખ સેવા</translation> <translation id="2836269494620652131">ક્રૅશ</translation> <translation id="2836635946302913370">તમારા વ્યવસ્થાપક દ્વારા આ વપરાશકર્તા સાથે સાઇન ઇન કરવું અક્ષમ કરવામાં આવ્યું છે.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> નો નેટવર્ક ઉપયોગ કરવા માટે, પહેલાં નીચે ઇન્ટરનેટથી તમારા કનેક્શનને પૂર્ણ કરો.</translation> @@ -1533,6 +1539,7 @@ <translation id="3019285239893817657">સબપેજનું બટન</translation> <translation id="3020183492814296499">શૉર્ટકટ</translation> <translation id="3020990233660977256">સીરિયલ નંબર: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">બૅટરી પર હોય, ત્યારે</translation> <translation id="3021066826692793094">પતંગિયું</translation> <translation id="3021678814754966447">ફ્રેમ સ્રોત &જુઓ</translation> <translation id="3022978424994383087">તે મળ્યો નથી.</translation> @@ -2729,6 +2736,7 @@ <translation id="4633757335284074492">Google ડ્રાઇવ પર બૅકઅપ લો. ડેટાને સરળતાથી પાછો મેળવો અથવા ડિવાઇસને કોઈપણ સમયે સ્વિચ કરો. આ બૅકઅપમાં ઍપનો ડેટા શામેલ છે. બૅકઅપને Google પર અપલોડ કરવામાં આવે છે અને તમારા બાળકના Google એકાઉન્ટ પાસવર્ડનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરવામાં આવે છે.</translation> <translation id="4634771451598206121">ફરીથી સાઇન ઇન કરો....</translation> <translation id="4635398712689569051">અતિથિ વપરાશકર્તાઓ માટે <ph name="PAGE_NAME" /> ઉપલબ્ધ નથી.</translation> +<translation id="4635444580397524003">Linuxનું બૅકઅપ સફળતાપૂર્વક રિસ્ટોર કરવામાં આવ્યું.</translation> <translation id="4636930964841734540">માહિતી</translation> <translation id="4637083375689622795">વધુ ક્રિયાઓ, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB ડિબગીંગ ચાલુ કરો</translation> @@ -2904,6 +2912,7 @@ <translation id="4890773143211625964">વિગતવાર પ્રિન્ટર વિકલ્પો બતાવો</translation> <translation id="4891089016822695758">બીટા ચર્ચા મંચ</translation> <translation id="4892229439761351791">સાઇટ બ્લૂટૂથનો ઉપયોગ કરી શકે</translation> +<translation id="489258173289528622">બૅટરી પર હોય, ત્યારની નિષ્ક્રિય ક્રિયા</translation> <translation id="4893336867552636863">આ તમારો બ્રાઉઝીંગ ડેટા આ ડિવાઇસમાંથી સ્થાયી રૂપે ડિલીટ કરશે.</translation> <translation id="4893522937062257019">લૉક સ્ક્રીન પર</translation> <translation id="489454699928748701">સાઇટને મોશન સેન્સરનો ઉપયોગ કરવાની મંજૂરી આપો</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">ડિબગીંગ સુવિધાઓ ચાલુ કરો</translation> <translation id="5864195618110239517">મીટર્ડ કનેક્શનનો ઉપયોગ કરો</translation> <translation id="5864471791310927901">DHCP લુકઅપ નિષ્ફળ</translation> +<translation id="5864754048328252126">ચાર્જિંગ દરમ્યાનની નિષ્ક્રિય ક્રિયા</translation> <translation id="5865508026715185451"><ph name="APP_NAME" />ને ટૂંક સમયમાં થોભાવવામાં આવશે</translation> <translation id="586567932979200359">તમે <ph name="PRODUCT_NAME" /> ને તેની ડિસ્ક છબીથી ચલાવી રહ્યા છો. તેને તમારા કમ્પ્યુટર પર ઇન્સ્ટોલ કરવાથી તમે તેને ડિસ્ક છબી વગર ચલાવી શકો છો, અને તે અપ-ટુ-ડેટ રાખવામાં આવશે તેની ખાતરી થાય છે.</translation> <translation id="5865733239029070421">Googleને વપરાશના આંકડા અને ક્રૅશ રિપોર્ટ ઑટોમૅટિક રીતે મોકલે છે</translation> @@ -3811,6 +3821,7 @@ <translation id="6120205520491252677">પ્રારંભ સ્ક્રીન પર આ પૃષ્ઠ પિન કરો...</translation> <translation id="6122081475643980456">તમારું ઇન્ટરનેટ કનેક્શન નિયંત્રિત કરવામાં આવી રહ્યું છે</translation> <translation id="6122095009389448667">ક્લિપબોર્ડને જોવાથી આ સાઇટને બ્લૉક કરવાનું ચાલુ રાખો</translation> +<translation id="6122831415929794347">Safe Browsing બંધ કરીએ?</translation> <translation id="6122875415561139701">આના પર લેખન ઓપરેશનને મંજૂરી નથી: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">નીચેના એક્સ્ટેન્શન્સ આ એક્સ્ટેન્શન પર નિર્ભર કરે છે:</translation> <translation id="6124698108608891449">આ સાઇટ માટે વધુ પરવાનગીઓની જરૂર છે.</translation> @@ -3988,7 +3999,6 @@ <translation id="6365411474437319296">કુટુંબીજનો અને મિત્રોને ઉમેરો</translation> <translation id="636850387210749493">સંગઠન નોંધણી</translation> <translation id="6370021412472292592">મેનિફેસ્ટ લોડ કરી શકાયું નથી.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{પાસવર્ડ બદલો}one{પાસવર્ડ બદલો}other{પાસવર્ડ બદલો}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ફરી પ્રયાસ કરો</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' માટે 1 પરિણામ</translation> @@ -4014,6 +4024,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> અને <ph name="WEBSITE_3" /> પર તમારો ડેટા વાંચો અને બદલો</translation> <translation id="6410257289063177456">છબી ફાઇલો</translation> <translation id="6410328738210026208">ચેનલ બદલો અને Powerwash કરો</translation> +<translation id="6410390304316730527">Safe Browsing એવા હુમલાખોરોથી તમારું રક્ષણ કરી શકે છે જે તમને દુર્ભાવનાપૂર્ણ સૉફ્ટવેર ઇન્સ્ટૉલ કરવા અથવા પાસવર્ડ, ફોન નંબર અથવા ક્રેડિટ કાર્ડ જેવી વ્યક્તિગત માહિતી જાહેર કરવા જેવી જોખમી બાબતો કરવા ગેરમાર્ગે દોરી શકે છે. જો તમે આ બંધ કરો, તો અજાણી અથવા ભરોસાપાત્ર ન હોય એવી સાઇટ બ્રાઉઝ કરતી વખતે સાવધાન રહેજો.</translation> <translation id="6410668567036790476">શોધ એંજિન ઉમેરો</translation> <translation id="641081527798843608">વિષય મેળ</translation> <translation id="6412673304250309937">URLsને Chromeમાં સંગ્રહિત અસુરક્ષિત સાઇટની સૂચિ સાથે ચેક કરે છે. જો કોઈ સાઇટ તમારો પાસવર્ડ ચોરી કરવાનો પ્રયાસ કરે અથવા તમે કોઈ નુકસાનકારક ફાઇલ ડાઉનલોડ કરો, ત્યારે Chrome પેજ કન્ટેન્ટના બિટની સાથોસાથ URLs પણ Safe Browsingને મોકલી શકે છે.</translation> @@ -5928,6 +5939,7 @@ <translation id="8951256747718668828">ભૂલને કારણે પુનઃસ્થાપના પૂર્ણ ન કરી શકાઈ</translation> <translation id="8951465597020890363">તેમ છતાંએ અતિથિ મોડથી બહાર નીકળી જઈએ?</translation> <translation id="8952831374766033534">ગોઠવણીના વિકલ્પની સુવિધા નથી: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">ચાર્જિંગ થતી વખતે</translation> <translation id="895347679606913382">પ્રારંભ કરે છે...</translation> <translation id="8957762313041272117">લાઇવ કૅપ્શન</translation> <translation id="895944840846194039">JavaScript મેમરી</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 5c938a73..df3949a 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">प्रिंट सर्वर</translation> <translation id="1805967612549112634">पिन की पुष्टि करें</translation> <translation id="1806335016774576568">किसी दूसरे खुले हुए ऐप्लिकेशन पर स्विच करें</translation> +<translation id="1809483812148634490">जिन ऐप्लिकेशन को आपने Google Play से डाउनलोड किया था उन्हें इस Chromebook से मिटा दिया जाएगा. + <ph name="LINE_BREAKS1" /> + आपने जो सामग्री खरीदी है, जैसे कि फ़िल्में, टीवी शो, संगीत, किताबें या दूसरी इन-ऐप्लिकेशन खरीदारी भी मिटाई जा सकती हैं. + <ph name="LINE_BREAKS2" /> + इससे दूसरे डिवाइस के ऐप्लिकेशन या सामग्री पर कोई असर नहीं पड़ता.</translation> <translation id="1809734401532861917">मेरे बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग को <ph name="USER_EMAIL_ADDRESS" /> में जोड़ें</translation> <translation id="1813278315230285598">सेवाएं</translation> <translation id="18139523105317219">EDI पार्टी नाम</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">अपनी 'सुरक्षा चाबी' के पीछे प्रिंट किया हुआ नाम देखें</translation> <translation id="2828650939514476812">वाई-फ़ाई नेटवर्क से कनेक्ट करें</translation> <translation id="2835294513443818940">इस फ़ाइल को सुरक्षित रूप से डाउनलोड नहीं किया जा सकता.</translation> +<translation id="2835547721736623118">बोली पहचानने की सुविधा</translation> <translation id="2836269494620652131">खराबी</translation> <translation id="2836635946302913370">आपके व्यवस्थापक द्वारा इस उपयोगकर्ता नाम से प्रवेश करना अक्षम कर दिया गया है.</translation> <translation id="283669119850230892">नेटवर्क <ph name="NETWORK_ID" /> का उपयोग करने के लिए, सबसे पहले नीचे इंटरनेट से अपना कनेक्शन पूरा करें.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">सबपेज बटन</translation> <translation id="3020183492814296499">शॉर्टकट</translation> <translation id="3020990233660977256">क्रम संख्या: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">बैटरी का इस्तेमाल करते समय</translation> <translation id="3021066826692793094">तितली</translation> <translation id="3021678814754966447">फ़्रेम का स्रोत &देखें</translation> <translation id="3022978424994383087">समझ नहीं आया.</translation> @@ -2732,6 +2739,7 @@ <translation id="4633757335284074492">'Google डिस्क' में बैक अप लें. आसानी से डेटा वापस पाएं या किसी भी समय डिवाइस बदलें. इस बैक अप में ऐप्लिकेशन का डेटा शामिल है. बैकअप आपके बच्चे के Google खाते के पासवर्ड से सुरक्षित करके Google पर अपलोड किए जाते हैं.</translation> <translation id="4634771451598206121">फिर से साइन इन करें...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> मेहमान उपयोगकर्ताओं के लिए उपलब्ध नहीं है.</translation> +<translation id="4635444580397524003">Linux का बैक अप पहले जैसा कर दिया गया है.</translation> <translation id="4636930964841734540">जानकारी</translation> <translation id="4637083375689622795">ज़्यादा कार्रवाइयां, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB डीबग करने की सुविधा चालू करें</translation> @@ -2907,6 +2915,7 @@ <translation id="4890773143211625964">बेहतर प्रिंटर विकल्प दिखाएं</translation> <translation id="4891089016822695758">बीटा फ़ोरम</translation> <translation id="4892229439761351791">साइट 'ब्लूटूथ' का इस्तेमाल कर सकती है</translation> +<translation id="489258173289528622">बैटरी का इस्तेमाल करते समय ऐसी गतिविधि करना जो कुछ समय से बंद है</translation> <translation id="4893336867552636863">इससे इस डिवाइस से आपका पूरा ब्राउज़िंग डेटा हमेशा के लिए मिट जाएगा.</translation> <translation id="4893522937062257019">लॉक स्क्रीन पर</translation> <translation id="489454699928748701">साइटों को हलचल पकड़ने वाले सेंसर का इस्तेमाल करने दें</translation> @@ -3613,6 +3622,7 @@ <translation id="5863445608433396414">डीबग करने वाली सुविधाएं चालू करें</translation> <translation id="5864195618110239517">सीमित डेटा वाला कनेक्शन इस्तेमाल करें</translation> <translation id="5864471791310927901">DHCP लुकअप विफल</translation> +<translation id="5864754048328252126">चार्ज करते समय ऐसी गतिविधि करना जो कुछ समय से बंद है</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> जल्द ही रुक जाएगा</translation> <translation id="586567932979200359">आप <ph name="PRODUCT_NAME" /> को उसकी डिस्क इमेज से चला रहे हैं. इसे अपने कंप्यूटर पर इंस्टॉल करने से यह आपको बिना डिस्क इमेज के चलाने देता है और पक्का करता है कि इससे यह 'अप टू डेट' रहेगा.</translation> <translation id="5865733239029070421">Google को इस्तेमाल के आंकड़े और खराबी रिपोर्ट अपने आप भेजती है</translation> @@ -3812,6 +3822,7 @@ <translation id="6120205520491252677">इस पेज को प्रारंभ स्क्रीन में पिन करें...</translation> <translation id="6122081475643980456">आपका इंटरनेट कनेक्शन नियंत्रित किया जा रहा है</translation> <translation id="6122095009389448667">इस साइट को क्लिपबोर्ड देखने से ब्लॉक करते रहें</translation> +<translation id="6122831415929794347">क्या आप सुरक्षित ब्राउज़िंग की सुविधा का इस्तेमाल बंद करना चाहते हैं?</translation> <translation id="6122875415561139701">लिखें कार्रवाई की इस पर अनुमति नहीं है: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">निम्न एक्सटेंशन इस एक्सटेंशन पर निर्भर हैं:</translation> <translation id="6124698108608891449">इस साइट को ज़्यादा अनुमतियां चाहिए.</translation> @@ -3989,7 +4000,6 @@ <translation id="6365411474437319296">परिवार और मित्रों को जोड़ें</translation> <translation id="636850387210749493">एंटरप्राइज़ नामांकन</translation> <translation id="6370021412472292592">मेनिफ़ेस्ट लोड नहीं किया जा सका.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{पासवर्ड बदलें}one{पासवर्ड बदलें}other{पासवर्ड बदलें}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">फिर से कोशिश करें</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' के लिए एक नतीजा मिला है</translation> @@ -4015,6 +4025,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> और <ph name="WEBSITE_3" /> पर मौजूद आपका डेटा पढ़ और बदल सकता है</translation> <translation id="6410257289063177456">इमेज फ़ाइल</translation> <translation id="6410328738210026208">चैनल बदलें और पावरवॉश करें</translation> +<translation id="6410390304316730527">सुरक्षित ब्राउज़िंग की सुविधा आपको ऐसे हमलावरों से बचाती है जो आपको कुछ खतरनाक कामों में फंसा सकते हैं. उदाहरण के लिए, आपको नुकसान पहुंचाने वाले सॉफ़्टवेयर इंस्टॉल करना या आपकी निजी जानकारी, जैसे कि पासवर्ड, फ़ोन नंबर या क्रेडिट कार्ड हासिल करना. अगर आप इस सुविधा को बंद करते हैं, तो ऐसी साइटें ब्राउज़ करते समय सावधान रहें जिनसे आप अनजान हैं या जो जानी-मानी नहीं हैं.</translation> <translation id="6410668567036790476">सर्च इंजन जोड़ें</translation> <translation id="641081527798843608">विषय मिलान</translation> <translation id="6412673304250309937">Chrome में पहले से सेव असुरक्षित साइटों के साथ यूआरएल की जांच करता है. अगर कोई साइट आपका पासवर्ड चुराने की कोशिश करती है या आप कोई नुकसान पहुंचाने वाली फ़ाइल डाउनलोड करते हैं, तो Chrome सुरक्षित ब्राउज़िंग की सेवा को उनका यूआरएल भेजता है. यूआरएल के साथ इनमें उन पेज की कुछ सामग्री भी शामिल होती है.</translation> @@ -5934,6 +5945,7 @@ <translation id="8951256747718668828">गड़बड़ी की वजह से इंपोर्ट पूरा नहीं किया जा सका</translation> <translation id="8951465597020890363">क्या आप मेहमान मोड से बाहर निकलना चाहते हैं?</translation> <translation id="8952831374766033534">कॉन्फ़िगर करने का विकल्प काम नहीं करता: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">चार्ज करते समय</translation> <translation id="895347679606913382">प्रारंभ कर रहा है...</translation> <translation id="8957762313041272117">लाइव कैप्शन</translation> <translation id="895944840846194039">JavaScript मेमोरी</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 85e1e12..2ae6f1c 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -94,7 +94,7 @@ <translation id="1122960773616686544">Naziv oznake</translation> <translation id="1124772482545689468">Korisnik</translation> <translation id="1125550662859510761">Izgleda kao <ph name="WIDTH" /> x <ph name="HEIGHT" /> (izvorno)</translation> -<translation id="1126809382673880764">Ne štiti vas od opasnih web-lokacija, preuzimanja i proširenja. Bez obzira na to i gdje je primjenjivo, u drugim Googleovim uslugama, kao što su Gmail i Pretraživanje, dobit ćete zaštitu Sigurno pregledavanje.</translation> +<translation id="1126809382673880764">Ne štiti vas od opasnih web-lokacija, preuzimanja i proširenja. Na drugim Googleovim uslugama, kao što su Gmail i Pretraživanje, i dalje ste zaštićeni Sigurnim pregledavanjem, ako je dostupno.</translation> <translation id="1128109161498068552">Ne dozvoli nijednoj web-lokaciji upotrebu posebnih sistemskih poruka za pristup MIDI uređajima</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Uređivanje tražilice</translation> @@ -612,6 +612,11 @@ <translation id="1805888043020974594">Poslužitelj za ispis</translation> <translation id="1805967612549112634">Potvrda PIN-a</translation> <translation id="1806335016774576568">Prelazak na neku drugu otvorenu aplikaciju</translation> +<translation id="1809483812148634490">Aplikacije koje ste preuzeli s Google Playa izbrisat će se s ovog Chromebooka. + <ph name="LINE_BREAKS1" /> + Možda će se izbrisati i kupljeni sadržaj, primjerice filmovi, TV emisije, glazba, knjige ili druge kupnje putem aplikacije. + <ph name="LINE_BREAKS2" /> + To ne utječe na aplikacije ili sadržaj na drugim uređajima.</translation> <translation id="1809734401532861917">Dodaj moje oznake, povijest, zaporke i druge postavke na <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Usluge</translation> <translation id="18139523105317219">Naziv EDI strane</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Pronađite naziv na poleđini sigurnosnog ključa</translation> <translation id="2828650939514476812">Povezivanje s Wi-Fi mrežom</translation> <translation id="2835294513443818940">Ta se datoteka ne može sigurno preuzeti.</translation> +<translation id="2835547721736623118">Usluga prepoznavanja govora</translation> <translation id="2836269494620652131">Pad sustava</translation> <translation id="2836635946302913370">Prijavu ovim korisničkim imenom onemogućio je vaš administrator.</translation> <translation id="283669119850230892">Da biste upotrebljavali mrežu <ph name="NETWORK_ID" />, prvo se povežite s internetom prema uputama u nastavku.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Gumb podstranice</translation> <translation id="3020183492814296499">Prečaci</translation> <translation id="3020990233660977256">Serijski broj: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Tijekom baterijskog napajanja</translation> <translation id="3021066826692793094">Leptir</translation> <translation id="3021678814754966447">&Pogledaj izvor okvira</translation> <translation id="3022978424994383087">Nisam shvatio.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Sigurnosno kopiranje na Google disku. Lako vratite podatke ili promijenite uređaj u bilo kojem trenutku. Sigurnosna kopija uključuje podatke aplikacija. Sigurnosna kopija prenosi se na Google i kriptira pomoću zaporke Google računa vašeg djeteta.</translation> <translation id="4634771451598206121">Prijavite se ponovo...</translation> <translation id="4635398712689569051">Stranica <ph name="PAGE_NAME" /> nije dostupna gostujućim korisnicima.</translation> +<translation id="4635444580397524003">Sigurnosna kopija Linuxa uspješno je vraćena.</translation> <translation id="4636930964841734540">Informacije</translation> <translation id="4637083375689622795">Više radnji, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Omogući ADB otklanjanje pogrešaka</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Prikaži napredne opcije pisača</translation> <translation id="4891089016822695758">Forum za beta verziju</translation> <translation id="4892229439761351791">Web-lokacija može upotrebljavati Bluetooth</translation> +<translation id="489258173289528622">Radnja neaktivnosti tijekom baterijskog napajanja</translation> <translation id="4893336867552636863">Time će se trajno izbrisati podaci o pregledavanju s ovog uređaja.</translation> <translation id="4893522937062257019">Na zaključanom zaslonu</translation> <translation id="489454699928748701">Dopusti web-lokacijama upotrebu senzora kretanja</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">Omogući značajke za otklanjanje pogrešaka</translation> <translation id="5864195618110239517">Koristi vezu s ograničenim prometom</translation> <translation id="5864471791310927901">DHCP pretraživanje nije uspjelo</translation> +<translation id="5864754048328252126">Radnja neaktivnosti tijekom napajanja</translation> <translation id="5865508026715185451">Uskoro će se pauzirati <ph name="APP_NAME" /></translation> <translation id="586567932979200359">Pokrećete program <ph name="PRODUCT_NAME" /> iz diskovne slike. Instaliranjem na računalu moći ćete ga pokrenuti u bilo kojem trenutku i uvijek će biti ažuran.</translation> <translation id="5865733239029070421">Automatski šalje Googleu statistiku upotrebe i izvješća o rušenju</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">Prikvači ovu stranicu na zaslon Start...</translation> <translation id="6122081475643980456">Internetskom vezom upravlja proširenje</translation> <translation id="6122095009389448667">Nastavi ovoj web-lokaciji blokirati uvid u međuspremnik</translation> +<translation id="6122831415929794347">Želite li isključiti Sigurno pregledavanje?</translation> <translation id="6122875415561139701">Operacija zapisivanja nije dopuštena na uređaju: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">O tom proširenju ovise sljedeća proširenja:</translation> <translation id="6124698108608891449">Ovoj web-lokaciji potrebno je više dopuštenja.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Dodavanje članova obitelji i prijatelja</translation> <translation id="636850387210749493">Prijava poduzeća</translation> <translation id="6370021412472292592">Manifest nije učitan.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Promijenite zaporku}one{Promijenite zaporke}few{Promijenite zaporke}other{Promijenite zaporke}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Pokušaj ponovo</translation> <translation id="6377268785556383139">Jedan rezultat za upit "<ph name="SEARCH_TEXT" />"</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">pročitati i promijeniti vaše podatke na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Slikovne datoteke</translation> <translation id="6410328738210026208">Promijeni kanal i pokreni Powerwash</translation> +<translation id="6410390304316730527">Sigurno pregledavanje štiti vas od napadača koji vas mogu na prijevaru pokušati navesti da napravite nešto opasno kao što je instaliranje zlonamjernog softvera ili otkrivanje osobnih podataka kao što su zaporke, telefonski brojevi ili kreditne kartice. Ako ga isključite, pripazite kada pregledavate nepoznate ili nepouzdane web-lokacije.</translation> <translation id="6410668567036790476">Dodavanje tražilice</translation> <translation id="641081527798843608">Podudaranje predmeta</translation> <translation id="6412673304250309937">Provjerava URL-ove s popisom nesigurnih web-lokacija pohranjenih u Chromeu. Ako neka web-lokacija pokuša ukrasti vašu zaporku ili ako preuzmete štetnu datoteku, Chrome također može poslati URL-ove, uključujući dijelove sadržaja web-stranice, Sigurnom pregledavanju.</translation> @@ -5936,6 +5947,7 @@ <translation id="8951256747718668828">Vraćanje se ne može dovršiti zbog pogreške.</translation> <translation id="8951465597020890363">Svejedno želite zatvoriti način rada za goste?</translation> <translation id="8952831374766033534">Opcija konfiguracije nije podržana: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Tijekom punjenja</translation> <translation id="895347679606913382">Početak...</translation> <translation id="8957762313041272117">Automatski titlovi</translation> <translation id="895944840846194039">Memorija JavaScripta</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 2a214bd..442211c 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -4002,7 +4002,6 @@ <translation id="6365411474437319296">Családtagok és ismerősök hozzáadása</translation> <translation id="636850387210749493">Vállalat rögzítése</translation> <translation id="6370021412472292592">Nem sikerült a jegyzék betöltése.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Jelszó módosítása}other{Jelszavak módosítása}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Próbálja újra</translation> <translation id="6377268785556383139">1 találat a következőre: <ph name="SEARCH_TEXT" /></translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 3b84ef4..c64ac3fe 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -4004,7 +4004,6 @@ <translation id="6365411474437319296">Ավելացրեք հարազատներին և ընկերներին</translation> <translation id="636850387210749493">Ձեռնարկության գրանցում</translation> <translation id="6370021412472292592">Չհաջողվեց բեռնել մանիֆեստը:</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Փոխել գաղտնաբառը}one{Փոխել գաղտնաբառերը}other{Փոխել գաղտնաբառերը}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Փորձել կրկին</translation> <translation id="6377268785556383139">«<ph name="SEARCH_TEXT" />»-ի որոնման 1 արդյունք</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 6d2f705..e842cb15 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Server cetak</translation> <translation id="1805967612549112634">Konfirmasi PIN</translation> <translation id="1806335016774576568">Alihkan ke aplikasi lain yang terbuka</translation> +<translation id="1809483812148634490">Aplikasi yang telah Anda download dari Google Play akan dihapus dari Chromebook ini. + <ph name="LINE_BREAKS1" /> + Konten yang telah Anda beli seperti film, acara TV, musik, buku, atau pembelian dalam aplikasi lainnya juga dapat dihapus. + <ph name="LINE_BREAKS2" /> + Tindakan ini tidak memengaruhi aplikasi atau konten di perangkat lain.</translation> <translation id="1809734401532861917">Tambahkan bookmark, histori, sandi, dan setelan saya lainnya ke <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Layanan</translation> <translation id="18139523105317219">EDI Party Name</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Cari nama yang tercetak di bagian belakang kunci keamanan</translation> <translation id="2828650939514476812">Tersambung ke jaringan Wi-Fi</translation> <translation id="2835294513443818940">File ini tidak dapat didownload dengan aman.</translation> +<translation id="2835547721736623118">Layanan pengenalan ucapan</translation> <translation id="2836269494620652131">Kerusakan</translation> <translation id="2836635946302913370">Login dengan nama pengguna ini telah dinonaktifkan oleh administrator Anda.</translation> <translation id="283669119850230892">Untuk menggunakan <ph name="NETWORK_ID" /> jaringan, pertama-tama, selesaikan sambungan Anda ke Internet di bawah ini.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Tombol subhalaman</translation> <translation id="3020183492814296499">Pintasan</translation> <translation id="3020990233660977256">Nomor Seri: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Saat menggunakan baterai</translation> <translation id="3021066826692793094">Kupu-kupu</translation> <translation id="3021678814754966447">&Lihat Sumber Bingkai</translation> <translation id="3022978424994383087">Tidak mengerti.</translation> @@ -2731,6 +2738,7 @@ <translation id="4633757335284074492">Cadangkan ke Google Drive. Pulihkan data atau beralih perangkat kapan saja dengan mudah. Cadangan ini mencakup data aplikasi. Cadangan diupload ke Google dan dienkripsi menggunakan sandi Akun Google anak Anda.</translation> <translation id="4634771451598206121">Login lagi...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> tidak tersedia bagi pengguna Tamu.</translation> +<translation id="4635444580397524003">Cadangan Linux berhasil dipulihkan.</translation> <translation id="4636930964841734540">Info</translation> <translation id="4637083375689622795">Tindakan lainnya, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Aktifkan proses debug ADB</translation> @@ -2906,6 +2914,7 @@ <translation id="4890773143211625964">Tampilkan opsi printer lanjutan</translation> <translation id="4891089016822695758">Forum Beta</translation> <translation id="4892229439761351791">Situs dapat menggunakan Bluetooth</translation> +<translation id="489258173289528622">Tidak ada aktivitas saat menggunakan baterai</translation> <translation id="4893336867552636863">Tindakan ini akan menghapus data penjelajahan Anda dari perangkat ini secara permanen.</translation> <translation id="4893522937062257019">Di layar kunci</translation> <translation id="489454699928748701">Izinkan situs menggunakan sensor gerakan</translation> @@ -3612,6 +3621,7 @@ <translation id="5863445608433396414">Aktifkan fitur debug</translation> <translation id="5864195618110239517">Gunakan koneksi berbayar</translation> <translation id="5864471791310927901">Pencarian DHCP gagal</translation> +<translation id="5864754048328252126">Tidak ada aktivitas saat mengisi daya</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> akan segera dijeda</translation> <translation id="586567932979200359">Anda menjalankan <ph name="PRODUCT_NAME" /> dari citra disknya. Dengan memasangnya di komputer, Anda dapat menjalankannya tanpa citra disk, dan memastikannya tetap mutakhir.</translation> <translation id="5865733239029070421">Secara otomatis mengirimkan statistik penggunaan dan laporan kerusakan ke Google</translation> @@ -3811,6 +3821,7 @@ <translation id="6120205520491252677">Pasang pin halaman ini ke layar Awal...</translation> <translation id="6122081475643980456">Koneksi internet Anda sedang dikendalikan</translation> <translation id="6122095009389448667">Terus blokir situs ini dari melihat papan klip</translation> +<translation id="6122831415929794347">Nonaktifkan Safe Browsing?</translation> <translation id="6122875415561139701">Operasi menulis tidak diizinkan di: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Ekstensi berikut bergantung pada ekstensi ini:</translation> <translation id="6124698108608891449">Situs ini memerlukan izin lainnya.</translation> @@ -3988,7 +3999,6 @@ <translation id="6365411474437319296">Tambahkan keluarga dan teman</translation> <translation id="636850387210749493">Pendaftaran perusahaan</translation> <translation id="6370021412472292592">Tidak dapat memuat manifes.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Ubah sandi}other{Ubah sandi}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Coba Lagi</translation> <translation id="6377268785556383139">1 hasil untuk '<ph name="SEARCH_TEXT" />'</translation> @@ -4014,6 +4024,7 @@ <translation id="6408118934673775994">Membaca dan mengubah data Anda di <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, dan <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">File Gambar</translation> <translation id="6410328738210026208">Ganti saluran dan Powerwash</translation> +<translation id="6410390304316730527">Safe Browsing akan melindungi Anda dari penyerang yang dapat mengelabui Anda agar melakukan sesuatu yang berbahaya, misalnya menginstal software berbahaya atau mengungkap informasi pribadi seperti sandi, nomor telepon, atau kartu kredit. Jika dinonaktifkan, harap berhati-hati saat mengakses situs tidak dikenal atau tidak tepercaya.</translation> <translation id="6410668567036790476">Tambahkan mesin telusur</translation> <translation id="641081527798843608">Kecocokan subjek</translation> <translation id="6412673304250309937">Memeriksa kesesuaian URL dengan daftar situs tidak aman yang disimpan di Chrome. Jika situs berusaha mencuri sandi Anda, atau jika Anda mendownload file berbahaya, Chrome mungkin juga mengirim URL, termasuk bit konten halaman, ke Safe Browsing.</translation> @@ -5934,6 +5945,7 @@ <translation id="8951256747718668828">Tidak dapat menyelesaikan pemulihan karena terjadi error</translation> <translation id="8951465597020890363">Tetap keluar dari mode tamu?</translation> <translation id="8952831374766033534">Opsi konfigurasi tidak didukung: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Saat mengisi daya</translation> <translation id="895347679606913382">Memulai...</translation> <translation id="8957762313041272117">Teks Otomatis</translation> <translation id="895944840846194039">Memori JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index bf485d1..72116c3 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Bættu fjölskyldu og vinum við</translation> <translation id="636850387210749493">Fyrirtækjaskráning</translation> <translation id="6370021412472292592">Ekki var hægt að hlaða upplýsingaskrá.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Breyta aðgangsorði}one{Breyta aðgangsorðum}other{Breyta aðgangsorðum}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Reyna aftur</translation> <translation id="6377268785556383139">Ein niðurstaða fyrir „<ph name="SEARCH_TEXT" />“</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index e52907c..08ed0fb 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Server di stampa</translation> <translation id="1805967612549112634">Conferma PIN</translation> <translation id="1806335016774576568">Passa a un'altra app aperta</translation> +<translation id="1809483812148634490">Le app che hai scaricato da Google Play verranno eliminate da questo Chromebook. + <ph name="LINE_BREAKS1" /> + Potrebbero essere eliminati anche i contenuti che hai acquistato, ad esempio film, musica, libri o altri acquisti in-app. + <ph name="LINE_BREAKS2" /> + L'eliminazione non riguarda app o contenuti presenti su altri dispositivi.</translation> <translation id="1809734401532861917">Aggiungi preferiti, cronologia, password e altre impostazioni a <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Servizi</translation> <translation id="18139523105317219">EDI Party Name</translation> @@ -1392,6 +1397,7 @@ <translation id="2825848369316359348">Cerca il nome stampato sul retro del token di sicurezza</translation> <translation id="2828650939514476812">Collegati alla rete Wi-Fi</translation> <translation id="2835294513443818940">Impossibile scaricare il file in modo sicuro.</translation> +<translation id="2835547721736623118">Servizio di riconoscimento vocale</translation> <translation id="2836269494620652131">Interruzione anomala</translation> <translation id="2836635946302913370">L'accesso con questo nome utente è stato disattivato dall'amministratore.</translation> <translation id="283669119850230892">Per poter utilizzare la rete <ph name="NETWORK_ID" /> devi completare la connessione a Internet sotto.</translation> @@ -1536,6 +1542,7 @@ <translation id="3019285239893817657">Pulsante pagina secondaria</translation> <translation id="3020183492814296499">Scorciatoie</translation> <translation id="3020990233660977256">Numero di serie: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Durante l'utilizzo della batteria</translation> <translation id="3021066826692793094">Farfalla</translation> <translation id="3021678814754966447">&Visualizza sorgente frame</translation> <translation id="3022978424994383087">Non ho capito.</translation> @@ -2732,6 +2739,7 @@ <translation id="4633757335284074492">Effettua il backup su Google Drive. Ripristina i dati facilmente o cambia dispositivo in qualsiasi momento. Questa copia di backup include i dati delle app. Le copie di backup vengono caricate su Google e criptate mediante la password del tuo Account Google.</translation> <translation id="4634771451598206121">Esegui di nuovo l'accesso...</translation> <translation id="4635398712689569051">La pagina <ph name="PAGE_NAME" /> non è disponibile per gli utenti Ospite.</translation> +<translation id="4635444580397524003">Il backup di Linux è stato ripristinato correttamente.</translation> <translation id="4636930964841734540">Info</translation> <translation id="4637083375689622795">Altre azioni, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Attiva debug ADB</translation> @@ -2907,6 +2915,7 @@ <translation id="4890773143211625964">Mostra impostazioni avanzate della stampante</translation> <translation id="4891089016822695758">Forum per la versione Beta</translation> <translation id="4892229439761351791">Il sito può usare il Bluetooth</translation> +<translation id="489258173289528622">Azione stabilita in caso di inattività durante l'utilizzo della batteria</translation> <translation id="4893336867552636863">I tuoi dati di navigazione verranno eliminati definitivamente da questo dispositivo.</translation> <translation id="4893522937062257019">Nella schermata di blocco</translation> <translation id="489454699928748701">Consenti ai siti di usare i sensori di movimento</translation> @@ -3613,6 +3622,7 @@ <translation id="5863445608433396414">Attiva funzioni di debug</translation> <translation id="5864195618110239517">Usa connessione a consumo</translation> <translation id="5864471791310927901">Ricerca DHCP non riuscita</translation> +<translation id="5864754048328252126">Azione stabilita in caso di inattività durante la ricarica</translation> <translation id="5865508026715185451">L'app <ph name="APP_NAME" /> verrà presto messa in pausa</translation> <translation id="586567932979200359">Stai eseguendo <ph name="PRODUCT_NAME" /> dall'immagine disco. L'installazione sul computer permette di eseguirlo senza immagine disco e ne garantisce l'aggiornamento.</translation> <translation id="5865733239029070421">Invia automaticamente a Google statistiche sull'utilizzo e rapporti sugli arresti anomali</translation> @@ -3812,6 +3822,7 @@ <translation id="6120205520491252677">Blocca questa pagina in schermata iniziale...</translation> <translation id="6122081475643980456">La tua connessione Internet è controllata</translation> <translation id="6122095009389448667">Continua a impedire a questo sito di leggere gli appunti</translation> +<translation id="6122831415929794347">Disattivare la Navigazione sicura?</translation> <translation id="6122875415561139701">Scrittura non consentita su: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Le seguenti estensioni dipendono da questa estensione:</translation> <translation id="6124698108608891449">Questo sito richiede altre autorizzazioni.</translation> @@ -3989,7 +4000,6 @@ <translation id="6365411474437319296">Aggiungi amici e familiari</translation> <translation id="636850387210749493">Registrazione aziendale</translation> <translation id="6370021412472292592">Impossibile caricare il file manifest.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Cambia password}other{Cambia le password}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Riprova</translation> <translation id="6377268785556383139">1 risultato per "<ph name="SEARCH_TEXT" />"</translation> @@ -4015,6 +4025,7 @@ <translation id="6408118934673775994">Leggere e modificare i tuoi dati su <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> e <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">File di immagine</translation> <translation id="6410328738210026208">Cambia canale ed esegui Powerwash</translation> +<translation id="6410390304316730527">La Navigazione sicura ti protegge da utenti malintenzionati che potrebbero indurti con l'inganno a effettuare operazioni pericolose, come installare software dannosi o rivelare informazioni personali (ad esempio password, numeri di telefono o carte di credito). Se la disattivi, fai attenzione quando navighi in siti sconosciuti o equivoci.</translation> <translation id="6410668567036790476">Aggiungi motore di ricerca</translation> <translation id="641081527798843608">Corrispondenza oggetto</translation> <translation id="6412673304250309937">Verifica gli URL con un elenco di siti non sicuri archiviati in Chrome. Se un sito cerca di rubare la tua password o se scarichi un file dannoso, Chrome potrebbe inviare anche gli URL, inclusi bit e contenuti di pagina, a Navigazione sicura.</translation> @@ -5934,6 +5945,7 @@ <translation id="8951256747718668828">Impossibile completare il ripristino a causa di un errore.</translation> <translation id="8951465597020890363">Vuoi uscire comunque dalla modalità ospite?</translation> <translation id="8952831374766033534">Opzione di configurazione non supportata: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Durante la ricarica</translation> <translation id="895347679606913382">Avvio download in corso...</translation> <translation id="8957762313041272117">Sottotitoli in tempo reale</translation> <translation id="895944840846194039">Memoria JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index d92ca1b..ca7627e 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">הוספת בני משפחה וחברים</translation> <translation id="636850387210749493">הרשמה ל-Enterprise</translation> <translation id="6370021412472292592">לא ניתן היה לטעון את המניפסט.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{החלפת סיסמה}two{החלפת סיסמאות}many{החלפת סיסמאות}other{החלפת סיסמאות}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">נסה שוב</translation> <translation id="6377268785556383139">תוצאה אחת בשביל '<ph name="SEARCH_TEXT" />'</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index bb423dc..4d40d0b1 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">プリント サーバー</translation> <translation id="1805967612549112634">PIN の確認</translation> <translation id="1806335016774576568">別の開いているアプリに切り替える</translation> +<translation id="1809483812148634490">Google Play からダウンロードしたアプリは、この Chromebook から削除されます。 + <ph name="LINE_BREAKS1" /> + 購入した映画、テレビ番組、音楽、書籍、その他のアプリ内購入のコンテンツも削除される可能性があります。 + <ph name="LINE_BREAKS2" /> + 他のデバイスのアプリやコンテンツに影響はありません。</translation> <translation id="1809734401532861917">自分のブックマーク、履歴、パスワード、その他の設定を <ph name="USER_EMAIL_ADDRESS" /> に追加します</translation> <translation id="1813278315230285598">サービス</translation> <translation id="18139523105317219">EDI パーティ名</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">セキュリティ キーの背面に記載されている名前を確認します</translation> <translation id="2828650939514476812">Wi-Fi ネットワークへの接続</translation> <translation id="2835294513443818940">このファイルは安全にダウンロードできません。</translation> +<translation id="2835547721736623118">音声認識サービス</translation> <translation id="2836269494620652131">クラッシュ</translation> <translation id="2836635946302913370">このユーザー名でのログインは、管理者によって無効にされています。</translation> <translation id="283669119850230892">ネットワーク <ph name="NETWORK_ID" /> を使用するには、まずインターネット接続を完了してください(下記参照)。</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">サブページのボタン</translation> <translation id="3020183492814296499">ショートカット</translation> <translation id="3020990233660977256">シリアル番号: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">バッテリー駆動時</translation> <translation id="3021066826692793094">蝶</translation> <translation id="3021678814754966447">フレームのソースを表示(&V)</translation> <translation id="3022978424994383087">聞き取れませんでした。</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Google ドライブにデータをバックアップします。これにより、いつでも簡単にデータを復元したりデバイスを切り替えたりできます。バックアップ内容にはアプリのデータが含まれます。バックアップ データは Google にアップロードされ、お子様の Google アカウントのパスワードを使って暗号化されます。</translation> <translation id="4634771451598206121">もう一度ログインする...</translation> <translation id="4635398712689569051">ゲストユーザーは <ph name="PAGE_NAME" /> を利用できません。</translation> +<translation id="4635444580397524003">Linux のバックアップが復元されました。</translation> <translation id="4636930964841734540">情報</translation> <translation id="4637083375689622795">その他の操作(<ph name="EMAIL" />)</translation> <translation id="4638930039313743000">ADB デバッグを有効にする</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">プリンタの詳細オプションを表示</translation> <translation id="4891089016822695758">ベータ版フォーラム</translation> <translation id="4892229439761351791">サイトに Bluetooth の使用が許可されています</translation> +<translation id="489258173289528622">バッテリー駆動時のアイドル操作</translation> <translation id="4893336867552636863">このデバイスから閲覧データが完全に削除されます。</translation> <translation id="4893522937062257019">ロック画面</translation> <translation id="489454699928748701">サイトでのモーション センサーの使用を許可する</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">デバッグ機能を有効にする</translation> <translation id="5864195618110239517">従量制接続を使用</translation> <translation id="5864471791310927901">DHCP を検索できませんでした</translation> +<translation id="5864754048328252126">充電時のアイドル操作</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> はまもなく一時的に利用できなくなります</translation> <translation id="586567932979200359"><ph name="PRODUCT_NAME" /> はディスク イメージから実行されています。パソコンにインストールすると、ディスク イメージなしで実行できるようになり、常に最新の状態に維持できます。</translation> <translation id="5865733239029070421">使用統計情報や障害レポートを Google に自動送信します</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">このページを起動画面に固定...</translation> <translation id="6122081475643980456">インターネット接続が制限されています</translation> <translation id="6122095009389448667">このサイトによるクリップボードへのアクセスを引き続きブロックする</translation> +<translation id="6122831415929794347">セーフ ブラウジングをオフにしますか?</translation> <translation id="6122875415561139701">「<ph name="DEVICE_NAME" />」での書き込み操作は許可されていません。</translation> <translation id="6124650939968185064">次の拡張機能は、この拡張機能に依存しています:</translation> <translation id="6124698108608891449">このサイトが追加の権限をリクエストしています。</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">家族や友だちを追加</translation> <translation id="636850387210749493">企業の登録</translation> <translation id="6370021412472292592">マニフェストを読み込めませんでした。</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{パスワードを変更}other{パスワードを変更}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">再試行</translation> <translation id="6377268785556383139">「<ph name="SEARCH_TEXT" />」に対する 1 件の検索結果</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />、<ph name="WEBSITE_3" /> 上にある自分のデータの読み取りと変更</translation> <translation id="6410257289063177456">画像ファイル</translation> <translation id="6410328738210026208">チャンネルを変更して Powerwash</translation> +<translation id="6410390304316730527">セーフ ブラウジングは、不正なソフトウェアのインストールや個人情報(パスワード、電話番号、クレジット カードなど)の入力といった危険な操作を行うよう誘導する悪意のあるユーザーから保護します。オフにする場合、なじみのないサイトや評判の悪いサイトを閲覧する際は十分に注意してください。</translation> <translation id="6410668567036790476">検索エンジンの追加</translation> <translation id="641081527798843608">件名の一致</translation> <translation id="6412673304250309937">Chrome に保存されている安全でないサイトのリストと URL を照合します。サイトがパスワードを不正に取得しようとしている場合や、ユーザーが安全でないファイルをダウンロードしようとした場合は、URL とページ コンテンツの一部をセーフ ブラウジングに送信することがあります。</translation> @@ -5936,6 +5947,7 @@ <translation id="8951256747718668828">エラーが発生したため、復元を完了できませんでした</translation> <translation id="8951465597020890363">ゲストモードを終了してもよろしいですか?</translation> <translation id="8952831374766033534">設定オプションがサポートされていません: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">充電時</translation> <translation id="895347679606913382">開始しています...</translation> <translation id="8957762313041272117">自動字幕起こし</translation> <translation id="895944840846194039">JavaScript メモリ</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 751d9f6..e689f30 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">ბეჭდვის სერვერი</translation> <translation id="1805967612549112634">დაადასტურეთ PIN-კოდი</translation> <translation id="1806335016774576568">სხვა გახსნილ აპზე გადართვა</translation> +<translation id="1809483812148634490">ამ Chromebook-იდან წაიშლება Google Play-ს მეშვეობით ჩამოტვირთული აპები. + <ph name="LINE_BREAKS1" /> + გარდა ამისა, შეიძლება წაიშალოს თქვენ მიერ შეძენილი კონტენტი, როგორიცაა ფილმები, სატელევიზიო შოუები, მუსიკა, წიგნები ან აპს-შიდა შენაძენები. + <ph name="LINE_BREAKS2" /> + ეს მოქმედება სხვა მოწყობილობებზე არსებულ აპებსა და კონტენტზე გავლენას არ იქონიებს.</translation> <translation id="1809734401532861917">ჩემი სანიშნეების, ისტორიის, პაროლებისა და სხვა პარამეტრების <ph name="USER_EMAIL_ADDRESS" />-ში დამატება</translation> <translation id="1813278315230285598">სერვისები</translation> <translation id="18139523105317219">EDI მხარის სახელი</translation> @@ -1392,6 +1397,7 @@ <translation id="2825848369316359348">იპოვეთ თქვენი უსაფრთხოების გასაღების უკანა მხარეს მითითებული სახელი</translation> <translation id="2828650939514476812">Wi-Fi ქსელთან დაკავშირება</translation> <translation id="2835294513443818940">ამ ფაილის უსაფრთხოდ ჩამოტვირთვა ვერ მოხერხდება.</translation> +<translation id="2835547721736623118">მეტყველების ამოცნობის სერვისი</translation> <translation id="2836269494620652131">შეცდომა</translation> <translation id="2836635946302913370">მომხმარებლის ამ სახელით სისტემაში შესვლა გათიშულია თქვენი ადმინისტრატორის მიერ.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> ქსელის გამოსაყენებლად, ჯერ დაასრულეთ ინტერნეტთან დაკავშირება ქვემოთ.</translation> @@ -1536,6 +1542,7 @@ <translation id="3019285239893817657">ქვეგვერდის ღილაკი</translation> <translation id="3020183492814296499">მალსახმობები</translation> <translation id="3020990233660977256">სერიული ნომერი: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">ბატარეით მუშაობისას</translation> <translation id="3021066826692793094">პეპელა</translation> <translation id="3021678814754966447">ჩარჩოს წყაროს &ნახვა</translation> <translation id="3022978424994383087">წარმოთქმულის აღქმა ვერ მოხერხდა.</translation> @@ -2732,6 +2739,7 @@ <translation id="4633757335284074492">სარეზერვო კოპირება Google Drive-ში. მარტივად აღადგინეთ მონაცემები, ან შეცვალეთ მოწყობილობები ნებისმიერ დროს. ეს სარეზერვო ასლი მოიცავს აპების მონაცემებს. სარეზერვო ასლები აიტვირთება Google-ში და დაიშიფრება თქვენი შვილის Google ანგარიშის პაროლით.</translation> <translation id="4634771451598206121">ხელახლა შესვლა…</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> მიუწვდომელია სტუმარი მომხმარებლებისთვის.</translation> +<translation id="4635444580397524003">Linux-ის სარეზერვო ასლი აღდგენილია.</translation> <translation id="4636930964841734540">ინფორმაცია</translation> <translation id="4637083375689622795">სხვა ქმედებები, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB გამართვის ჩართვა</translation> @@ -2907,6 +2915,7 @@ <translation id="4890773143211625964">პრინტერის დამატებითი პარამეტრების ჩვენება</translation> <translation id="4891089016822695758">ბეტა ფორუმი</translation> <translation id="4892229439761351791">საიტს შეუძლია Bluetooth-კავშირის გამოყენება</translation> +<translation id="489258173289528622">ბატარეით მუშაობისას უმოქმედობის შემთხვევაში შესასრულებელი მოქმედება</translation> <translation id="4893336867552636863">ეს მოქმედება სამუდამოდ წაშლის თქვენს დათვალიერების მონაცემებს ამ მოწყობილობიდან.</translation> <translation id="4893522937062257019">ჩაკეტილ ეკრანზე</translation> <translation id="489454699928748701">საიტებისთვის მოძრაობის სენსორების გამოყენების დაშვება</translation> @@ -3613,6 +3622,7 @@ <translation id="5863445608433396414">გამართვის ფუნქციების ჩართვა</translation> <translation id="5864195618110239517">ლიმიტირებული კავშირის გამოყენება</translation> <translation id="5864471791310927901">DHCP ძებნა ვერ განხორციელდა</translation> +<translation id="5864754048328252126">დატენისას უმოქმედობის შემთხვევაში შესასრულებელი მოქმედება</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> მალე დაპაუზდება</translation> <translation id="586567932979200359">თქვენ გაშვებული გაქვთ <ph name="PRODUCT_NAME" /> დისკის გამოსახულებიდან. თუ დააინსტალირებთ მას კომპიუტერში, შეძლებთ მის გაშვებას დისკის გამოსახულების გარეშე და პროგრამა ყოველთვის განახლებული გექნებათ.</translation> <translation id="5865733239029070421">ავტომატური აგზავნის Google-ში გამოყენების სტატისტიკასა და შეცდომების ანგარიშებს</translation> @@ -3812,6 +3822,7 @@ <translation id="6120205520491252677">გვერდის ჩამაგრება საწყის ეკრანზე…</translation> <translation id="6122081475643980456">თქვენი კავშირი ინტერნეტთან კონტროლის ქვეშაა</translation> <translation id="6122095009389448667">ამ საიტისთვის გაცვლის ბუფერის ნახვის კვლავ აკრძალვა</translation> +<translation id="6122831415929794347">გსურთ Safe Browsing-ის გამორთვა?</translation> <translation id="6122875415561139701">„<ph name="DEVICE_NAME" />“-ზე ჩაწერის ოპერაცია დაუშვებელია.</translation> <translation id="6124650939968185064">შემდეგი გავრცობა ეხება აღნიშნულის გავრცობას:</translation> <translation id="6124698108608891449">ამ საიტს სჭირდება მეტი ნებართვა.</translation> @@ -3989,7 +4000,6 @@ <translation id="6365411474437319296">დაამატე ოჯახი და მეგობრები</translation> <translation id="636850387210749493">ორგანიზაციის რეგისტრაცია</translation> <translation id="6370021412472292592">მანიფესტი ვერ ჩაიტვირთა.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{პაროლის შეცვლა}other{პაროლების შეცვლა}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ხელახლა ცდა</translation> <translation id="6377268785556383139">მოთხოვნაზე „<ph name="SEARCH_TEXT" />“ მოიძებნა 1 შედეგი</translation> @@ -4015,6 +4025,7 @@ <translation id="6408118934673775994">წაიკითხეთ და შეცვალეთ თქვენი მონაცემები <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> და <ph name="WEBSITE_3" />-ზე</translation> <translation id="6410257289063177456">გამოსახულების ფაილები</translation> <translation id="6410328738210026208">არხის შეცვლა და განახლება</translation> +<translation id="6410390304316730527">Safe Browsing დაგიცავთ თავდამსხმელებისგან, რომლებმაც შეიძლება მოტყუებით ჩაგადენინონ ისეთი სახიფათო ქმედება, როგორიცაა პროგრამული უზრუნველყოფის ინსტალაცია ან თქვენი პერსონალური ინფორმაციის (მაგალითად, პაროლების, ტელეფონის ნომრების ან საკრედიტო ბარათების მონაცემების) გამჟღავნება. გამორთვის შემთხვევაში გამოიჩინეთ სიფრთხილე უცნობი საიტების დათვალიერებისას.</translation> <translation id="6410668567036790476">საძიებო სისტემის დამატება</translation> <translation id="641081527798843608">თემის თანხვედრა</translation> <translation id="6412673304250309937">შეამოწმებს URL-ების თანხვედრას Chrome-ში შენახულ არაუსაფრთხო საიტების სიასთან. საიტის მიერ პაროლის მოპარვის მცდელობის ან თქვენ მიერ საზიანო ფაილის ჩამოტვირთვის შემთხვევაში Chrome-ის მიერ Safe Browsing-ს გაეგზავნება URL-ები და შესაბამისი გვერდის კონტენტის გარკვეული ნაწილი.</translation> @@ -5933,6 +5944,7 @@ <translation id="8951256747718668828">აღდგენა ვერ მოხერხდა შეცდომის გამო</translation> <translation id="8951465597020890363">მაინც გსურთ სტუმრის რეჟიმიდან გასვლა?</translation> <translation id="8952831374766033534">კონფიგურაციის ვარიანტი მხარდაუჭერელია: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">დატენისას</translation> <translation id="895347679606913382">იწყება…</translation> <translation id="8957762313041272117">ავტოსუბტიტრები</translation> <translation id="895944840846194039">JavaScript მეხსიერება</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 643347b..126425c 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">Басып шығару сервері</translation> <translation id="1805967612549112634">PIN кодын қайта енгізіңіз</translation> <translation id="1806335016774576568">Басқа ашық қолданбаға ауысу</translation> +<translation id="1809483812148634490">Google Play дүкенінен жүктеп алынған қолданбалар бұл Chromebook құрылғысынан жойылады. + <ph name="LINE_BREAKS1" /> + Фильмдер, телешоулар, музыка, кітаптар сияқты мазмұндар не басқа да қолданба арқылы сатып алынғандар жойылуы мүмкін. + <ph name="LINE_BREAKS2" /> + Басқа құрылғылардағы қолданбалар немесе мазмұн сол күйінде қалады.</translation> <translation id="1809734401532861917">Бетбелгілерді, тарихты, құпия сөздерді және басқа параметрлерді <ph name="USER_EMAIL_ADDRESS" /> профиліне енгізу</translation> <translation id="1813278315230285598">Қызметтер</translation> <translation id="18139523105317219">EDI тарабының атауы</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">Қауіпсіздік кілтінің артқы бетіндегі атауды табыңыз.</translation> <translation id="2828650939514476812">Wi-Fi желісіне қосылу</translation> <translation id="2835294513443818940">Бұл файлды қауіпсіз жүктеп алу мүмкін емес.</translation> +<translation id="2835547721736623118">Айтылған сөзді тану қызметі</translation> <translation id="2836269494620652131">Бұзылу</translation> <translation id="2836635946302913370">Бұл пайдаланушы атымен кіру мүмкіндігін әкімші өшірген.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> желісін пайдалану үшін алдымен төмендегі интернет байланысын орнатып болыңыз.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">"Қосымша бет" түймесі</translation> <translation id="3020183492814296499">Перне тіркесімдері</translation> <translation id="3020990233660977256">Сериялық нөмір: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Батареямен істегенде</translation> <translation id="3021066826692793094">Көбелек</translation> <translation id="3021678814754966447">&Жақтау дереккөзін көру</translation> <translation id="3022978424994383087">Түсініксіз.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">Google Drive жадына сақтық көшірме жасау. Деректерді қалпына келтіруге немесе құрылғыны кез келген уақытта ауыстыруға болады. Сақтық көшірмеде қолданба деректері қамтылады. Сақтық көшірмелер Google-ға жүктеп салынады және балаңыздың Google есептік жазбасының құпия сөзімен шифрланады.</translation> <translation id="4634771451598206121">Қайта кіру…</translation> <translation id="4635398712689569051">Қонақ пайдаланушылар <ph name="PAGE_NAME" /> бетіне кіре алмайды.</translation> +<translation id="4635444580397524003">Linux cақтық көшірмесі қалпына келтірілді.</translation> <translation id="4636930964841734540">Ақпарат</translation> <translation id="4637083375689622795">Қосымша әрекеттер, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB түзетуін қосу</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">Қосымша принтер опцияларын көрсету</translation> <translation id="4891089016822695758">Бета форумы</translation> <translation id="4892229439761351791">Сайт Bluetooth функциясын пайдалана алады</translation> +<translation id="489258173289528622">Батареямен істегендегі жұмыссыз режим</translation> <translation id="4893336867552636863">Бұл осы құрылғыдағы шолу деректерін біржола жояды.</translation> <translation id="4893522937062257019">Құлып экранында</translation> <translation id="489454699928748701">Сайттардың қозғалыс датчиктерін пайдалануына рұқсат ету</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">Түзету мүмкіндіктерін қосу</translation> <translation id="5864195618110239517">Шектелген байланысты пайдалану</translation> <translation id="5864471791310927901">DHCP іздеу сәтсіз аяқталды</translation> +<translation id="5864754048328252126">Зарядтау кезіндегі жұмыссыз режим</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> сәлден кейін кідіртіледі</translation> <translation id="586567932979200359">Сіз <ph name="PRODUCT_NAME" /> бағдарламасын диск бейнесінен іске қостыңыз. Оны компьютеріңізге орнату оны дисктегі бейнесіз іске қосуға мүмкіндік береді және оның жаңартылуын қамтамасыз етеді.</translation> <translation id="5865733239029070421">Қолданыс статистикасын және жаңылыс туралы есептерді Google жүйесіне автоматты түрде жібереді</translation> @@ -3810,6 +3820,7 @@ <translation id="6120205520491252677">Бұл бетті "Іске қосу" экранына бекіту…</translation> <translation id="6122081475643980456">Интернет байланысыңыз бақылануда</translation> <translation id="6122095009389448667">Бұл сайттың буферді көру әрекеттеріне әрі қарай тыйым салу</translation> +<translation id="6122831415929794347">"Қауіпсіз шолу" функциясы өшірілсін бе?</translation> <translation id="6122875415561139701">Келесі құрылғыдан жазуға рұқсат жоқ: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Келесі кеңейтімдер осы кеңейтімге байланысты:</translation> <translation id="6124698108608891449">Сайтқа қосымша рұқсаттар қажет.</translation> @@ -3987,7 +3998,6 @@ <translation id="6365411474437319296">Отбасы мен достарды қосу</translation> <translation id="636850387210749493">Кәсіпорынды тіркеу</translation> <translation id="6370021412472292592">Манифестті жүктеу мүмкін болмады.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Кұпия сөзді өзгерту}other{Құпия сөздерді өзгерту}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Әрекетті қайталау</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" сұрауы бойынша 1 нәтиже шықты</translation> @@ -4013,6 +4023,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> және <ph name="WEBSITE_3" /> сайттарындағы деректеріңізді оқу және өзгерту</translation> <translation id="6410257289063177456">Кескін файлдары</translation> <translation id="6410328738210026208">Арнаны өзгерту және Powerwash орындау</translation> +<translation id="6410390304316730527">"Қауіпсіз шолу" функциясы сізді алдап, зиянды бағдарламалық құрал орнаттыратын немесе құпия сөздер, телефон нөмірлері мен несиелік карталар сияқты жеке ақпаратты біліп алатын шабуылдаушылардан қорғайды. Оны өшірсеңіз, таныс емес немесе сенімсіз сайттарды ашқанда абайлаңыз.</translation> <translation id="6410668567036790476">Іздеу жүйесін қосу</translation> <translation id="641081527798843608">Тақырып сәйкестігі</translation> <translation id="6412673304250309937">Chrome браузерінде сақталған қауіпсіз емес сайттар тізімімен URL сілтемелерін салыстырып тексереді. Егер сайт құпия сөзіңізді ұрлағысы келсе немесе сіз зиянды файл жүктеп алған кезде, Chrome браузері URL мекенжайларын, сонымен қатар бет мазмұны бөліктерін, "Қауіпсіз шолу" функциясына жіберуі мүмкін.</translation> @@ -5932,6 +5943,7 @@ <translation id="8951256747718668828">Қате шығуына байланысты қалпына келтірілмеді.</translation> <translation id="8951465597020890363">Бәрібір қонақ режимінен шығасыз ба?</translation> <translation id="8952831374766033534">Конфигурация опциясына қолдау көрсетілмейді: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Зарядтау кезінде</translation> <translation id="895347679606913382">Басталуда…</translation> <translation id="8957762313041272117">Тікелей субтитр</translation> <translation id="895944840846194039">JavaScript жады</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 6d5d0f7f..38f3a84 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">ម៉ាស៊ីនមេបោះពុម្ព</translation> <translation id="1805967612549112634">បញ្ជាក់កូដ PIN</translation> <translation id="1806335016774576568">ប្ដូរទៅកម្មវិធីដែលបើកមួយទៀត</translation> +<translation id="1809483812148634490">កម្មវិធីដែលអ្នកបានទាញយកពី Google Play នឹងត្រូវបានលុបចេញពី Chromebook នេះ។ + <ph name="LINE_BREAKS1" /> + ខ្លឹមសារដែលអ្នកបានទិញដូចជា ភាពយន្ត កម្មវិធីទូរទស្សន៍ តន្ត្រី សៀវភៅ ឬការទិញក្នុងកម្មវិធីផ្សេងទៀតក៏ប្រហែលជាត្រូវលុបផងដែរ។ + <ph name="LINE_BREAKS2" /> + សកម្មភាពនេះមិនប៉ះពាល់ដល់កម្មវិធី ឬខ្លឹមសារនៅលើឧបករណ៍ផ្សេងទៀតទេ។</translation> <translation id="1809734401532861917">បញ្ចូលចំណាំ ប្រវត្តិ ពាក្យសម្ងាត់ និងការកំណត់ផ្សេងទៀតរបស់ខ្ញុំទៅ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">សេវាកម្ម</translation> <translation id="18139523105317219">ឈ្មោះភាគី EDI</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">ស្វែងរកឈ្មោះដែលបោះពុម្ពនៅផ្នែកខាងក្រោយសោសុវត្ថិភាពរបស់អ្នក</translation> <translation id="2828650939514476812">ភ្ជាប់បណ្តាញ Wi-Fi</translation> <translation id="2835294513443818940">មិនអាចទាញយកឯកសារនេះដោយសុវត្ថិភាពបានទេ។</translation> +<translation id="2835547721736623118">សេវាកម្មសម្គាល់ការនិយាយ</translation> <translation id="2836269494620652131">គាំង</translation> <translation id="2836635946302913370">ការចូលដោយជាមួយឈ្មោះអ្នកប្រើនេះត្រូវបាន</translation> <translation id="283669119850230892">ដើម្បីប្រើបណ្តាញ <ph name="NETWORK_ID" /> ជាដំបូងបំពេញការភ្ជាប់របស់អ្នកទៅអ៊ីនធឺណិតខាងក្រោម។</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">ប៊ូតុងទំព័ររង</translation> <translation id="3020183492814296499">ផ្លូវកាត់</translation> <translation id="3020990233660977256">លេខសេរ៊ី៖ <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">ពេលកំពុងប្រើថ្ម</translation> <translation id="3021066826692793094">មេអំបៅ</translation> <translation id="3021678814754966447">មើលប្រភពហ្រ្វេម</translation> <translation id="3022978424994383087">មិនយល់ទេ។</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">បម្រុងទុកទៅក្នុង Google ថាស។ ងាយស្រួលក្នុងការស្ដារទិន្នន័យ ឬប្ដូរឧបករណ៍បានគ្រប់ពេល។ ការបម្រុងទុកនេះរួមបញ្ចូលទាំងទិន្នន័យកម្មវិធី។ ការបម្រុងទុកត្រូវបានបង្ហោះទៅ Google និងអ៊ីនគ្រីបដោយប្រើពាក្យសម្ងាត់គណនី Google របស់កូនអ្នក។</translation> <translation id="4634771451598206121">ចូលម្តងទៀត...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> មិនអាចប្រើបានសម្រាប់អ្នកប្រើប្រាស់ជាភ្ញៀវទេ។</translation> +<translation id="4635444580397524003">ការបម្រុងទុក Linux ត្រូវបានស្ដារដោយជោគជ័យហើយ។</translation> <translation id="4636930964841734540">ព័ត៌មាន</translation> <translation id="4637083375689622795">សកម្មភាពច្រើនទៀត <ph name="EMAIL" /></translation> <translation id="4638930039313743000">បើកការជួសជុល ADB</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">បង្ហាញជម្រើសម៉ាស៊ីនបោះពុម្ពកម្រិតខ្ពស់</translation> <translation id="4891089016822695758">វេទិកាបេតា</translation> <translation id="4892229439761351791">គេហទំព័រអាចប្រើប៊្លូធូសបាន</translation> +<translation id="489258173289528622">សកម្មភាពអសកម្ម ពេលកំពុងប្រើថ្ម</translation> <translation id="4893336867552636863">វានឹងលុបទិន្នន័យរុករករបស់អ្នកចេញពីឧបករណ៍នេះជាអចិន្ត្រៃយ៍</translation> <translation id="4893522937062257019">នៅលើអេក្រង់ចាក់សោ</translation> <translation id="489454699928748701">អនុញ្ញាតឱ្យគេហទំព័រចូលប្រើឧបករណ៍ចាប់ចលនា</translation> @@ -3615,6 +3624,7 @@ <translation id="5863445608433396414">បើកដំណើរការលក្ខណៈពិសេសកម្ចាត់កំហុស</translation> <translation id="5864195618110239517">ប្រើការតភ្ជាប់តាមកម្រិត</translation> <translation id="5864471791310927901">DHCP lookup បានបរាជ័យ</translation> +<translation id="5864754048328252126">សកម្មភាពអសកម្ម ពេលកំពុងសាកថ្ម</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> នឹងផ្អាកក្នុងពេលឆាប់ៗនេះ</translation> <translation id="586567932979200359">អ្នកកំពុងដំណើរការ <ph name="PRODUCT_NAME" /> ពីរូបភាពឌីសរបស់វា។ ការតំឡើងវានៅលើកុំព្យូទ័ររបស់អ្នក អនុញ្ញាតឲ្យអ្នកដំណើរការវាដោយមិនចាំបាច់រូបភាពឌីស ហើយត្រូវប្រាកដថារក្សាវាឲ្យទាន់សម័យកាល។</translation> <translation id="5865733239029070421">ផ្ញើស្ថិតិប្រើប្រាស់ និងរបាយការណ៍អំពីការគាំងទៅ Google ដោយស្វ័យប្រវត្តិ</translation> @@ -3814,6 +3824,7 @@ <translation id="6120205520491252677">ដៅទំព័រនេះដើម្បី ចាប់ផ្តើម អេក្រង់...</translation> <translation id="6122081475643980456">ការភ្ជាប់អ៊ីនធឺណិតរបស់អ្នកកំពុងត្រូវបានគ្រប់គ្រង</translation> <translation id="6122095009389448667">បន្តទប់ស្កាត់ទំព័រនេះមិនឱ្យមើលអង្គចងចាំ</translation> +<translation id="6122831415929794347">បិទការរុករកដោយសុវត្ថិភាពឬ?</translation> <translation id="6122875415561139701">ប្រតិបត្តិការសរសេរមិនអនុញ្ញាតចំពោះ៖ "<ph name="DEVICE_NAME" />" ទេ</translation> <translation id="6124650939968185064">កម្មវិធីបន្ថែមខាងក្រោមអាស្រ័យលើកម្មវិធីបន្ថែមនេះ៖</translation> <translation id="6124698108608891449">គេហទំព័រនេះត្រូវការការអនុញ្ញាតបន្ថែមទៀត។</translation> @@ -3991,7 +4002,6 @@ <translation id="6365411474437319296">បន្ថែមគ្រួសារ និងមិត្តភ័ក្ត</translation> <translation id="636850387210749493">ការចុះឈ្មោះសហគ្រាស</translation> <translation id="6370021412472292592">មិនអាចដំណើរការមេនីហ្វេសទេ។</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{ប្ដូរពាក្យសម្ងាត់}other{ប្ដូរពាក្យសម្ងាត់}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ព្យាយាមម្តងទៀត</translation> <translation id="6377268785556383139">លទ្ធផល 1 សម្រាប់ '<ph name="SEARCH_TEXT" />'</translation> @@ -4017,6 +4027,7 @@ <translation id="6408118934673775994">អាន និងប្តូរទិន្នន័យរបស់អ្នកនៅលើ <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, និង <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">ឯកសាររូបភាព</translation> <translation id="6410328738210026208">ប្តូរបណ្តាញ និង Powerwash</translation> +<translation id="6410390304316730527">ការរុករកដោយសុវត្ថិភាពការពារអ្នកពីអ្នកវាយប្រហារ ដែលអាចបញ្ឆោតឱ្យអ្នកធ្វើអ្វីមួយគ្រោះថ្នាក់ដូចជា ដំឡើងកម្មវិធីគ្រោះថ្នាក់ ឬបង្ហាញព័ត៌មានផ្ទាល់ខ្លួនដូចជា ពាក្យសម្ងាត់ លេខទូរសព្ទ ឬបណ្ណឥណទានជាដើម។ ប្រសិនបើអ្នកបិទការរុករកដោយសុវត្ថិភាព សូមប្រុងប្រយ័ត្ន នៅពេលរុករកគេហទំព័រដែលមិនគួរឱ្យទុកចិត្ត ឬមិនស្គាល់។</translation> <translation id="6410668567036790476">បន្ថែមម៉ាស៊ីនស្វែងរក</translation> <translation id="641081527798843608">ប្រធានបទត្រូវគ្នា</translation> <translation id="6412673304250309937">ពិនិត្យ URL ធៀបនឹងបញ្ជីគេហទំព័រគ្មានសុវត្ថិភាព ដែលរក្សាទុកនៅក្នុង Chrome។ ប្រសិនបើគេហទំព័រណាមួយព្យាយាមលួចពាក្យសម្ងាត់របស់អ្នក ឬនៅពេលអ្នកទាញយកឯកសារដែលអាចបង្កគ្រោះថ្នាក់នោះ Chrome ក៏ប្រហែលជាបញ្ជូន URL រួមជាមួយផ្នែកនៃខ្លឹមសារទំព័រ ទៅការរុករកដោយសុវត្ថិភាពផងដែរ។</translation> @@ -5936,6 +5947,7 @@ <translation id="8951256747718668828">មិនអាចបញ្ចប់ការស្ដារបានទេ ដោយសារមានបញ្ហា</translation> <translation id="8951465597020890363">ចេញពីមុខងារភ្ញៀវទោះយ៉ាងណាក៏ដោយ?</translation> <translation id="8952831374766033534">មិនស្គាល់ជម្រើសនៃការកំណត់រចនាសម្ព័ន្ធ៖ <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">ពេលកំពុងសាកថ្ម</translation> <translation id="895347679606913382">កំពុងចាប់ផ្តើម...</translation> <translation id="8957762313041272117">អក្សររត់ក្នុងពេលជាក់ស្ដែង</translation> <translation id="895944840846194039">មេម៉ូរី JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 058a334..0d208fa 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -613,6 +613,11 @@ <translation id="1805888043020974594">ಪ್ರಿಂಟ್ ಸರ್ವರ್</translation> <translation id="1805967612549112634">ಪಿನ್ ದೃಢೀಕರಿಸಿ</translation> <translation id="1806335016774576568">ತೆರೆದಿರುವ ಬೇರೊಂದು ಆ್ಯಪ್ಗೆ ಬದಲಿಸಿ</translation> +<translation id="1809483812148634490">Google Play ನಿಂದ ನೀವು ಡೌನ್ಲೋಡ್ ಮಾಡಲಾದ ಆ್ಯಪ್ಗಳನ್ನು ಈ Chromebook ನಿಂದ ಅಳಿಸಲಾಗುತ್ತದೆ. + <ph name="LINE_BREAKS1" /> + ಚಲನಚಿತ್ರಗಳು, ಟಿವಿ ಶೋಗಳು, ಸಂಗೀತ, ಪುಸ್ತಕಗಳಂತಹ ನೀವು ಖರೀದಿಸಿದ ವಿಷಯವನ್ನು ಅಥವಾ ಇತರ ಆ್ಯಪ್ನಲ್ಲಿನ ಖರೀದಿಗಳನ್ನು ಸಹ ಅಳಿಸಬಹುದು. + <ph name="LINE_BREAKS2" /> + ಇದು ಇತರ ಸಾಧನಗಳಲ್ಲಿನ ಆ್ಯಪ್ಗಳು ಅಥವಾ ವಿಷಯಕ್ಕೆ ಯಾವುದೇ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ.</translation> <translation id="1809734401532861917"><ph name="USER_EMAIL_ADDRESS" /> ಗೆ ನನ್ನ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಸೇರಿಸಿ.</translation> <translation id="1813278315230285598">ಸೇವೆಗಳು</translation> <translation id="18139523105317219">EDI ಪಾರ್ಟಿ ಹೆಸರು</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">ನಿಮ್ಮ ಭದ್ರತೆ ಕೀಯ ಹಿಂಭಾಗದಲ್ಲಿ ಮುದ್ರಿಸಲಾಗಿರುವ ಹೆಸರನ್ನು ಕಂಡುಕೊಳ್ಳಿ</translation> <translation id="2828650939514476812">ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಿ</translation> <translation id="2835294513443818940">ಈ ಫೈಲ್ ಅನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಡೌನ್ಲೋಡ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> +<translation id="2835547721736623118">ಧ್ವನಿ ಗುರುತಿಸುವಿಕೆ ಸೇವೆ</translation> <translation id="2836269494620652131">ಕ್ರ್ಯಾಷ್</translation> <translation id="2836635946302913370">ಈ ಬಳಕೆದಾರರ ಹೆಸರಿನೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವುದನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರ ಮೂಲಕ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation> <translation id="283669119850230892">ನೆಟ್ವರ್ಕ್ <ph name="NETWORK_ID" /> ಅನ್ನು ಬಳಸಲು, ಮೊದಲು ನಿಮ್ಮ ಸಂಪರ್ಕವನ್ನು ಕೆಳಗಿನ ಇಂಟರ್ನೆಟ್ಗೆ ಸಂಪೂರ್ಣಗೊಳಿಸಿ.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">ಉಪಪುಟ ಬಟನ್</translation> <translation id="3020183492814296499">ಶಾರ್ಟ್ಕಟ್ಗಳು</translation> <translation id="3020990233660977256">ಕ್ರಮ ಸಂಖ್ಯೆ: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">ಬ್ಯಾಟರಿ ಆನ್ ಇರುವಾಗ</translation> <translation id="3021066826692793094">ಚಿಟ್ಟೆ</translation> <translation id="3021678814754966447">ಫ್ರೇಮ್ ಮೂಲವನ್ನು &ವೀಕ್ಷಿಸಿ</translation> <translation id="3022978424994383087">ಅದು ಅರ್ಥವಾಗಲಿಲ್ಲ.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Google ಡ್ರೈವ್ನಲ್ಲಿ ಬ್ಯಾಕಪ್ ಮಾಡಿ. ಡೇಟಾವನ್ನು ಸುಲಭವಾಗಿ ಮರುಸ್ಥಾಪಿಸಿ ಅಥವಾ ಯಾವಾಗ ಬೇಕಾದರೂ ಸಾಧನವನ್ನು ಬದಲಾಯಿಸಿ. ಈ ಬ್ಯಾಕಪ್ನಲ್ಲಿ ಆ್ಯಪ್ ಡೇಟಾ ಒಳಗೊಂಡಿರುತ್ತದೆ. ಬ್ಯಾಕಪ್ಗಳನ್ನು Google ಗೆ ಅಪ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಮಗುವಿನ Google ಖಾತೆಯ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="4634771451598206121">ಪುನಃ ಸೈನ್ ಇನ್ ಮಾಡಿ...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> ಅತಿಥಿ ಬಳಕೆದಾರರಿಗೆ ಲಭ್ಯವಿಲ್ಲ.</translation> +<translation id="4635444580397524003">Linux ಬ್ಯಾಕಪ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಮರುಸ್ಥಾಪಿಸಲಾಗಿದೆ.</translation> <translation id="4636930964841734540">ಮಾಹಿತಿ</translation> <translation id="4637083375689622795">ಇನ್ನಷ್ಟು ಕ್ರಿಯೆಗಳು, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> @@ -2909,6 +2917,7 @@ <translation id="4890773143211625964">ಸುಧಾರಿತ ಪ್ರಿಂಟರ್ ಆಯ್ಕೆಗಳನ್ನು ತೋರಿಸು</translation> <translation id="4891089016822695758">ಬೀಟಾ ಫೋರಮ್</translation> <translation id="4892229439761351791">ಸೈಟ್, ಬ್ಲೂಟೂತ್ ಅನ್ನು ಬಳಸಬಹುದು</translation> +<translation id="489258173289528622">ಬ್ಯಾಟರಿ ಆನ್ ಆಗಿರುವಾಗ ತಟಸ್ಥ ಸ್ಥಿತಿ</translation> <translation id="4893336867552636863">ಇದು ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಖಾಯಂ ಆಗಿ ಅಳಿಸುತ್ತದೆ.</translation> <translation id="4893522937062257019">ಲಾಕ್ ಪರದೆಯಲ್ಲಿ</translation> <translation id="489454699928748701">ಚಲನೆ ಸೆನ್ಸರ್ಗಳನ್ನು ಬಳಸಲು ಸೈಟ್ಗಳಿಗೆ ಅನುಮತಿಸಿ</translation> @@ -3616,6 +3625,7 @@ <translation id="5863445608433396414">ಡೀಬಗ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="5864195618110239517">ಮಾಪನ ಮಾಡಿದ ಸಂಪರ್ಕವನ್ನು ಬಳಸಿ</translation> <translation id="5864471791310927901">DHCP ಲುಕಪ್ ವಿಫಲವಾಗಿದೆ</translation> +<translation id="5864754048328252126">ಚಾರ್ಜ್ ಆಗುವಾಗ ತಟಸ್ಥ ಸ್ಥಿತಿ</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> ಆ್ಯಪ್ ಶೀಘ್ರದಲ್ಲೇ ವಿರಾಮಗೊಳ್ಳಲಿದೆ</translation> <translation id="586567932979200359">ನೀವು <ph name="PRODUCT_NAME" /> ಅನ್ನು ಅದರ ಡಿಸ್ಕ್ ಇಮೇಜ್ನಿಂದ ಚಾಲನೆ ಮಾಡುತ್ತಿರುವಿರಿ. ಅದನ್ನು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನಲ್ಲಿ ಸ್ಥಾಪನೆ ಮಾಡಿದರೆ ಅದು ನಿಮಗೆ ಡಿಸ್ಕ್ ಇಮೇಜ್ ಇಲ್ಲದೆಯೆ ಚಾಲನೆ ಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಮತ್ತು ಆಗಿಂದಾಗ್ಗೆ ನವೀಕೃತಗೊಂಡಿದೆಯೆ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸುತ್ತದೆ.</translation> <translation id="5865733239029070421">ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳು ಮತ್ತು ಕ್ರ್ಯಾಶ್ ವರದಿಗಳನ್ನು Google ಗೆ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುತ್ತದೆ</translation> @@ -3815,6 +3825,7 @@ <translation id="6120205520491252677">ಆರಂಭಿಕ ಪರದೆಗೆ ಈ ಪುಟವನ್ನು ಪಿನ್ ಮಾಡಿ...</translation> <translation id="6122081475643980456">ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ನಿಯಂತ್ರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="6122095009389448667">ಕ್ಲಿಪ್ಬೋರ್ಡ್ ಅನ್ನು ನೋಡದಂತೆ ಈ ಸೈಟ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸುವುದನ್ನು ಮುಂದುವರಿಸಿ</translation> +<translation id="6122831415929794347">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಅನ್ನು ಆಫ್ ಮಾಡುವುದೇ?</translation> <translation id="6122875415561139701">ಈ ಸಾಧನದಲ್ಲಿ ಬರೆಯುವಿಕೆ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನುಮತಿಸಲಾಗಿಲ್ಲ: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">ಕೆಳಗಿನ ವಿಸ್ತರಣೆಗಳು ಈ ವಿಸ್ತರಣೆಯ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿವೆ:</translation> <translation id="6124698108608891449">ಈ ಸೈಟ್ಗೆ ಇನ್ನಷ್ಟು ಅನುಮತಿಗಳ ಅಗತ್ಯವಿದೆ.</translation> @@ -3992,7 +4003,6 @@ <translation id="6365411474437319296">ಸ್ನೇಹಿತರು ಮತ್ತು ಕುಟುಂಬದವರನ್ನು ಸೇರಿಸಿ</translation> <translation id="636850387210749493">ಎಂಟರ್ಪ್ರೈಸ್ ದಾಖಲಾತಿ</translation> <translation id="6370021412472292592">ಮ್ಯಾನಿಫೆಸ್ಟ್ ಲೋಡ್ ಮಾಡಲಾಗಲಿಲ್ಲ.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{ಪಾಸ್ವರ್ಡ್ ಬದಲಿಸಿ}one{ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬದಲಿಸಿ}other{ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬದಲಿಸಿ}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' ಗಾಗಿ 1 ಫಲಿತಾಂಶ</translation> @@ -4018,6 +4028,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, ಮತ್ತು <ph name="WEBSITE_3" /> ನಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಓದಿ ಮತ್ತು ಬದಲಾಯಿಸಿ</translation> <translation id="6410257289063177456">ಇಮೇಜ್ ಫೈಲ್ಗಳು</translation> <translation id="6410328738210026208">ಚಾನಲ್ ಬದಲಿಸಿ ಮತ್ತು ಪವರ್ವಾಷ್ ಮಾಡಿ</translation> +<translation id="6410390304316730527">ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ನಿಮ್ಮನ್ನು ಅಪಾಯಕಾರಿ ಕೆಲಸ ಮಾಡಲು ಪ್ರಚೋದಿಸುವ ದಾಳಿಕೋರರಿಂದ ರಕ್ಷಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಹಾನಿಕಾರಕ ಸಾಫ್ಟ್ವೇರ್ ಅನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡುವುದು ಹಾಗೂ ಪಾಸ್ವರ್ಡ್ಗಳು, ಫೋನ್ ಸಂಖ್ಯೆಗಳು ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ಗಳಂತಹ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಬಹಿರಂಗಪಡಿಸುವುದು. ನೀವು ಅದನ್ನು ಆಫ್ ಮಾಡಿದರೆ, ಪರಿಚಯವಿಲ್ಲದ ಅಥವಾ ಜನಪ್ರಿಯವಲ್ಲದ ಸೈಟ್ಗಳನ್ನು ಬ್ರೌಸ್ ಮಾಡುವಾಗ ಬಹಳ ಜಾಗರೂಕರಾಗಿರಿ.</translation> <translation id="6410668567036790476">ಹುಡುಕಾಟ ಇಂಜಿನ್ ಸೇರಿಸಿ</translation> <translation id="641081527798843608">ವಿಷಯದ ಹೊಂದಾಣಿಕೆ</translation> <translation id="6412673304250309937">Chrome ನಲ್ಲಿ ಸಂಗ್ರಹಣೆ ಮಾಡಲಾಗಿರುವ ಅಸುರಕ್ಷಿತ ಸೈಟ್ಗಳ ಪಟ್ಟಿಯನ್ನು ಬಳಸಿ, URL ಗಳನ್ನು ಪರಿಶೀಲಿಸುತ್ತದೆ. ಯಾವುದಾದರೂ ಸೈಟ್, ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಕದಿಯಲು ಪ್ರಯತ್ನಿಸಿದರೆ ಅಥವಾ ನೀವು ಹಾನಿಕಾರಕ ಫೈಲ್ ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿದಾಗ, ಪುಟದ ಕಂಟೆಂಟ್ನ ತುಣುಕುಗಳನ್ನು ಒಳಗೊಂಡ URL ಗಳನ್ನು ಸಹ Chrome, ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ಗೆ ಕಳುಹಿಸಬಹುದು.</translation> @@ -5935,6 +5946,7 @@ <translation id="8951256747718668828">ದೋಷದ ಕಾರಣದಿಂದಾಗಿ ಮರುಸ್ಥಾಪನೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಲಾಗಲಿಲ್ಲ</translation> <translation id="8951465597020890363">ಹೇಗಾದರೂ ಅತಿಥಿ ಮೋಡ್ನಿಂದ ನಿರ್ಗಮಿಸುವುದೇ?</translation> <translation id="8952831374766033534">ಕಾನ್ಫಿಗರೇಶನ್ ಆಯ್ಕೆಗೆ ಬೆಂಬಲವಿಲ್ಲ: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವಾಗ</translation> <translation id="895347679606913382">ಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತಿದೆ...</translation> <translation id="8957762313041272117">ಲೈವ್ ಶೀರ್ಷಿಕೆ</translation> <translation id="895944840846194039">JavaScript ಸ್ಮರಣೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index bd9ff6b..880b3362 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">인쇄 서버</translation> <translation id="1805967612549112634">PIN 확인</translation> <translation id="1806335016774576568">열려 있는 다른 앱으로 전환</translation> +<translation id="1809483812148634490">Google Play에서 다운로드한 앱이 Chromebook에서 삭제됩니다. + <ph name="LINE_BREAKS1" /> + 영화, TV 프로그램, 음악, 도서, 기타 인앱 구매 등 구매한 콘텐츠도 삭제될 수 있습니다. + <ph name="LINE_BREAKS2" /> + 다른 기기의 앱이나 콘텐츠에는 영향을 미치지 않습니다.</translation> <translation id="1809734401532861917">북마크, 방문 기록, 비밀번호, 기타 설정을 <ph name="USER_EMAIL_ADDRESS" />에 추가합니다.</translation> <translation id="1813278315230285598">서비스</translation> <translation id="18139523105317219">EDI측 이름</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">보안 키 뒷면에 인쇄된 이름을 확인하세요.</translation> <translation id="2828650939514476812">Wi-Fi 네트워크에 연결</translation> <translation id="2835294513443818940">이 파일은 안전하게 다운로드할 수 없습니다.</translation> +<translation id="2835547721736623118">음성 인식 서비스</translation> <translation id="2836269494620652131">비정상 종료</translation> <translation id="2836635946302913370">해당 사용자 이름 로그인이 관리자에 의해 사용 중지되었습니다.</translation> <translation id="283669119850230892">네트워크 <ph name="NETWORK_ID" />을(를) 사용하려면 먼저 아래에서 인터넷 연결을 완료합니다.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">하위 페이지 버튼</translation> <translation id="3020183492814296499">바로가기</translation> <translation id="3020990233660977256">일련번호: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">배터리 사용 시</translation> <translation id="3021066826692793094">나비</translation> <translation id="3021678814754966447">프레임 소스 보기(&V)</translation> <translation id="3022978424994383087">인식하지 못했습니다.</translation> @@ -2731,6 +2738,7 @@ <translation id="4633757335284074492">Google 드라이브에 백업합니다. 언제든지 간편하게 데이터를 복원하거나 다른 기기로 전환할 수 있습니다. 앱 데이터도 백업에 포함됩니다. 백업 항목은 Google에 업로드되며 자녀의 Google 계정 비밀번호를 사용하여 암호화됩니다.</translation> <translation id="4634771451598206121">다시 로그인...</translation> <translation id="4635398712689569051">게스트 사용자는 <ph name="PAGE_NAME" />을(를) 사용할 수 없음</translation> +<translation id="4635444580397524003">Linux 백업이 복원되었습니다.</translation> <translation id="4636930964841734540">정보</translation> <translation id="4637083375689622795">추가 작업, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB 디버깅 사용 설정</translation> @@ -2906,6 +2914,7 @@ <translation id="4890773143211625964">고급 프린터 옵션 표시</translation> <translation id="4891089016822695758">베타 포럼</translation> <translation id="4892229439761351791">사이트에서 블루투스를 사용할 수 있습니다.</translation> +<translation id="489258173289528622">배터리 사용 시 유휴 작업</translation> <translation id="4893336867552636863">기기에서 인터넷 사용 기록이 완전히 삭제됩니다.</translation> <translation id="4893522937062257019">잠금 화면에서</translation> <translation id="489454699928748701">사이트에서 움직임 감지 센서를 사용하도록 허용</translation> @@ -3612,6 +3621,7 @@ <translation id="5863445608433396414">디버깅 기능 사용</translation> <translation id="5864195618110239517">종량제 연결 사용</translation> <translation id="5864471791310927901">DHCP 조회 실패</translation> +<translation id="5864754048328252126">충전 시 유휴 작업</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> 앱이 곧 일시중지됨</translation> <translation id="586567932979200359">디스크 이미지에서 <ph name="PRODUCT_NAME" />을(를) 실행 중입니다. 컴퓨터에 설치하면 디스크 이미지가 없어도 실행이 가능하며 최신 상태로 유지됩니다.</translation> <translation id="5865733239029070421">사용 통계 및 비정상 종료 보고서를 Google로 자동 전송</translation> @@ -3811,6 +3821,7 @@ <translation id="6120205520491252677">이 페이지를 시작 화면에 고정...</translation> <translation id="6122081475643980456">인터넷 연결이 제어되고 있습니다.</translation> <translation id="6122095009389448667">이 사이트에서 클립보드를 보지 못하게 계속 차단</translation> +<translation id="6122831415929794347">세이프 브라우징을 사용 중지하시겠습니까?</translation> <translation id="6122875415561139701">기기(<ph name="DEVICE_NAME" />)에서 쓰기 작업이 허용되지 않습니다.</translation> <translation id="6124650939968185064">이 확장 프로그램에 종속되는 확장 프로그램:</translation> <translation id="6124698108608891449">추가 권한이 필요한 사이트입니다.</translation> @@ -3988,7 +3999,6 @@ <translation id="6365411474437319296">친구 및 가족 추가</translation> <translation id="636850387210749493">엔터프라이즈 등록</translation> <translation id="6370021412472292592">매니페스트를 로드할 수 없습니다.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{비밀번호 변경}other{비밀번호 변경}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">다시 시도</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' 검색결과 1개</translation> @@ -4014,6 +4024,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" />의 데이터를 읽고 변경</translation> <translation id="6410257289063177456">이미지 파일</translation> <translation id="6410328738210026208">채널 변경 및 Powerwash</translation> +<translation id="6410390304316730527">세이프 브라우징을 사용하면 악성 소프트웨어를 설치하거나 개인정보(예: 비밀번호, 전화번호, 신용카드 정보)를 공개하는 등의 위험한 행동을 하도록 사용자를 속이는 공격자를 차단합니다. 이 기능을 사용 중지하는 경우 익숙하지 않거나 평판이 안 좋은 사이트를 탐색할 때 주의하시기 바랍니다.</translation> <translation id="6410668567036790476">검색엔진 추가</translation> <translation id="641081527798843608">주제 일치</translation> <translation id="6412673304250309937">Chrome에 저장된 안전하지 않은 사이트 목록을 사용하여 URL을 검사합니다. 사이트에서 사용자의 비밀번호를 도용하려고 하거나 사용자가 유해한 파일을 다운로드하는 경우, Chrome에서 페이지 콘텐츠 일부를 비롯한 URL을 세이프 브라우징 서비스에 보낼 수 있습니다.</translation> @@ -5934,6 +5945,7 @@ <translation id="8951256747718668828">오류로 인해 복원을 완료할 수 없습니다.</translation> <translation id="8951465597020890363">게스트 모드를 종료하시겠습니까?</translation> <translation id="8952831374766033534">설정 옵션이 지원되지 않음: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">충전 시</translation> <translation id="895347679606913382">다운로드 시작...</translation> <translation id="8957762313041272117">실시간 자막</translation> <translation id="895944840846194039">자바스크립트 메모리</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 8b3a1f9d..55759db 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -246,7 +246,7 @@ <translation id="1327272175893960498">Kerberos билеттери</translation> <translation id="1327495825214193325">ADB аркылуу мүчүлүштүктөрдү оңдоону иштетүү үчүн бул <ph name="DEVICE_TYPE" /> түзмөгүн өчүрүп, кайра күйгүзүү талап кылынат. Аны өчүрүү үчүн түзмөктү демейки жөндөөлөргө кайтаруу керек.</translation> <translation id="1327977588028644528">Шлюз</translation> -<translation id="1329584516321524826">Азыр эле жаңырды</translation> +<translation id="1329584516321524826">Жаңы эле жаңырды</translation> <translation id="1330145147221172764">Экрандагы баскычтопту иштетүү</translation> <translation id="1331977651797684645">Ал мен болчумун.</translation> <translation id="1333489022424033687">Башка сайттар түзмөгүңүзгө сактаган дайын-даректер өчүрүлмөйүнчө <ph name="ORIGIN" /> сайтынын айрым функциялары иштебеши мүмкүн</translation> @@ -381,7 +381,7 @@ <translation id="1510238584712386396">Жүргүзгүч</translation> <translation id="1510581003097415337">Барактын QR кодун алуу</translation> <translation id="1510785804673676069">Эгер прокси серверин колдонуп жатсаңыз, прокси жөндөөлөрүңүздү текшериңиз же - прокси серверинин иштеп жатканын текшерүү үчүн тармактык администраторуңузга + прокси серверинин иштеп жатканын текшерүү үчүн, тармактык администраторуңузга кайрылыңыз. Эгер прокси сервери колдонулган жок деп ойлосоңуз, <ph name="LINK_START" />прокси жөндөөлөрүңүздү<ph name="LINK_END" /> тууралаңыз.</translation> <translation id="1511997356770098059">Бул коопсуздук ачкычында кирүү дайындарын сактоого болбойт</translation> @@ -612,6 +612,11 @@ <translation id="1805888043020974594">Басып чыгаруу сервери</translation> <translation id="1805967612549112634">PIN кодду ырастаңыз</translation> <translation id="1806335016774576568">Ачылып турган башка колдонмого которулуу</translation> +<translation id="1809483812148634490">Сиз Google Play'ден жүктөп алган колдонмолор бул Chromebook'тан өчүрүлөт. + <ph name="LINE_BREAKS1" /> + Тасмалар, телешоулор, музыка, китептер же колдонмодон сатып алган башка нерселер сыяктуу мазмундар да жок кылынышы мүмкүн. + <ph name="LINE_BREAKS2" /> + Бул башка түзмөктөрдөгү колдонмолорго же мазмундарга таасирин тийгизбейт.</translation> <translation id="1809734401532861917">Кыстармаларым, таржымалым, сырсөздөрүм жана башка жөндөөлөрүм <ph name="USER_EMAIL_ADDRESS" /> дарегине кошулсун</translation> <translation id="1813278315230285598">Кызматтар</translation> <translation id="18139523105317219">EDI тарабынын аталышы</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Коопсуздук ачкычынын аталышын анын арткы бетинен көрүңүз</translation> <translation id="2828650939514476812">Wi-Fi тармагына туташуу</translation> <translation id="2835294513443818940">Бул файлды коопсуз жүктөп алууга болбойт.</translation> +<translation id="2835547721736623118">Кепти таануу кызматы</translation> <translation id="2836269494620652131">Кыйроо</translation> <translation id="2836635946302913370">Бул колдонуучунун ысымы менен катталып кирүү аракети администратор тарабынан бөгөттөлгөн.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> тармагын колдонуу үчүн, адегенде төмөнкү интернетке туташууну бүтүрүңүз.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Кошумча барак баскычы</translation> <translation id="3020183492814296499">Кыска жолдор</translation> <translation id="3020990233660977256">Сериялык номери: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Батареянын кубаты менен иштеп жатканда</translation> <translation id="3021066826692793094">Көпөлөк</translation> <translation id="3021678814754966447">Алкак булагын карап &көрүү</translation> <translation id="3022978424994383087">Түшүнүксүз которулуп калды.</translation> @@ -2434,7 +2441,7 @@ <translation id="4194595472342532425">Конфигурациялоо маселесинен улам Plugin VM жөндөлгөн жок. Уюмуңуздун түзмөгүнүн администраторуна кайрылыңыз. Ката коду: <ph name="ERROR_CODE" />.</translation> <translation id="4195643157523330669">Жаңы өтмөктө ачуу</translation> <translation id="4195814663415092787">Чыгып кеткен жерден улантыңыз</translation> -<translation id="4198146608511578238">Google Жардамчыңызга кайрылуу үчүн Жүргүзгүчтүн сүрөтчөсүн басып туруңуз.</translation> +<translation id="4198146608511578238">Google Жардамчыңызга кайрылуу үчүн, Жүргүзгүчтүн сүрөтчөсүн басып туруңуз.</translation> <translation id="4200689466366162458">Ыңгайлаштырылган сөздөр</translation> <translation id="4200983522494130825">Жаңы &өтмөк</translation> <translation id="4201546031411513170">Эмнени шайкештирүү керек экенин жөндөөлөрдөн ар дайым тандай аласыз.</translation> @@ -2561,7 +2568,7 @@ <translation id="4394049700291259645">Ө</translation> <translation id="439817266247065935">Түзмөк туура өчүрүлгөн жок. Linux колдонмолорун иштетүү үчүн Linux'ту өчүрүп күйгүзүңүз.</translation> <translation id="4400367121200150367">Сырсөздөрдү эч качан сактабаган сайттар бул жерден көрүнөт</translation> -<translation id="4400632832271803360">Жогорку катардагы баскычтардын аракеттерин которуштуруу үчүн Жүргүзгүч баскычын басып туруңуз</translation> +<translation id="4400632832271803360">Жогорку катардагы баскычтардын аракеттерин которуштуруу үчүн, Жүргүзгүч баскычын басып туруңуз</translation> <translation id="4400963414856942668">Өтмөктү кыстармаларга кошуу үчүн жылдызчаны чыкылдатып коюңуз</translation> <translation id="4403775189117163360">Башка папканы тандоо</translation> <translation id="4404136731284211429">Кайра текшерүү</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Google Drive'га камдык көчүрмөлөрдү сактоо. Маалыматыңды (ошондой эле колдонмолордогу) оңой эле калыбына келтирип, бир түзмөктөн экинчисине өткөрө аласыз. Көчүрмөдө колдонмо тууралуу маалымат дагы сакталат. Камдык көчүрмөлөр Google'га жүктөлүп берилип, балаңыздын Google аккаунтунун сырсөзү менен шифрленет.</translation> <translation id="4634771451598206121">Кайра кириңиз…</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> Конок режиминдеги колдонуучулар үчүн жеткиликсиз.</translation> +<translation id="4635444580397524003">Linux камдык көчүрмөсү калыбына келтирилди.</translation> <translation id="4636930964841734540">Маалымат</translation> <translation id="4637083375689622795">Көбүрөөк аракеттер, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB аркылуу мүчүлүштүктөрдү оңдоону иштетүү</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Принтердин өркүндөтүлгөн параметрлери көрсөтүлсүн</translation> <translation id="4891089016822695758">Бета форуму</translation> <translation id="4892229439761351791">Сайт Bluetooth'ду колдоно алат</translation> +<translation id="489258173289528622">Батареянын кубаты менен иштеп жатканда эч кандай аракет аткарылбасын</translation> <translation id="4893336867552636863">Ушуну менен бул түзмөктөн серептөө дайын-даректериңиз биротоло өчүрүлөт.</translation> <translation id="4893522937062257019">Кулпуланган экранда</translation> <translation id="489454699928748701">Сайттарда кыймыл сенсорлорун колдонууга уруксат берилсин</translation> @@ -3248,7 +3257,7 @@ <translation id="5370819323174483825">&Кайра жүктөө</translation> <translation id="5372529912055771682">Каттоо режими иш тутумдун бул версиясында колдоого алынбайт. Эң акыркы версиянын колдонулуп жатканын текшерип, кайра аракет кылып көрүңүз.</translation> <translation id="5372579129492968947">Кеңейтүүнү бошотуу</translation> -<translation id="5376169624176189338">Артка кайтуу үчүн чыкылдатып, таржымалды көрүү үчүн кармап туруңуз</translation> +<translation id="5376169624176189338">Артка кайтуу үчүн, чыкылдатып, таржымалды көрүү үчүн кармап туруңуз</translation> <translation id="5376931455988532197">Файл өтө чоң</translation> <translation id="537813040452600081">Бул терезеде каралган баракчалар серепчи таржымалында көрүнбөйт жана компьютерде кукилер сыяктуу башка издерди калтырбайт. Бирок бардык жүктөлүп алынган файлдар сакталып кала берет.</translation> <translation id="5379140238605961210">Микрофонду колдонуу мүмкүнчүлүгү бөгөттөлө берсин</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">Мүчүлүштүктөрдү оңдоо өзгөчөлүктөрүн иштетүү</translation> <translation id="5864195618110239517">Тарифтелген Интернет байланышты колдонуу</translation> <translation id="5864471791310927901">DHCP каралбай калды</translation> +<translation id="5864754048328252126">Кубатталып жатканда эч кандай аракет аткарылбасын</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> жакында тындырылат</translation> <translation id="586567932979200359"><ph name="PRODUCT_NAME" /> диск элесинен иштеп жатат. Аны компьютериңизге орнотуп алсаңыз, ал диск элесинен тышкары иштеп, эч качан эскирбейт.</translation> <translation id="5865733239029070421">Колдонуу статистикасын жана каталар жөнүндө кабарларды Google'га автоматтык түрдө жөнөтүп турат</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">Бул бетти баштоо экранына кадап коюу…</translation> <translation id="6122081475643980456">Интернет байланышыңыз көзөмөлдөнүүдө</translation> <translation id="6122095009389448667">Бул сайт алмашуу буферин мындан ары да көрбөсүн</translation> +<translation id="6122831415929794347">Коопсуз серептөө өчүрүлсүнбү?</translation> <translation id="6122875415561139701">"<ph name="DEVICE_NAME" />" түзмөгүндөгү дайындарды жазууга тыюу салынган.</translation> <translation id="6124650939968185064">Бул кеңейтүүгө төмөнкү кеңейтүүлөр көз каранды:</translation> <translation id="6124698108608891449">Бул сайт көбүрөөк уруксаттарды талап кылат.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Үй-бүлө жана досторду кошуу</translation> <translation id="636850387210749493">Корпоративдик каттоо</translation> <translation id="6370021412472292592">Менифест жүктөлгөн жок.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Сызсөздү өзгөртүү}other{Сырсөздөрдү өзгөртүү}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Кайталап көрүңүз</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" сурамы боюнча 1 жыйынтык табылды</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">Дайын-даректериңизди <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> жана <ph name="WEBSITE_3" /> даректеринен окуңуз жана өзгөртүңүз</translation> <translation id="6410257289063177456">Сүрөт файлдары</translation> <translation id="6410328738210026208">Нуктарды жана жууп салуу аракетин өзгөртүү</translation> +<translation id="6410390304316730527">Коопсуз серептөө кесепеттүү программаны орнотуу же сырсөздөр, телефон номерлери жана насыя карталарынын дайындары сыяктуу маалыматыңыздын чабуулчулар тарабынан уурдалышынан коргойт. Эгер аны өчүрсөңүз, бейтааныш же ишенимсиз сайттарды карап чыгууда өзгөчө этият болуңуз.</translation> <translation id="6410668567036790476">Издөө каражатын кошуу</translation> <translation id="641081527798843608">Темасы дал келди</translation> <translation id="6412673304250309937">Chrome'догу кооптуу сайттардын тизмесиндеги URL даректерин текшерет. Эгер сайт сырсөзүңүздү уурдоого аракет кылса же кооптуу файлды жүктөп алсаңыз, Chrome URL даректерди, анын ичинде барактардагы мазмунду Коопсуз серептөөгө жөнөтүшү мүмкүн.</translation> @@ -5577,7 +5588,7 @@ <translation id="8509646642152301857">Орфографиялык сөздүк жүктөлүп алынбай калды.</translation> <translation id="8512476990829870887">Процессти бүтүрүү</translation> <translation id="851263357009351303">Сүрөттөрдү көрсөтүү үчүн, <ph name="HOST" /> ар дайыма уруксат берилсин</translation> -<translation id="8513108775083588393">Авто айлануу</translation> +<translation id="8513108775083588393">Авто буруу</translation> <translation id="8514746246728959655">Башка коопсуздук ачкычын колдонуп көрүңүз</translation> <translation id="851960115758509829">Колдонмолор, жөндөөлөр жана башка жеке параметрлер Google аккаунтуңуз менен кирип турган бардык Chrome OS түзмөктөрүндө шайкештирилет.</translation> <translation id="8521475323816527629">Колдонмолоруңузду ылдам алыңыз</translation> @@ -5606,7 +5617,7 @@ <translation id="854655314928502177">Веб проксини авто табуу URL'и:</translation> <translation id="8546930481464505581">Басуу тилкесин ыңгайлаштыруу</translation> <translation id="8547013269961688403">Толук экран лупасын иштетүү</translation> -<translation id="85486688517848470">Жогорку катардагы баскычтардын аракеттерин которуштуруу үчүн Издөө баскычын басып туруңуз</translation> +<translation id="85486688517848470">Жогорку катардагы баскычтардын аракеттерин которуштуруу үчүн, Издөө баскычын басып туруңуз</translation> <translation id="8551388862522347954">Уруксаттамалар</translation> <translation id="8553342806078037065">Башка адамдарды башкаруу</translation> <translation id="8554899698005018844">Тил коюлган эмес</translation> @@ -5800,7 +5811,7 @@ <translation id="8787254343425541995">Бөлүшүлгөн тармактардын проксилерине уруксат берүү</translation> <translation id="8791534160414513928">"Көз cалынбасын" сурамын cерептөө трафигиңиз менен кошо жөнөтүңүз</translation> <translation id="8794025342371547160">Чектелген IP</translation> -<translation id="879413103056696865">Туташуу түйүнү күйүп турганда, сиздин <ph name="PHONE_NAME" /> төмөнкүлөрдү аткарат:</translation> +<translation id="879413103056696865">Байланыш түйүнү күйүп турганда, сиздин <ph name="PHONE_NAME" /> төмөнкүлөрдү аткарат:</translation> <translation id="8795916974678578410">Жаңы терезе</translation> <translation id="8797459392481275117">Бул сайт эч качан которулбасын</translation> <translation id="8798099450830957504">Демейки</translation> @@ -5935,6 +5946,7 @@ <translation id="8951256747718668828">Катадан улам калыбына келтирилген жок</translation> <translation id="8951465597020890363">Конок режиминен баары бир чыгасызбы?</translation> <translation id="8952831374766033534">Конфигурациянын параметри колдоого алынбайт: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Кубатталып жатканда</translation> <translation id="895347679606913382">Башталууда…</translation> <translation id="8957762313041272117">Ыкчам коштомо жазуулар</translation> <translation id="895944840846194039">JavaScript эстутуму</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index ea62db0..adcdf8c3 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">ເພີ່ມຄອບຄົວ ແລະຫມູ່ເພື່ອນ</translation> <translation id="636850387210749493">ການລົງທະບຽນວິສາຫະກິດ</translation> <translation id="6370021412472292592">ບໍ່ສາມາດໂຫຼດໃບລາຍການໄດ້.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{ປ່ຽນລະຫັດຜ່ານ}other{ປ່ຽນລະຫັດຜ່ານ}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ລອງໃໝ່ອີກ</translation> <translation id="6377268785556383139">1 ຜົນການຊອກຫາສຳລັບ '<ph name="SEARCH_TEXT" />'</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index a09fb1c..73b9f2b 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Spausdinimo serveris</translation> <translation id="1805967612549112634">Patvirtinkite PIN kodą</translation> <translation id="1806335016774576568">Perjungti į kitą atidarytą programą</translation> +<translation id="1809483812148634490">Programos, kurias atsisiuntėte iš „Google Play“, bus ištrintos iš šio „Chromebook“. + <ph name="LINE_BREAKS1" /> + Įsigytas turinys, pvz., filmai, TV laidos, muzika, knygos ar kiti pirkiniai programoje, taip pat gali būti ištrintas. + <ph name="LINE_BREAKS2" /> + Tai neturi įtakos programoms ar turiniui kituose įrenginiuose.</translation> <translation id="1809734401532861917">Pridėti mano žymes, istoriją, slaptažodžius ir kitus nustatymus prie <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Paslaugos</translation> <translation id="18139523105317219">EDI šalies pavadinimas</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Raskite saugos rakto užpakalinėje dalyje užrašytą pavadinimą</translation> <translation id="2828650939514476812">Prisijungti prie „Wi-Fi“ tinklo</translation> <translation id="2835294513443818940">Negalima saugiai atsisiųsti šio failo.</translation> +<translation id="2835547721736623118">Kalbos atpažinimo paslauga</translation> <translation id="2836269494620652131">Strigtis</translation> <translation id="2836635946302913370">Prisijungimas šiuo naudotojo vardu neleidžiamas administratoriaus.</translation> <translation id="283669119850230892">Jei norite naudoti tinklą <ph name="NETWORK_ID" />, pirmiausia baikite prisijungti prie toliau nurodyto interneto.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Papildomo puslapio mygtukas</translation> <translation id="3020183492814296499">Spartieji klavišai</translation> <translation id="3020990233660977256">Serijos numeris: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Naudojant su akumuliatoriumi</translation> <translation id="3021066826692793094">Drugelis</translation> <translation id="3021678814754966447">&Žiūrėti rėmelio šaltinį</translation> <translation id="3022978424994383087">Nepavyko suprasti.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Sukurkite atsarginę kopiją „Google“ diske. Lengvai atkurkite duomenis arba perjunkite įrenginį bet kuriuo metu. Į šią atsarginę kopiją įtraukiami programų. Atsarginės kopijos įkeliamos į sistemą „Google“ ir šifruojamos naudojant vaiko „Google“ paskyros slaptažodį.</translation> <translation id="4634771451598206121">Prisijungti dar kartą...</translation> <translation id="4635398712689569051">„<ph name="PAGE_NAME" />“ nepasiekiamas svečiams.</translation> +<translation id="4635444580397524003">„Linux“ atsarginė kopija sėkmingai atkurta.</translation> <translation id="4636930964841734540">Informacija</translation> <translation id="4637083375689622795">Daugiau veiksmų, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Įgalinti ADB derinimą</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Rodyti išplėstines spausdintuvo parinktis</translation> <translation id="4891089016822695758">Beta forumas</translation> <translation id="4892229439761351791">Svetainė gali naudoti „Bluetooth“</translation> +<translation id="489258173289528622">Neaktyvus naudojant su akumuliatoriumi</translation> <translation id="4893336867552636863">Atlikus šį veiksmą bus visam laikui ištrinti naršymo duomenys iš šio įrenginio.</translation> <translation id="4893522937062257019">Užrakinimo ekrane</translation> <translation id="489454699928748701">Leisti svetainėms naudoti judesio jutiklius</translation> @@ -3615,6 +3624,7 @@ <translation id="5863445608433396414">Įgalinti derinimo funkcijas</translation> <translation id="5864195618110239517">Naudoti matuojamą ryšį</translation> <translation id="5864471791310927901">DHCP paieška nepavyko</translation> +<translation id="5864754048328252126">Neaktyvus įkraunant</translation> <translation id="5865508026715185451">Programa „<ph name="APP_NAME" />“ netrukus bus pristabdyta</translation> <translation id="586567932979200359">„<ph name="PRODUCT_NAME" />“ paleista iš disko vaizdo. Įdiegę ją kompiuteryje, galėsite paleisti be disko vaizdo ir būti tikri, kad ji bus atnaujinama.</translation> <translation id="5865733239029070421">Automatiškai siunčia naudojimo statistiką ir strigčių ataskaitas „Google“</translation> @@ -3814,6 +3824,7 @@ <translation id="6120205520491252677">Prisegti šį puslapį prie pradžios ekrano...</translation> <translation id="6122081475643980456">Jūsų interneto ryšys yra kontroliuojamas</translation> <translation id="6122095009389448667">Toliau neleisti šiai svetainei peržiūrėti iškarpinės</translation> +<translation id="6122831415929794347">Išjungti saugų naršymą?</translation> <translation id="6122875415561139701">Rašymo operacija neleidžiama įrenginyje „<ph name="DEVICE_NAME" />“.</translation> <translation id="6124650939968185064">Toliau pateikti plėtiniai priklauso nuo šio plėtinio:</translation> <translation id="6124698108608891449">Šiai svetainei reikia daugiau leidimų.</translation> @@ -3991,7 +4002,6 @@ <translation id="6365411474437319296">Pridėti šeimos narius ir draugus</translation> <translation id="636850387210749493">Įmonės registracija</translation> <translation id="6370021412472292592">Nepavyko įkelti aprašo.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Keisti slaptažodį}one{Keisti slaptažodžius}few{Keisti slaptažodžius}many{Keisti slaptažodžius}other{Keisti slaptažodžius}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Bandyti dar kartą</translation> <translation id="6377268785556383139">Rezultatų pagal užklausą „<ph name="SEARCH_TEXT" />“: 1</translation> @@ -4017,6 +4027,7 @@ <translation id="6408118934673775994">Skaityti ir keisti duomenis <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> ir <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Vaizdo failai</translation> <translation id="6410328738210026208">Pakeisti kanalą ir paleisti „Powerwash“</translation> +<translation id="6410390304316730527">Saugaus naršymo funkcija apsaugo jus nuo atakų vykdytojų, kurie gali bandyti apgaule priversti jus atlikti pavojingus veiksmus, pvz., įdiegti kenkėjišką programinę įrangą ar atskleisti asmens informaciją (pvz., slaptažodžius, telefono numerius ar kredito kortelių duomenis). Jei ją išjungsite, būkite atsargūs naršydami nežinomose ar nepatikimose svetainėse.</translation> <translation id="6410668567036790476">Paieškos variklio pridėjimas</translation> <translation id="641081527798843608">Temos atitiktis</translation> <translation id="6412673304250309937">Tikrinami URL pagal nesaugių svetainių sąrašą, saugomą naršyklėje „Chrome“. Jei svetainė bando pavogti slaptažodį ar atsisiuntėte žalingą failą, „Chrome“ taip pat gali siųsti URL, įskaitant puslapio turinio dalis, Saugaus naršymo funkcijai.</translation> @@ -5937,6 +5948,7 @@ <translation id="8951256747718668828">Nepavyko atkurti dėl klaidos</translation> <translation id="8951465597020890363">Vis tiek išeiti iš svečio režimo?</translation> <translation id="8952831374766033534">Konfigūracijos parinktis nepalaikoma: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Įkraunant</translation> <translation id="895347679606913382">Pradedama...</translation> <translation id="8957762313041272117">Subtitrai realiuoju laiku</translation> <translation id="895944840846194039">„JavaScript“ atmintis</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 8fc673ce..f7e73ef 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -186,7 +186,7 @@ <translation id="1235458158152011030">Zināmie tīkli</translation> <translation id="123578888592755962">Disks ir pilns.</translation> <translation id="1238191093934674082">Atvērt VPN</translation> -<translation id="1239439601391236986">Rādīt teksta ievadei paredzētus personas informācijas ieteikumus</translation> +<translation id="1239439601391236986">Rādīt personas informācijas ievades ieteikumus</translation> <translation id="1239594683407221485">Pārlūkojiet ierīces saturu lietotnē Faili.</translation> <translation id="124116460088058876">Citas valodas…</translation> <translation id="1241753985463165747">Lasīt un mainīt visus jūsu datus pašreizējā vietnē, kad aktivizēts</translation> @@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Ģimenes un draugu pievienošana</translation> <translation id="636850387210749493">Uzņēmuma palaide</translation> <translation id="6370021412472292592">Nevarēja ielādēt manifestu.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Mainīt paroli}zero{Mainīt paroles}one{Mainīt paroles}other{Mainīt paroles}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Mēģināt vēlreiz</translation> <translation id="6377268785556383139">1 rezultāts vaicājumam “<ph name="SEARCH_TEXT" />”</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 5fffebe..e653a9a2 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Сервер за печатење</translation> <translation id="1805967612549112634">Потврдете го PIN-кодот</translation> <translation id="1806335016774576568">Префрлете се на друга отворена апликација</translation> +<translation id="1809483812148634490">Апликациите што ги презедовте од Google Play ќе се избришат од овој Chromebook. + <ph name="LINE_BREAKS1" /> + Содржините што ги купивте, како филмови, ТВ-серии, музика, книги и други купувања во апликации можеби исто така ќе се избришат. + <ph name="LINE_BREAKS2" /> + Ова не влијае на апликациите или содржините на другите уреди.</translation> <translation id="1809734401532861917">Додај ги моите обележувачи, историја, лозинки и други поставки на <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Услуги</translation> <translation id="18139523105317219">Име на партијата EDI</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">Најдете го името отпечатено на задниот дел на безбедносниот клуч</translation> <translation id="2828650939514476812">Поврзете се на Wi-Fi мрежа</translation> <translation id="2835294513443818940">Датотекава не може да се преземе безбедно.</translation> +<translation id="2835547721736623118">Услуга за препознавање говор</translation> <translation id="2836269494620652131">Пад</translation> <translation id="2836635946302913370">Администраторот го оневозможи најавувањето со ова корисничко име.</translation> <translation id="283669119850230892">За да ја користите мрежата <ph name="NETWORK_ID" />, прво завршете со поврзувањето на интернет подолу.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">Копче за подредена страница</translation> <translation id="3020183492814296499">Кратенки</translation> <translation id="3020990233660977256">Сериски број: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Додека се користи батерија</translation> <translation id="3021066826692793094">Пеперутка</translation> <translation id="3021678814754966447">&Прикажи извор на рамка</translation> <translation id="3022978424994383087">Не го разбрав тоа.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Направете бекап на Google Drive. Лесно враќајте ги податоците или менувајте ги уредите во секое време. Бекапов опфаќа податоци од апликациите. Бекапот се прикачува во Google и се шифрира со лозинката за сметката на Google на вашето дете.</translation> <translation id="4634771451598206121">Најави се повторно...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> не е достапна за гостинските корисници.</translation> +<translation id="4635444580397524003">Бекапот на Linux е успешно вратен.</translation> <translation id="4636930964841734540">Информации</translation> <translation id="4637083375689622795">Повеќе дејства, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Овозможете отстранување грешка на ADB</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">Покажи ги напредните опции за печатач</translation> <translation id="4891089016822695758">Форум за Beta Chrome</translation> <translation id="4892229439761351791">Сајтот може да користи Bluetooth</translation> +<translation id="489258173289528622">Дејство при неактивност додека се користи батерија</translation> <translation id="4893336867552636863">Ова трајно ќе ги избрише податоците од прелистувањето на овој уред.</translation> <translation id="4893522937062257019">На заклучен екран</translation> <translation id="489454699928748701">Дозволете сајтовите да користат сензори за движење</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">Овозможете ги функциите за отстранување грешки</translation> <translation id="5864195618110239517">Користи врска со ограничен интернет</translation> <translation id="5864471791310927901">Барањето за DHCP не успеа.</translation> +<translation id="5864754048328252126">Дејство при неактивност додека се полни</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> ќе се паузира наскоро</translation> <translation id="586567932979200359">Го активиравте производот <ph name="PRODUCT_NAME" /> од неговата слика на дискот. Со негово инсталирање на компјутер, може да го активирате без сликата на диск и се обезбедува дека ќе биде ажурен.</translation> <translation id="5865733239029070421">Автоматски испраќа статистика на користењето и извештаи за падовите до Google.</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">Прикачи ја оваа страница на Почетен екран...</translation> <translation id="6122081475643980456">Вашето поврзување на интернет се контролира</translation> <translation id="6122095009389448667">Продолжи да го блокираш пристапот за гледање на привремената меморија на сајтов</translation> +<translation id="6122831415929794347">Да се исклучи „Безбедно прелистување“?</translation> <translation id="6122875415561139701">Операцијата за пишување не е дозволена на: „<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Следните наставки зависат од оваа наставка:</translation> <translation id="6124698108608891449">Сајтов има потреба од повеќе дозволи.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Додај семејство и пријатели</translation> <translation id="636850387210749493">Запишување компанија</translation> <translation id="6370021412472292592">Не може да вчита манифест.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Променете ја лозинката}one{Променете ги лозинките}other{Променете ги лозинките}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Обидете се повторно</translation> <translation id="6377268785556383139">1 резултат за „<ph name="SEARCH_TEXT" />“</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">Прочитајте ги и променете ги вашите податоци на <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Датотеки со слики</translation> <translation id="6410328738210026208">Промени канал и ресетирај до фабрички вредности</translation> +<translation id="6410390304316730527">„Безбедно прелистување“ ве заштитува од напаѓачи што може да ве измамат да направите нешто опасно, како што е инсталирањето злонамерен софтвер или откривањето лични податоци, како што се лозинки, телефонски броеви или кредитни картички. Ако го исклучите, бидете внимателни при прелистувањето на непознати сајтови или сајтови со лоша репутација.</translation> <translation id="6410668567036790476">Додајте пребарувач</translation> <translation id="641081527798843608">Совпаѓање на предмети</translation> <translation id="6412673304250309937">Ги проверува URL-адресите во список со небезбедни сајтови меморирани во Chrome. Ако некој сајт се обиде да ви ја украде лозинката или кога ќе преземете штетна датотека, Chrome може да испрати и URL-адреси, вклучувајќи и делови од содржините на страницата, во „Безбедно прелистување“.</translation> @@ -5938,6 +5949,7 @@ <translation id="8951256747718668828">Враќањето не може да се заврши поради грешка</translation> <translation id="8951465597020890363">Сепак да се излезе од режимот на гостин?</translation> <translation id="8952831374766033534">Опцијата за конфигурација не е поддржана: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Додека се полни</translation> <translation id="895347679606913382">Се стартува…</translation> <translation id="8957762313041272117">Автоматски титлови</translation> <translation id="895944840846194039">Меморија на JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 91b80fb..e3cf488 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">പ്രിന്റ് സെർവർ</translation> <translation id="1805967612549112634">പിൻ സ്ഥിരീകരിക്കുക</translation> <translation id="1806335016774576568">തുറന്നിരിക്കുന്ന മറ്റൊരു ആപ്പിലേക്ക് മാറുക</translation> +<translation id="1809483812148634490">നിങ്ങൾ Google Play-യിൽ നിന്ന് ഡൗൺലോഡ് ചെയ്ത ആപ്പുകളെ ഈ Chromebook-ൽ നിന്നും ഇല്ലാതാക്കും. + <ph name="LINE_BREAKS1" /> + നിങ്ങൾ വാങ്ങിയ സിനിമകൾ, ടിവി ഷോകൾ, സംഗീതം, പുസ്തകങ്ങൾ എന്നിവ പോലുള്ള ഉള്ളടക്കവും മറ്റ് ആപ്പ് മുഖേനയുള്ള വാങ്ങലുകളും ഇല്ലാതാക്കിയേക്കാം. + <ph name="LINE_BREAKS2" /> + ഇത് മറ്റ് ഉപകരണങ്ങളിലെ ആപ്പുകളെയോ ഉള്ളടക്കത്തെയോ ബാധിക്കില്ല.</translation> <translation id="1809734401532861917"><ph name="USER_EMAIL_ADDRESS" /> ഇമെയിലിൽ എന്റെ ബുക്ക്മാർക്കുകളും ചരിത്രവും പാസ്വേഡുകളും മറ്റ് ക്രമീകരണവും ചേർക്കുക</translation> <translation id="1813278315230285598">സേവനങ്ങള്</translation> <translation id="18139523105317219">EDI പാര്ട്ടി നാമം</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">നിങ്ങളുടെ സുരക്ഷാ കീയുടെ പുറകിൽ പ്രിൻ്റ് ചെയ്ത പേര് നോക്കുക</translation> <translation id="2828650939514476812">Wi-Fi നെറ്റ്വർക്കിലേക്ക് കണക്റ്റ് ചെയ്യുക</translation> <translation id="2835294513443818940">ഈ ഫയൽ സുരക്ഷിതമായി ഡൗൺലോഡ് ചെയ്യാനാവില്ല.</translation> +<translation id="2835547721736623118">സംഭാഷണം തിരിച്ചറിയൽ സേവനം</translation> <translation id="2836269494620652131">ക്രാഷ്</translation> <translation id="2836635946302913370">ഈ ഉപയോക്തൃനാമം ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുന്നത് നിങ്ങളുടെ അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കി.</translation> <translation id="283669119850230892">നെറ്റ്വർക്ക് <ph name="NETWORK_ID" /> ഉപയോഗിക്കുന്നതിന്, ആദ്യം ഇന്റർനെറ്റിലേക്കുള്ള നിങ്ങളുടെ കണക്ഷൻ ചുവടെ പൂർത്തിയാക്കുക.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">ഉപപേജ് ബട്ടൺ</translation> <translation id="3020183492814296499">കുറുക്കുവഴികൾ</translation> <translation id="3020990233660977256">സീരിയല് നമ്പര്: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">ബാറ്ററി ഉപയോഗിക്കുമ്പോൾ</translation> <translation id="3021066826692793094">ചിത്രശലഭം</translation> <translation id="3021678814754966447">ഫ്രെയിം ഉറവിടം &കാണുക</translation> <translation id="3022978424994383087">അത് മനസ്സിലായില്ല.</translation> @@ -2729,6 +2736,7 @@ <translation id="4633757335284074492">Google ഡ്രൈവിലേക്ക് ബാക്കപ്പെടുക്കുക. ഏത് സമയത്തും ഡാറ്റ എളുപ്പത്തിൽ പുനഃസ്ഥാപിക്കുകയോ ഉപകരണം മാറുകയോ ചെയ്യുക. ഈ ബാക്കപ്പിൽ ആപ്പ് ഡാറ്റയും ഉൾപ്പെടുന്നു. ബാക്കപ്പുകൾ Google-ലേക്ക് അപ്ലോഡ് ചെയ്ത്, നിങ്ങളുടെ കുട്ടിയുടെ Google അക്കൗണ്ട് പാസ്വേഡ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്യും.</translation> <translation id="4634771451598206121">വീണ്ടും പ്രവേശിക്കുക...</translation> <translation id="4635398712689569051">അതിഥി ഉപയോക്താക്കൾക്ക്, <ph name="PAGE_NAME" /> ലഭ്യമല്ല.</translation> +<translation id="4635444580397524003">Linux ബാക്കപ്പ് പുനഃസ്ഥാപിച്ചു.</translation> <translation id="4636930964841734540">വിവരം</translation> <translation id="4637083375689622795">കൂടുതൽ പ്രവര്ത്തനങ്ങൾ, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB ഡീബഗ് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക</translation> @@ -2904,6 +2912,7 @@ <translation id="4890773143211625964">വിപുലമായ പ്രിന്റർ ഓപ്ഷനുകൾ കാണിക്കുക</translation> <translation id="4891089016822695758">ബീറ്റ ഫോറം</translation> <translation id="4892229439761351791">സൈറ്റിന് Bluetooth ഉപയോഗിക്കാനാവും</translation> +<translation id="489258173289528622">ബാറ്ററി ഉപയോഗിക്കുമ്പോഴുള്ള നിഷ്ക്രിയ പ്രവർത്തനം</translation> <translation id="4893336867552636863">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റയെ ശാശ്വതമായി ഇല്ലാതാക്കും.</translation> <translation id="4893522937062257019">ലോക്ക് സ്ക്രീനിൽ</translation> <translation id="489454699928748701">ചലന സെൻസറുകൾ ഉപയോഗിക്കാൻ സൈറ്റുകളെ അനുവദിക്കുക</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">ഡീബഗ് ചെയ്യൽ ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation> <translation id="5864195618110239517">മീറ്റർ ചെയ്ത കണക്ഷന് ഉപയോഗിക്കുക</translation> <translation id="5864471791310927901">DHCP തിരയൽ പരാജയപ്പെട്ടു</translation> +<translation id="5864754048328252126">ചാർജ് ചെയ്യുമ്പോഴുള്ള നിഷ്ക്രിയ പ്രവർത്തനം</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> ഉടൻ താൽക്കാലികമായി നിർത്തും</translation> <translation id="586567932979200359">നിങ്ങൾ <ph name="PRODUCT_NAME" />, അതിന്റെ ഡിസ്ക് ചിത്രത്തിൽ നിന്ന് പ്രവർത്തിപ്പിക്കുന്നു. ഇത് നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ ഇൻസ്റ്റാൾ ചെയ്യുന്നത്, ഡിസ്ക് ചിത്രം ഇല്ലാതെ തന്നെ ഇത് പ്രവർത്തിപ്പിക്കാൻ നിങ്ങളെ അനുവദിക്കുകയും അപ് റ്റു ഡേറ്റായി നിലനിർത്തുമെന്ന് ഉറപ്പുവരുത്തുകയും ചെയ്യുന്നു.</translation> <translation id="5865733239029070421">Google-ലേക്ക് സ്വയമേവ ഉപയോഗ വിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോര്ട്ടുകളും അയയ്ക്കുന്നു</translation> @@ -3811,6 +3821,7 @@ <translation id="6120205520491252677">ഈ പേജ് ആരംഭ സ്ക്രീനിലേക്ക് പിൻ ചെയ്യുക...</translation> <translation id="6122081475643980456">നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ നിയന്ത്രിക്കുന്നു</translation> <translation id="6122095009389448667">ക്ലിപ്പ്ബോർഡ് കാണുന്നതിൽ നിന്ന് ഈ സൈറ്റിനെ ബ്ലോക്ക് ചെയ്യുന്നത് തുടരുക</translation> +<translation id="6122831415929794347">സുരക്ഷിത ബ്രൗസിംഗ് ഓഫാക്കണോ?</translation> <translation id="6122875415561139701">ഇനി പറയുന്നതിൽ എഴുതാൻ അനുമതിയില്ല: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">ഇനിപ്പറയുന്ന വിപുലീകരണങ്ങൾ ഈ വിപുലീകരണത്തെ ആശ്രയിച്ചിരിക്കുന്നു:</translation> <translation id="6124698108608891449">ഈ സൈറ്റിന് കൂടുതൽ അനുമതികൾ ആവശ്യമുണ്ട്.</translation> @@ -3988,7 +3999,6 @@ <translation id="6365411474437319296">കുടുംബാംഗങ്ങളെയും സുഹൃത്തുക്കളെയും ചേർക്കുക</translation> <translation id="636850387210749493">സംരംഭ വിവരപ്പട്ടിക</translation> <translation id="6370021412472292592">മാനിഫെസ്റ്റ് ലോഡ് ചെയ്യാനായില്ല.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{പാസ്വേഡ് മാറ്റുക}other{പാസ്വേഡുകൾ മാറ്റുക}}</translation> <translation id="6374077068638737855">ഐസ്വീസൽ</translation> <translation id="6374469231428023295">വീണ്ടും ശ്രമിക്കുക</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' എന്നതിനായി ഒരു ഫലം</translation> @@ -4014,6 +4024,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> എന്നിവയിലെ നിങ്ങളുടെ ഡാറ്റ വായിക്കുക, മാറ്റുക</translation> <translation id="6410257289063177456">ചിത്ര ഫയലുകള്</translation> <translation id="6410328738210026208">ചാനലും പവർവാഷും മാറ്റുക</translation> +<translation id="6410390304316730527">ക്ഷുദ്രകരമായ സോഫ്റ്റ്വയറുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതോ പാസ്വേഡുകൾ, ഫോൺ നമ്പറുകൾ അല്ലെങ്കിൽ ക്രെഡിറ്റ് കാർഡുകൾ പോലുള്ള നിങ്ങളുടെ സ്വകാര്യ വിവരങ്ങൾ വെളിപ്പെടുത്തുന്നതോ പോലെ അപകടകരമായ കാര്യങ്ങൾ ചെയ്യിപ്പിക്കുന്ന രീതിയിൽ നിങ്ങളെ കബളിപ്പിച്ചേക്കാവുന്ന അക്രമകാരികളിൽ നിന്നും സുരക്ഷിത ബ്രൗസിംഗ് നിങ്ങളെ പരിരക്ഷിക്കുന്നു. നിങ്ങൾ ഇത് ഓഫാക്കുകയാണെങ്കിൽ, അപരിചിതമായതോ നിന്ദ്യമായതോ ആയ സൈറ്റുകൾ ബ്രൗസ് ചെയ്യുമ്പോൾ ശ്രദ്ധിക്കുക.</translation> <translation id="6410668567036790476">തിരയൽ യന്ത്രം ചേർക്കുക</translation> <translation id="641081527798843608">പൊരുത്തപ്പെടുന്ന വിഷയം</translation> <translation id="6412673304250309937">Chrome-ൽ സംഭരിച്ചിരിക്കുന്ന സുരക്ഷിതമല്ലാത്ത സൈറ്റുകളുടെ ലിസ്റ്റ് ഉപയോഗിച്ച് URL-കൾ പരിശോധിക്കുന്നു. ഒരു സൈറ്റ് നിങ്ങളുടെ പാസ്വേഡ് മോഷ്ടിക്കാൻ ശ്രമിക്കുമ്പോഴോ നിങ്ങൾ ഒരു ദോഷകരമായ ഫയൽ ഡൗൺലോഡ് ചെയ്യുമ്പോഴോ, പേജ് ഉള്ളടക്കത്തിന്റെ ബിറ്റുകൾ ഉൾപ്പെടെയുള്ള URL-കളും Chrome സുരക്ഷിത ബ്രൗസിംഗിലേക്ക് അയച്ചേക്കാം.</translation> @@ -5933,6 +5944,7 @@ <translation id="8951256747718668828">പിശക് കാരണം പുനഃസ്ഥാപിക്കൽ പൂർത്തിയാക്കാനായില്ല</translation> <translation id="8951465597020890363">എന്തായാലും അതിഥി മോഡിൽ നിന്ന് പുറത്തുകടക്കണോ?</translation> <translation id="8952831374766033534">കോൺഫിഗറേഷൻ ഓപ്ഷന് പിന്തുണയില്ല: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">ചാർജ് ചെയ്യുമ്പോൾ</translation> <translation id="895347679606913382">ആരംഭിക്കുന്നു...</translation> <translation id="8957762313041272117">തൽസമയ ക്യാപ്ഷൻ</translation> <translation id="895944840846194039">JavaScript മെമ്മറി</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 4ffc6a6..28afc6a9 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -608,6 +608,11 @@ <translation id="1805888043020974594">Хэвлэх сервер</translation> <translation id="1805967612549112634">ПИН-г баталгаажуулах</translation> <translation id="1806335016774576568">Нээлттэй өөр апп руу сэлгэх</translation> +<translation id="1809483812148634490">Таны Google Play-с татсан аппуудыг энэ Chromebook-с устгана. + <ph name="LINE_BREAKS1" /> + Кино, ТВ шоу, хөгжим, ном зэрэг таны худалдаж авсан контент эсвэл апликейшний бусад худалдан авалтыг мөн устгаж болзошгүй. + <ph name="LINE_BREAKS2" /> + Энэ нь бусад төхөөрөмж дээрх аппууд эсвэл контентод нөлөөлөхгүй.</translation> <translation id="1809734401532861917">Миний хавчуурга, түүх, нууц үг, бусад тохиргоог <ph name="USER_EMAIL_ADDRESS" />-д нэмэх</translation> <translation id="1813278315230285598">Үйлчилгээ</translation> <translation id="18139523105317219">EDI Талын нэр</translation> @@ -1388,6 +1393,7 @@ <translation id="2825848369316359348">Аюулгүй байдлын түлхүүрийнхээ арын хэсэгт хэвлэсэн нэрийг хайж олно уу</translation> <translation id="2828650939514476812">Wi-Fi сүлжээнд холбогдох</translation> <translation id="2835294513443818940">Энэ файлыг аюулгүй татах боломжгүй.</translation> +<translation id="2835547721736623118">Яриа таних үйлчилгээ</translation> <translation id="2836269494620652131">Эвдрэл</translation> <translation id="2836635946302913370">Энэ хэрэглэгчийн нэрээр нэвтрэхийг администратор хориглосон байна.</translation> <translation id="283669119850230892">Сүлжээг ашиглахын тулд <ph name="NETWORK_ID" /> эхлээд доорх Интернэтийн холболтыг дуусгана уу.</translation> @@ -1532,6 +1538,7 @@ <translation id="3019285239893817657">Дэд хуудасны товчлуур</translation> <translation id="3020183492814296499">Товчлол</translation> <translation id="3020990233660977256">Сери дугаар: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Батарейгаар ажиллах үед</translation> <translation id="3021066826692793094">Эрвээхэй</translation> <translation id="3021678814754966447">&Хүрээний эх үүсвэрийг харах</translation> <translation id="3022978424994383087">Үүнийг ойлгосонгүй.</translation> @@ -2727,6 +2734,7 @@ <translation id="4633757335284074492">Google Драйвд хуулбарлана уу. Өгөгдлийг амархан сэргээх эсвэл хүссэн үедээ төхөөрөмж хооронд сэлгэнэ үү. Энэ нөөцлөлтөд аппын өгөгдөл багтана. Нөөцлөлтийг Google-д байршуулдаг бөгөөд таны хүүхдийн Google Бүртгэлийн нууц үгийг ашиглан шифрлэдэг.</translation> <translation id="4634771451598206121">Дахин нэвтэрнэ үү...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> Зочин хэрэглэгч ашиглах боломжгүй байна.</translation> +<translation id="4635444580397524003">Linux-н нөөцлөлтийг амжилттай сэргээлээ.</translation> <translation id="4636930964841734540">Мэдээлэл</translation> <translation id="4637083375689622795">Нэмэлт үйлдлүүд, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB алдаа засахыг идэвхжүүлэх</translation> @@ -2902,6 +2910,7 @@ <translation id="4890773143211625964">Нарийвчилсан хэвлэгчийн сонголтыг харуулах</translation> <translation id="4891089016822695758">Бэта форум</translation> <translation id="4892229439761351791">Сайт Bluetooth ашиглах боломжтой</translation> +<translation id="489258173289528622">Батарейгаар ажиллах үед идэвхгүй төлөвт хийх үйлдэл</translation> <translation id="4893336867552636863">Энэ нь таны хайлтын өгөгдлийг энэ төхөөрөмжөөс бүрмөсөн устгах болно.</translation> <translation id="4893522937062257019">Түгжигдсэн дэлгэцэд</translation> <translation id="489454699928748701">Сайтуудад хөдөлгөөн мэдрэгч ашиглахыг зөвшөөрөх</translation> @@ -3609,6 +3618,7 @@ <translation id="5863445608433396414">Debugging features-г идэвхгүй болгох</translation> <translation id="5864195618110239517">Хязгаартай холболт ашиглах</translation> <translation id="5864471791310927901">DHCP лавлаж харах ажиллагаа амжилтгүй боллоо</translation> +<translation id="5864754048328252126">Цэнэглэж байх үед идэвхгүй төлөвт хийх үйлдэл</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> удахгүй түр зогсоно</translation> <translation id="586567932979200359">Та <ph name="PRODUCT_NAME" />-ийг дискний дүрснээс нь ажилуулж байна. Үүнийг компьютер дээрээ суулгаснаар та үүн дээр дискний дүрсгүйгээр ажиллах боломжтой болох бөгөөд үргэлж шинэчлэгдэж байх болно.</translation> <translation id="5865733239029070421">Хэрэглээний статистик мэдээ болон алдааны тайланг Google-д автоматаар илгээдэг</translation> @@ -3807,6 +3817,7 @@ <translation id="6120205520491252677">Эхлүүлэх дэлгэц дээр энэ хуудсыг тусгайлан сонгож оруул...</translation> <translation id="6122081475643980456">Таны интернет холболт хяналтанд байна</translation> <translation id="6122095009389448667">Энэ сайтыг түр санах ой харахыг нь үргэлжлүүлэн хориглох</translation> +<translation id="6122831415929794347">Аюулгүй үзэх онцлогийг унтраах уу?</translation> <translation id="6122875415561139701">Бичих үйлдлийг дараахд зөвшөөрөөгүй: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Дараах өргөтгөлүүд нь энэ өргөтгөлөөс хамаардаг:</translation> <translation id="6124698108608891449">Энэ сайтад илүү зөвшөөрөл шаардлагатай.</translation> @@ -3984,7 +3995,6 @@ <translation id="6365411474437319296">Гэр бүл болон найз нөхөдөө нэмэх</translation> <translation id="636850387210749493">Байгууллагын бүртгэл</translation> <translation id="6370021412472292592">Мэдүүлгийг ачаалж чадсангүй.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Нууц үгээ өөрчлөх}other{Нууц үгсээ өөрчлөх}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Дахин оролдоно уу</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />'-н 1 илэрц</translation> @@ -4010,6 +4020,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, <ph name="WEBSITE_3" /> дахь мэдээллээ унших, өөрчлөх</translation> <translation id="6410257289063177456">Зургийн файлууд</translation> <translation id="6410328738210026208">Сувгийг өөрчилж, үйлдвэрийн тохиргоонд нь оруулах</translation> +<translation id="6410390304316730527">Аюулгүй үзэх онцлог нь хортой программ хангамж суулгах эсвэл нууц үг, утасны дугаар эсвэл кредит карт зэрэг хувийн мэдээллийг ил болгох зэрэг аюултай үйлдлийг хийлгүүлэхээр таныг хуурч болзошгүй халдагч нараас таныг хамгаалдаг. Хэрэв түүнийг унтраасан бол танихгүй эсвэл баталгаагүй сайт үзэж байхдаа болгоомжтой байна уу.</translation> <translation id="6410668567036790476">Хайлтын систем нэмэх</translation> <translation id="641081527798843608">Субъект тохируулах</translation> <translation id="6412673304250309937">URL-г Chrome-д хадгалсан аюултай сайтын жагсаалттай харьцуулж шалгадаг. Хэрэв сайт таны нууц үгийг хулгайлах гэж оролдвол эсвэл таныг аюултай файл татах үед Chrome нь хуудасны бага зэрэг контентын хамт URL-г Аюулгүй хайлт руу мөн илгээж болзошгүй.</translation> @@ -5924,6 +5935,7 @@ <translation id="8951256747718668828">Алдааны улмаас сэргээлтийг дуусгаж чадсангүй</translation> <translation id="8951465597020890363">Зочин горимоос гарах уу?</translation> <translation id="8952831374766033534">Тохируулгын сонголт дэмжигдээгүй байна: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Цэнэглэх үед</translation> <translation id="895347679606913382">Үйлдлийг эхэлж байна ...</translation> <translation id="8957762313041272117">Шууд тайлбар</translation> <translation id="895944840846194039">JavaScript санах ой</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 20c402c..cf79abe4 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2416,7 +2416,7 @@ <translation id="4144218403971135344">आणखी चांगल्या दर्जाचे व्हिडिओ मिळवा आणि बॅटरी लाइफ वाचवा. व्हिडिओ फक्त तुमच्या Cast सुरू केलेल्या स्क्रीनवर प्ले होईल.</translation> <translation id="4146026355784316281">नेहमी सिस्टम दर्शकासह उघडा</translation> <translation id="4146785383423576110">रीसेट करा आणि साफ करा</translation> -<translation id="4147897805161313378">Google फोटो</translation> +<translation id="4147897805161313378">Google Photos</translation> <translation id="4147911968024186208">रीबूट करा. तुम्हाला ही एरर पुन्हा दिसल्यास कृपया तुमच्या साहाय्य प्रतिनिधीशी संपर्क साधा.</translation> <translation id="4150201353443180367">डिस्प्ले करा</translation> <translation id="4152670763139331043">{NUM_TABS,plural, =1{1 टॅब}other{# टॅब}}</translation> @@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">कुटुंब आणि मित्र जोडा</translation> <translation id="636850387210749493">Enterprise नावनोंदणी</translation> <translation id="6370021412472292592">मॅनिफेस्ट लोड करू शकलो नाही.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{पासवर्ड बदला}other{पासवर्ड बदला}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">पुन्हा प्रयत्न करा</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' साठी एक परिणाम</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index d53eb4f..2a1bedd 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Tambahkan keluarga dan rakan</translation> <translation id="636850387210749493">Pendaftaran perusahaan</translation> <translation id="6370021412472292592">Tidak dapat memuatkan manifes.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Tukar kata laluan}other{Tukar kata laluan}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Cuba Lagi</translation> <translation id="6377268785556383139">1 hasil carian untuk '<ph name="SEARCH_TEXT" />'</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 3af3c69..0e18fe1 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">မိသားစုနှင့် သူငယ်ချင်းများ ပေါင်းထည့်</translation> <translation id="636850387210749493">လုပ်ငန်း အမည်စာရင်းသွင်းခြင်း</translation> <translation id="6370021412472292592">ကြေညာစာတမ်းကို တင် မပေးနိုင်ခဲ့ပါ။</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{စကားဝှက် ပြောင်းရန်}other{စကားဝှက်များ ပြောင်းရန်}}</translation> <translation id="6374077068638737855">အိုင်စ်ဝါဆယ်လ</translation> <translation id="6374469231428023295">ထပ်စမ်းကြည့်ပါ</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' အတွက် ရလဒ် ၁ ခု</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 1afd032..fbee9a4 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -37,6 +37,7 @@ <translation id="1041263367839475438">उपलब्ध यन्त्रहरू</translation> <translation id="1042174272890264476">तपाइँको कम्प्युटर <ph name="SHORT_PRODUCT_NAME" /> को RLZ अन्तरनिर्मित पुस्तकालयसँग पनि आउँछ। एक विशेष वृद्धि जनक अभियानद्वारा चालू भएको खोजीहरू र <ph name="SHORT_PRODUCT_NAME" /> प्रयोगहरू नाप्नको लागि RLZ ले एउटा अद्वितीय नभएको, व्यक्तिगत नभएको ठम्याउन सकिने ट्याग तोक्छ। यी लेबुलहरू कहिलेकाही <ph name="PRODUCT_NAME" /> मा Google खोजी क्वेरीहरूमका देखा पर्छन्।</translation> <translation id="1043818413152647937">यी अनुप्रयोगहरूका डेटा पनि खाली गर्ने हो?</translation> +<translation id="1045448422538531528">समूहमा थप्नुहोस्</translation> <translation id="1046635659603195359">तपाईंले आफ्नो Google सहायकमार्फत अर्को यन्त्रमा Voice Match सेटअप गरिसक्नुभएको छ जस्तो देखिन्छ। यो यन्त्रमा आवाजको नमुना बनाउनका लागि ती अघिल्ला रेकर्डिङहरू प्रयोग गर्न सकिन्छ। यसो गर्न एक मिनेटभन्दा कम समय लाग्छ।</translation> <translation id="104710386808485638">Linux पुनः सुरु गर्ने हो?</translation> <translation id="1047431265488717055">लिंक पाठ प्रतिलिपि गर्नुहोस्</translation> @@ -64,6 +65,7 @@ <translation id="1076818208934827215">Microsoft Internet Explorer</translation> <translation id="1079766198702302550">जहिले पनि क्यामेरा पहुँच रोक्नुहोस्</translation> <translation id="1082398631555931481"><ph name="THIRD_PARTY_TOOL_NAME" />ले तपाईँका Chrome सेटिङहरू उनीहरूको आफ्नो मूल पूर्वनिर्धारितमा पुनर्स्थापना गर्न चाहन्छ। यसले तपाईँको गृहपृष्ठ, नयाँ ट्याब पृष्ठ र खोज इन्जिनलाई रिसेट गर्ने छ, तपाईँका विस्तारहरूलाई निस्क्रिय पार्दछ, र सबै ट्याबहरूलाई अनपिन गर्ने छ। यसले कुकीहरू, सामग्री र साइट डेटा जस्ता अन्य अस्थायी र क्यास गरिएका डेटालाई मेटाउने छ।</translation> +<translation id="1084096383128641877">यो पासवर्ड हटाउनुले <ph name="DOMAIN" /> मा रहेको तपाईंको खाता मेटाउने छैन। <ph name="DOMAIN_LINK" /> मा रहेको तपाईंको खाता अन्य मान्छेहरूबाट सुरक्षित राख्न आफ्नो पासवर्ड परिवर्तन गर्नुहोस् वा उक्त खाता मेटाउनुहोस्।</translation> <translation id="1084824384139382525">लिङ्क ठे&गानाको प्रतिलिपि बनाउनुहोस्</translation> <translation id="1085697365578766383">भर्चुअल मेसिन सुरु गर्ने क्रममा त्रुटि भयो। कृपया फेरि प्रयास गर्नुहोस्।</translation> <translation id="1090126737595388931">कुनै पृष्ठभूमिमा चलिरहेका अनुप्रयोगहरू छैनन्</translation> @@ -90,6 +92,7 @@ <translation id="1122960773616686544">बुकमार्क नाम</translation> <translation id="1124772482545689468">प्रयोगकर्ता</translation> <translation id="1125550662859510761"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (नेटिभ) जस्तो देखिन्छ</translation> +<translation id="1126809382673880764">तपाईंलाई जोखिमपूर्ण वेबसाइट, डाउनलोड वा एक्स्टेन्सनहरूविरुद्ध सुरक्षा प्रदान गर्दैन। उपलब्ध भएसम्म तपाईं अझै पनि Gmail र खोज जस्ता Google का अन्य सेवाहरूमा सुरक्षित ब्राउजिङको सुरक्षा प्राप्त गर्नु हुने छ।</translation> <translation id="1128109161498068552">कुनै पनि साइटलाई MIDI यन्त्रहरू पहुँच गर्न प्रणाली अलग सन्देशहरू प्रयोग गर्न अनुमति नदिनुहोस्</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">खोज इन्जिनलाई सम्पादन गर्नुहोस्</translation> @@ -181,6 +184,7 @@ <translation id="1235458158152011030">ज्ञात नेटवर्कहरू</translation> <translation id="123578888592755962">डिस्क भरियो</translation> <translation id="1238191093934674082">खुल्ला VPN</translation> +<translation id="1239439601391236986">व्यक्तिगत जानकारीसम्बन्धी सिफारिसहरू देखाइयोस्</translation> <translation id="1239594683407221485">Files अनुप्रयोगमार्फत यन्त्रको सामग्री अन्वेषण गर्नुहोस्।</translation> <translation id="124116460088058876">थप भाषाहरू</translation> <translation id="1241753985463165747">इन्भोक गरिएको बेला हालको वेबसाइटमा रहेका आफ्ना सम्पूर्ण डेटा पढ्नुहोस् र तिनीहरूलाई परिवर्तन गर्नुहोस्</translation> @@ -197,6 +201,7 @@ <translation id="1259152067760398571">हिजो सुरक्षा जाँच गरिएको थियो</translation> <translation id="1260451001046713751"><ph name="HOST" /> लाई पपअप देखाउन र रिडिरेक्ट गर्न अनुमति दिनुहोस्</translation> <translation id="126156426083987769">डेमो मोडका यन्त्रको इजाजतपत्रसम्बन्धी कुनै समस्या भयो।</translation> +<translation id="1263490604593716556"><ph name="FIRST_PARENT_EMAIL" /> र <ph name="SECOND_PARENT_EMAIL" /> ले व्यवस्थापन गरेको खाता। यो यन्त्रमा साइन इन गरिएको प्राथमिक खाताबाट साइन आउट गर्न आफ्नो स्क्रिनमा देखिएको समयमा क्लिक गर्नुहोस्। त्यसपछि देखिने मेनुमा "साइन आउट गर्नुहोस्" नामक बटनमा क्लिक गर्नुहोस्।</translation> <translation id="126710816202626562">अनुवाद भाषा:</translation> <translation id="126768002343224824">१६ गुणा</translation> <translation id="1272079795634619415">रोक्नुहोस्</translation> @@ -296,6 +301,7 @@ <translation id="140723521119632973">सेलुलर सक्रिय गर्ने कार्य</translation> <translation id="1407489512183974736">केन्द्रलाई काटियो</translation> <translation id="1408504635543854729">फाइलहरू नामक एपमा यन्त्रको सामग्री अन्वेषण गर्नुहोस्। कुनै प्रशासकद्वारा बन्देज लगाइएको सामग्रीलाई परिमार्जन गर्न सकिँदैन।</translation> +<translation id="1408980562518920698">व्यक्तिगत जानकारी व्यवस्थित गर्नुहोस्</translation> <translation id="1410197035576869800">अनुप्रयोगको आइकन</translation> <translation id="1410616244180625362">तपाईंको क्यामेरा पहुँचका लागि <ph name="HOST" /> लाई अनुमति दिन जारी राख्नुहोस्</translation> <translation id="1414648216875402825">तपाईं <ph name="PRODUCT_NAME" /> को अस्थिर संस्करणमा अपडेट गर्दै हुनुहुन्छ जुनमा सुविधाहरू हुन्छ जो प्रगतिमा छ। क्रयासहरू र नसोचिएका बगहरू आउनेछ। कृपया सतर्कता सहित जारी राख्नुहोस्।</translation> @@ -427,6 +433,7 @@ <translation id="1585717515139318619">तपाईँको कम्प्युटरमा अर्को प्रोग्रामले एउटा विषयवस्तु थप्यो जसले Chrome को कार्य गर्ने तरिका बदल्न सक्छ। <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">&JavaScript कन्सोल</translation> <translation id="1587907146729660231">आफ्ना औँलाले पावर बटनमा छुनुहोस्</translation> +<translation id="1588200577109872591">स्मार्ट इनपुटहरू</translation> <translation id="1588438908519853928">सामान्य</translation> <translation id="158849752021629804">गृह नेटवर्क आवश्यक छ</translation> <translation id="1588870296199743671">यस मार्फत लिङ्क खोल्नुहोस्...</translation> @@ -662,6 +669,7 @@ <translation id="1879000426787380528">निम्न व्यक्तिका रूपमा साइन इन गर्नुहोस्</translation> <translation id="1880905663253319515">प्रमाणपत्र "<ph name="CERTIFICATE_NAME" />" लाई मेटाउने?</translation> <translation id="1884013283844450420"><ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" /> मध्ये नेटवर्क <ph name="NETWORK_INDEX" />, जोड्नुहोस्</translation> +<translation id="1884705339276589024">Linux को डिस्कको आकार बदल्नुहोस्</translation> <translation id="1886996562706621347">प्रोटोकलहरूको लागि पूर्वनिर्धारित हेन्डलर बन्न अनुरोध गर्न साइटहरूलाई अनुमति दिनुहोस् (सिफारिश गरिएको)</translation> <translation id="1887442540531652736">साइन इनसम्बन्धी त्रुटि</translation> <translation id="1887597546629269384">फेरि "Hey Google" भन्नुहोस्</translation> @@ -731,6 +739,7 @@ <translation id="1979280758666859181">तपाइँले <ph name="PRODUCT_NAME" /> को पुरानो संस्करण भएको च्यानलमा परिवर्नत गर्दै हुनुहुन्छ। तपाइँ यन्त्रमा हालै स्थपित संस्करणसँग च्यानल संस्करण मेल खायो पछि च्यानल परिवर्तन लागू हुनेछ।</translation> <translation id="197989455406964291">KDC ले इन्क्रिप्सनको यो प्रकारलाई समर्थन गर्दैन</translation> <translation id="1982354452682152483">कुनै पनि विवरण उपलब्ध छैन।</translation> +<translation id="1984417487208496350">सुरक्षारहित मोड (सिफारिस गरिँदैन)</translation> <translation id="1987317783729300807">खाताहरू</translation> <translation id="1989112275319619282">ब्राउज गर्नुहोस्</translation> <translation id="1990512225220753005">यस पृष्ठमा सर्टकटहरू नदेखाउनुहोस्</translation> @@ -800,6 +809,7 @@ <translation id="2090165459409185032">तपाईँको खाता जानकारी पुनःप्राप्ति गर्न google.com/accounts/recovery मा जानुहोस्</translation> <translation id="2090876986345970080">प्रणाली सुरक्षा सेटिङ</translation> <translation id="2091887806945687916">आवाज</translation> +<translation id="2096478741073211388">व्यक्तिगत जानकारीसम्बन्धी सिफारिसहरूले तपाईंले कुनै खास शब्दहरू टाइप गर्दा तपाईंको नाम, ठेगाना वा फोन नम्बर स्वत: टाइप गरेर तपाईंलाई अझ छिटो लेख्न मद्दत गर्छन्। तपाईंको खाताका हकमा दिइने निजी तथा वैयक्तीकृत सिफारिसहरू तपाईं मात्र देख्नुहुन्छ।</translation> <translation id="2096715839409389970">तेस्रो पक्षीय कुकीहरू खाली गर्नुहोस्</translation> <translation id="2097372108957554726">नयाँ यन्त्रहरू दर्ता गराउन तपाईंले Chrome मा साइन इन गर्न आवश्यक छ।</translation> <translation id="2099172618127234427">तपाईं Chrome OS डिबगिङ विशेषताहरू सक्षम गर्दै हुनुहुन्छ जुन USB ड्राइभहरूबाट sshd daemon सेटअप गर्दछ।</translation> @@ -816,6 +826,7 @@ <translation id="2114326799768592691">&Frame पुन: लोड गर्नुहोस्</translation> <translation id="2114896190328250491"><ph name="NAME" /> द्वारा खिचिएको फोटो</translation> <translation id="2119349053129246860"><ph name="APP" /> मा खोल्नुहोस्</translation> +<translation id="2119461801241504254">सुरक्षित ब्राउजिङ सक्रिय छ र यसले हानिकारक साइट र डाउनलोडहरूबाट तपाईंलाई सुरक्षित राख्दै छ</translation> <translation id="2120297377148151361">क्रियाकलाप तथा अन्तर्क्रियाहरू</translation> <translation id="2120639962942052471"><ph name="PERMISSION" /> माथि रोक लगाइएको छ</translation> <translation id="2121055421682309734">{COUNT,plural, =0{कुकीहरूलाई रोक लगाइएको छ}=1{कुकीहरूलाई रोक लगाइएको छ, १ वटा बाहेक}other{कुकीहरूलाई रोक लगाइएको छ, {COUNT} वटा बाहेक}}</translation> @@ -865,6 +876,7 @@ <translation id="2172784515318616985">जारी राख्नुहोस्</translation> <translation id="2173302385160625112">आफ्नो इन्टरनेट जडानको जाँच गर्नुहोस्</translation> <translation id="2173801458090845390">यो यन्त्रमा माग ID थप्नुहोस्</translation> +<translation id="2174948148799307353"><ph name="PARENT_EMAIL" /> ले व्यवस्थापन गरेको खाता। यो यन्त्रमा साइन इन गरिएको प्राथमिक खाताबाट साइन आउट गर्न आफ्नो स्क्रिनमा देखिएको समयमा क्लिक गर्नुहोस्। त्यसपछि देखिने मेनुमा "साइन आउट गर्नुहोस्" नामक बटनमा क्लिक गर्नुहोस्।</translation> <translation id="2175607476662778685">द्रुत सुरुवात पट्टी</translation> <translation id="217576141146192373">प्रिन्टर थप्न सकिएन। कृपया आफ्नो प्रिन्टरको कन्फिगुरेसन जाँच गरी फेरि प्रयास गर्नुहोस्।</translation> <translation id="2177950615300672361">इन्कग्निटो ट्याब: <ph name="TAB_NAME" /></translation> @@ -1469,6 +1481,7 @@ <translation id="2948300991547862301"><ph name="PAGE_TITLE" /> मा जानुहोस्</translation> <translation id="29488703364906173">आधुनिक वेबको लागि निर्मित एउटा छिटो, सरल, र सुरक्षित वेब ब्राउजर।</translation> <translation id="2949289451367477459">स्थानसम्बन्धी सेवा प्रयोग गर्नुहोस्। स्थानसम्बन्धी अनुमति भएका अनुप्रयोग र सेवाहरूलाई यो यन्त्रको स्थान प्रयोग गर्न दिनुहोस्। स्थानको सटीकता तथा स्थानमा आधारित सेवाहरूलाई सुधार्न Google ले आवधिक रूपमा स्थानसम्बन्धी डेटा सङ्कलन गरी अज्ञात तरिकाले उक्त डेटा प्रयोग गर्न सक्छ। <ph name="BEGIN_LINK1" />थप जान्नुहोस्<ph name="END_LINK1" /></translation> +<translation id="2950666755714083615">मलाई साइन अप गर्नुहोस्</translation> <translation id="2956070239128776395">समूहभित्र खण्ड छ: <ph name="ERROR_LINE" /></translation> <translation id="2957117904572187936">कुनै पनि साइटलाई आफ्नो यन्त्रका फाइल वा फोल्डरहरू सम्पादन गर्न नदिनुहोस्</translation> <translation id="2958721676848865875">प्याक विस्तारसम्बन्धी चेतावनी</translation> @@ -1593,6 +1606,7 @@ <translation id="3139925690611372679">पूर्वनिर्धारित पहेँलो अवतार</translation> <translation id="3141318088920353606">सुन्दै...</translation> <translation id="3141917231319778873">दिइएको अनुरोध "<ph name="DEVICE_NAME" />" ले समर्थन गर्दैन।</translation> +<translation id="3142562627629111859">नयाँ समूह</translation> <translation id="3143515551205905069">सिंक रद्द गर्नुहोस्</translation> <translation id="3143754809889689516">सुरुबाट प्ले गर्नुहोस्</translation> <translation id="3144647712221361880">यस रूपमा लिंक खोल्नुहोस्</translation> @@ -1617,6 +1631,7 @@ <translation id="3159493096109238499">बेइज</translation> <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (हार्डवेयर समर्थित)</translation> <translation id="3161522574479303604">सबै भाषाहरू</translation> +<translation id="3162853326462195145">विद्यालयको खाता</translation> <translation id="3162899666601560689">साइटहरूले तपाईंलाई राम्रो ब्राउजिङ अनुभव दिन कुकीहरूको प्रयोग गर्न सक्छन्। उदाहरणको लागि साइटहरूले कुकीहरूको प्रयोग गरी तपाईंलाई साइन इन अवस्थामै राख्न वा तपाईंको किनमेलको कार्टमा भएका वस्तुहरू सम्झन सक्छन्।</translation> <translation id="3163201441334626963">बिक्रेता <ph name="VENDOR_ID" /> बाट अज्ञात उत्पादन <ph name="PRODUCT_ID" /></translation> <translation id="3164329792803560526"><ph name="APP_NAME" /> सँग यो ट्याब आदान प्रदान गर्दै</translation> @@ -1778,6 +1793,7 @@ <translation id="3396800784455899911">"स्वीकार गरी जारी राख्नुहोस् " नामक बटनमा क्लिक गरेर तपाईं Google का यी सेवाहरूका लागि माथि वर्णन गरिएको प्रक्रियामा सहमति जनाउनु हुन्छ।</translation> <translation id="3399432415385675819">सूचनाहरू प्राप्त गर्ने सुविधालाई असक्षम पारिनेछ</translation> <translation id="3400390787768057815"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (<ph name="REFRESH_RATE" /> Hertz) - अन्तर्गर्भित</translation> +<translation id="3402585168444815892">डेमो मोडमा दर्ता गर्दै</translation> <translation id="340282674066624"><ph name="DOWNLOAD_RECEIVED" />, <ph name="TIME_LEFT" /></translation> <translation id="3404065873681873169">यो साइटका लागि कुनै पनि पासवर्ड सुरक्षित गरिएको छैन</translation> <translation id="3405664148539009465">फन्टहरूलाई आफू अनुकूल गर्नुहोस्</translation> @@ -1839,6 +1855,7 @@ <translation id="3468999815377931311">Android फोन</translation> <translation id="3470442499439619530">यो प्रयोगकर्ता हटाउनुहोस्</translation> <translation id="3471876058939596279">भिडियोसम्बन्धी प्रयोजनका लागि HDMI र USB Type-C पोर्टहरू एकै समयमा प्रयोग गर्न मिल्दैन। कुनै अर्को भिडियो पोर्ट प्रयोग गर्नुहोस्।</translation> +<translation id="3473241910002674503">ट्याब्लेट मोडमा हुँदा गर्दा बटनहरूको प्रयोग गरी गृह स्क्रिनमा जानुहोस्, पछाडि फर्कनुहोस् र एउटा अनुप्रयोगबाट अर्को अनुप्रयोगमा जानुहोस्।</translation> <translation id="3473479545200714844">स्क्रिन म्याग्निफायर</translation> <translation id="3475843873335999118">माफ गर्नुहोस्, तपाईंको फिंगरप्रिन्ट अझै पहिचान भएन। कृपया आफ्नो पासवर्ड प्रविष्टि गर्नुहोस्।</translation> <translation id="3476303763173086583">प्रयोग तथा निदानसम्बन्धी डेटा पठाउनुहोस्। निदान, यन्त्र र अनुप्रयोगको उपयोगसम्बन्धी डेटा स्वतः Google मा पठाएर आफ्ना बालकको Android सम्बन्धी अनुभवलाई सुधार गर्न मद्दत गर्नुहोस्। यस्तो डेटा तपाईंका बालकको पहिचान गर्ने प्रयोजनका लागि प्रयोग गरिने छैन र यसले प्रणाली तथा अनुप्रयोगको स्थिरता र थप कुराहरू सुधार गर्न मद्दत गर्ने छ। केही एकीकृत डेटाले Google का अनुप्रयोग तथा Android का विकासकर्ता जस्ता साझेदारहरूलाई पनि मद्दत गर्ने छ। मालिकले यो <ph name="BEGIN_LINK1" />सेटिङ<ph name="END_LINK1" /> लागू गर्नुभएको हो। मालिकले यस यन्त्रको निदान तथा प्रयोगसम्बन्धी डेटा Google मा पठाउने विकल्प छनौट गर्न सक्नुहुन्छ। तपाईंका बालकको खातामा वेब तथा अनुप्रयोगसम्बन्धी अतिरिक्त क्रियाकलापको सेटिङ सक्रिय गरिएको छ भने यो डेटा उनको Google खातामा सुरक्षित गरिन सक्छ। <ph name="BEGIN_LINK2" />थप जान्नुहोस्<ph name="END_LINK2" /></translation> @@ -1878,6 +1895,7 @@ <translation id="3515983984924808886">रिसेट गर्ने कार्य पुष्टि गर्न आफ्नो सुरक्षा साँचो फेरि छुनुहोस्। सुरक्षा साँचोको PIN लगायत यस साँचोमा भण्डार गरिएका सबै जानकारी मेटाइने छन्।</translation> <translation id="3518985090088779359">स्वीकार र जारी</translation> <translation id="351952459507671940">नयाँ समूहमा थप्नुहोस्</translation> +<translation id="3521606918211282604">डिस्कको आकार बदल्नुहोस्</translation> <translation id="3523642406908660543">तपाईँको कम्प्युटर पहुँच गर्नको लागि साइटले प्लगइन प्रयोग गर्न कहिले चाहन्छ सोध्नुहोस् (सिफारिस गरिएको)</translation> <translation id="3524965460886318643">निर्यातसम्बन्धी क्रियाकलापहरू</translation> <translation id="3526034519184079374">साइटको डेटा पढ्न वा त्यसमा परिवर्तन गर्न सकिएन</translation> @@ -1965,6 +1983,7 @@ <translation id="3629631988386925734">Smart Lock सक्षम पार्न आफ्नो पासवर्ड प्रविष्टि गर्नुहोस्। अर्को पटकदेखि तपाईंको फोनले तपाईंको <ph name="DEVICE_TYPE" /> अनलक गर्ने छ। तपाईं सेटिङहरूमा गई Smart Lock निष्क्रिय पार्न सक्नुहुन्छ।</translation> <translation id="3630132874740063857">तपाईंको फोन</translation> <translation id="3630995161997703415">यो साइट जुनसुकै बेला प्रयोग गर्न यसलाई आफ्नो सेल्फमा थप्नुहोस्</translation> +<translation id="3633309367764744750">पृष्ठहरूबाट अग्रिम रूपमा जानकारी निकाल्छ। यी पृष्ठहरूमा तपाईंले हालसम्म नहेर्नुभएका पृष्ठहरू पनि समावेश हुन्छन्। तपाईंले कुकीलाई अनुमति दिनुभएको छ भने पृष्ठबाट निकालिने जानकारीमा कुकीहरू पनि समावेश हुन सक्छन्।</translation> <translation id="3634507049637220048"><ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" /> मध्ये नेटवर्क <ph name="NETWORK_INDEX" />, तपाईंका प्रशासकले व्यवस्थित गर्नुभएको छ, विवरणहरू</translation> <translation id="3635241501480133979">यो डेटा तपाईंको सङ्गठनको सुरक्षासम्बन्धी नीतिहरूको उल्लङ्घन हुने भएकाले यो डेटा ड्रप गर्न सकिँदैन</translation> <translation id="3635353578505343390">Google लाई प्रतिक्रिया पठाउनुहोस्</translation> @@ -2325,6 +2344,7 @@ <translation id="4068506536726151626">यो पृष्ठमा तपाईंको स्थान ट्र्याक गरिरहेका निम्न साइटहरूको तत्त्वहरू सम्मिलित छ।</translation> <translation id="4068776064906523561">सुरक्षित गरिएका फिंगरप्रिन्टहरू</translation> <translation id="407173827865827707">क्लिक गर्दा</translation> +<translation id="4073520450811433493">सेटिङ सिंक गर्ने</translation> <translation id="4074900173531346617">इमेल साइनर प्रमाणपत्र</translation> <translation id="407520071244661467">मापन</translation> <translation id="4075639477629295004"><ph name="FILE_NAME" /> लाई cast गर्न सकिएन।</translation> @@ -2604,6 +2624,7 @@ <translation id="4479877282574735775">भर्चुअल मेसिन कन्फिगर गर्दै। यस कार्यमा केही मिनेट लाग्न सक्छ।</translation> <translation id="4480590691557335796">Chrome ले तपाईंको कम्प्युटरमा हानिकारक सफ्टवेयर भेट्टाउन र त्यसलाई हटाउन सक्छ</translation> <translation id="4481530544597605423">जोडा हटाइएका यन्त्रहरू</translation> +<translation id="4488107067273194838">सेटअप गरिसकेपछि ब्राउजरका सिंकसम्बन्धी विकल्पहरूको समीक्षा गर्नुहोस्</translation> <translation id="4488502501195719518">सबै डेटा खाली गर्ने हो?</translation> <translation id="4495419450179050807">यो पेजमा नदेखाउनुहोस्</translation> <translation id="4496054781541092778"><ph name="PERMISSION" /> माथि स्वतः रोक लगाइएको छ</translation> @@ -2861,6 +2882,7 @@ <translation id="4871322859485617074">PIN मा अमान्य वर्णहरू छन्</translation> <translation id="4871370605780490696">पृष्ठमञ्जूषा थप्नुहोस्</translation> <translation id="4871719318659334896">समूह बन्द गर्नुहोस्</translation> +<translation id="4871852311166078968">समूहमा थप्नुहोस्</translation> <translation id="4873312501243535625">मिडिया फाइल परीक्षक</translation> <translation id="4876273079589074638">हाम्रा इन्जिनियरहरूलाई यो क्र्यासको छानबिन गर्न र त्यसलाई समाधान गर्नमा मद्दत गर्नुहोस्। सम्भव भएसम्म हरेक कदमहरू जस्ताको तस्तै सूचीबद्ध गर्नुहोस्। कुनै पनि विवरण कम महत्त्वपूर्ण हुँदैन!</translation> <translation id="4876895919560854374">स्क्रिनलाई लक र अनलक गर्नुहोस्</translation> @@ -3500,6 +3522,7 @@ <translation id="5739235828260127894">पुष्टिका लागि प्रतीक्षा गर्दै। <ph name="LINK_BEGIN" />थप जान्नुहोस्।<ph name="LINK_END" /></translation> <translation id="5739458112391494395">धेरै ठुलो</translation> <translation id="574209121243317957">पिच</translation> +<translation id="5745136023067925867"><ph name="DEVICE_TYPE" /> सम्बन्धी सुझाव, योजना तथा अद्यावधिक प्राप्त गर्नुहोस् र प्रतिक्रिया दिनुहोस्</translation> <translation id="5746169159649715125">पीडीएपको रूपमा बचत गर्नुहोस्</translation> <translation id="5747552184818312860">म्याद सकिन्छ</translation> <translation id="5747785204778348146">विकासकर्ता - अस्थिर</translation> @@ -3913,6 +3936,7 @@ <translation id="6298962879096096191">Android का अनुप्रयोगहरूको स्थापना गर्न Google Play को प्रयोग गर्नुहोस्</translation> <translation id="630065524203833229">बा&हिर निस्कनुहोस्</translation> <translation id="6300718114348072351"><ph name="PRINTER_NAME" /> स्वतः कन्फिगर गर्न सकिएन। कृपया प्रिन्टरका उन्नत विवरणहरू तोक्नुहोस्। <ph name="LINK_BEGIN" />थप जान्नुहोस्<ph name="LINK_END" /></translation> +<translation id="630292539633944562">व्यक्तिगत जानकारीसम्बन्धी सिफारिसहरू</translation> <translation id="6305607932814307878">विश्वव्यापी नीति:</translation> <translation id="6307990684951724544">प्रणाली व्यस्त</translation> <translation id="6308493641021088955"><ph name="EXTENSION_NAME" /> ले प्रदान गरेको साइन इन स्क्रिन</translation> @@ -3961,7 +3985,6 @@ <translation id="6365411474437319296">परिवार र साथीहरू थप्नुहोस्</translation> <translation id="636850387210749493">उद्यम भर्ना</translation> <translation id="6370021412472292592">म्यानिफेस्ट लोड गर्न सकिएन।</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{पासवर्ड परिवर्तन गर्नुहोस्}other{पासवर्डहरू परिवर्तन गर्नुहोस्}}</translation> <translation id="6374077068638737855">आइसवेसल</translation> <translation id="6374469231428023295">फेरि प्रयास गर्नुहोस्</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' को १ परिणाम</translation> @@ -3991,6 +4014,7 @@ <translation id="641081527798843608">विषयको मिलान</translation> <translation id="6412673304250309937">Chrome मा भण्डारण गरिएका असुरक्षित साइटको सूची जाँच गरी URL हरू सुरक्षित छन् वा छैनन् भन्ने कुरा यकिन गर्छ। कुनै साइटले तपाईंको पासवर्ड चोरी गर्न खोज्दा वा तपाईंले कुनै हानिकारक फाइल डाउनलोड गर्दा Chrome ले पृष्ठका केही सामग्रीसहित URL हरूलाई सुरक्षित ब्राउजिङमा पठाउन पनि सक्छ।</translation> <translation id="6412931879992742813">नयाँ गुप्त विण्डो</translation> +<translation id="6413591858632097328">यस कार्यले <ph name="ORIGIN_NAME" /> ले भण्डारण गरेका सबै डेटा र कुकीका साथै यसले स्थापना गरेका अनुप्रयोगहरू मेटाउने छ।</translation> <translation id="641469293210305670">अद्यावधिक र अनुप्रयोगहरू स्थापना गर्नुहोस्</translation> <translation id="6414888972213066896">तपाईंले यो साइटमा जानु ठिक हुन्छ वा हुँदैन भनेर आफ्नो अभिभावकलाई सोध्नुभएको थियो</translation> <translation id="6415900369006735853">आफ्नो फोनमार्फत इन्टरनेटमा जोडिनुहोस्</translation> @@ -4405,6 +4429,7 @@ <translation id="6997642619627518301"><ph name="NAME_PH" /> - क्रियाकलापको लग</translation> <translation id="6997707937646349884">तपाईंका यन्त्रहरूमा:</translation> <translation id="6998793565256476099">भिडियो सम्मेलनका लागि यन्त्र दर्ता गर्नुहोस्</translation> +<translation id="6999956497249459195">नयाँ समूह</translation> <translation id="7000206553895739324"><ph name="PRINTER_NAME" /> जोडिएको छ तर यसलाई कन्फिगर गर्नु पर्छ</translation> <translation id="7000347579424117903">Ctrl, Alt वा खोज कुञ्जी समावेश गर्नुहोस्</translation> <translation id="7001036685275644873">Linux अनुप्रयोग र फाइलहरू ब्याकअप गरिँदै</translation> @@ -4702,6 +4727,7 @@ <translation id="7400418766976504921">URL</translation> <translation id="7400839060291901923">आफ्नो <ph name="PHONE_NAME" /> मा जडान सेटअप गर्नुहोस्</translation> <translation id="7401778920660465883">यो सन्देश हटाउनुहोस्</translation> +<translation id="7403642243184989645">स्रोतहरू डाउनलोड गर्दै</translation> <translation id="7405938989981604410">{NUM_HOURS,plural, =1{१ घन्टाअघि सुरक्षा जाँच गरिएको थियो}other{{NUM_HOURS} घन्टाअघि सुरक्षा जाँच गरिएको थियो}}</translation> <translation id="740624631517654988">पप-अप रोकिएको</translation> <translation id="7407430846095439694">आयात गनुहोस् र बाँध्नुहोस्</translation> @@ -4937,6 +4963,7 @@ <translation id="7716781361494605745">नेटस्केप प्रमाणीकरण प्राधिकरण नीति URL</translation> <translation id="7717014941119698257">डाउनलोड गर्दै: <ph name="STATUS" /></translation> <translation id="7717845620320228976">अद्यावधिकहरू उपलब्ध छन् वा छैनन् भनी जाँच्नुहोस्</translation> +<translation id="7719070594859855691">क्यामेरा प्रयोग गर्न दिनुहोस्</translation> <translation id="7719367874908701697">पृष्ठ जुम</translation> <translation id="7721179060400456005">विन्डोलाई डिस्प्लेहरू फैलाउने अनुमति दिनुहोस्</translation> <translation id="7722040605881499779">अद्यावधिकका लागि आवश्यक खाली ठाउँ: <ph name="NECESSARY_SPACE" /></translation> @@ -5254,6 +5281,7 @@ <translation id="8107015733319732394">तपाईंको <ph name="DEVICE_TYPE" /> मा उक्त Google Play स्टोर स्थापना गर्दै। यस कार्यमा केही समय लाग्नसक्छ।</translation> <translation id="8108526232944491552">{COUNT,plural, =0{कुनै पनि तेस्रो पक्षीय कुकी छैन}=1{१ तेस्रो पक्षीय कुकीलाई रोक लगाइयो}other{# वटा तेस्रो पक्षीय कुकीलाई रोक लगाइयो}}</translation> <translation id="810875025413331850">वरपर कुनै पनि यन्त्र भेटिएन।</translation> +<translation id="8114199541033039755">ट्याब्लेट मोडमा हुँदा गर्दा बटनहरूको प्रयोग गरी गृह स्क्रिनमा जानुहोस्, पछाडि फर्कनुहोस् र एउटा अनुप्रयोगबाट अर्को अनुप्रयोगमा जानुहोस्। यी बटनहरू ChromeVox वा स्वचालित क्लिक सुविधा सक्षम पारिएका बेला सक्रिय हुन्छन्।</translation> <translation id="8114875720387900039">तेर्सो रूपमा विभाजन गर्नुहोस्</translation> <translation id="8116972784401310538">&बुकमार्क व्यवस्थापक</translation> <translation id="8117620576188476503">स्थितिसम्बन्धी ट्रेमार्फत जडान, अद्यावधिक र सेटिङहरू व्यवस्थित गर्नुहोस्। किबोर्डमार्फत यो कार्य गर्न Alt + Shift + S थिच्नुहोस्।</translation> @@ -5373,6 +5401,7 @@ <translation id="8263744495942430914"><ph name="FULLSCREEN_ORIGIN" /> ले तपाइँको माउस कर्सरलाई असक्षम गरेको छ।</translation> <translation id="8264024885325823677">तपाईंका प्रशासक यो सेटिङ मिलाउनुहुन्छ।</translation> <translation id="8264718194193514834">"<ph name="EXTENSION_NAME" />" ले फुल स्क्रिन ट्रिगर गर्यो।</translation> +<translation id="826511437356419340">विन्डोको रूपरेखा मोडमा प्रवेश गरियो। तपाईं किबोर्ड प्रयोग गर्दै हुनुहुन्छ भने नेभिगेसन गर्न स्वाइप गर्नुहोस् वा tab थिच्नुहोस्।</translation> <translation id="8267961145111171918"><ph name="BEGIN_PARAGRAPH1" />यो जानकारी यस यन्त्र र यसको प्रयोग (जस्तै ब्याट्रीको स्तर, प्रणाली तथा अनुप्रयोगका क्रियाकलाप र त्रुटिहरू) सम्बन्धी सामान्य जानकारी हो। यो डेटालाई Android मा सुधार गर्ने प्रयोजनका लागि प्रयोग गरिने छ र केही एकत्रित जानकारीले Google का अनुप्रयोग तथा Android का विकासकर्ता जस्ता साझेदारहरूलाई तिनका अनुप्रयोग र उत्पादनहरू अझ राम्रो बनाउन पनि मद्दत गर्ने छ।<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />यो सुविधा निष्क्रिय पार्नुले प्रणालीका अद्यावधिक र सुरक्षा जस्ता अत्यावश्यक सेवाहरूलाई आवश्यक पर्ने जानकारी पठाउने यस यन्त्रको क्षमतामा भने कुनै असर पर्दैन।<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />यस यन्त्रका मालिक सेटिङहरू > उन्नत > निदान तथा प्रयोगसम्बन्धी डेटा Google मा स्वतः पठाउनुहोस् नामक विकल्पमा गई यो सुविधा नियन्त्रण गर्न सक्नुहुन्छ।<ph name="END_PARAGRAPH3" /> @@ -5481,6 +5510,7 @@ <translation id="8426713856918551002">सक्षम पार्दै</translation> <translation id="8427292751741042100">कुनै पनि होस्टमा इम्बेड गरिएको</translation> <translation id="8428213095426709021">सेटिङहरू</translation> +<translation id="8428271547607112339">विद्यालयको खाता थप्नुहोस्</translation> <translation id="8428628598981198790">तपाईंको सुरक्षा साँचो यस साइटमा प्रयोग गर्न सकिँदैन</translation> <translation id="84297032718407999"><ph name="LOGOUT_TIME_LEFT" /> मा तपाईंलाई साइन आउट गरिने छ</translation> <translation id="8431190899827883166">ट्यापहरू देखाउनुहोस्</translation> @@ -5543,6 +5573,7 @@ <translation id="851263357009351303">छविहरू देखाउन <ph name="HOST" /> लाई सधैँ अनुमति दिनुहोस्</translation> <translation id="8513108775083588393">स्वतः परिक्रमा</translation> <translation id="8514746246728959655">कुनै अर्को सुरक्षा साँचो प्रयोग गरी हेर्नुहोस्</translation> +<translation id="851960115758509829">तपाईंका अनुप्रयोग, सेटिङ र रोजाइअनुसारका अन्य कुराहरू तपाईंले आफ्नो Google खातामार्फत साइन गर्नुभएका Chrome OS चल्ने सबै यन्त्रहरूमा सिंक हुने छन्।</translation> <translation id="8521475323816527629">आफ्ना अनुप्रयोगहरू छिटो प्राप्त गर्नुहोस्</translation> <translation id="8523493869875972733">परिवर्तनहरू कायम राख्नुहोस्</translation> <translation id="8523849605371521713">नीतिद्वारा थपिएको</translation> @@ -5823,11 +5854,13 @@ <translation id="885701979325669005">भण्डारण</translation> <translation id="8859057652521303089">तपाइँको भाषा चयन गर्नुहोस्:</translation> <translation id="8859174528519900719">सबफ्रेम: <ph name="SUBFRAME_SITE" /></translation> +<translation id="8859662783913000679">अभिभावकको खाता</translation> <translation id="8862003515646449717">कुनै द्रुत ब्राउजरमा स्विच गर्नुहोस्</translation> <translation id="8863753581171631212">लिंकलाई नयाँ <ph name="APP" /> मा खोल्नुहोस्</translation> <translation id="8864055848767439877"><ph name="APP_NAME" /> सँग <ph name="TAB_NAME" /> आदान प्रदान गर्दै</translation> <translation id="8864458770072227512">यो यन्त्रबाट <ph name="EMAIL" /> हटाइयो</translation> <translation id="8867228703146808825">बिल्डसम्बन्धी विवरणहरू प्रतिलिपि गरेर क्लिपबोर्डमा राख्नुहोस्</translation> +<translation id="8868333925931032127">डेमो मोड सुरु गर्दै</translation> <translation id="8868626022555786497">प्रयोगमा रहेको</translation> <translation id="8870413625673593573">हालै बन्द गरिएको</translation> <translation id="8871551568777368300">प्रशासकद्वारा पिन गरिएको</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index b975b56..5806351 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Familie en vrienden toevoegen</translation> <translation id="636850387210749493">Aanmelding voor Enterprise</translation> <translation id="6370021412472292592">Kan manifest niet laden.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Wachtwoord wijzigen}other{Wachtwoorden wijzigen}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Opnieuw proberen</translation> <translation id="6377268785556383139">Eén resultaat voor '<ph name="SEARCH_TEXT" />'</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 73b7b61..d61c243 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -3996,7 +3996,6 @@ <translation id="6365411474437319296">Legg til familie og venner</translation> <translation id="636850387210749493">Bedriftsregistrering</translation> <translation id="6370021412472292592">Kunne ikke laste inn manifestet.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Endre passordet}other{Endre passordene}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Prøv på nytt</translation> <translation id="6377268785556383139">1 resultat for «<ph name="SEARCH_TEXT" />»</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index f2d4c12b..d7c035a 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -3984,7 +3984,6 @@ <translation id="6365411474437319296">ଫ୍ୟାମିଲି ଏବଂ ବନ୍ଧୁମାନଙ୍କୁ ଯୋଗ କରନ୍ତୁ</translation> <translation id="636850387210749493">ଏଣ୍ଟର୍ପ୍ରାଇଜ୍ ନାମାଙ୍କନ</translation> <translation id="6370021412472292592">ମାନିଫେଷ୍ଟକୁ ଲୋଡ୍ କରାଯାଇପାରିଲା ନାହିଁ।</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{ପାସୱାର୍ଡ ପରିବର୍ତ୍ତନ କରନ୍ତୁ}other{ପାସୱାର୍ଡଗୁଡ଼ିକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' ପାଇଁ 1ଟି ଫଳାଫଳ</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 2a5f7bb..ad744be02 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">ਪ੍ਰਿੰਟ ਸਰਵਰ</translation> <translation id="1805967612549112634">ਪਿੰਨ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation> <translation id="1806335016774576568">ਕਿਸੇ ਹੋਰ ਖੁੱਲ੍ਹੀ ਐਪ 'ਤੇ ਜਾਓ</translation> +<translation id="1809483812148634490">ਤੁਹਾਡੇ ਵੱਲੋਂ Google Play ਤੋਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਗਈਆਂ ਐਪਾਂ ਇਸ Chromebook ਤੋਂ ਮਿਟਾ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ। + <ph name="LINE_BREAKS1" /> + ਤੁਹਾਡੇ ਵੱਲੋਂ ਖਰੀਦੀ ਸਮੱਗਰੀ ਜਿਵੇਂ ਫ਼ਿਲਮਾਂ, ਟੀਵੀ ਸ਼ੋਅ, ਸੰਗੀਤ, ਕਿਤਾਬਾਂ, ਜਾਂ ਹੋਰ ਐਪ-ਵਿੱਚ ਖਰੀਦਾਂ ਵੀ ਮਿਟਾਈਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ। + <ph name="LINE_BREAKS2" /> + ਇਹ ਹੋਰ ਡੀਵਾਈਸਾਂ ਦੀਆਂ ਐਪਾਂ ਜਾਂ ਸਮੱਗਰੀ 'ਤੇ ਅਸਰ ਨਹੀਂ ਪਾਉਂਦਾ।</translation> <translation id="1809734401532861917"><ph name="USER_EMAIL_ADDRESS" /> ਵਿੱਚ ਮੇਰੇ ਬੁੱਕਮਾਰਕ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡ ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="1813278315230285598">ਸੇਵਾਵਾਂ</translation> <translation id="18139523105317219">EDI ਪਾਰਟੀ ਨਾਮ</translation> @@ -1392,6 +1397,7 @@ <translation id="2825848369316359348">ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕੁੰਜੀ ਦੇ ਪਿਛਲੇ ਪਾਸੇ ਪ੍ਰਿੰਟ ਕੀਤਾ ਨਾਮ ਲੱਭੋ</translation> <translation id="2828650939514476812">ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ</translation> <translation id="2835294513443818940">ਇਸ ਫ਼ਾਈਲ ਨੂੰ ਸੁਰੱਖਿਅਤ ਢੰਗ ਨਾਲ ਡਾਊਨਲੋਡ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।</translation> +<translation id="2835547721736623118">ਬੋਲੀ ਪਛਾਣ ਸੇਵਾ</translation> <translation id="2836269494620652131">ਕ੍ਰੈਸ਼</translation> <translation id="2836635946302913370">ਇਸ ਵਰਤੋਂਕਾਰ ਨਾਮ ਨਾਲ ਸਾਈਨ ਇਨ ਕਰਨ ਨੂੰ ਤੁਹਾਡੇ ਪ੍ਰਬੰਧਕ ਵੱਲੋਂ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।</translation> <translation id="283669119850230892">ਨੈੱਟਵਰਕ <ph name="NETWORK_ID" /> ਵਰਤਣ ਲਈ, ਪਹਿਲਾਂ ਹੇਠਾਂ ਇੰਟਰਨੈਟ ਨਾਲ ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਨੂੰ ਪੂਰਾ ਕਰੋ।</translation> @@ -1535,6 +1541,7 @@ <translation id="3019285239893817657">ਉਪ-ਪੰਨਾ ਬਟਨ</translation> <translation id="3020183492814296499">ਸ਼ਾਰਟਕੱਟ</translation> <translation id="3020990233660977256">ਲੜੀ ਨੰਬਰ: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">ਜਦੋਂ ਚਾਰਜ ਨਾ ਹੋ ਰਿਹਾ ਹੋਵੇ</translation> <translation id="3021066826692793094">ਤਿਤਲੀ</translation> <translation id="3021678814754966447">&ਫ੍ਰੇਮ ਸ੍ਰੋਤ ਦੇਖੋ</translation> <translation id="3022978424994383087">ਸਮਝ ਨਹੀਂ ਆਇਆ।</translation> @@ -2731,6 +2738,7 @@ <translation id="4633757335284074492">'Google ਡਰਾਈਵ' ਵਿੱਚ ਬੈਕਅੱਪ ਲਓ। ਕਿਸੇ ਵੇਲੇ ਵੀ ਅਸਾਨੀ ਨਾਲ ਡਾਟਾ ਮੁੜ-ਬਹਾਲ ਕਰੋ ਜਾਂ ਡੀਵਾਈਸਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰੋ। ਇਸ ਬੈਕਅੱਪ ਵਿੱਚ ਐਪ ਡਾਟਾ ਸ਼ਾਮਲ ਹੈ। ਇਹ ਬੈਕਅੱਪ Google 'ਤੇ ਅੱਪਲੋਡ ਕੀਤੇ ਜਾਂਦੇ ਹਨ ਅਤੇ ਤੁਹਾਡੇ ਬੱਚੇ ਦੇ Google ਖਾਤੇ ਦੇ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਇਨਕ੍ਰਿਪਟ ਕੀਤੇ ਜਾਂਦੇ ਹਨ।</translation> <translation id="4634771451598206121">ਦੁਬਾਰਾ ਸਾਈਨ-ਇਨ ਕਰੋ…</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> ਮਹਿਮਾਨ ਵਰਤੋਂਕਾਰਾਂ ਲਈ ਉਪਲਬਧ ਨਹੀਂ ਹੈ।</translation> +<translation id="4635444580397524003">Linux ਬੈਕਅੱਪ ਨੂੰ ਸਫਲਤਾਪੂਰਵਕ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਗਿਆ।</translation> <translation id="4636930964841734540">ਜਾਣਕਾਰੀ</translation> <translation id="4637083375689622795">ਹੋਰ ਕਾਰਵਾਈਆਂ, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB ਡੀਬੱਗਿੰਗ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> @@ -2906,6 +2914,7 @@ <translation id="4890773143211625964">ਉੱਨਤ ਪ੍ਰਿੰਟਰ ਵਿਕਲਪ ਦਿਖਾਓ </translation> <translation id="4891089016822695758">ਬੀਟਾ ਫ਼ੋਰਮ</translation> <translation id="4892229439761351791">ਸਾਈਟ ਬਲੂਟੁੱਥ ਨੂੰ ਵਰਤ ਸਕਦੀ ਹੈ</translation> +<translation id="489258173289528622">ਬੈਟਰੀ ਚਾਰਜ ਨਾ ਹੋਣ ਦੌਰਾਨ ਅਕਿਰਿਆਸ਼ੀਲ ਕਾਰਵਾਈ</translation> <translation id="4893336867552636863">ਇਸ ਨਾਲ ਇਸ ਡੀਵਾਈਸ ਤੋਂ ਤੁਹਾਡਾ ਬ੍ਰਾਉਜ਼ਿੰਗ ਡਾਟਾ ਸਥਾਈ ਤੌਰ 'ਤੇ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> <translation id="4893522937062257019">ਲਾਕ ਸਕ੍ਰੀਨ 'ਤੇ</translation> <translation id="489454699928748701">ਸਾਈਟਾਂ ਨੂੰ ਗਤੀਸ਼ੀਲਤਾ ਸੈਂਸਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਦਿਓ</translation> @@ -3612,6 +3621,7 @@ <translation id="5863445608433396414">ਡੀਬੱਗਿੰਗ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕਰੋ</translation> <translation id="5864195618110239517">ਮੀਟਰਡ ਕਨੈਕਸ਼ਨ ਵਰਤੋ</translation> <translation id="5864471791310927901">DHCP ਲੁਕਅੱਪ ਅਸਫ਼ਲ ਹੋ ਗਿਆ</translation> +<translation id="5864754048328252126">ਚਾਰਜ ਕਰਨ ਦੌਰਾਨ ਅਕਿਰਿਆਸ਼ੀਲ ਕਾਰਵਾਈ</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> ਨੂੰ ਜਲਦ ਰੋਕਿਆ ਜਾਵੇਗਾ</translation> <translation id="586567932979200359">ਤੁਸੀਂ ਇਸਦੇ ਡਿਸਕ ਚਿੱਤਰ ਤੋਂ <ph name="PRODUCT_NAME" /> ਚਲਾ ਰਹੇ ਹੋ। ਇਸਨੂੰ ਆਪਣੇ ਕੰਪਿਊਟਰ 'ਤੇ ਸਥਾਪਤ ਕਰਨ ਨਾਲ ਇਹ ਤੁਹਾਨੂੰ ਬਿਨਾਂ ਡਿਸਕ ਇਮੇਜ ਦੇ ਚਲਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ ਅਤੇ ਇਹ ਪੱਕਾ ਕਰਦਾ ਹੈ ਕਿ ਇਸਨੂੰ ਅੱਪ ਟੂ ਡੇਟ ਰੱਖਿਆ ਜਾਵੇਗਾ।</translation> <translation id="5865733239029070421">Google ਨੂੰ ਵਰਤੋਂ ਅੰਕੜੇ ਅਤੇ ਕ੍ਰੈਸ਼ ਰਿਪੋਰਟਾਂ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਭੇਜਦੀ ਹੈ</translation> @@ -3811,6 +3821,7 @@ <translation id="6120205520491252677">ਸਟਾਰਟ ਸਕ੍ਰੀਨ ਲਈ ਇਹ ਸਫ਼ਾ ਪਿਨ ਕਰੋ...</translation> <translation id="6122081475643980456">ਤੁਹਾਡੇ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਤੇ ਨਿਯੰਤਰਣ ਪਾਇਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="6122095009389448667">ਇਸ ਸਾਈਟ ਨੂੰ ਕਲਿੱਪਬੋਰਡ ਦੇਖਣ ਤੋਂ ਬਲਾਕ ਕਰਦੇ ਰਹੋ</translation> +<translation id="6122831415929794347">ਕੀ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?</translation> <translation id="6122875415561139701">ਇਸ 'ਤੇ ਲਿਖਣ ਦੀ ਕਿਰਿਆ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ: "<ph name="DEVICE_NAME" />"।</translation> <translation id="6124650939968185064">ਅਨੁਸਰਣ ਐਕਸਟੈਂਸ਼ਨਾਂ ਇਸ ਐਕਸਟੈਂਸ਼ਨਾਂ 'ਤੇ ਨਿਰਭਰ ਹਨ:</translation> <translation id="6124698108608891449">ਇਸ ਸਾਈਟ ਨੂੰ ਹੋਰ ਇਜਾਜ਼ਤਾਂ ਦੀ ਲੋੜ ਹੈ।</translation> @@ -3988,7 +3999,6 @@ <translation id="6365411474437319296">ਪਰਿਵਾਰ ਅਤੇ ਦੋਸਤਾਂ ਨੂੰ ਜੋੜੋ</translation> <translation id="636850387210749493">ਐਂਟਰਪ੍ਰਾਈਜ਼ ਐਨਰੌਲਮੈਂਟ</translation> <translation id="6370021412472292592">ਮੈਨੀਫ਼ੈਸਟ ਲੋਡ ਨਹੀਂ ਕਰ ਸਕਿਆ।</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{ਪਾਸਵਰਡ ਬਦਲੋ}one{ਪਾਸਵਰਡ ਬਦਲੋ}other{ਪਾਸਵਰਡ ਬਦਲੋ}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' ਲਈ 1 ਨਤੀਜਾ</translation> @@ -4014,6 +4024,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, ਅਤੇ <ph name="WEBSITE_3" /> ਤੇ ਆਪਣਾ ਡਾਟਾ ਪੜ੍ਹੋ ਅਤੇ ਬਦਲੋ</translation> <translation id="6410257289063177456">ਚਿੱਤਰ ਫਾਈਲਾਂ</translation> <translation id="6410328738210026208">ਚੈਨਲ ਅਤੇ ਪਾਵਰਵਾਸ਼ ਬਦਲੋ</translation> +<translation id="6410390304316730527">ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਜਿਹੇ ਹਮਲਾਵਾਰਾਂ ਤੋਂ ਤੁਹਾਡੀ ਸੁਰੱਖਿਆ ਕਰਦੀ ਹੈ ਜੋ ਖਰਾਬ ਸਾਫ਼ਟਵੇਅਰ ਨੂੰ ਸਥਾਪਤ ਕਰਨ ਜਾਂ ਪਾਸਵਰਡ ਫ਼ੋਨ ਨੰਬਰ ਜਾਂ ਕ੍ਰੈਡਿਟ ਕਾਰਡਾਂ ਵਰਗੀ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਦਾ ਖੁਲਾਸਾ ਕਰਨ ਵਰਗੇ ਖਤਰਨਾਕ ਕੰਮ ਕਰਕੇ ਤੁਹਾਡੇ ਨਾਲ ਚਾਲਬਾਜ਼ੀ ਕਰ ਸਕਦੇ ਹਨ। ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬੰਦ ਕਰਦੇ ਹੋ, ਤਾਂ ਅਣਪਛਾਤੀਆਂ ਅਤੇ ਅਪ੍ਰਸਿੱਧ ਸਾਈਟਾਂ 'ਤੇ ਬ੍ਰਾਊਜ਼ ਕਰਦੇ ਸਮੇਂ ਸਾਵਧਾਨ ਰਹੋ।</translation> <translation id="6410668567036790476">ਖੋਜ ਇੰਜਣ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="641081527798843608">ਵਿਸ਼ਾ ਮਿਲਾਨ</translation> <translation id="6412673304250309937">Chrome ਵਿੱਚ ਸਟੋਰ ਕੀਤੀਆਂ ਅਸੁਰੱਖਿਅਤ ਸਾਈਟਾਂ ਦੀ ਸੂਚੀ ਦੇ ਨਾਲ URL ਦੀ ਜਾਂਚ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਜੇ ਕੋਈ ਸਾਈਟ ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਨੂੰ ਚੋਰੀ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੀ ਹੈ ਜਾਂ ਜਦੋਂ ਤੁਸੀਂ ਕੋਈ ਨੁਕਸਾਨਦੇਹ ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰਦੇ ਹੋ, ਤਾਂ Chrome ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਨੂੰ ਪੰਨੇ ਦੀ ਥੋੜ੍ਹੀ ਸਮੱਗਰੀ ਸਮੇਤ URL ਵੀ ਭੇਜ ਸਕਦਾ ਹੈ।</translation> @@ -5931,6 +5942,7 @@ <translation id="8951256747718668828">ਕਿਸੇ ਗੜਬੜ ਕਰਕੇ ਮੁੜ-ਬਹਾਲ ਦੀ ਪ੍ਰਕਿਰਿਆ ਨੂੰ ਪੂਰਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> <translation id="8951465597020890363">ਕੀ ਫਿਰ ਵੀ ਮਹਿਮਾਨ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਣਾ ਹੈ?</translation> <translation id="8952831374766033534">ਸੰਰੂਪਣ ਵਿਕਲਪ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">ਚਾਰਜਿੰਗ ਵੇਲੇ</translation> <translation id="895347679606913382">ਸ਼ੁਰੂ ਹੋ ਰਿਹਾ ਹੈ...</translation> <translation id="8957762313041272117">ਲਾਈਵ ਸੁਰਖੀਆਂ</translation> <translation id="895944840846194039">JavaScript ਮੈਮਰੀ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 0f87eba15..60f77bd 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -3997,7 +3997,6 @@ <translation id="6365411474437319296">Dodaj rodzinę i znajomych</translation> <translation id="636850387210749493">Rejestracja w firmie</translation> <translation id="6370021412472292592">Nie można wczytać pliku manifestu.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Zmień hasło}few{Zmień hasła}many{Zmień hasła}other{Zmień hasła}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Spróbuj jeszcze raz</translation> <translation id="6377268785556383139">1 wynik dla zapytania „<ph name="SEARCH_TEXT" />”</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 1581163..c33fc1cb 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -4003,7 +4003,6 @@ <translation id="6365411474437319296">Adicionar familiares e amigos</translation> <translation id="636850387210749493">Registro da empresa</translation> <translation id="6370021412472292592">Não foi possível carregar o manifesto.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Mudar senha}one{Mudar senha}other{Mudar senhas}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Repetir</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation> @@ -4034,7 +4033,7 @@ <translation id="641081527798843608">Correspondência de assunto</translation> <translation id="6412673304250309937">Verifica se os URLs estão em uma lista de sites não seguros armazenada no Chrome. Se um site tentar roubar sua senha ou se você fizer o download de um arquivo nocivo, o Chrome também poderá enviar URLs, incluindo partes do conteúdo da página, para o "Navegação segura".</translation> <translation id="6412931879992742813">Nova janela anônima</translation> -<translation id="6413591858632097328">Isso limpará todos os dados e cookies armazenados por <ph name="ORIGIN_NAME" /> e os apps instalados.</translation> +<translation id="6413591858632097328">Isso limpará todos os dados e cookies armazenados por <ph name="ORIGIN_NAME" /> e os apps ali instalados.</translation> <translation id="641469293210305670">Instalar atualizações e apps</translation> <translation id="6414888972213066896">Você perguntou ao seu responsável se pode visitar este site</translation> <translation id="6415900369006735853">Conecte-se à internet pelo smartphone</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index bd18a735..c0f87a0 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4002,7 +4002,6 @@ <translation id="6365411474437319296">Adicionar família e amigos</translation> <translation id="636850387210749493">Inscrição empresarial</translation> <translation id="6370021412472292592">Não foi possível carregar manifesto.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Alterar palavra-passe}other{Alterar palavras-passe}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Tentar novamente</translation> <translation id="6377268785556383139">1 resultado para "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 94bf9c1..420f2fe11 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Adăugați membri ai familiei și prieteni</translation> <translation id="636850387210749493">Înscriere pentru întreprindere</translation> <translation id="6370021412472292592">Manifestul nu a putut fi încărcat.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Schimbă parola}few{Schimbă parolele}other{Schimbă parolele}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Încearcă din nou</translation> <translation id="6377268785556383139">Un rezultat pentru „<ph name="SEARCH_TEXT" />”</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 566182f..6371140 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">Добавьте родных и друзей</translation> <translation id="636850387210749493">Регистрация в корпоративном домене</translation> <translation id="6370021412472292592">Не удалось загрузить манифест.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Сменить пароль}one{Сменить пароли}few{Сменить пароли}many{Сменить пароли}other{Сменить пароли}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Повторить</translation> <translation id="6377268785556383139">1 результат поиска по запросу "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index ff03fbe..365efd90 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -4000,7 +4000,6 @@ <translation id="6365411474437319296">පවුල සහ මිතුරන් එක් කරන්න</translation> <translation id="636850387210749493">ව්යාපාරික බඳවාගැනීම</translation> <translation id="6370021412472292592">ලේඛනය පැටවිය නොහැකි විය.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{මුරපදය වෙනස් කරන්න}one{මුරපද වෙනස් කරන්න}other{මුරපද වෙනස් කරන්න}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">නැවත උත්සහ කරන්න</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' සඳහා 1 ප්රතිඵලයක්</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index ebc1cfb..1de7303 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">Tlačový server</translation> <translation id="1805967612549112634">Potvrdenie kódu PIN</translation> <translation id="1806335016774576568">Prepnúť na inú otvorenú aplikáciu</translation> +<translation id="1809483812148634490">Z tohto Chromebooku budú odstránené aplikácie, ktoré ste stiahli zo služby Google Play. + <ph name="LINE_BREAKS1" /> + Môže sa tiež odstrániť obsah, ktorý ste si zakúpili, napríklad filmy, televízne relácie, hudba, knihy alebo ďalšie nákupy v aplikáciách. + <ph name="LINE_BREAKS2" /> + Neovplyvní to aplikácie ani obsah v ďalších zariadeniach.</translation> <translation id="1809734401532861917">Pridať záložky, históriu, heslá a ďalšie nastavenia do účtu <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Služby</translation> <translation id="18139523105317219">Názov strany EDI</translation> @@ -1392,6 +1397,7 @@ <translation id="2825848369316359348">Nájdite názov vytlačený na zadnej strane bezpečnostného kľúča</translation> <translation id="2828650939514476812">Pripojenie k sieti Wi‑Fi</translation> <translation id="2835294513443818940">Tento súbor nie je možné bezpečne stiahnuť.</translation> +<translation id="2835547721736623118">Služba rozpoznávania reči</translation> <translation id="2836269494620652131">Zrútenie</translation> <translation id="2836635946302913370">Správca zakázal prihlasovanie pomocou tohto používateľského mena.</translation> <translation id="283669119850230892">Ak chcete používať sieť <ph name="NETWORK_ID" /> , musíte najskôr v časti uvedenej nižšie dokončiť pripojenie k internetu.</translation> @@ -1536,6 +1542,7 @@ <translation id="3019285239893817657">Tlačidlo podstránky</translation> <translation id="3020183492814296499">Skratky</translation> <translation id="3020990233660977256">Sériové číslo: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Počas napájania z batérie</translation> <translation id="3021066826692793094">Motýľ</translation> <translation id="3021678814754966447">&Zobraziť zdrojový kód rámca</translation> <translation id="3022978424994383087">Nebolo rozumieť.</translation> @@ -2732,6 +2739,7 @@ <translation id="4633757335284074492">Zálohovanie na Disk Google. Jednoducho kedykoľvek obnovte údaje alebo prejdite na iné zariadenie. Táto záloha zahrnuje dáta aplikácií. Zálohy sa nahrajú do Googlu a zašifrujú pomocou hesla účtu Google vášho dieťaťa.</translation> <translation id="4634771451598206121">Znova prihlásiť...</translation> <translation id="4635398712689569051">Stránka <ph name="PAGE_NAME" /> nie je k dispozícii pre hostí.</translation> +<translation id="4635444580397524003">Záloha systému Linux bola úspešne obnovená.</translation> <translation id="4636930964841734540">Informácie</translation> <translation id="4637083375689622795">Ďalšie akcie, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Aktivovať ladenie ADB</translation> @@ -2907,6 +2915,7 @@ <translation id="4890773143211625964">Zobraziť rozšírené možnosti tlačiarne</translation> <translation id="4891089016822695758">Beta fórum</translation> <translation id="4892229439761351791">Web môže používať Bluetooth</translation> +<translation id="489258173289528622">Akcia pri nečinnosti počas napájania z batérie</translation> <translation id="4893336867552636863">Táto akcia natrvalo odstráni údaje prehliadania z tohto zariadenia.</translation> <translation id="4893522937062257019">Na uzamknutej obrazovke</translation> <translation id="489454699928748701">Povoliť webom používať senzory pohybu</translation> @@ -3613,6 +3622,7 @@ <translation id="5863445608433396414">Aktivovať funkcie ladenia</translation> <translation id="5864195618110239517">Použiť merané pripojenie</translation> <translation id="5864471791310927901">Vyhľadanie servera DHCP zlyhalo</translation> +<translation id="5864754048328252126">Akcia pri nečinnosti počas nabíjania</translation> <translation id="5865508026715185451">Aplikácia <ph name="APP_NAME" /> bude čoskoro pozastavená</translation> <translation id="586567932979200359">Prehliadač <ph name="PRODUCT_NAME" /> je spustený z jeho obrazu disku. Inštalácia do počítača vám umožní spustiť ho bez obrazu disku a zabezpečí jeho aktualizáciu.</translation> <translation id="5865733239029070421">Automaticky odosiela štatistiky o používaní a správy o zlyhaní Googlu</translation> @@ -3812,6 +3822,7 @@ <translation id="6120205520491252677">Pripnúť túto stránku na Úvodnú obrazovku...</translation> <translation id="6122081475643980456">Vaše internetové pripojenie je ovládané</translation> <translation id="6122095009389448667">Tomuto webu naďalej blokovať prístup do schránky</translation> +<translation id="6122831415929794347">Chcete vypnúť Bezpečné prehliadanie?</translation> <translation id="6122875415561139701">Operácia zápisu je na zariadení <ph name="DEVICE_NAME" /> zakázaná.</translation> <translation id="6124650939968185064">Od tohto rozšírenia závisia nasledujúce rozšírenia:</translation> <translation id="6124698108608891449">Tento web potrebuje ďalšie povolenia.</translation> @@ -3989,7 +4000,6 @@ <translation id="6365411474437319296">Pridanie rodiny a priateľov</translation> <translation id="636850387210749493">Registrácia podniku</translation> <translation id="6370021412472292592">Manifest sa nepodarilo načítať.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Zmeniť heslo}few{Zmeniť heslá}many{Zmeniť heslá}other{Zmeniť heslá}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Skúsiť znova</translation> <translation id="6377268785556383139">1 výsledok pre hľadaný výraz „<ph name="SEARCH_TEXT" />“</translation> @@ -4015,6 +4025,7 @@ <translation id="6408118934673775994">Čítať a meniť údaje na weboch <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> a <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Súbory obrázkov</translation> <translation id="6410328738210026208">Zmeniť kanál a použiť funkciu Powerwash</translation> +<translation id="6410390304316730527">Bezpečné prehliadanie vás chráni pred útočníkmi, ktorí sa vás môžu pokúsiť naviesť vykonať niečo nebezpečné, ako je inštalácia škodlivého softvéru alebo odhalenie osobných údajov, napríklad hesiel, telefónnych čísel alebo kreditných kariet. Ak ho vypnete, pri prehliadaní neznámych webov alebo takých, ktoré nemajú dobrú reputáciu, postupujte opatrne.</translation> <translation id="6410668567036790476">Pridať vyhľadávač</translation> <translation id="641081527798843608">Zhoda predmetu</translation> <translation id="6412673304250309937">Kontroluje webové adresy podľa zoznamu nebezpečných webov uloženého v Chrome. Ak sa vám určitý web pokúsi ukradnúť heslo alebo stiahnete škodlivý súbor, Chrome môže tiež odoslať webové adresy vrátane častí obsahu stránky Bezpečnému prehliadaniu.</translation> @@ -5934,6 +5945,7 @@ <translation id="8951256747718668828">Obnovovanie sa nepodarilo dokončiť pre chybu</translation> <translation id="8951465597020890363">Chcete aj napriek tomu ukončiť režim pre hostí?</translation> <translation id="8952831374766033534">Konfiguračná možnosť nie je k podporovaná: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Počas nabíjania</translation> <translation id="895347679606913382">Spúšťa sa...</translation> <translation id="8957762313041272117">Živý prepis</translation> <translation id="895944840846194039">Pamäť JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 70707c9a..e1978083a 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -4003,7 +4003,6 @@ <translation id="6365411474437319296">Dodajte sorodnike in prijatelje</translation> <translation id="636850387210749493">Prijava v podjetje</translation> <translation id="6370021412472292592">Manifesta ni bilo mogoče naložiti.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Sprememba gesla}one{Sprememba gesel}two{Sprememba gesel}few{Sprememba gesel}other{Sprememba gesel}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Vnovični poskus</translation> <translation id="6377268785556383139">1 rezultat za »<ph name="SEARCH_TEXT" />«</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 758f4c8b..1eabfefc 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">Serveri i printimit</translation> <translation id="1805967612549112634">Konfirmo kodin PIN</translation> <translation id="1806335016774576568">Kalo te një aplikacion tjetër i hapur</translation> +<translation id="1809483812148634490">Aplikacionet që ke shkarkuar nga Google Play do të fshihen nga ky Chromebook. + <ph name="LINE_BREAKS1" /> + Përmbajtja që ke blerë si filmat, shfaqjet televizive, muzika, librat ose blerjet e tjera përmes aplikacionit mund të fshihen po ashtu. + <ph name="LINE_BREAKS2" /> + Kjo nuk ndikon tek aplikacionet ose përmbajtjet në pajisjet e tjera.</translation> <translation id="1809734401532861917">Shto faqeshënuesit, historinë, fjalëkalimet dhe cilësimet e mia të tjera te <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Shërbimet</translation> <translation id="18139523105317219">Emri i palës EDI</translation> @@ -1244,7 +1249,7 @@ <translation id="265390580714150011">Vlera e fushës</translation> <translation id="2654166010170466751">Lejo që sajtet të instalojnë përpunues të pagesave</translation> <translation id="2654553774144920065">Kërkesa për printim</translation> -<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Funksionet ndryshojnë sipas pajisjes</translation> +<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Veçoritë ndryshojnë sipas pajisjes</translation> <translation id="2660779039299703961">Ngjarje</translation> <translation id="266079277508604648">Printeri nuk mund të lidhet. Kontrollo që printeri është i ndezur dhe është i lidhur me pajisjen tënde Chromebook nëpërmjet Wi-Fi ose USB-së.</translation> <translation id="2661714428027871023">Shfleto më shpejt dhe përdor më pak të dhëna me "Modalitetin e lehtë". Kliko për të mësuar më shumë.</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">Gjej emrin e printuar në pjesën e pasme të çelësit të sigurisë</translation> <translation id="2828650939514476812">Lidhu me rrjetin Wi-Fi</translation> <translation id="2835294513443818940">Ky skedar nuk mund të shkarkohet në mënyrë të sigurt.</translation> +<translation id="2835547721736623118">Shërbimi i njohjes së ligjërimit</translation> <translation id="2836269494620652131">Ndërprerje aksidentale</translation> <translation id="2836635946302913370">Identifikimi me këtë emër përdoruesi është çaktivizuar nga administratori yt.</translation> <translation id="283669119850230892">Për të përdorur rrjetin <ph name="NETWORK_ID" />, në fillim përfundo lidhjen tënde me internetin më poshtë.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">Butoni i nënfaqes</translation> <translation id="3020183492814296499">Shkurtoret</translation> <translation id="3020990233660977256">Numri i serisë: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Gjatë kohës me bateri</translation> <translation id="3021066826692793094">Flutur</translation> <translation id="3021678814754966447">&Shiko burimin e kornizës</translation> <translation id="3022978424994383087">Nuk e kuptova.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">Rezervo në "Diskun e Google". Restauro të dhënat ose ndërro me lehtësi pajisjen në çdo kohë. Rezervimi yt përfshin të dhënat e aplikacioneve. Rezervimet ngarkohen në Google dhe enkriptohen duke përdorur fjalëkalimin e "Llogarisë së Google" të fëmijës tënd.</translation> <translation id="4634771451598206121">Identifikohu sërish...</translation> <translation id="4635398712689569051"><ph name="PAGE_NAME" /> nuk ofrohet për përdoruesit vizitorë.</translation> +<translation id="4635444580397524003">Rezervimi i Linux është restauruar me sukses.</translation> <translation id="4636930964841734540">Informacion</translation> <translation id="4637083375689622795">Më shumë veprime, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Aktivizo korrigjimin e ADB-së</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">Shfaq opsionet e përparuara të printerit</translation> <translation id="4891089016822695758">Forumi beta</translation> <translation id="4892229439761351791">Sajti mund të përdorë Bluetooth-in</translation> +<translation id="489258173289528622">Veprimi i gjendjes joaktive gjatë kohës që është me bateri</translation> <translation id="4893336867552636863">Kjo do të fshijë në mënyrë të përhershme të dhënat e shfletimit nga kjo pajisje.</translation> <translation id="4893522937062257019">Në ekranin e kyçjes</translation> <translation id="489454699928748701">Lejoju faqeve të përdorin sensorët e lëvizjes</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">Aktivizo funksionet e korrigjimit</translation> <translation id="5864195618110239517">Përdor lidhjen me matje</translation> <translation id="5864471791310927901">Kërkimi i DHCP-së dështoi</translation> +<translation id="5864754048328252126">Veprimi i gjendjes joaktive gjatë karikimit</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> do të vendoset në pauzë së shpejti</translation> <translation id="586567932979200359">Po e ekzekuton <ph name="PRODUCT_NAME" /> nga imazhi i tij i diskut. Instalimi i tij në kompjuter lejon që ta ekzekutosh pa imazhin e diskut dhe garanton se do të mbahet i përditësuar.</translation> <translation id="5865733239029070421">Dërgon automatikisht te Google statistika të përdorimit dhe raportet e ndërprerjeve aksidentale</translation> @@ -3810,6 +3820,7 @@ <translation id="6120205520491252677">Gozhdoje këtë faqe tek ekrani i Nisjes...</translation> <translation id="6122081475643980456">Lidhja jote e internetit po kontrollohet</translation> <translation id="6122095009389448667">Vazhdo të bllokosh këtë sajt që të mos shikojë kujtesën e fragmenteve</translation> +<translation id="6122831415929794347">Të çaktivizohet "Shfletimi i sigurt"?</translation> <translation id="6122875415561139701">Veprimi i shkrimit nuk lejohet në: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Shtesat vijuese varen nga kjo shtesë:</translation> <translation id="6124698108608891449">Ky sajt ka nevojë për më shumë autorizime.</translation> @@ -3987,7 +3998,6 @@ <translation id="6365411474437319296">Shto familjarë dhe miq</translation> <translation id="636850387210749493">Regjistrimi i ndërmarrjes</translation> <translation id="6370021412472292592">Manifesti nuk mund të ngarkohej.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Ndrysho fjalëkalimin}other{Ndrysho fjalëkalimet}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Provo përsëri</translation> <translation id="6377268785556383139">1 rezultat për "<ph name="SEARCH_TEXT" />"</translation> @@ -4013,6 +4023,7 @@ <translation id="6408118934673775994">Lexo dhe ndrysho të dhënat e tua në <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> dhe <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Skedarët e imazheve</translation> <translation id="6410328738210026208">Ndërro kanalin dhe zbato Powerwash</translation> +<translation id="6410390304316730527">"Shfletimi i sigurt" të mbron kundër sulmuesve që mund të të mashtrojnë që të bësh diçka të rrezikshme si instalimi i softuerëve keqdashës ose të zbulosh informacion personal si fjalëkalime, numra telefoni ose karta krediti. Nëse e çaktivizon, ki kujdes kur shfleton sajte të panjohura ose pa reputacion.</translation> <translation id="6410668567036790476">Shto motor kërkimi</translation> <translation id="641081527798843608">Përputhja e subjektit</translation> <translation id="6412673304250309937">Kontrollon URL-të kundrejt një liste sajtesh të pasigurta të ruajtur në Chrome. Nëse një sajt përpiqet të vjedhë fjalëkalimin tënd, ose kur shkarkon një skedar të dëmshëm, Chrome mund t'i dërgojë po ashtu "Shfletimit të sigurt" URL-të, duke përfshirë pjesë të përmbajtjes së faqes.</translation> @@ -5931,6 +5942,7 @@ <translation id="8951256747718668828">Restaurimi nuk mund të përfundonte për shkak të një gabimi</translation> <translation id="8951465597020890363">Dëshiron të dalësh gjithsesi nga modaliteti "vizitor"?</translation> <translation id="8952831374766033534">Opsioni i konfigurimit nuk mbështetet: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Gjatë karikimit</translation> <translation id="895347679606913382">Po niset...</translation> <translation id="8957762313041272117">Titra në çast</translation> <translation id="895944840846194039">Memoria e JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 44b864a..2efc296 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -407,7 +407,7 @@ <translation id="1543284117603151572">Uvezeni iz Edge-a</translation> <translation id="1545177026077493356">Automatski režim kioska</translation> <translation id="1545775234664667895">Instalirana je tema „<ph name="THEME_NAME" />“</translation> -<translation id="1546280085599573572">Ovaj dodatak je promenio stranicu koja se prikazuje kada kliknete na dugme Početna.</translation> +<translation id="1546280085599573572">Ovaj dodatak je promenio stranicu koja se prikazuje kada kliknete na dugme Početak.</translation> <translation id="1546452108651444655"><ph name="CHILD_NAME" /> želi da instalira <ph name="EXTENSION_TYPE" /> koji može:</translation> <translation id="1549275686094429035">Vreme izvršavanja aplikacije za Chrome je omogućeno</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> želi da pristupa <ph name="VOLUME_NAME" />. Možda će da menja ili briše datoteke.</translation> @@ -609,6 +609,11 @@ <translation id="1805888043020974594">Server za štampanje</translation> <translation id="1805967612549112634">Potvrdite PIN</translation> <translation id="1806335016774576568">Pređite na neku drugu otvorenu aplikaciju</translation> +<translation id="1809483812148634490">Aplikacije koje ste preuzeli sa Google Play-a će biti izbrisane sa ovog Chromebook-a. + <ph name="LINE_BREAKS1" /> + Sadržaj koji ste kupili, poput filmova, TV emisija, muzike, knjiga ili drugih kupovina u aplikacijama, takođe može da bude izbrisan. + <ph name="LINE_BREAKS2" /> + To ne utiče na aplikacije ili sadržaj na drugim uređajima.</translation> <translation id="1809734401532861917">Dodaj obeleživače, istoriju, lozinke i druga podešavanja na <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Usluge</translation> <translation id="18139523105317219">Ime EDI strane</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">Pronađite odštampani naziv na poleđini bezbednosnog ključa</translation> <translation id="2828650939514476812">Povezivanje sa Wi-Fi mrežom</translation> <translation id="2835294513443818940">Bezbedno preuzimanje ove datoteke nije uspelo.</translation> +<translation id="2835547721736623118">Usluga za prepoznavanje govora</translation> <translation id="2836269494620652131">Otkazivanje</translation> <translation id="2836635946302913370">Administrator je onemogućio prijavljivanje pomoću ovog korisničkog imena.</translation> <translation id="283669119850230892">Da biste koristili mrežu <ph name="NETWORK_ID" />, najpre uspostavite vezu sa internetom u nastavku.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">Dugme za podstranicu</translation> <translation id="3020183492814296499">Prečice</translation> <translation id="3020990233660977256">Serijski broj: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Tokom korišćenja baterije</translation> <translation id="3021066826692793094">Leptir</translation> <translation id="3021678814754966447">&Prikaži izvor okvira</translation> <translation id="3022978424994383087">Nismo vas razumeli.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">Pravite rezervne kopije na Google disku. Lako vratite podatke ili pređite na drugi uređaj u bilo kom trenutku. Ova rezervna kopija uključuje podatke aplikacija. Rezervne kopije se otpremaju na Google i šifruju lozinkom za Google nalog deteta.</translation> <translation id="4634771451598206121">Prijavi me ponovo...</translation> <translation id="4635398712689569051">Stranica <ph name="PAGE_NAME" /> nije dostupna korisnicima u režimu gosta.</translation> +<translation id="4635444580397524003">Rezervna kopija Linux-a je vraćena.</translation> <translation id="4636930964841734540">Informacije</translation> <translation id="4637083375689622795">Još radnji, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Omogući ADB otklanjanje grešaka</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">Prikazuj napredne opcije za štampač</translation> <translation id="4891089016822695758">Forum za beta verziju</translation> <translation id="4892229439761351791">Sajt može da koristi Bluetooth</translation> +<translation id="489258173289528622">Neaktivnost tokom korišćenja baterije</translation> <translation id="4893336867552636863">To će trajno izbrisati podatke pregledanja sa ovog uređaja.</translation> <translation id="4893522937062257019">Na zaključanom ekranu</translation> <translation id="489454699928748701">Dozvoli sajtovima da koriste senzore za pokret</translation> @@ -3079,7 +3088,7 @@ <translation id="5139955368427980650">&Otvori</translation> <translation id="5142793792982256885">Brzina pomeranja tačpedom</translation> <translation id="5142961317498132443">Potvrda identiteta</translation> -<translation id="5143374789336132547">Dodatak „<ph name="EXTENSION_NAME" />“ je promenio stranicu koja se prikazuje kada kliknete na dugme Početna.</translation> +<translation id="5143374789336132547">Dodatak „<ph name="EXTENSION_NAME" />“ je promenio stranicu koja se prikazuje kada kliknete na dugme Početak.</translation> <translation id="5143712164865402236">Pređi na režim celog ekrana</translation> <translation id="514575469079499857">Korišćenje IP adrese za određivanje lokacije (podrazumevano)</translation> <translation id="5147103632304200977">Pitaj kada sajt želi da pristupi uređajima sa interfejsom (preporučeno)</translation> @@ -3443,7 +3452,7 @@ <translation id="5623842676595125836">Evidencija</translation> <translation id="5624120631404540903">Upravljaj lozinkama</translation> <translation id="5626134646977739690">Ime:</translation> -<translation id="5627086634964711283">Kontroliše i stranicu koja se prikazuje kada kliknete na dugme Početna.</translation> +<translation id="5627086634964711283">Kontroliše i stranicu koja se prikazuje kada kliknete na dugme Početak.</translation> <translation id="5627676517703583263">Pametno pregledajte uz Chrome</translation> <translation id="562935524653278697">Administrator je onemogućio sinhronizaciju obeleživača, istorije, lozinki i drugih podešavanja.</translation> <translation id="5632566673632479864">Nalog <ph name="EMAIL" /> nije više dozvoljen kao primarni nalog. Pošto tim nalogom upravlja <ph name="DOMAIN" />, obeleživači, istorija, lozinke i druga podešavanja biće obrisani sa uređaja.</translation> @@ -3612,6 +3621,7 @@ <translation id="5863445608433396414">Omogući funkcije za otklanjanje grešaka</translation> <translation id="5864195618110239517">Koristi vezu sa ograničenjem</translation> <translation id="5864471791310927901">Pronalaženje DHCP-a nije uspelo</translation> +<translation id="5864754048328252126">Neaktivnost tokom punjenja</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> će se uskoro pauzirati</translation> <translation id="586567932979200359">Pokrećete <ph name="PRODUCT_NAME" /> sa diska. Instalacija na računar omogućava pokretanje bez diska i redovno ažuriranje.</translation> <translation id="5865733239029070421">Automatski šalje Google-u statistiku korišćenja i izveštaje o otkazivanju</translation> @@ -3686,7 +3696,7 @@ <translation id="5959471481388474538">Mreža nije dostupna</translation> <translation id="595959584676692139">Ponovo učitajte ovu stranicu da biste koristili ovaj dodatak</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (najviše <ph name="NUM_KILOBYTES_LIVE" />)</translation> -<translation id="5965661248935608907">Kontroliše i stranicu koja se prikazuje kada kliknete na dugme Početna ili pretražujete iz omniboksa.</translation> +<translation id="5965661248935608907">Kontroliše i stranicu koja se prikazuje kada kliknete na dugme Početak ili pretražujete iz omniboksa.</translation> <translation id="5969419185858894314"><ph name="ORIGIN" /> može da pregleda datoteke u direktorijumu <ph name="FOLDERNAME" /></translation> <translation id="5971037678316050792">Kontrola stanja i uparivanja Bluetooth adaptera</translation> <translation id="597235323114979258">Pogledajte još destinacija</translation> @@ -3811,6 +3821,7 @@ <translation id="6120205520491252677">Zakači ovu stranicu na Početni ekran...</translation> <translation id="6122081475643980456">Internet veza se kontroliše</translation> <translation id="6122095009389448667">Nastavi da blokiraš uvid u privremenu memoriju ovom sajtu</translation> +<translation id="6122831415929794347">Želite li da isključite Bezbednosno pregledanje?</translation> <translation id="6122875415561139701">Operacija pisanja nije dozvoljena na: „<ph name="DEVICE_NAME" />“.</translation> <translation id="6124650939968185064">Sledeći dodaci zavise od ovog dodatka:</translation> <translation id="6124698108608891449">Ovaj sajt traži još dozvola.</translation> @@ -3988,7 +3999,6 @@ <translation id="6365411474437319296">Dodajte porodicu i prijatelje</translation> <translation id="636850387210749493">Prijavljivanje za izdanje za preduzeća</translation> <translation id="6370021412472292592">Učitavanje manifesta nije moguće.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Promenite lozinku}one{Promenite lozinke}few{Promenite lozinke}other{Promenite lozinke}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Probaj ponovo</translation> <translation id="6377268785556383139">1 rezultat za „<ph name="SEARCH_TEXT" />“</translation> @@ -4014,6 +4024,7 @@ <translation id="6408118934673775994">Čitanje i menjanje podataka na <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> i <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Datoteke slika</translation> <translation id="6410328738210026208">Promeni kanal i obavi Powerwash</translation> +<translation id="6410390304316730527">Bezbedno pregledanje vas štiti od napadača koji mogu da vas navedu da uradite nešto opasno, na primer, da instalirate zlonamerni softver ili otkrijete lične podatke poput lozinki, brojeva telefona ili brojeva kreditnih kartica. Ako ga isključite, budite oprezni pri pregledanju nepoznatih ili nebezbednih sajtova.</translation> <translation id="6410668567036790476">Dodavanje pretraživača</translation> <translation id="641081527798843608">Podudaranje naslova</translation> <translation id="6412673304250309937">Proverava URL-ove sa listom nebezbednih sajtova koji se čuvaju u Chrome-u. Ako neki sajt pokuša da ukrade vašu lozinku ili probate da preuzmete štetnu datoteku, Chrome može da pošalje URL-ove, uključujući delove sadržaja stranice, u Bezbedno pregledanje.</translation> @@ -4066,7 +4077,7 @@ <translation id="6468485451923838994">Fontovi</translation> <translation id="6472207088655375767">OTP</translation> <translation id="6472804939621540371">Ovim brišete sve podatke i kolačiće koje čuvaju sajt <ph name="SITE_GROUP_NAME" />, svi njemu podređeni sajtovi i njegove instalirane aplikacije.</translation> -<translation id="6472893788822429178">Prikaži dugme Početna</translation> +<translation id="6472893788822429178">Prikaži dugme Početak</translation> <translation id="6473842110411557830">Ilustracija za Powerwash</translation> <translation id="6474498546677193336">Opozivanje deljenja nije uspelo jer jedna aplikacija koristi ovaj direktorijum. Deljenje direktorijuma će biti opozvano kada se Linux sledeći put zatvori.</translation> <translation id="6474884162850599008">Prekini vezu sa nalogom Google diska</translation> @@ -5934,6 +5945,7 @@ <translation id="8951256747718668828">Nismo uspeli da dovršimo vraćanje zbog greške</translation> <translation id="8951465597020890363">Želite li da ipak izađete iz režima gosta?</translation> <translation id="8952831374766033534">Opcija konfigurisanja nije podržana: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Tokom punjenja</translation> <translation id="895347679606913382">Započinjanje...</translation> <translation id="8957762313041272117">Titl uživo</translation> <translation id="895944840846194039">JavaScript memorija</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 314c1d27..1974cf25 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -407,7 +407,7 @@ <translation id="1543284117603151572">Увезени из Edge-а</translation> <translation id="1545177026077493356">Аутоматски режим киоска</translation> <translation id="1545775234664667895">Инсталирана је тема „<ph name="THEME_NAME" />“</translation> -<translation id="1546280085599573572">Овај додатак је променио страницу која се приказује када кликнете на дугме Почетна.</translation> +<translation id="1546280085599573572">Овај додатак је променио страницу која се приказује када кликнете на дугме Почетак.</translation> <translation id="1546452108651444655"><ph name="CHILD_NAME" /> жели да инсталира <ph name="EXTENSION_TYPE" /> који може:</translation> <translation id="1549275686094429035">Време извршавања апликације за Chrome је омогућено</translation> <translation id="1549788673239553762"><ph name="APP_NAME" /> жели да приступа <ph name="VOLUME_NAME" />. Можда ће да мења или брише датотеке.</translation> @@ -609,6 +609,11 @@ <translation id="1805888043020974594">Сервер за штампање</translation> <translation id="1805967612549112634">Потврдите PIN</translation> <translation id="1806335016774576568">Пређите на неку другу отворену апликацију</translation> +<translation id="1809483812148634490">Апликације које сте преузели са Google Play-а ће бити избрисане са овог Chromebook-а. + <ph name="LINE_BREAKS1" /> + Садржај који сте купили, попут филмова, ТВ емисија, музике, књига или других куповина у апликацијама, такође може да буде избрисан. + <ph name="LINE_BREAKS2" /> + То не утиче на апликације или садржај на другим уређајима.</translation> <translation id="1809734401532861917">Додај обележиваче, историју, лозинке и друга подешавања на <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Услуге</translation> <translation id="18139523105317219">Име EDI стране</translation> @@ -1390,6 +1395,7 @@ <translation id="2825848369316359348">Пронађите одштампани назив на полеђини безбедносног кључа</translation> <translation id="2828650939514476812">Повезивање са Wi-Fi мрежом</translation> <translation id="2835294513443818940">Безбедно преузимање ове датотеке није успело.</translation> +<translation id="2835547721736623118">Услуга за препознавање говора</translation> <translation id="2836269494620652131">Отказивање</translation> <translation id="2836635946302913370">Администратор је онемогућио пријављивање помоћу овог корисничког имена.</translation> <translation id="283669119850230892">Да бисте користили мрежу <ph name="NETWORK_ID" />, најпре успоставите везу са интернетом у наставку.</translation> @@ -1534,6 +1540,7 @@ <translation id="3019285239893817657">Дугме за подстраницу</translation> <translation id="3020183492814296499">Пречице</translation> <translation id="3020990233660977256">Серијски број: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Током коришћења батерије</translation> <translation id="3021066826692793094">Лептир</translation> <translation id="3021678814754966447">&Прикажи извор оквира</translation> <translation id="3022978424994383087">Нисмо вас разумели.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">Правите резервне копије на Google диску. Лако вратите податке или пређите на други уређај у било ком тренутку. Ова резервна копија укључује податке апликација. Резервне копије се отпремају на Google и шифрују лозинком за Google налог детета.</translation> <translation id="4634771451598206121">Пријави ме поново...</translation> <translation id="4635398712689569051">Страница <ph name="PAGE_NAME" /> није доступна корисницима у режиму госта.</translation> +<translation id="4635444580397524003">Резервна копија Linux-а је враћена.</translation> <translation id="4636930964841734540">Информације</translation> <translation id="4637083375689622795">Још радњи, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Омогући ADB отклањање грешака</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">Приказуј напредне опције за штампач</translation> <translation id="4891089016822695758">Форум за бета верзију</translation> <translation id="4892229439761351791">Сајт може да користи Bluetooth</translation> +<translation id="489258173289528622">Неактивност током коришћења батерије</translation> <translation id="4893336867552636863">То ће трајно избрисати податке прегледања са овог уређаја.</translation> <translation id="4893522937062257019">На закључаном екрану</translation> <translation id="489454699928748701">Дозволи сајтовима да користе сензоре за покрет</translation> @@ -3079,7 +3088,7 @@ <translation id="5139955368427980650">&Отвори</translation> <translation id="5142793792982256885">Брзина померања тачпедом</translation> <translation id="5142961317498132443">Потврда идентитета</translation> -<translation id="5143374789336132547">Додатак „<ph name="EXTENSION_NAME" />“ је променио страницу која се приказује када кликнете на дугме Почетна.</translation> +<translation id="5143374789336132547">Додатак „<ph name="EXTENSION_NAME" />“ је променио страницу која се приказује када кликнете на дугме Почетак.</translation> <translation id="5143712164865402236">Пређи на режим целог екрана</translation> <translation id="514575469079499857">Коришћење IP адресе за одређивање локације (подразумевано)</translation> <translation id="5147103632304200977">Питај када сајт жели да приступи уређајима са интерфејсом (препоручено)</translation> @@ -3443,7 +3452,7 @@ <translation id="5623842676595125836">Евиденција</translation> <translation id="5624120631404540903">Управљај лозинкама</translation> <translation id="5626134646977739690">Име:</translation> -<translation id="5627086634964711283">Контролише и страницу која се приказује када кликнете на дугме Почетна.</translation> +<translation id="5627086634964711283">Контролише и страницу која се приказује када кликнете на дугме Почетак.</translation> <translation id="5627676517703583263">Паметно прегледајте уз Chrome</translation> <translation id="562935524653278697">Администратор је онемогућио синхронизацију обележивача, историје, лозинки и других подешавања.</translation> <translation id="5632566673632479864">Налог <ph name="EMAIL" /> није више дозвољен као примарни налог. Пошто тим налогом управља <ph name="DOMAIN" />, обележивачи, историја, лозинке и друга подешавања биће обрисани са уређаја.</translation> @@ -3612,6 +3621,7 @@ <translation id="5863445608433396414">Омогући функције за отклањање грешака</translation> <translation id="5864195618110239517">Користи везу са ограничењем</translation> <translation id="5864471791310927901">Проналажење DHCP-а није успело</translation> +<translation id="5864754048328252126">Неактивност током пуњења</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> ће се ускоро паузирати</translation> <translation id="586567932979200359">Покрећете <ph name="PRODUCT_NAME" /> са диска. Инсталација на рачунар омогућава покретање без диска и редовно ажурирање.</translation> <translation id="5865733239029070421">Аутоматски шаље Google-у статистику коришћења и извештаје о отказивању</translation> @@ -3686,7 +3696,7 @@ <translation id="5959471481388474538">Мрежа није доступна</translation> <translation id="595959584676692139">Поново учитајте ову страницу да бисте користили овај додатак</translation> <translation id="5963453369025043595"><ph name="NUM_HANDLES" /> (највише <ph name="NUM_KILOBYTES_LIVE" />)</translation> -<translation id="5965661248935608907">Контролише и страницу која се приказује када кликнете на дугме Почетна или претражујете из омнибокса.</translation> +<translation id="5965661248935608907">Контролише и страницу која се приказује када кликнете на дугме Почетак или претражујете из омнибокса.</translation> <translation id="5969419185858894314"><ph name="ORIGIN" /> може да прегледа датотеке у директоријуму <ph name="FOLDERNAME" /></translation> <translation id="5971037678316050792">Контрола стања и упаривања Bluetooth адаптера</translation> <translation id="597235323114979258">Погледајте још дестинација</translation> @@ -3811,6 +3821,7 @@ <translation id="6120205520491252677">Закачи ову страницу на Почетни екран...</translation> <translation id="6122081475643980456">Интернет веза се контролише</translation> <translation id="6122095009389448667">Настави да блокираш увид у привремену меморију овом сајту</translation> +<translation id="6122831415929794347">Желите ли да искључите Безбедносно прегледање?</translation> <translation id="6122875415561139701">Операција писања није дозвољена на: „<ph name="DEVICE_NAME" />“.</translation> <translation id="6124650939968185064">Следећи додаци зависе од овог додатка:</translation> <translation id="6124698108608891449">Овај сајт тражи још дозвола.</translation> @@ -3988,7 +3999,6 @@ <translation id="6365411474437319296">Додајте породицу и пријатеље</translation> <translation id="636850387210749493">Пријављивање за издање за предузећа</translation> <translation id="6370021412472292592">Учитавање манифеста није могуће.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Промените лозинку}one{Промените лозинке}few{Промените лозинке}other{Промените лозинке}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Пробај поново</translation> <translation id="6377268785556383139">1 резултат за „<ph name="SEARCH_TEXT" />“</translation> @@ -4014,6 +4024,7 @@ <translation id="6408118934673775994">Читање и мењање података на <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> и <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Датотеке слика</translation> <translation id="6410328738210026208">Промени канал и обави Powerwash</translation> +<translation id="6410390304316730527">Безбедно прегледање вас штити од нападача који могу да вас наведу да урадите нешто опасно, на пример, да инсталирате злонамерни софтвер или откријете личне податке попут лозинки, бројева телефона или бројева кредитних картица. Ако га искључите, будите опрезни при прегледању непознатих или небезбедних сајтова.</translation> <translation id="6410668567036790476">Додавање претраживача</translation> <translation id="641081527798843608">Подударање наслова</translation> <translation id="6412673304250309937">Проверава URL-ове са листом небезбедних сајтова који се чувају у Chrome-у. Ако неки сајт покуша да украде вашу лозинку или пробате да преузмете штетну датотеку, Chrome може да пошаље URL-ове, укључујући делове садржаја странице, у Безбедно прегледање.</translation> @@ -4066,7 +4077,7 @@ <translation id="6468485451923838994">Фонтови</translation> <translation id="6472207088655375767">OTP</translation> <translation id="6472804939621540371">Овим бришете све податке и колачиће које чувају сајт <ph name="SITE_GROUP_NAME" />, сви њему подређени сајтови и његове инсталиране апликације.</translation> -<translation id="6472893788822429178">Прикажи дугме Почетна</translation> +<translation id="6472893788822429178">Прикажи дугме Почетак</translation> <translation id="6473842110411557830">Илустрација за Powerwash</translation> <translation id="6474498546677193336">Опозивање дељења није успело јер једна апликација користи овај директоријум. Дељење директоријума ће бити опозвано када се Linux следећи пут затвори.</translation> <translation id="6474884162850599008">Прекини везу са налогом Google диска</translation> @@ -5934,6 +5945,7 @@ <translation id="8951256747718668828">Нисмо успели да довршимо враћање због грешке</translation> <translation id="8951465597020890363">Желите ли да ипак изађете из режима госта?</translation> <translation id="8952831374766033534">Опција конфигурисања није подржана: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Током пуњења</translation> <translation id="895347679606913382">Започињање...</translation> <translation id="8957762313041272117">Титл уживо</translation> <translation id="895944840846194039">JavaScript меморија</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index c3eb04b0..36315b6 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Lägg till familj och vänner</translation> <translation id="636850387210749493">Företagsregistrering</translation> <translation id="6370021412472292592">Det gick inte att läsa in manifestet.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Byt lösenord}other{Byt lösenord}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Försök igen</translation> <translation id="6377268785556383139">1 resultat för <ph name="SEARCH_TEXT" /></translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 74a4dca..61c95da5 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -3996,7 +3996,6 @@ <translation id="6365411474437319296">Ongeza familia na marafiki</translation> <translation id="636850387210749493">Usajili wa biashara</translation> <translation id="6370021412472292592">Haikupakia maelezo.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Badilisha nenosiri}other{Badilisha manenosiri}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Jaribu Tena</translation> <translation id="6377268785556383139">Imepata tokeo 1 la '<ph name="SEARCH_TEXT" />'</translation> @@ -4782,7 +4781,7 @@ <translation id="7454548535253569100">Tovuti kuu: <ph name="SUBFRAME_SITE" /></translation> <translation id="7456142309650173560">dev</translation> <translation id="7456847797759667638">Fungua Mahali...</translation> -<translation id="7458168200501453431">Hutumia kikagua maendelezo kinachotumiwa katika Huduma ya Tafuta na Google. Maandishi unayochapisha katika kivinjari yanatumwa kwa Google.</translation> +<translation id="7458168200501453431">Hutumia kikagua tahajia kinachotumiwa katika Huduma ya Tafuta na Google. Maandishi unayochapisha katika kivinjari yanatumwa kwa Google.</translation> <translation id="7460045493116006516">Mandhari ya sasa uliyosakinisha</translation> <translation id="7461924472993315131">Bana</translation> <translation id="746216226901520237">Wakati ujao, simu yako itafungua <ph name="DEVICE_TYPE" /> yako. Unaweza kuzima Smart Lock katika Mipangilio.</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index ea49ff93..65c2cbd 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">பிரிண்ட் சேவையகம்</translation> <translation id="1805967612549112634">பின்னை உறுதிப்படுத்து</translation> <translation id="1806335016774576568">திறந்திருக்கும் மற்றொரு ஆப்ஸிற்கு மாறு</translation> +<translation id="1809483812148634490">Google Playயிலிருந்து நீங்கள் பதிவிறக்கிய ஆப்ஸ் இந்த Chromebookகிலிருந்து நீக்கப்படும். + <ph name="LINE_BREAKS1" /> + நீங்கள் வாங்கிய திரைப்படங்கள், டிவி நிகழ்ச்சிகள், இசை, புத்தகங்கள் போன்றவையோ ஆப்ஸில் வாங்கியவையோ கூட நீக்கப்படலாம். + <ph name="LINE_BREAKS2" /> + இதனால் பிற சாதனங்களில் உள்ள ஆப்ஸோ உள்ளடக்கமோ பாதிக்கப்படாது.</translation> <translation id="1809734401532861917"><ph name="USER_EMAIL_ADDRESS" /> இல் எனது புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைச் சேர்</translation> <translation id="1813278315230285598">சேவைகள்</translation> <translation id="18139523105317219">EDI பார்ட்டி பெயர்</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">உங்கள் பாதுகாப்பு விசையின் பின்புறத்தில் அச்சிடப்பட்டுள்ள பெயரைக் கண்டறியவும்</translation> <translation id="2828650939514476812">வைஃபை நெட்வொர்க்குடன் இணை</translation> <translation id="2835294513443818940">இந்தக் கோப்பைப் பாதுகாப்பாகப் பதிவிறக்க முடியாது.</translation> +<translation id="2835547721736623118">பேச்சு அறிதல் சேவை</translation> <translation id="2836269494620652131">செயலிழப்பு</translation> <translation id="2836635946302913370">இந்தப் பயனர்பெயரில் உள்நுழைவது, உங்களின் நிர்வாகியால் முடக்கப்பட்டுள்ளது.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> நெட்வொர்க்கைப் பயன்படுத்த, முதலில் கீழே உள்ளபடி இணையத்தோடு இணைக்கவும்.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">துணைப்பக்க பட்டன்</translation> <translation id="3020183492814296499">ஷார்ட்கட்கள்</translation> <translation id="3020990233660977256">வரிசை எண்: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">பேட்டரியில் இயங்கும்போது</translation> <translation id="3021066826692793094">பட்டர்ஃப்ளை</translation> <translation id="3021678814754966447">சட்டக ஆதாரங்களைக் &காண்க</translation> <translation id="3022978424994383087">மொழிபெயர்க்க முடியவில்லை.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">Google Driveவிற்குக் காப்புப் பிரதி எடுக்கவும். எப்போது வேண்டுமானாலும் தரவை எளிதாக மீட்டெடுக்கலாம் அல்லது சாதனத்தை மாற்றலாம். ஆப்ஸ் தரவும் இந்தக் காப்புப் பிரதியில் அடங்கும். காப்புப்பிரதிகள் Googleளுக்குப் பதிவேற்றப்பட்டு பிள்ளையின் Google கணக்கின் கடவுச்சொல்லைப் பயன்படுத்தி என்க்ரிப்ஷன் செய்யப்படுகின்றன.</translation> <translation id="4634771451598206121">மீண்டும் உள்நுழைக...</translation> <translation id="4635398712689569051">கெஸ்ட் பயனர்களுக்கு <ph name="PAGE_NAME" /> கிடைக்காது.</translation> +<translation id="4635444580397524003">Linux காப்புப் பிரதி மீட்டெடுக்கப்பட்டது.</translation> <translation id="4636930964841734540">தகவல்</translation> <translation id="4637083375689622795">கூடுதல் செயல்கள், <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB பிழைதிருத்தத்தை இயக்கு</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">மேம்பட்ட பிரிண்டர் விருப்பங்களைக் காட்டு</translation> <translation id="4891089016822695758">பீட்டா மன்றம்</translation> <translation id="4892229439761351791">தளத்தால் புளூடூத்தைப் பயன்படுத்த முடியும்</translation> +<translation id="489258173289528622">பேட்டரியில் இயங்கும்போது செயலற்ற நிலை</translation> <translation id="4893336867552636863">இது, இந்தச் சாதனத்திலிருந்து உலாவிய தரவை நிரந்தரமாக நீக்கும்.</translation> <translation id="4893522937062257019">திரை பூட்டியிருக்கும்போது</translation> <translation id="489454699928748701">மோஷன் சென்சார்களைப் பயன்படுத்த தளங்களை அனுமதிக்கும்</translation> @@ -3611,6 +3620,7 @@ <translation id="5863445608433396414">பிழைதிருத்த அம்சங்களை இயக்கவும்</translation> <translation id="5864195618110239517">கட்டண நெட்வொர்க் இணைப்பைப் பயன்படுத்து</translation> <translation id="5864471791310927901">DHCP பார்வையிடுதல் தோல்வி</translation> +<translation id="5864754048328252126">சார்ஜ் செய்யப்படும்போது செயலற்ற நிலை</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> விரைவில் இடைநிறுத்தப்படும்</translation> <translation id="586567932979200359"><ph name="PRODUCT_NAME" /> ஐ அதன் டிஸ்க் இமேஜில் இருந்து நீங்கள் இயக்குகிறீர்கள். உங்கள் கம்ப்யூட்டரில் இதை நிறுவுவதால் டிஸ்க் இமேஜ் இல்லாமல் இதை இயக்கலாம், மேலும் புதுப்பிக்கப்பட்டதாகவும் வைத்திருக்கலாம்.</translation> <translation id="5865733239029070421">பயன்பாட்டுப் புள்ளிவிவரங்களையும் சிதைவு அறிக்கைகளையும் தானாகவே Googleளுக்கு அனுப்பும்</translation> @@ -3810,6 +3820,7 @@ <translation id="6120205520491252677">தொடக்கத் திரையில் இந்தப் பக்கத்தைப் பொருத்து...</translation> <translation id="6122081475643980456">உங்கள் இணைய இணைப்பு கட்டுப்படுத்தப்படுகிறது</translation> <translation id="6122095009389448667">இந்தத் தளம், கிளிப்போர்டைப் பார்ப்பதைத் தொடர்ந்து தடைசெய்</translation> +<translation id="6122831415929794347">'பாதுகாப்பு உலாவல்' அம்சத்தை முடக்கவா?</translation> <translation id="6122875415561139701">எழுதுதல் செயல்பாடு இந்தச் சாதனத்தில் அனுமதிக்கப்படவில்லை: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">பின்வரும் நீட்டிப்புகள் இந்த நீட்டிப்பைச் சார்ந்தவை:</translation> <translation id="6124698108608891449">இந்தத் தளத்திற்குக் கூடுதல் அனுமதிகள் தேவை.</translation> @@ -3987,7 +3998,6 @@ <translation id="6365411474437319296">குடும்பத்தினர் மற்றும் நண்பர்களைச் சேர்</translation> <translation id="636850387210749493">நிறுவனப் பதிவு</translation> <translation id="6370021412472292592">மெனிஃபெஸ்ட்டை ஏற்ற முடியவில்லை.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{கடவுச்சொல்லை மாற்று}other{கடவுச்சொற்களை மாற்று}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">மீண்டும் முயலவும்</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />'க்கு 1 முடிவு உள்ளது</translation> @@ -4013,6 +4023,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> மற்றும் <ph name="WEBSITE_3" /> இல் உள்ள உங்கள் தரவைப் படித்தல் மற்றும் திருத்துதல்</translation> <translation id="6410257289063177456">படக் கோப்புகள்</translation> <translation id="6410328738210026208">சேனல் மற்றும் பவர்வாஷை மாற்று</translation> +<translation id="6410390304316730527">தீங்கிழைக்கும் மென்பொருளை நிறுவச் செய்வது, கடவுச்சொற்கள், ஃபோன் எண்கள், கிரெடிட் கார்டு எண்கள் போன்ற தனிப்பட்ட தகவல்களைத் வெளியிடச் செய்வது உள்ளிட்ட ஆபத்தான செயல்களைச் செய்ய வைக்கக்கூடிய தீங்கிழைப்பவர்களிடமிருந்து ’பாதுகாப்பு உலாவல்’ அம்சம் உங்களைப் பாதுகாக்கும். அதை முடக்கினால், பரிச்சயமற்ற/நம்பகமற்ற தளங்களை உலாவும்போது கவனமாக இருக்கவும்.</translation> <translation id="6410668567036790476">தேடல் இன்ஜினைச் சேர்</translation> <translation id="641081527798843608">சப்ஜெக்ட் மேட்ச்</translation> <translation id="6412673304250309937">Chromeமில் சேமிக்கப்பட்டுள்ள பாதுகாப்பில்லாத தளங்களின் பட்டியலைப் பயன்படுத்தி URLகளைச் சரிபார்க்கும். தளம் உங்கள் கடவுச்சொல்லைத் திருட முயன்றலோ தீங்குவிளைவிக்கும் கோப்பை நீங்கள் பதிவிறக்கினாலோ Chromeமானது பக்க உள்ளடக்கத்தின் சிறிய பகுதிகள் உட்பட URLகளையும் பாதுகாப்பு உலாவலுக்கு அனுப்பக்கூடும்.</translation> @@ -5706,7 +5717,7 @@ <translation id="8680251145628383637">உள்நுழைந்து, உங்கள் சாதனங்கள் எல்லாவற்றிலும் உள்ள புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைப் பெறவும். உங்கள் Google சேவைகளிலும் தானாகவே உள்நுழைவீர்கள்.</translation> <translation id="8682730193597992579"><ph name="PRINTER_NAME" /> இணைக்கப்பட்டும் தயார்நிலையிலும் உள்ளது</translation> <translation id="8688579245973331962">உங்கள் பெயரைப் பார்க்கவில்லையா?</translation> -<translation id="8688591111840995413">எளிதான கடவுச்சொல்</translation> +<translation id="8688591111840995413">தவறான கடவுச்சொல்</translation> <translation id="8688672835843460752">மீதமுள்ளது:</translation> <translation id="8691418731028620688">வைஃபையுடன் இணை</translation> <translation id="8695825812785969222">Open &Location...</translation> @@ -5931,6 +5942,7 @@ <translation id="8951256747718668828">பிழை காரணமாக மீட்டமைக்க முடியவில்லை</translation> <translation id="8951465597020890363">எனினும் கெஸ்ட் பயன்முறையை விட்டு வெளியேற வேண்டுமா?</translation> <translation id="8952831374766033534">உள்ளமைவு விருப்பம் ஆதரிக்கப்படவில்லை: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">சார்ஜ் செய்யும்போது</translation> <translation id="895347679606913382">தொடங்குகிறது...</translation> <translation id="8957762313041272117">உடனடி வசனம்</translation> <translation id="895944840846194039">JavaScript நினைவகம்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index e02f3c13..3b494b4 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -612,6 +612,11 @@ <translation id="1805888043020974594">ప్రింట్ సర్వర్</translation> <translation id="1805967612549112634">పిన్ను నిర్ధారించండి</translation> <translation id="1806335016774576568">తెరిచి ఉన్న మరొక యాప్కు మారండి</translation> +<translation id="1809483812148634490">మీరు Google Play నుండి డౌన్లోడ్ చేసిన యాప్లు ఈ Chromebook నుండి తొలగించబడతాయి. + <ph name="LINE_BREAKS1" /> + మీరు కొనుగోలు చేసిన సినిమాలు, టీవీ షోలు, సంగీతం, పుస్తకాలు లేదా ఇతర యాప్లో కొనుగోళ్లు కూడా తొలగించబడవచ్చు. + <ph name="LINE_BREAKS2" /> + ఇది ఇతర పరికరాల్లో యాప్లు లేదా కంటెంట్ను ప్రభావితం చేయదు.</translation> <translation id="1809734401532861917">నా బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను <ph name="USER_EMAIL_ADDRESS" />కి జోడించు</translation> <translation id="1813278315230285598">సేవలు</translation> <translation id="18139523105317219">EDI వేడుక పేరు</translation> @@ -1393,6 +1398,7 @@ <translation id="2825848369316359348">మీ సెక్యూరిటీ కీ వెనుక భాగాన ముద్రించిన పేరును చూడండి</translation> <translation id="2828650939514476812">Wi-Fi నెట్వర్క్కు కనెక్ట్ చేయండి</translation> <translation id="2835294513443818940">ఈ ఫైల్ను సురక్షితంగా డౌన్లోడ్ చేయడం సాధ్యం కాదు.</translation> +<translation id="2835547721736623118">ప్రసంగ గుర్తింపు సర్వీస్</translation> <translation id="2836269494620652131">క్రాష్</translation> <translation id="2836635946302913370">ఈ వినియోగదారు పేరుతో సైన్ ఇన్ చేయడం, మీ నిర్వాహకుడి ద్వారా నిలిపివేయబడింది.</translation> <translation id="283669119850230892"><ph name="NETWORK_ID" /> నెట్వర్క్ను ఉపయోగించడానికి, మొదట దిగువ ఇంటర్నెట్కు మీ కనెక్షన్ను పూర్తి చేయండి.</translation> @@ -1537,6 +1543,7 @@ <translation id="3019285239893817657">ఉప పేజీ బటన్</translation> <translation id="3020183492814296499">షార్ట్కట్లు</translation> <translation id="3020990233660977256">క్రమ సంఖ్య: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">బ్యాటరీలో ఉన్నప్పుడు</translation> <translation id="3021066826692793094">సీతాకోకచిలుక</translation> <translation id="3021678814754966447">ఫ్రేమ్ మూలాన్ని &వీక్షించండి</translation> <translation id="3022978424994383087">అది పూర్తి కాలేదు.</translation> @@ -2733,6 +2740,7 @@ <translation id="4633757335284074492">Google డిస్క్లో బ్యాకప్ చేయండి. సులభంగా డేటాను పునరుద్ధరించండి లేదా ఏ సమయంలో అయినా పరికరాన్ని మార్చండి. ఈ బ్యాకప్లో యాప్ డేటా కూడా ఉంటుంది. బ్యాకప్లు Googleకు అప్లోడ్ అవుతాయి, మీ చిన్నారి Google ఖాతా పాస్వర్డ్ను ఉపయోగించి ఎన్క్రిప్ట్ చేయబడతాయి.</translation> <translation id="4634771451598206121">మళ్ళీ సైన్ ఇన్ చేయండి...</translation> <translation id="4635398712689569051">అతిథి వినియోగదారులకు <ph name="PAGE_NAME" /> అందుబాటులో లేదు.</translation> +<translation id="4635444580397524003">Linux బ్యాకప్ విజయవంతంగా రీస్టోర్ చేయబడింది.</translation> <translation id="4636930964841734540">సమాచారం</translation> <translation id="4637083375689622795">మరిన్ని చర్యలు, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">ADB డీబగ్గింగ్ను ఎనేబుల్ చేయండి</translation> @@ -2908,6 +2916,7 @@ <translation id="4890773143211625964">అధునాతన ప్రింటర్ ఎంపికలను చూపు</translation> <translation id="4891089016822695758">బీటా ఫోరమ్</translation> <translation id="4892229439761351791">బ్లూటూత్ను సైట్ ఉపయోగించవచ్చు</translation> +<translation id="489258173289528622">బ్యాటరీలో ఉన్నప్పుడు ఇన్యాక్టివ్ చర్య</translation> <translation id="4893336867552636863">దీని వలన మీ బ్రౌజింగ్ డేటా ఈ పరికరం నుండి శాశ్వతంగా తొలగించబడుతుంది.</translation> <translation id="4893522937062257019">లాక్ స్క్రీన్పై</translation> <translation id="489454699928748701">మోషన్ సెన్సార్లను ఉపయోగించడానికి సైట్లను అనుమతించు</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">డీబగ్గింగ్ ఫీచర్లను ప్రారంభించు</translation> <translation id="5864195618110239517">డేటా నియంత్రణ ఉన్న కనెక్షన్ను ఉపయోగించండి</translation> <translation id="5864471791310927901">DHCP లుక్అప్ విఫలమైంది</translation> +<translation id="5864754048328252126">ఛార్జింగ్లో ఉన్నప్పుడు ఇన్యాక్టివ్ చర్య</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> త్వరలో పాజ్ అవుతుంది</translation> <translation id="586567932979200359">మీరు <ph name="PRODUCT_NAME" /> డిస్క్ ఇమేజ్ నుండి దాన్ని అమలు చేస్తున్నారు. మీ కంప్యూటర్లో దీన్ని ఇన్స్టాల్ చేయడం వలన డిస్క్ ఇమేజ్ లేకుండా దాన్ని అమలు చేయడానికి మీరు అనుమతించబడతారు. ఇది తాజాగా ఉంటుందని హామీ పొందుతారు.</translation> <translation id="5865733239029070421">Googleకు ఆటోమేటిక్గా వినియోగ గణాంకాలను, క్రాష్ నివేదికలను పంపుతుంది</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">ప్రారంభ స్క్రీన్కు ఈ పేజీని పిన్ చేయి...</translation> <translation id="6122081475643980456">మీ ఇంటర్నెట్ కనెక్షన్ నియంత్రించబడుతోంది</translation> <translation id="6122095009389448667">క్లిప్బోర్డ్ను చూడనీయకుండా ఈ సైట్ను బ్లాక్ చేయడం కొనసాగించు</translation> +<translation id="6122831415929794347">సురక్షిత బ్రౌజింగ్ను ఆఫ్ చేయాలా?</translation> <translation id="6122875415561139701">దీనిలో వ్రాసే చర్యకు అనుమతి లేదు: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">క్రింది పొడిగింపులు ఈ పొడిగింపుపై ఆధారపడి ఉంటాయి:</translation> <translation id="6124698108608891449">ఈ సైట్కు మరిన్ని అనుమతులు అవసరం.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">కుటుంబ సభ్యులు మరియు స్నేహితులను జోడించండి</translation> <translation id="636850387210749493">ఎంటర్ప్రైజ్ నమోదు</translation> <translation id="6370021412472292592">మానిఫెస్ట్ను లోడ్ చేయడం సాధ్యపడలేదు.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{పాస్వర్డ్ను మార్చండి}other{పాస్వర్డ్లను మార్చండి}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">మళ్లీ ప్రయత్నించు</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' అనే దానికి 1 ఫలితం మాత్రమే లభించింది</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> మరియు <ph name="WEBSITE_3" />లో ఉన్న మీ డేటాని చదవడం మరియు మార్చడం</translation> <translation id="6410257289063177456">చిత్రం ఫైళ్లు</translation> <translation id="6410328738210026208">ఛానెల్ మరియు పవర్వాష్ను మార్చు</translation> +<translation id="6410390304316730527">ప్రమాదకరమైన సాఫ్ట్వేర్ ఇన్స్టాల్ చేసే విధంగా లేదా మీ పాస్వర్డ్లు, ఫోన్ నంబర్లు లేదా క్రెడిట్ కార్డ్ల వంటి మీ వ్యక్తిగత సమాచారాన్ని బహిర్గతం చేసే విధంగా మిమ్మల్ని మాయ చేసే హ్యాకర్ల నుండి మిమ్మల్ని సురక్షిత బ్రౌజింగ్ రక్షిస్తుంది. మీరు దీన్ని ఆఫ్ చేస్తే, అపరిచిత లేదా విశ్వసనీయం కాని సైట్లను బ్రౌజ్ చేసినప్పుడు జాగ్రత్త వహించండి.</translation> <translation id="6410668567036790476">శోధన ఇంజిన్ను జోడించండి</translation> <translation id="641081527798843608">విషయ సరిపోలిక</translation> <translation id="6412673304250309937">Chromeలో స్టోర్ చేసిన సురక్షితం కాని సైట్ల జాబితాతో కూడిన URLలను చెక్ చేస్తుంది. ఏదైనా సైట్ మీ పాస్వర్డ్ను దొంగిలించే ప్రయత్నం చేసినా, లేదంటే ఏదైనా హానికరమైన ఫైల్ను మీరు డౌన్లోడ్ చేసినా, సదరు URLలను, ఆయా పేజీల కంటెంట్లోని కొన్ని భాగాలను కూడా Chrome, 'సురక్షిత బ్రౌజింగ్'కు పంపవచ్చు.</translation> @@ -5932,6 +5943,7 @@ <translation id="8951256747718668828">ఒక ఎర్రర్ కారణంగా పునరుద్ధరించడం పూర్తి కాలేదు</translation> <translation id="8951465597020890363">ఏదేమైనా అతిథి మోడ్ను మూసివేయాలా?</translation> <translation id="8952831374766033534">కాన్ఫిగరేషన్ ఎంపికకు మద్దతు లేదు: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">ఛార్జింగ్లో ఉన్నప్పుడు</translation> <translation id="895347679606913382">ప్రారంభిస్తోంది...</translation> <translation id="8957762313041272117">లైవ్ క్యాప్షన్</translation> <translation id="895944840846194039">JavaScript మెమరీ</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 53edb01..e6b3b2ca 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">เพิ่มครอบครัวและเพื่อนๆ</translation> <translation id="636850387210749493">การลงทะเบียนองค์กร</translation> <translation id="6370021412472292592">ไม่สามารถโหลดไฟล์ Manifest</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{เปลี่ยนรหัสผ่าน}other{เปลี่ยนรหัสผ่าน}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">ลองอีกครั้ง</translation> <translation id="6377268785556383139">มีผลการค้นหา "<ph name="SEARCH_TEXT" />" 1 รายการ</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 5a50eabf..5ff4e7b 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4002,7 +4002,6 @@ <translation id="6365411474437319296">Aile üyelerini ve arkadaşları ekleyin</translation> <translation id="636850387210749493">Kurumsal kayıt</translation> <translation id="6370021412472292592">Manifest yüklenemedi.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Şifreyi değiştir}other{Şifreleri değiştir}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Tekrar Dene</translation> <translation id="6377268785556383139">"<ph name="SEARCH_TEXT" />" için bulunan 1 sonuç gösteriliyor</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 6ae82ed..99bcd4a 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -4001,7 +4001,6 @@ <translation id="6365411474437319296">Додавання друзів і рідних</translation> <translation id="636850387210749493">Реєстрація підприємства</translation> <translation id="6370021412472292592">Не вдалося завантажити маніфест.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Змінити пароль}one{Змінити паролі}few{Змінити паролі}many{Змінити паролі}other{Змінити паролі}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Повторити спробу</translation> <translation id="6377268785556383139">1 результат для запиту "<ph name="SEARCH_TEXT" />"</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 41cb842..1150258 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -3992,7 +3992,6 @@ <translation id="6365411474437319296">خاندان اور دوستوں کو شامل کریں</translation> <translation id="636850387210749493">انٹرپرائز اندراج</translation> <translation id="6370021412472292592">manifest لوڈ نہیں کیا جا سکا۔</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{پاس ورڈ تبدیل کریں}other{پاس ورڈز تبدیل کریں}}</translation> <translation id="6374077068638737855">آئیس ویزل</translation> <translation id="6374469231428023295">دوبارہ کوشش کریں</translation> <translation id="6377268785556383139">'<ph name="SEARCH_TEXT" />' کا 1 نتیجہ</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index abebec7..c283981 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -816,7 +816,7 @@ <translation id="2090165459409185032">Hisob ma’lumotini tiklash uchun bu yerga o‘ting: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Tizim xavfsizlik sozlamasi</translation> <translation id="2091887806945687916">Tovush</translation> -<translation id="2096478741073211388">Shaxsiy axborot takliflari maxsus soʻzlarni kiritayotganingizda ism, manzil yoki telefon raqam taklif qilish orqali tezkor yozishga yordam beradi. Faqat siz hisobingiz uchun maxfiy, moslashtirilgan takliflarni koʻrishingiz mumkin.</translation> +<translation id="2096478741073211388">Shaxsiy axborot takliflari maxsus soʻzlarni kiritayotganingizda ism, manzil yoki telefon raqamini taklif qilish orqali tezkor yozishga yordam beradi. Faqat siz hisobingiz uchun maxfiy, moslashtirilgan takliflarni koʻrishingiz mumkin.</translation> <translation id="2096715839409389970">Tashqi cookie fayllarni tozalash</translation> <translation id="2097372108957554726">Yangi qurilmani ro‘yxatdan o‘tkazish uchun Chrome hisobingizga kiring</translation> <translation id="2099172618127234427">Siz Chrome OS tuzatish xususiyatlarini ishga tushirmoqdasiz, ular debugging features which sshd xizmatini o‘rnatib, USB disklardan yuklanishni xususiyatini yoqadi.</translation> @@ -1687,7 +1687,7 @@ <translation id="3220586366024592812"><ph name="CLOUD_PRINT_NAME" /> konnektori ishdan chiqdi. Qayta ishga tushirilsinmi?</translation> <translation id="3222066309010235055">Oldindan ishlov berish: <ph name="PRERENDER_CONTENTS_NAME" /></translation> <translation id="3223531857777746191">Asliga qaytarish tugmasi</translation> -<translation id="3225084153129302039">Standart binafsharang avatar</translation> +<translation id="3225084153129302039">Standart siyohrang avatar</translation> <translation id="3225319735946384299">Kodni imzolash</translation> <translation id="3227137524299004712">Mikrofon</translation> <translation id="3228679360002431295">Aloqa o‘rnatilmoqda va tekshirilmoqda<ph name="ANIMATED_ELLIPSIS" /></translation> @@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">Oila a’zolaringiz va do‘stlaringizni qo‘shing</translation> <translation id="636850387210749493">Korporativ domen ro‘yxatidan o‘tish</translation> <translation id="6370021412472292592">Aniqlovchi faylni yuklab bo‘lmadi.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Parolni almashtirish}other{Parollarni almashtirish}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Qaytadan</translation> <translation id="6377268785556383139">“<ph name="SEARCH_TEXT" />” uchun bitta natija</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index a447139..ec5a318 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -94,6 +94,7 @@ <translation id="1122960773616686544">Tên dấu trang</translation> <translation id="1124772482545689468">Người dùng</translation> <translation id="1125550662859510761">Có vẻ như là <ph name="WIDTH" /> x <ph name="HEIGHT" /> (Gốc)</translation> +<translation id="1126809382673880764">Không bảo vệ bạn trước các trang web, tệp đã tải xuống và tiện ích nguy hiểm. Bạn sẽ vẫn được bảo vệ bằng tính năng Duyệt web an toàn (nếu có) ở các dịch vụ khác của Google, chẳng hạn như Gmail và Tìm kiếm.</translation> <translation id="1128109161498068552">Không cho phép bất cứ trang web nào sử dụng thông báo dành riêng cho hệ thống để truy cập thiết bị MIDI</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">Chỉnh sửa công cụ tìm kiếm</translation> @@ -185,6 +186,7 @@ <translation id="1235458158152011030">Mạng đã biết</translation> <translation id="123578888592755962">Đĩa đầy</translation> <translation id="1238191093934674082">Open VPN</translation> +<translation id="1239439601391236986">Hiển thị nội dung đề xuất thông tin cá nhân</translation> <translation id="1239594683407221485">Khám phá nội dung của thiết bị trong ứng dụng Files.</translation> <translation id="124116460088058876">Ngôn ngữ khác</translation> <translation id="1241753985463165747">Đọc và thay đổi tất cả dữ liệu của bạn trên trang web hiện tại khi được gọi ra</translation> @@ -301,6 +303,7 @@ <translation id="140723521119632973">Kích hoạt mạng di động</translation> <translation id="1407489512183974736">Cắt giữa</translation> <translation id="1408504635543854729">Khám phá nội dung của thiết bị trong ứng dụng Tệp. Quản trị viên đã hạn chế nội dung và bạn không thể sửa đổi nội dung này.</translation> +<translation id="1408980562518920698">Quản lý thông tin cá nhân</translation> <translation id="1410197035576869800">Biểu tượng ứng dụng</translation> <translation id="1410616244180625362">Tiếp tục cho phép <ph name="HOST" /> truy cập máy ảnh của bạn</translation> <translation id="1414648216875402825">Bạn đang cập nhật lên phiên bản không chính thức <ph name="PRODUCT_NAME" /> chứa các tính năng hiện trong quá trình thử nghiệm. Các sự cố và lỗi không mong muốn sẽ xảy ra. Hãy thận trọng khi tiếp tục.</translation> @@ -434,6 +437,7 @@ <ph name="EXTENSION_NAME" /></translation> <translation id="1587275751631642843">Bảng điều khiển &JavaScript</translation> <translation id="1587907146729660231">Dùng ngón tay chạm vào nút nguồn</translation> +<translation id="1588200577109872591">Phương thức nhập thông minh</translation> <translation id="1588438908519853928">Bình thường</translation> <translation id="158849752021629804">Cần mạng gia đình</translation> <translation id="1588870296199743671">Mở liên kết bằng...</translation> @@ -608,6 +612,11 @@ <translation id="1805888043020974594">Máy chủ máy in</translation> <translation id="1805967612549112634">Xác nhận mã PIN</translation> <translation id="1806335016774576568">Chuyển sang một ứng dụng khác đang mở</translation> +<translation id="1809483812148634490">Ứng dụng bạn đã tải xuống từ Google Play sẽ bị xóa khỏi Chromebook này. + <ph name="LINE_BREAKS1" /> + Nội dung bạn đã mua như phim, chương trình truyền hình, nhạc, sách hoặc các nội dung khác mua trong ứng dụng cũng có thể bị xóa. + <ph name="LINE_BREAKS2" /> + Điều này không ảnh hưởng đến ứng dụng hoặc nội dung trên các thiết bị khác.</translation> <translation id="1809734401532861917">Thêm dấu trang, lịch sử, mật khẩu của tôi và các cài đặt khác vào <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Dịch vụ</translation> <translation id="18139523105317219">Tên của Bên EDI</translation> @@ -669,6 +678,7 @@ <translation id="1879000426787380528">Đăng nhập bằng</translation> <translation id="1880905663253319515">Xóa chứng chỉ "<ph name="CERTIFICATE_NAME" />"?</translation> <translation id="1884013283844450420">Mạng <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, Kết nối</translation> +<translation id="1884705339276589024">Thay đổi dung lượng ổ đĩa Linux</translation> <translation id="1886996562706621347">Cho phép các trang web yêu cầu trở thành trình xử lý mặc định cho giao thức (nên chọn)</translation> <translation id="1887442540531652736">Lỗi đăng nhập</translation> <translation id="1887597546629269384">Nói lại "Ok Google"</translation> @@ -738,6 +748,7 @@ <translation id="1979280758666859181">Bạn đang thay đổi sang kênh có phiên bản <ph name="PRODUCT_NAME" /> cũ hơn. Sẽ áp dụng thay đổi kênh khi phiên bản kênh khớp với phiên bản hiện được cài đặt trên thiết bị của bạn.</translation> <translation id="197989455406964291">KDC không hỗ trợ loại mã hóa</translation> <translation id="1982354452682152483">Không có mô tả.</translation> +<translation id="1984417487208496350">Không được bảo vệ (không khuyến nghị)</translation> <translation id="1987317783729300807">Tài khoản</translation> <translation id="1989112275319619282">Duyệt qua</translation> <translation id="1990512225220753005">Không hiển thị lối tắt trên trang này</translation> @@ -807,6 +818,7 @@ <translation id="2090165459409185032">Để khôi phục thông tin tài khoản của bạn, hãy truy cập: google.com/accounts/recovery</translation> <translation id="2090876986345970080">Cài đặt bảo mật hệ thống</translation> <translation id="2091887806945687916">Âm thanh</translation> +<translation id="2096478741073211388">Nội dung đề xuất thông tin cá nhân giúp bạn viết nhanh hơn bằng cách đề xuất tên, địa chỉ hoặc số điện thoại khi bạn nhập một số từ cụ thể. Chỉ bạn mới thấy các nội dung đề xuất riêng tư dành riêng cho tài khoản của mình.</translation> <translation id="2096715839409389970">Xóa cookie của bên thứ ba</translation> <translation id="2097372108957554726">Bạn cần đăng nhập Chrome để đăng ký thiết bị mới</translation> <translation id="2099172618127234427">Bạn đâng bật tính năng gỡ lỗi của Chrome OS, thao tác này sẽ thiết lập sshd daemon và bật tính năng khởi động từ ổ USB.</translation> @@ -823,6 +835,7 @@ <translation id="2114326799768592691">Tải lại &khung</translation> <translation id="2114896190328250491">Ảnh của <ph name="NAME" /></translation> <translation id="2119349053129246860">Mở trong <ph name="APP" /></translation> +<translation id="2119461801241504254">Tính năng Duyệt web an toàn đang bật. Tính năng này sẽ bảo vệ bạn khỏi những tệp đã tải xuống và trang web gây hại</translation> <translation id="2120297377148151361">Hoạt động và tương tác</translation> <translation id="2120639962942052471">Đã chặn <ph name="PERMISSION" /></translation> <translation id="2121055421682309734">{COUNT,plural, =0{Đã chặn các cookie}=1{Đã chặn các cookie nhưng có 1 trường hợp ngoại lệ}other{Đã chặn các cookie nhưng có {COUNT} trường hợp ngoại lệ}}</translation> @@ -1239,7 +1252,7 @@ <translation id="265390580714150011">Giá trị Trường</translation> <translation id="2654166010170466751">Cho phép các trang web cài đặt trình xử lý thanh toán</translation> <translation id="2654553774144920065">Yêu cầu in</translation> -<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Các tính năng có thể thay đổi tùy theo thiết bị</translation> +<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Các tính năng có thể khác nhau tùy theo thiết bị</translation> <translation id="2660779039299703961">Sự kiện</translation> <translation id="266079277508604648">Không thể kết nối với máy in. Hãy kiểm tra để đảm bảo rằng bạn đã bật máy in cũng như đã kết nối máy in với Chromebook qua Wi-Fi hoặc USB.</translation> <translation id="2661714428027871023">Duyệt web nhanh hơn và sử dụng ít dữ liệu hơn nhờ Chế độ thu gọn. Nhấp để tìm hiểu thêm.</translation> @@ -1385,6 +1398,7 @@ <translation id="2825848369316359348">Tìm tên in trên mặt sau của khóa bảo mật</translation> <translation id="2828650939514476812">Kết nối với mạng Wi-Fi</translation> <translation id="2835294513443818940">Không thể tải tệp này xuống một cách an toàn.</translation> +<translation id="2835547721736623118">Dịch vụ nhận dạng lời nói</translation> <translation id="2836269494620652131">Lỗi</translation> <translation id="2836635946302913370">Đăng nhập bằng tên người dùng này đã bị quản trị viên của bạn vô hiệu hóa.</translation> <translation id="283669119850230892">Để sử dụng mạng <ph name="NETWORK_ID" />, trước hết hãy hoàn tất kết nối Internet của bạn ở bên dưới.</translation> @@ -1529,6 +1543,7 @@ <translation id="3019285239893817657">Nút trang con</translation> <translation id="3020183492814296499">Phím tắt</translation> <translation id="3020990233660977256">Số Sê-ri: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Trong khi chạy bằng pin</translation> <translation id="3021066826692793094">Bướm</translation> <translation id="3021678814754966447">&Xem Nguồn Khung</translation> <translation id="3022978424994383087">Không hiểu được.</translation> @@ -1890,6 +1905,7 @@ <translation id="3515983984924808886">Chạm lại vào khóa bảo mật để xác nhận đặt lại. Thao tác này sẽ xóa toàn bộ thông tin lưu trữ trên khóa bảo mật, bao gồm cả mã PIN của khóa.</translation> <translation id="3518985090088779359">Chấp nhận và tiếp tục</translation> <translation id="351952459507671940">Thêm vào nhóm mới</translation> +<translation id="3521606918211282604">Thay đổi dung lượng ổ đĩa</translation> <translation id="3523642406908660543">Hỏi khi một trang web muốn sử dụng plugin để truy cập vào máy tính của bạn (được khuyến nghị)</translation> <translation id="3524965460886318643">Xuất hoạt động</translation> <translation id="3526034519184079374">Không thể đọc hoặc thay đổi dữ liệu của trang web</translation> @@ -1977,6 +1993,7 @@ <translation id="3629631988386925734">Nhập mật khẩu để bật tính năng Smart Lock. Vào lần tới, điện thoại của bạn sẽ mở khóa <ph name="DEVICE_TYPE" />. Bạn có thể tắt tính năng Smart Lock trong phần Cài đặt.</translation> <translation id="3630132874740063857">Điện thoại</translation> <translation id="3630995161997703415">Thêm trang web này vào giá của bạn để sử dụng bất cứ lúc nào</translation> +<translation id="3633309367764744750">Tìm nạp trước thông tin từ các trang, kể cả trang bạn chưa truy cập. Thông tin được tìm nạp có thể bao gồm cookie, nếu bạn cho phép.</translation> <translation id="3634507049637220048">Mạng <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Do quản trị viên của bạn quản lý, Thông tin chi tiết</translation> <translation id="3635241501480133979">Dữ liệu này vi phạm chính sách bảo mật của tổ chức bạn nên không thể thả được.</translation> <translation id="3635353578505343390">Gửi ý kiến phản hồi cho Google</translation> @@ -2723,6 +2740,7 @@ <translation id="4633757335284074492">Sao lưu vào Google Drive. Dễ dàng khôi phục dữ liệu hoặc chuyển đổi thiết bị bất cứ lúc nào. Bản sao lưu này bao gồm cả dữ liệu ứng dụng. Các bản sao lưu được tải lên Google và mã hóa bằng mật khẩu Tài khoản Google của con bạn.</translation> <translation id="4634771451598206121">Đăng nhập lại...</translation> <translation id="4635398712689569051">Người dùng khách không thể sử dụng <ph name="PAGE_NAME" />.</translation> +<translation id="4635444580397524003">Đã khôi phục thành công bản sao lưu Linux.</translation> <translation id="4636930964841734540">Thông tin</translation> <translation id="4637083375689622795">Thao tác khác, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Bật tùy chọn gỡ lỗi ADB</translation> @@ -2898,6 +2916,7 @@ <translation id="4890773143211625964">Hiển thị tùy chọn máy in nâng cao</translation> <translation id="4891089016822695758">Diễn đàn beta</translation> <translation id="4892229439761351791">Trang web có thể sử dụng Bluetooth</translation> +<translation id="489258173289528622">Trạng thái không hoạt động trong khi chạy bằng pin</translation> <translation id="4893336867552636863">Thao tác này sẽ xóa vĩnh viễn dữ liệu duyệt web của bạn khỏi thiết bị này.</translation> <translation id="4893522937062257019">Trên màn hình khóa</translation> <translation id="489454699928748701">Cho phép các trang web sử dụng cảm biến chuyển động</translation> @@ -3604,6 +3623,7 @@ <translation id="5863445608433396414">Bật tính năng gỡ lỗi</translation> <translation id="5864195618110239517">Sử dụng đường kết nối có đo lượng dữ liệu</translation> <translation id="5864471791310927901">Không thể tra cứu DHCP</translation> +<translation id="5864754048328252126">Trạng thái không hoạt động trong khi sạc</translation> <translation id="5865508026715185451"><ph name="APP_NAME" /> sắp tạm dừng</translation> <translation id="586567932979200359">Bạn đang chạy <ph name="PRODUCT_NAME" /> từ hình ảnh đĩa của nó. Cài đặt trình duyệt này trên máy tính cho phép bạn chạy trình duyệt mà không cần có hình ảnh đĩa và đảm bảo trình duyệt sẽ được cập nhật.</translation> <translation id="5865733239029070421">Tự động gửi số liệu thống kê sử dụng và báo cáo sự cố cho Google</translation> @@ -3803,6 +3823,7 @@ <translation id="6120205520491252677">Ghim trang này vào màn hình Bắt đầu...</translation> <translation id="6122081475643980456">Kết nối Internet của bạn đang bị kiểm soát</translation> <translation id="6122095009389448667">Tiếp tục chặn trang web này xem khay nhớ tạm</translation> +<translation id="6122831415929794347">Tắt tính năng Duyệt web an toàn?</translation> <translation id="6122875415561139701">Tác vụ ghi không được phép trên: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Các tiện ích sau phụ thuộc vào tiện ích này:</translation> <translation id="6124698108608891449">Trang web này cần các quyền khác.</translation> @@ -3931,6 +3952,7 @@ <translation id="6298962879096096191">Sử dụng Google Play để cài đặt các ứng dụng Android</translation> <translation id="630065524203833229">T&hoát</translation> <translation id="6300718114348072351">Không thể tự động định cấu hình cho <ph name="PRINTER_NAME" />. Vui lòng chỉ định các tùy chọn cài đặt nâng cao cho máy in. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> +<translation id="630292539633944562">Nội dung đề xuất thông tin cá nhân</translation> <translation id="6305607932814307878">Chính sách toàn cầu:</translation> <translation id="6307990684951724544">Hệ thống đang bận</translation> <translation id="6308493641021088955">Màn hình đăng nhập do <ph name="EXTENSION_NAME" /> cung cấp</translation> @@ -3979,7 +4001,6 @@ <translation id="6365411474437319296">Thêm gia đình và bạn bè</translation> <translation id="636850387210749493">Đăng ký doanh nghiệp</translation> <translation id="6370021412472292592">Không thể tải tệp kê khai.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Đổi mật khẩu}other{Đổi mật khẩu}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">Thử lại</translation> <translation id="6377268785556383139">1 kết quả cho '<ph name="SEARCH_TEXT" />'</translation> @@ -4005,10 +4026,12 @@ <translation id="6408118934673775994">Đọc và thay đổi dữ liệu của bạn trên <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> và <ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Tệp hình ảnh</translation> <translation id="6410328738210026208">Thay đổi kênh và Powerwash</translation> +<translation id="6410390304316730527">Tính năng Duyệt web an toàn bảo vệ bạn trước những kẻ tấn công có thể đánh lừa bạn làm một việc gì đó nguy hiểm như cài đặt phần mềm độc hại hoặc tiết lộ thông tin cá nhân như mật khẩu, số điện thoại hoặc thẻ tín dụng. Nếu bạn tắt tính năng này, hãy cẩn thận khi duyệt các trang web lạ hoặc không có uy tín.</translation> <translation id="6410668567036790476">Thêm công cụ tìm kiếm</translation> <translation id="641081527798843608">Khớp với chủ đề</translation> <translation id="6412673304250309937">Kiểm tra đối chiếu các URL với danh sách trang web không an toàn được lưu trữ trong Chrome. Nếu một trang web cố ăn cắp mật khẩu của bạn hoặc nếu bạn tải một tệp gây hại xuống, Chrome cũng có thể gửi các URL, bao gồm cả các đoạn nội dung trên trang, đến tính năng Duyệt web an toàn.</translation> <translation id="6412931879992742813">Cửa sổ ẩn danh mới</translation> +<translation id="6413591858632097328">Thao tác này sẽ xóa toàn bộ dữ liệu và cookie do <ph name="ORIGIN_NAME" /> lưu, cũng như trong mọi ứng dụng đã cài đặt thuộc nhóm này.</translation> <translation id="641469293210305670">Cài đặt bản cập nhật và ứng dụng</translation> <translation id="6414888972213066896">Bạn đã hỏi cha mẹ mình xem có thể truy cập vào trang này hay không</translation> <translation id="6415900369006735853">Kết nối Internet qua điện thoại</translation> @@ -5924,6 +5947,7 @@ <translation id="8951256747718668828">Không thể hoàn tất quá trình khôi phục do lỗi</translation> <translation id="8951465597020890363">Vẫn thoát khỏi chế độ khách?</translation> <translation id="8952831374766033534">Không hỗ trợ tùy chọn cấu hình: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Trong khi sạc</translation> <translation id="895347679606913382">Đang bắt đầu...</translation> <translation id="8957762313041272117">Phụ đề trực tiếp</translation> <translation id="895944840846194039">Bộ nhớ dành cho JavaScript</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 6f54983..bbea15e 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -609,6 +609,11 @@ <translation id="1805888043020974594">打印服务器</translation> <translation id="1805967612549112634">确认 PIN 码</translation> <translation id="1806335016774576568">切换到另一个已打开的应用</translation> +<translation id="1809483812148634490">系统会从这台 Chromebook 中删除您从 Google Play 下载的应用。 + <ph name="LINE_BREAKS1" /> + 可能还会删除您购买的内容(例如电影、电视节目、音乐、图书或其他应用内购商品)。 + <ph name="LINE_BREAKS2" /> + 其他设备上的应用或内容均不受影响。</translation> <translation id="1809734401532861917">将我的书签、历史记录、密码和其他设置添加至 <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">服务</translation> <translation id="18139523105317219">EDI 参与方名称</translation> @@ -1389,6 +1394,7 @@ <translation id="2825848369316359348">找到印在安全密钥背面的名称</translation> <translation id="2828650939514476812">连接到 Wi-Fi 网络</translation> <translation id="2835294513443818940">无法安全地下载此文件。</translation> +<translation id="2835547721736623118">“语音识别”服务</translation> <translation id="2836269494620652131">崩溃</translation> <translation id="2836635946302913370">管理员已禁止使用此用户名登录。</translation> <translation id="283669119850230892">要使用网络“<ph name="NETWORK_ID" />”,请先在下方连接互联网。</translation> @@ -1533,6 +1539,7 @@ <translation id="3019285239893817657">子页面按钮</translation> <translation id="3020183492814296499">快捷键</translation> <translation id="3020990233660977256">序列号:<ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">使用电池时</translation> <translation id="3021066826692793094">蝴蝶</translation> <translation id="3021678814754966447">查看框架的源代码(&V)</translation> <translation id="3022978424994383087">无法解析您所说的内容。</translation> @@ -2728,6 +2735,7 @@ <translation id="4633757335284074492">备份到 Google 云端硬盘。您随时可以轻松地恢复数据或更换设备。此类备份内容包含应用数据。备份内容将上传到 Google 并使用您孩子的 Google 帐号密码进行加密。</translation> <translation id="4634771451598206121">重新登录...</translation> <translation id="4635398712689569051">访客用户无法使用“<ph name="PAGE_NAME" />”页面。</translation> +<translation id="4635444580397524003">已成功恢复 Linux 备份。</translation> <translation id="4636930964841734540">信息</translation> <translation id="4637083375689622795">更多操作,<ph name="EMAIL" /></translation> <translation id="4638930039313743000">启用 ADB 调试</translation> @@ -2903,6 +2911,7 @@ <translation id="4890773143211625964">显示高级打印机选项</translation> <translation id="4891089016822695758">Chrome(测试版)论坛</translation> <translation id="4892229439761351791">此网站可能会使用蓝牙</translation> +<translation id="489258173289528622">使用电池时的闲置操作</translation> <translation id="4893336867552636863">这会将您的浏览数据从这台设备上永久删除。</translation> <translation id="4893522937062257019">屏幕锁定时</translation> <translation id="489454699928748701">允许网站使用动态传感器</translation> @@ -3609,6 +3618,7 @@ <translation id="5863445608433396414">启用调试功能</translation> <translation id="5864195618110239517">使用按流量计费的网络连接</translation> <translation id="5864471791310927901">DHCP 查找失败</translation> +<translation id="5864754048328252126">充电时的闲置操作</translation> <translation id="5865508026715185451">“<ph name="APP_NAME" />”即将暂停</translation> <translation id="586567932979200359">您正在通过磁盘映像运行 <ph name="PRODUCT_NAME" />。您只需在计算机上安装该软件,即可在没有磁盘映像的情况下运行它,并可确保使用最新版本。</translation> <translation id="5865733239029070421">自动将使用情况统计信息和崩溃报告发送至 Google</translation> @@ -3808,6 +3818,7 @@ <translation id="6120205520491252677">将此网页固定到“开始”屏幕...</translation> <translation id="6122081475643980456">您的互联网连接受到控制</translation> <translation id="6122095009389448667">继续禁止此网站查看剪贴板</translation> +<translation id="6122831415929794347">关闭“安全浏览”功能?</translation> <translation id="6122875415561139701">禁止在“<ph name="DEVICE_NAME" />”上执行写入操作。</translation> <translation id="6124650939968185064">需先安装此扩展程序,下列扩展程序才能正常使用:</translation> <translation id="6124698108608891449">此网站需要更多权限。</translation> @@ -3985,7 +3996,6 @@ <translation id="6365411474437319296">添加亲朋好友</translation> <translation id="636850387210749493">企业注册</translation> <translation id="6370021412472292592">无法加载清单。</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{更改密码}other{更改密码}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">重试</translation> <translation id="6377268785556383139">1 个与“<ph name="SEARCH_TEXT" />”相符的搜索结果</translation> @@ -4011,6 +4021,7 @@ <translation id="6408118934673775994">读取和更改您在<ph name="WEBSITE_1" />、<ph name="WEBSITE_2" />和<ph name="WEBSITE_3" />上的数据</translation> <translation id="6410257289063177456">图片文件</translation> <translation id="6410328738210026208">变更版本并执行 Powerwash</translation> +<translation id="6410390304316730527">“安全浏览”功能可保护您免受以下攻击者的侵害:他们可能会诱骗您做一些危险的事情,例如安装恶意软件或泄露个人信息(例如密码、电话号码或信用卡信息)。如果关闭此功能,当浏览不熟悉或信誉不佳的网站时,请一定多加小心。</translation> <translation id="6410668567036790476">添加搜索引擎</translation> <translation id="641081527798843608">主题匹配</translation> <translation id="6412673304250309937">将网址与存储在 Chrome 中的不安全网站列表进行比对。如果某个网站企图窃取您的密码,或者您下载了有害的文件,Chrome 可能还会将相应网址连同少量网页内容发送给“安全浏览”功能。</translation> @@ -5930,6 +5941,7 @@ <translation id="8951256747718668828">发生错误,因此无法完成恢复</translation> <translation id="8951465597020890363">仍要退出访客模式?</translation> <translation id="8952831374766033534">有配置选项不受支持:<ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">充电时</translation> <translation id="895347679606913382">即将开始下载...</translation> <translation id="8957762313041272117">实时字幕</translation> <translation id="895944840846194039">JavaScript 使用的内存</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index e2f9cab6..215649b 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">新增家人好友</translation> <translation id="636850387210749493">企業註冊</translation> <translation id="6370021412472292592">無法載入資訊清單。</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{變更密碼}other{變更密碼}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">再試一次</translation> <translation id="6377268785556383139">有 1 個同「<ph name="SEARCH_TEXT" />」相關嘅搜尋結果</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 03ce25b..414e302 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -94,7 +94,7 @@ <translation id="1122960773616686544">書籤名稱</translation> <translation id="1124772482545689468">使用者</translation> <translation id="1125550662859510761">螢幕解析度:<ph name="WIDTH" /> x <ph name="HEIGHT" /> (原生)</translation> -<translation id="1126809382673880764">無法封鎖不安全的網站、下載內容和擴充功能。在 Gmail 和 Google 搜尋等其他 Google 服務中,你仍可獲得安全瀏覽的防護 (如適用)。</translation> +<translation id="1126809382673880764">無法封鎖不安全的網站、下載內容和擴充功能。在 Gmail 和 Google 搜尋等其他 Google 服務中,安全瀏覽功能的防護機制仍然會發揮作用 (在適用情況下)。</translation> <translation id="1128109161498068552">禁止任何網站使用系統專用訊息存取 MIDI 裝置</translation> <translation id="1128128132059598906">EAP-TTLS</translation> <translation id="1128591060186966949">編輯搜尋引擎</translation> @@ -818,7 +818,7 @@ <translation id="2090165459409185032">如要還原您的帳戶資訊,請前往 google.com/accounts/recovery</translation> <translation id="2090876986345970080">系統安全性設定</translation> <translation id="2091887806945687916">音訊</translation> -<translation id="2096478741073211388">個人資訊建議功能可在你輸入特定字詞時,針對你的姓名、地址或電話號碼提供建議,協助你更快輸入資訊。系統會為你的帳戶提供專屬的個人化建議,只有你能看到這些建議內容。</translation> +<translation id="2096478741073211388">個人資訊建議功能可在你輸入特定字詞時,提供關於姓名、地址或電話號碼的建議,方便你直接填入適用的內容。系統會為你的帳戶提供專屬的個人化建議,只有你能看到這些建議內容。</translation> <translation id="2096715839409389970">清除第三方 Cookie</translation> <translation id="2097372108957554726">你必須登入 Chrome 註冊新裝置</translation> <translation id="2099172618127234427">你即將啟用 Chrome 作業系統偵錯功能,這會一併設定 sshd 精靈,並允許從 USB 磁碟機執行啟動作業。</translation> @@ -3999,7 +3999,6 @@ <translation id="6365411474437319296">新增家人好友</translation> <translation id="636850387210749493">企業註冊</translation> <translation id="6370021412472292592">無法載入資訊清單。</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{變更密碼}other{變更密碼}}</translation> <translation id="6374077068638737855">Iceweasel</translation> <translation id="6374469231428023295">再試一次</translation> <translation id="6377268785556383139">有 1 個與「<ph name="SEARCH_TEXT" />」相符的搜尋結果</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index c1973ce..f60e6a4 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -610,6 +610,11 @@ <translation id="1805888043020974594">Iseva yokuphrinta</translation> <translation id="1805967612549112634">Qinisekisa i-PIN</translation> <translation id="1806335016774576568">Shintshela kolunye uhlelo lokusebenza oluvuliwe</translation> +<translation id="1809483812148634490">Izinhlelo zokusebenza ozilande ku-Google Play zizosuswa kusuka kule Chromebook. + <ph name="LINE_BREAKS1" /> + Okuqukethwe okuthengile okufana nama-movie, izinhlelo ze-TV, umculo, amabhuku, noma okunye ukuthenga ngaphakathi nohlelo nakho kungasuswa. + <ph name="LINE_BREAKS2" /> + Lokhu akuthinti izinhlelo zokusebenza noma okuqukethwe kwamanye amadivayisi.</translation> <translation id="1809734401532861917">Engeza amabhukhimakhi, umlando, amaphasiwedi, nezinye izilungiselelo ku-<ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="1813278315230285598">Amasevisi</translation> <translation id="18139523105317219">Igama lenhlangano ye-EDI</translation> @@ -1391,6 +1396,7 @@ <translation id="2825848369316359348">Thola igama eliphrintwe ngemuva kokhiye wakho wokuvikela</translation> <translation id="2828650939514476812">Xhumeka kunethiwekhi ye-Wi-Fi</translation> <translation id="2835294513443818940">Leli fayela alikwazi ukulandwa ngokuvikelekile.</translation> +<translation id="2835547721736623118">Isevisi yokubonwa kwengxoxo</translation> <translation id="2836269494620652131">Phahlazeka</translation> <translation id="2836635946302913370">Ukungena ngemvume ngaleli gama lomsebenzisi kukhutshazwe ngumlawuli wakho.</translation> <translation id="283669119850230892">Ukuze usebenzise inethiwekhi ye-<ph name="NETWORK_ID" />, okokuqala qedela ukuxhumeka kwakho ku-inthanethi ngezansi.</translation> @@ -1535,6 +1541,7 @@ <translation id="3019285239893817657">Inkinobho yekhasi elingezansi</translation> <translation id="3020183492814296499">Izinqamuleli</translation> <translation id="3020990233660977256">Inombolo yomkhiqizo: <ph name="SERIAL_NUMBER" /></translation> +<translation id="3021065318976393105">Ngenkathi ikwibhethri</translation> <translation id="3021066826692793094">Umvemvane</translation> <translation id="3021678814754966447">&Buka umthombo wozimele</translation> <translation id="3022978424994383087">Awukuzwanga lokho.</translation> @@ -2730,6 +2737,7 @@ <translation id="4633757335284074492">Yenza isipele ku-Google Drayivu. Buyisa kalula idatha noma ushintshe idivayisi noma kunini. Lesi sipele sihlanganisa nedatha yohlelo lokusebenza. Izipele zilayishwa ku-Google futhi zibethelwe kusetshenziswa iphasiwedi ye-Akhawunti ye-Google yengane yakho.</translation> <translation id="4634771451598206121">Ngena ngemvume futhi...</translation> <translation id="4635398712689569051">I-<ph name="PAGE_NAME" /> ayitholakali kubasebenzisi abayisihambeli.</translation> +<translation id="4635444580397524003">Ikhophi yasenqolobaneni ye-Linux ibuyiselwe ngokuphumelelayo.</translation> <translation id="4636930964841734540">Ulwazi</translation> <translation id="4637083375689622795">Izenzo eziningi, <ph name="EMAIL" /></translation> <translation id="4638930039313743000">Nika amandla ukulungisa amaphutha kwe-ADB</translation> @@ -2905,6 +2913,7 @@ <translation id="4890773143211625964">Bonisa izinketho ezithuthukile zephrinta</translation> <translation id="4891089016822695758">Iforamu ye-Beta</translation> <translation id="4892229439761351791">Isayithi lingasebenzisa i-Bluetooth</translation> +<translation id="489258173289528622">Isenzo sokungenzi lutho ngenkathi ikwibhethri</translation> <translation id="4893336867552636863">Lokhu kuzosula unaphakade idatha yokuphequlula kusuka kule divayisi.</translation> <translation id="4893522937062257019">Ekukhiyeni kwesikrini</translation> <translation id="489454699928748701">Vumela amasayithi ukuthi asebenzise izinzwa zokunyakaza</translation> @@ -3614,6 +3623,7 @@ <translation id="5863445608433396414">Nika amandla izici zokususa amaphutha</translation> <translation id="5864195618110239517">Sebenzisa ukuxhuma okwenziwe imitha</translation> <translation id="5864471791310927901">Ukubheka kwe-DHCP kuhlulekile</translation> +<translation id="5864754048328252126">Isenzo sokungenzi lutho ngenkathi ishaja</translation> <translation id="5865508026715185451">I-<ph name="APP_NAME" /> izophumula maduze</translation> <translation id="586567932979200359">Usebenzisa i-<ph name="PRODUCT_NAME" /> kusukela kusithombe sayo sediski. Ukuyifaka kukhompyutha yakho kukuvumela ukuthi uyisebenzise ngaphandle kwesithombe sediski, kuphinde kuqiniseke ukuthi izogcinwa isesikhathini samanje.</translation> <translation id="5865733239029070421">Ithumela ngokuzenzakalela izibalo zokusetshenziswa nemibiko yokuphahlazeka ku-Google</translation> @@ -3813,6 +3823,7 @@ <translation id="6120205520491252677">Phina leli khasi kusikrini sokuqala...</translation> <translation id="6122081475643980456">Uxhumano lwakho lwe-inthanethi luyalawulwa</translation> <translation id="6122095009389448667">Qhubeka uvimbele leli sayithi kusukela ekuboneni ibhodi lokunamathisela</translation> +<translation id="6122831415929794347">Vala ukuphequlula ngokuphephile?</translation> <translation id="6122875415561139701">Umsebenzi wokubhala awuvunyelwe ku-: "<ph name="DEVICE_NAME" />".</translation> <translation id="6124650939968185064">Izandiso ezilandelayo zincike kulesi sandiso:</translation> <translation id="6124698108608891449">Leli sayithi lidinga izimvume eziningi.</translation> @@ -3990,7 +4001,6 @@ <translation id="6365411474437319296">Engeza umndeni nabangani</translation> <translation id="636850387210749493">Ukubhalisa kwebhizinisi</translation> <translation id="6370021412472292592">Ayikwazanga ukulayisha okubonakalayo.</translation> -<translation id="6371486244597785139">{NUM_PASSWORDS,plural, =1{Shintsha iphasiwedi}one{Shintsha amaphasiwedi}other{Shintsha amaphasiwedi}}</translation> <translation id="6374077068638737855">I-Iceweasel</translation> <translation id="6374469231428023295">Phinda uzame</translation> <translation id="6377268785556383139">1 umphumela we-'<ph name="SEARCH_TEXT" />'</translation> @@ -4016,6 +4026,7 @@ <translation id="6408118934673775994">Funda futhi ushintshe idatha yakho ku-<ph name="WEBSITE_1" />, <ph name="WEBSITE_2" />, naku-<ph name="WEBSITE_3" /></translation> <translation id="6410257289063177456">Amafayela wesithombe</translation> <translation id="6410328738210026208">Guqula isiteshi Nokuwasha kwamandla</translation> +<translation id="6410390304316730527">Ukuphequlula ngokuphephile kukuvikela kubahlaseli abangase bakukhohlise ukwenza okuthile okuyingozi njengokufaka isofthiwe enonya noma ukuveza ulwazi lomuntu siqu njengamaphasiwedi, izinombolo zefoni, noma amakhadi esikweletu. Uma ukuvala, qaphela lapho uphequlula kumasayithi ongawajwayele noma angathenjwa.</translation> <translation id="6410668567036790476">Engeza injini yosesho</translation> <translation id="641081527798843608">Ukufana kwesihloko</translation> <translation id="6412673304250309937">Kuhlola ama-URL anohlu lwamasayithi angaphephile agcinwe ku-Chrome. Uma isayithi lizama ukuntshontsha iphasiwedi yakho, noma uma ulanda ifayela eliyingozi, i-Chrome ingathumela nama-URL, kuhlanganise nokuthile okuqukethwe kulelo khasi, Ekuphequluleni Okuphephile.</translation> @@ -5935,6 +5946,7 @@ <translation id="8951256747718668828">Ukubuyisa akukwazanga ukuqedwa ngenxa yephutha</translation> <translation id="8951465597020890363">Phuma kumodi yesivakashi noma kunjalo?</translation> <translation id="8952831374766033534">Inketho yokulungiselela ayisekelwe: <ph name="ERROR_LINE" /></translation> +<translation id="8953476467359856141">Ngenkathi ishaja</translation> <translation id="895347679606913382">Iyaqala...</translation> <translation id="8957762313041272117">Amagama-ncazo abukhoma</translation> <translation id="895944840846194039">Imemori ye-JavaScript</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb index 872a9324..89fdbd63 100644 --- a/chrome/app/resources/google_chrome_strings_af.xtb +++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">Hierdie lêer is gevaarlik en daarom het Chrome dit geblokkeer.</translation> <translation id="8370517070665726704">Kopiereg <ph name="YEAR" /> Google LLC. Alle regte voorbehou.</translation> <translation id="840084489713044809">Google Chrome wil jou wagwoorde uitvoer.</translation> -<translation id="8455999171311319804">Opsioneel: Help om Chrome-bedryfstelsel te verbeter deur diagnostiese en gebruikdata outomaties na Google te stuur.</translation> <translation id="8498858610309223613">'n Spesiale sekuriteitsopdatering vir Google Chrome is sopas toegepas. Herbegin nou en ons sal jou oortjies teruglaai.</translation> <translation id="8521348052903287641">Inkomende reël vir Google Chrome Dev om mDNS-verkeer toe te laat.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index 0ab2a68..f115b54af 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">በተጨማሪ ከ Chrome (<ph name="URL" />) ውሂብን አጽዳ</translation> <translation id="3503306920980160878">Chrome አካባቢዎን ለዚህ ጣቢያ ለማጋራት የአካባቢዎ መዳረሻ ያስፈልገዋል</translation> <translation id="3533694711092285624">ምንም የተቀመጡ የይለፍ ቃላት የሉም። Chrome እርስዎ ሲያስቀምጧቸው የእርስዎን የይለፍ ቃላት መፈተሽ ይችላል።</translation> +<translation id="3541482654983822893">Chrome የእርስዎን የይለፍ ቃላት መፈተሽ አይችልም። ከ24 ሰዓቶች በኋላ እንደገና ይሞክሩ።</translation> <translation id="3576528680708590453">የእርስዎ የስርዓት አስተዳዳሪ <ph name="TARGET_URL_HOSTNAME" />ን ለመድረስ Google Chrome ተለዋጭ አሳሽ እንዲከፍት አዋቅሮታል።</translation> <translation id="3582972582564653026">Chromeን በመላ መሣሪያዎችዎ ላይ ያስምሩ እና ግላዊነት ያላብሱ</translation> <translation id="3596080736082218006">{COUNT,plural, =0{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromeን ዳግም እንዲያስጀምሩት ይፈልግብዎታል}=1{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromeን ዳግም እንዲያስጀምሩት ይፈልግብዎታል። የእርስዎ ማንነት የማያሳውቅ መስኮት ዳግም አይከፈትም}one{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromeን ዳግም እንዲያስጀምሩት ይፈልግብዎታል። የእርስዎ # ማንነት የማያሳውቁ መስኮቶች ዳግም አይከፈቱም}other{አንድ ዝማኔ ለመተግበር አስተዳዳሪዎ Chromeን ዳግም እንዲያስጀምሩት ይፈልግብዎታል። የእርስዎ # ማንነት የማያሳውቁ መስኮቶች ዳግም አይከፈቱም}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">በሚተዳደር መለያ እየገቡ ነው፣ እና አስተዳዳሪው በእርስዎ Google Chrome መገለጫ ላይ ቁጥጥር እየሰጡት ነው። እንደ የእርስዎ መተግበሪያዎች፣ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ያሉ የእርስዎ Chrome ውሂብ እስከ መጨረሻው ከ<ph name="USER_NAME" /> ጋር የተያያዙ ይሆናሉ። ይህን ውሂብ በGoogle የመለያዎች Dashboard አማካኝነት ሊሰርዙት ይችላሉ፣ ነገር ግን ይህን ውሂብ ከሌላ መለያ ጋር ሊያጎዳኙት አይችሉም። <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ጫኝው መዝገብ ለመበተን አልቻለም። እባክዎ Google Chromeን እንደገና ያውርዱ።</translation> <translation id="4191857738314598978">{0,plural, =1{በአንድ ቀን ውስጥ Chromeን ዳግም አስጀምር}one{በ# ቀኖች ውስጥ Chromeን ዳግም አስጀምር}other{በ# ቀኖች ውስጥ Chromeን ዳግም አስጀምር}}</translation> +<translation id="4205939740494406371">Chrome የእርስዎን የይለፍ ቃላት መፈተሽ አይችልም። ከ24 ሰዓቶች በኋላ እንደገና ይሞክሩ ወይም <ph name="BEGIN_LINK" />በGoogle መለያዎ ውስጥ የይለፍ ቃላትን ይፈትሹ<ph name="END_LINK" />።</translation> <translation id="424864128008805179">ከChrome ተዘግቶ ይወጣ?</translation> <translation id="4251615635259297716">የChrome ውሂብዎ ከዚህ መለያ ጋር ይገናኝ?</translation> <translation id="4293420128516039005">Chromeን በመላ መሣሪያዎችዎ ላይ ለማሳመር እና ግላዊነት ለማላበስ</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">ይህ ፋይል አደገኛ ስለሆነ Chrome አግዶታል።</translation> <translation id="8370517070665726704">የቅጂ መብት <ph name="YEAR" /> Google LLC. ሁሉም መብቶች በህግ የተጠበቁ ናቸው።</translation> <translation id="840084489713044809">Google Chrome የእርስዎን የይለፍ ቃላት ወደ ውጭ መላክ ይፈልጋል።</translation> -<translation id="8455999171311319804">ከተፈለገ፦ የምርመራ እና የአጠቃቀም ውሂብ ወደ Google በራስ-ሰር በመላክ Chrome OS የተሻለ እንዲሆን ያግዙ።</translation> <translation id="8498858610309223613">ለGoogle Chrome ልዩ የደህንነት ዝማኔ አሁን ተጭኗል። አሁን እንደገና ያስጀምሩ እና የእርስዎን ትሮች እንደነበሩ እንመልሳቸዋለን።</translation> <translation id="8521348052903287641">የmDNS ትራፊክን ለመፍቀድ የGoogle Chrome ገንቢ የውስጥ ደንብ።</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index d778d05..b9f4144 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -233,7 +233,6 @@ <translation id="8342675569599923794">هذا الملف ضار، لذلك فقد حظره Chrome.</translation> <translation id="8370517070665726704">حقوق الطبع والنشر لعام <ph name="YEAR" /> لشركة Google LLC. جميع الحقوق محفوظة.</translation> <translation id="840084489713044809">يرغب Google Chrome في تصدير كلمات المرور.</translation> -<translation id="8455999171311319804">اختياري: يمكنك المساعدة في تحسين نظام التشغيل Chrome عن طريق إرسال بيانات التشخيص والاستخدام إلى Google تلقائيًا.</translation> <translation id="8498858610309223613">تم للتو تطبيق تحديث أمان خاص لمتصفِّح Google Chrome. ويمكنك الآن إعادة التشغيل وستتم استعادة علامات التبويب.</translation> <translation id="8521348052903287641">قاعدة الوارد إلى إصدار مطوري البرامج من Google Chrome للسماح بحركة مرور mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb index 0dd3d73..be0ea0b 100644 --- a/chrome/app/resources/google_chrome_strings_as.xtb +++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">লগতে Chrome (<ph name="URL" />)ৰ ডেটাও মচক</translation> <translation id="3503306920980160878">এই ছাইটটোৰ সৈতে আপোনাৰ অৱস্থান শ্বেয়াৰ কৰিবলৈ Chromeএ আপোনাৰ অৱস্থান এক্সেছ কৰাটো দৰকাৰ</translation> <translation id="3533694711092285624">ছেভ কৰা কোনো পাছৱৰ্ড নাই। আপুনি আপোনাৰ পাছৱর্ডসমূহ ছেভ কৰিলে Chromeএ সেইবোৰ পৰীক্ষা কৰিব পাৰে।</translation> +<translation id="3541482654983822893">Chromeএ আপোনাৰ পাছৱর্ডসমূহ পৰীক্ষা কৰিব নোৱাৰে। ২৪ ঘণ্টাৰ পাছত পুনৰ চেষ্টা কৰক।</translation> <translation id="3576528680708590453">আপোনাৰ ছিষ্টেমৰ প্ৰশাসকে <ph name="TARGET_URL_HOSTNAME" /> এক্সেছ কৰিবলৈ Google Chromeক এটা বিকল্প ব্ৰাউজাৰ খুলিবলৈ কনফিগাৰ কৰিছে।</translation> <translation id="3582972582564653026">আপোনাৰ সমগ্ৰ ডিভাইচতে Chromeক ছিংক কৰি ব্যক্তিকৃত কৰক</translation> <translation id="3596080736082218006">{COUNT,plural, =0{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chrome পুনৰ লঞ্চ কৰাটো বিচাৰে}=1{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chrome পুনৰ লঞ্চ কৰাটো বিচাৰে। আপোনাৰ.ইনক’গনিট' ৱিণ্ড'খন পুনৰ খুলিব নোৱাৰিব।}one{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chrome পুনৰ লঞ্চ কৰাটো বিচাৰে। আপোনাৰ #খন.ইনক’গনিট' ৱিণ্ড' পুনৰ খুলিব নোৱাৰিব।}other{আপোনাৰ প্ৰশাসকে কোনো আপডে’ট প্ৰয়োগ কৰিবলৈ আপুনি Chrome পুনৰ লঞ্চ কৰাটো বিচাৰে। আপোনাৰ #খন.ইনক’গনিট' ৱিণ্ড' পুনৰ খুলিব নোৱাৰিব।}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">আপুনি কোনো পৰিচালিত একাউণ্টৰ জৰিয়তে ছাইন ইন কৰিছে আৰু কোনো প্ৰশাসকক আপোনাৰ Google Chrome প্ৰ’ফাইলৰ নিয়ন্ত্ৰণ দিছে। আপোনাৰ এপ্, বুকমার্ক, ইতিহাস, পাছৱর্ড আৰু অন্য ছেটিংসমূহৰ দৰে নিজৰ Chrome ডেটা স্থায়ীভাৱে <ph name="USER_NAME" />ৰ সৈতে সংযুক্ত হ’ব। আপুনি Google একাউণ্ট ডেশ্বব’ৰ্ডৰ জৰিয়তে এই ডেটা মচিব পাৰিব কিন্তু আপুনি এই ডেটা অন্য একাউণ্টৰ সৈতে সংলগ্ন কৰিব নোৰাৰিব।<ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ইনষ্টলাৰে আৰ্কাইভক অসংকুচিত কৰিব নোৱাৰিলে। অনুগ্ৰহ কৰি পুনৰ Google Chrome ডাউনল'ড কৰক।</translation> <translation id="4191857738314598978">{0,plural, =1{এদিনৰ ভিতৰত Chrome পুনৰ লঞ্চ কৰক}one{# দিনৰ ভিতৰত Chrome পুনৰ লঞ্চ কৰক}other{# দিনৰ ভিতৰত Chrome পুনৰ লঞ্চ কৰক}}</translation> +<translation id="4205939740494406371">Chromeএ আপোনাৰ পাছৱর্ডসমূহ পৰীক্ষা কৰিব নোৱাৰে। ২৪ ঘণ্টাৰ পাছত পুনৰ চেষ্টা কৰক অথবা <ph name="BEGIN_LINK" />আপোনাৰ Google একাউণ্টত পাছৱর্ডসমূহ পৰীক্ষা কৰক<ph name="END_LINK" />।</translation> <translation id="424864128008805179">Chromeৰ পৰা ছাইন আউট কৰিবনে?</translation> <translation id="4251615635259297716">এই একাউণ্টত আপোনাৰ Chrome ডেটা লিংক কৰিবনে?</translation> <translation id="4293420128516039005">আপোনাৰ সকলো ডিভাইচত Chrome ছিংক আৰু ব্যক্তিগতকৰণ কৰিবলৈ ছাইন ইন কৰক</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">এই ফাইলটো বিপজ্জনক, সেয়েহে Chromeএ সেইটো অৱৰোধ কৰিছে।</translation> <translation id="8370517070665726704">স্বত্বাধিকাৰ <ph name="YEAR" /> Google LLC। সর্বস্বত্ব সংৰক্ষিত।</translation> <translation id="840084489713044809">Google Chromeএ আপোনাৰ পাছৱর্ড ৰপ্তানি কৰিব খোজে।</translation> -<translation id="8455999171311319804">ঐচ্ছিক: Google লৈ স্বয়ংক্ৰিয়ভাৱে ডায়েগন’ষ্টিকৰ লগতে ব্যৱহাৰৰ ডেটা পঠিয়াই Chrome OS উন্নত কৰাত সহায় কৰক।</translation> <translation id="8498858610309223613">Google Chromeৰ এটা বিশেষ সুৰক্ষা আপডে’ট এইমাত্ৰ প্ৰয়োগ কৰা হৈছে। এতিয়াই ৰিষ্টাৰ্ট কৰক আৰু আমি আপোনাৰ টেববোৰ পুনঃস্থাপন কৰিম।</translation> <translation id="8521348052903287641">mDNS ট্ৰেফিকক অনুমতি দিবলৈ Google Chrome Devৰ অন্তৰ্গামী নিয়ম।</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index cfe5191..825a766 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -90,6 +90,7 @@ <translation id="34857402635545079">Chrome'dan datanı silin (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome məkanı bu saytla paylaşmaq üçün məkana giriş tələb edir</translation> <translation id="3533694711092285624">Yadda saxlanmış parol yoxdur. Parollarınızı yadda saxladıqda Chrome onları yoxlaya bilər.</translation> +<translation id="3541482654983822893">Chrome parollarınızı yoxlaya bilmir. 24 saatdan sonra yenidən cəhd edin.</translation> <translation id="3576528680708590453">Sistem administratoru Google Chrome'u <ph name="TARGET_URL_HOSTNAME" /> ünvanına daxil olmaq məqsədilə alternativ brauzer açmaq üçün konfiqurasiya edib.</translation> <translation id="3582972582564653026">Chrome'u cihazlarda sinxronizasiya edin və fərdiləşdirin</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Administrator güncəlləməni tətbiq etmək üçün Chrome'u yenidən başlatmanızı tələb edir}=1{Administrator güncəlləməni tətbiq etmək üçün Chrome'u yenidən başlatmanızı tələb edir. Anonim pəncərəniz yenidən açılmayacaq.}other{Administrator güncəlləməni tətbiq etmək üçün Chrome'u yenidən başlatmanızı tələb edir. # Anonim pəncərəniz yenidən açılmayacaq.}}</translation> @@ -107,6 +108,7 @@ <translation id="4147555960264124640">İdarə olunan hesab ilə giriş edirsiniz və onun Chrome profili üzrə administrator nəzarətini verirsiniz. Tətbiqlər, əlfəcin, tarixçə, parol və digər ayarlar kimi Chrome datası həmişəlik <ph name="USER_NAME" /> adlı istifadəçi ilə əlaqələndiriləcək. Bu datanı Google İdarə panelindən silə biləcəksiniz, amma bu datanı başqa hesab ilə əlaqələndirə bilməyəcəksiniz. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Quraşdırıcı arxivi dekompres edə bilmədi. Google Chrome'u yenidən endirməyiniz xahiş olunur.</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome'u gün ərzində yenidən başladın}other{Chrome'u # gün ərzində yenidən başladın}}</translation> +<translation id="4205939740494406371">Chrome parollarınızı yoxlaya bilmir. 24 saatdan sonra yenidən cəhd edin və ya <ph name="BEGIN_LINK" />Google Hesabınızda parolları yoxlayın<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome'dan çıxılsın?</translation> <translation id="4251615635259297716">Chrome datanız bu hesab ilə birləşdirilsin?</translation> <translation id="4293420128516039005">Chrome'u cihazlarda sinxronizasiya etmək və fərdiləşdirmək üçün daxil olun</translation> @@ -231,7 +233,6 @@ <translation id="8342675569599923794">Bu fayl təhlükəlidir, bu səbəbdən Chrome onu blok etdi.</translation> <translation id="8370517070665726704">Müəllif hüquqları <ph name="YEAR" /> Google MMC. Bütün hüquqlar qorunur.</translation> <translation id="840084489713044809">Google Chrome parollarınızı eksport etmək istəyir.</translation> -<translation id="8455999171311319804">Seçimə görə: Diaqnostika və istifadəçi datasını avtomatik Google'a göndərməklə Chrome OS tətbiqini təkmilləşdirin.</translation> <translation id="8498858610309223613">Google Chrome üçün xüsusi təhlükəsizlik yeniləməsi indicə tətbiq edildi. İndi yenidən başladın və açdığınız tablar bərpa ediləcək.</translation> <translation id="8521348052903287641">mDNS nəqliyyatına icazə vermək üçün Google Chrome Dev ümumi qaydası.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index 714484c..c1bc823 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Таксама выдаліць даныя з Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome патрабуе доступу да вашага месцазнаходжання, каб абагуліць яго з гэтым сайтам</translation> <translation id="3533694711092285624">Няма захаваных пароляў. Chrome можа правяраць толькі захаваныя паролі.</translation> +<translation id="3541482654983822893">Браўзеру Chrome не ўдаецца праверыць паролі. Паўтарыце спробу праз 24 гадзіны.</translation> <translation id="3576528680708590453">Ваш сістэмны адміністратар наладзіў Google Chrome, каб адкрыць альтэрнатыўны браўзер для доступу да <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Сінхранізуйце і персаналізуйце Chrome на сваіх прыладах</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Ваш адміністратар патрабуе перазапусціць Chrome для ўсталявання абнаўлення}=1{Ваш адміністратар патрабуе перазапусціць Chrome для ўсталявання абнаўлення. Акно ў рэжыме інкогніта не будзе адкрыта паўторна.}one{Ваш адміністратар патрабуе перазапусціць Chrome для ўсталявання абнаўлення. # акно ў рэжыме інкогніта не будзе адкрыта паўторна.}few{Ваш адміністратар патрабуе перазапусціць Chrome для ўсталявання абнаўлення. # акны ў рэжыме інкогніта не будуць адкрыты паўторна.}many{Ваш адміністратар патрабуе перазапусціць Chrome для ўсталявання абнаўлення. # вокнаў у рэжыме інкогніта не будуць адкрыты паўторна.}other{Ваш адміністратар патрабуе перазапусціць Chrome для ўсталявання абнаўлення. # акна ў рэжыме інкогніта не будуць адкрыты паўторна.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Вы ўваходзіце праз уліковы запіс пад кіраваннем, таму адміністратар зможа кантраляваць ваш профіль Google Chrome. Даныя Chrome (праграмы, закладкі, гісторыя, паролі і іншыя налады) будуць назаўсёды прывязаны да ўліковага запісу <ph name="USER_NAME" />. Вы зможаце выдаліць гэтыя даныя праз панэль кіравання Уліковымі запісамі Google, але іх нельга будзе звязаць з іншым уліковым запісам. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Усталёўшчык не змог распакаваць архіў. Спампуйце Google Chrome зноў.</translation> <translation id="4191857738314598978">{0,plural, =1{Перазапусціце Chrome на працягу дня}one{Перазапусціце Chrome на працягу # дня}few{Перазапусціце Chrome на працягу # дзён}many{Перазапусціце Chrome на працягу # дзён}other{Перазапусціце Chrome на працягу # дня}}</translation> +<translation id="4205939740494406371">Браўзеру Chrome не ўдаецца праверыць паролі. Паўтарыце спробу праз 24 гадзіны або <ph name="BEGIN_LINK" />праверце паролі ва Уліковым запісе Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Выйсці з Chrome?</translation> <translation id="4251615635259297716">Звязаць вашы даныя Chrome з гэтым уліковым запісам?</translation> <translation id="4293420128516039005">Увайдзіце ў Chrome, каб сінхранізаваць і персаналізаваць яго на сваіх прыладах</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Файл небяспечны, таму Chrome заблакіраваў яго.</translation> <translation id="8370517070665726704">© <ph name="YEAR" /> Google LLC. Усе правы абароненыя.</translation> <translation id="840084489713044809">Google Chrome запытвае дазвол на экспартаванне вашых пароляў.</translation> -<translation id="8455999171311319804">Неабавязкова: дапамажыце палепшыць Chrome OS шляхам аўтаматычнай адпраўкі ў Google даных дыягностыкі і звестак аб выкарыстанні.</translation> <translation id="8498858610309223613">Толькі што было прыменена спецыяльнае абнаўленне бяспекі для Google Chrome. Перазапусціце браўзер, і вашы ўкладкі будуць адноўлены.</translation> <translation id="8521348052903287641">Уваходнае правіла версіі Google Chrome для распрацоўшчыкаў, якое дазваляе трафік mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index 1395814..2c734099 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -89,6 +89,7 @@ <translation id="34857402635545079">Да се изчистят и данните от Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome се нуждае от достъп до данните за местоположението ви, за да ги сподели с този сайт</translation> <translation id="3533694711092285624">Няма запазени пароли. Chrome може да проверява паролите ви, когато ги запазите.</translation> +<translation id="3541482654983822893">Chrome не може да провери паролите ви. Опитайте отново след 24 часа.</translation> <translation id="3576528680708590453">Системният ви администратор е конфигурирал Google Chrome да отваря алтернативен браузър за достъп до <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Синхронизирайте и персонализирайте Chrome на всичките си устройства</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Администраторът ви изисква да рестартирате Chrome, за да се приложи актуализация}=1{Администраторът ви изисква да рестартирате Chrome, за да се приложи актуализация. Прозорецът ви в режим „инкогнито“ няма да бъде отворен отново.}other{Администраторът ви изисква да рестартирате Chrome, за да се приложи актуализация. Вашите # прозореца в режим „инкогнито“ няма да бъдат отворени отново.}}</translation> @@ -106,6 +107,7 @@ <translation id="4147555960264124640">Влизате с управляван профил и давате на администратора му контрол над потребителския си профил в Google Chrome. Данните ви в браузъра, като например приложения, отметки, история, пароли и други настройки, ще се свържат за постоянно с/ъс <ph name="USER_NAME" />. Ще можете да ги изтриете чрез таблото за управление на Google Профили, но не и да ги свържете с друг профил. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Инсталационната програма не успя да декомпресира архива. Моля, изтеглете Google Chrome отново.</translation> <translation id="4191857738314598978">{0,plural, =1{Повторно стартиране на Chrome до 1 ден}other{Повторно стартиране на Chrome до # дни}}</translation> +<translation id="4205939740494406371">Chrome не може да провери паролите ви. Опитайте отново след 24 часа или <ph name="BEGIN_LINK" />ги проверете в профила си в Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Искате ли да излезете от Chrome?</translation> <translation id="4251615635259297716">Да се свържат ли данните ви в Chrome с този профил?</translation> <translation id="4293420128516039005">Влезте в профила си, за да синхронизирате и персонализирате Chrome на всичките си устройства</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">Chrome блокира този файл, тъй като е опасен.</translation> <translation id="8370517070665726704">Авторски права <ph name="YEAR" /> г. Google LLC. Всички права запазени.</translation> <translation id="840084489713044809">Google Chrome иска да експортира паролите ви.</translation> -<translation id="8455999171311319804">По избор: Помогнете за подобряването на Chrome OS, като автоматично изпращате до Google данни за диагностиката и употребата.</translation> <translation id="8498858610309223613">Току-що бе приложена специална актуализация за сигурност за Google Chrome. Рестартирайте сега – ще възстановим разделите ви.</translation> <translation id="8521348052903287641">Правило за Google Chrome Dev за допускане на входящия трафик за mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index 98882dba..8b5831f 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -231,7 +231,6 @@ <translation id="8342675569599923794">এই ফাইলটি বিপজ্জনক, তাই Chrome এটিকে অবরুদ্ধ করেছে।</translation> <translation id="8370517070665726704">কপিরাইট <ph name="YEAR" /> Google LLC সব স্বত্ব সংরক্ষিত আছে।</translation> <translation id="840084489713044809">Google Chrome আপনার পাসওয়ার্ড এক্সপোর্ট করতে চাইছে।</translation> -<translation id="8455999171311319804">ঐচ্ছিক: ডায়াগনস্টিক ও ব্যবহারের ডেটা অটোমেটিক Google-এ পাঠিয়ে Chrome OS-কে আরও ভাল করে তুলতে সাহায্য করুন।</translation> <translation id="8498858610309223613">Google Chrome-এর জন্য একটি বিশেষ নিরাপত্তা আপডেট এইমাত্র প্রয়োগ করা হয়েছে। এখনই রিস্টার্ট করুন এবং আপনার ট্যাব আমরা রিস্টোর করব।</translation> <translation id="8521348052903287641">mDNS ট্রাফিকের অনুমতি দিতে Google Chrome ডেভেলপারের জন্য ইনবাউন্ড নিয়ম।</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index 4da5983..81af2625 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -235,7 +235,6 @@ <translation id="8342675569599923794">Ovaj fajl je opasan, pa ga je Chrome blokirao.</translation> <translation id="8370517070665726704">Autorska prava <ph name="YEAR" /> Google LLC. Sva prava su zadržana.</translation> <translation id="840084489713044809">Google Chrome želi izvesti vaše lozinke.</translation> -<translation id="8455999171311319804">Nije obavezno: Pomozite nam da poboljšamo Chrome OS automatskim slanjem Googleu podataka o dijagnostici i korištenju.</translation> <translation id="8498858610309223613">Upravo je izvršeno posebno sigurnosno ažuriranje za Google Chrome. Sada ga ponovo pokrenite i vratićemo vaše kartice.</translation> <translation id="8521348052903287641">Ulazno pravilo da Google Chrome Dev dozvoli mDNS saobraćaj.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index 8f3daafd..a9ffdb3 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -227,7 +227,6 @@ <translation id="8342675569599923794">Chrome ha bloquejat aquest fitxer perquè és perillós.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Tots els drets reservats.</translation> <translation id="840084489713044809">Google Chrome vol exportar les teves contrasenyes.</translation> -<translation id="8455999171311319804">Opcional: ajuda'ns a millorar Chrome OS enviant automàticament dades de diagnòstic i d'ús a Google.</translation> <translation id="8498858610309223613">S'acaba d'aplicar una actualització de seguretat especial per a Google Chrome. Reinicia el navegador i restaurarem les pestanyes.</translation> <translation id="8521348052903287641">Regla d'entrada de Google Chrome Dev per permetre el trànsit d'mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index 70ebdbe..ed6b989 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -235,7 +235,6 @@ <translation id="8342675569599923794">Tento soubor je nebezpečný, proto jej Chrome zablokoval.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Všechna práva vyhrazena.</translation> <translation id="840084489713044809">Google Chrome chce exportovat vaše hesla.</translation> -<translation id="8455999171311319804">Volitelné: Pomozte zlepšit operační systém Chrome OS tím, že budete společnosti Google automaticky zasílat diagnostické údaje a údaje o využití.</translation> <translation id="8498858610309223613">Právě byla nainstalována mimořádná bezpečnostní aktualizace prohlížeče Google Chrome. Restartujte jej, vaše karty budou obnoveny.</translation> <translation id="8521348052903287641">Pravidlo příchozího provozu pro aplikaci Google Chrome Dev, které povolí provoz mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 0089007..47dcad26 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Denne fil er farlig, så Chrome har blokeret den.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Alle rettigheder forbeholdes.</translation> <translation id="840084489713044809">Google Chrome anmoder om at eksportere dine adgangskoder.</translation> -<translation id="8455999171311319804">Valgfrit: Vær med til at gøre Chrome OS bedre ved automatisk at sende diagnostik og brugsdata til Google.</translation> <translation id="8498858610309223613">En særlig sikkerhedsopdatering til Google Chrome blev netop anvendt. Genstart nu, hvorefter vi gendanner dine faner.</translation> <translation id="8521348052903287641">Indgående regel for udviklerversionen af Chrome om at tillade mDNS-trafik.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index 1e26af73..bafcd56e 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -227,7 +227,6 @@ <translation id="8342675569599923794">Diese Datei ist schädlich und wurde von Chrome blockiert.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC Alle Rechte vorbehalten.</translation> <translation id="840084489713044809">Google Chrome möchte Ihre Passwörter exportieren.</translation> -<translation id="8455999171311319804">Optional: Diagnose- und Nutzungsdaten zur Verbesserung von Chrome OS automatisch an Google senden.</translation> <translation id="8498858610309223613">Da soeben ein kritisches Sicherheitsupdate für Google Chrome installiert wurde, sollten Sie jetzt einen Neustart durchführen. Ihre Tabs werden dann automatisch wiederhergestellt.</translation> <translation id="8521348052903287641">Eingangsregel für die Zulassung von mDNS-Verkehr in Google Chrome Dev.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 118f69e..ab1a5bd 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -90,6 +90,7 @@ <translation id="34857402635545079">Να διαγραφούν επίσης δεδομένα από το (<ph name="URL" />)</translation> <translation id="3503306920980160878">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία σας, για να την κοινοποιήσει σε αυτόν τον ιστότοπο</translation> <translation id="3533694711092285624">Δεν υπάρχουν αποθηκευμένοι κωδικοί πρόσβασης. Το Chrome μπορεί να ελέγξει τους κωδικούς πρόσβασής σας όταν τους αποθηκεύσετε.</translation> +<translation id="3541482654983822893">Το Chrome δεν μπορεί να ελέγξει τους κωδικούς πρόσβασής σας. Δοκιμάστε ξανά σε 24 ώρες.</translation> <translation id="3576528680708590453">Ο διαχειριστής συστήματος έχει διαμορφώσει το Google Chrome έτσι ώστε να ανοίγει άλλο πρόγραμμα περιήγησης για την πρόσβαση στη διεύθυνση <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Συγχρονίστε και εξατομικεύστε το Chrome στις συσκευές σας</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Ο διαχειριστής σας απαιτεί να επανεκκινήσετε το Chrome, προκειμένου να εφαρμοστεί μια ενημέρωση.}=1{Ο διαχειριστής σας απαιτεί να επανεκκινήσετε το Chrome, προκειμένου να εφαρμοστεί μια ενημέρωση. Το παράθυρο για ανώνυμη περιήγηση δεν θα ανοίξει ξανά.}other{Ο διαχειριστής σας απαιτεί να επανεκκινήσετε το Chrome, προκειμένου να εφαρμοστεί μια ενημέρωση. Τα # παράθυρα για ανώνυμη περιήγηση δεν θα ανοίξουν ξανά.}}</translation> @@ -107,6 +108,7 @@ <translation id="4147555960264124640">Είστε συνδεδεμένοι με έναν διαχειριζόμενο λογαριασμό και παραχωρείτε στο διαχειριστή του τον έλεγχο του προφίλ σας στο Google Chrome. Τα δεδομένα σας στο Chrome, όπως οι εφαρμογές, οι σελιδοδείκτες, το ιστορικό, οι κωδικοί πρόσβασης και άλλες ρυθμίσεις θα συνδεθούν μόνιμα με το όνομα χρήστη <ph name="USER_NAME" />. Θα έχετε τη δυνατότητα να διαγράψετε αυτά τα δεδομένα μέσω του Πίνακα ελέγχου των Λογαριασμών Google, αλλά δεν θα μπορείτε να τα συσχετίσετε με άλλο λογαριασμό. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Η αποσυμπίεση του αρχείου από το πρόγραμμα εγκατάστασης απέτυχε. Κατεβάστε το Google Chrome ξανά.</translation> <translation id="4191857738314598978">{0,plural, =1{Επανεκκίνηση του Chrome σε μία ημέρα}other{Επανεκκίνηση του Chrome σε # ημέρες}}</translation> +<translation id="4205939740494406371">Το Chrome δεν μπορεί να ελέγξει τους κωδικούς πρόσβασής σας. Δοκιμάστε ξανά μετά από 24 ώρες ή <ph name="BEGIN_LINK" />ελέγξτε τους κωδικούς πρόσβασης στον Λογαριασμό σας Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Αποσύνδεση από το Chrome;</translation> <translation id="4251615635259297716">Να συνδεθούν τα δεδομένα σας στο Chrome με αυτόν το λογαριασμό;</translation> <translation id="4293420128516039005">Συνδεθείτε, για να συγχρονίσετε και να εξατομικεύσετε το Chrome στις συσκευές σας</translation> @@ -231,7 +233,6 @@ <translation id="8342675569599923794">Αυτό το αρχείο είναι επικίνδυνο και έχει αποκλειστεί από το Chrome.</translation> <translation id="8370517070665726704">Πνευματικά δικαιώματα <ph name="YEAR" /> Google LLC. Με την επιφύλαξη παντός δικαιώματος.</translation> <translation id="840084489713044809">Το Google Chrome θέλει να εξαγάγει τους κωδικούς πρόσβασής σας.</translation> -<translation id="8455999171311319804">Προαιρετικό: Συμβάλετε στη βελτίωση του Chrome OS στέλνοντας αυτόματα στην Google διαγνωστικά και δεδομένα χρήσης.</translation> <translation id="8498858610309223613">Μόλις εφαρμόστηκε μια ειδική ενημέρωση ασφαλείας για το Google Chrome. Επανεκκινήστε τώρα και θα γίνει επαναφορά των καρτελών σας.</translation> <translation id="8521348052903287641">Εισερχόμενος κανόνας για το Google Chrome Dev για να επιτρέπεται η κυκλοφορία του mDNS.</translation> <translation id="8540666473246803645">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 ad55d56..9d58453 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">This file is dangerous, so Chrome has blocked it.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation> <translation id="840084489713044809">Google Chrome wants to export your passwords.</translation> -<translation id="8455999171311319804">Optional: Help make Chrome OS better by automatically sending diagnostic and usage data to Google.</translation> <translation id="8498858610309223613">A special security update for Google Chrome was just applied. Restart now and we'll restore your tabs.</translation> <translation id="8521348052903287641">Inbound rule for Google Chrome Dev to allow mDNS traffic.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index d75a2bcf..2f06497b2 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">Borrar también datos de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome necesita acceder a tu ubicación para compartirla con este sitio</translation> <translation id="3533694711092285624">No hay contraseñas guardadas. Chrome puede revisar las contraseñas cuando las guardas.</translation> +<translation id="3541482654983822893">Chrome no puede revisar las contraseñas. Vuelve a intentarlo después de 24 horas.</translation> <translation id="3576528680708590453">El administrador del sistema configuró Google Chrome de manera que se abriera un navegador alternativo para acceder a <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Sincroniza y personaliza Chrome en todos tus dispositivos</translation> <translation id="3596080736082218006">{COUNT,plural, =0{El administrador necesita que reinicies Chrome para aplicar una actualización}=1{El administrador necesita que reinicies Chrome para aplicar una actualización. No se volverá a abrir la ventana de incógnito.}other{El administrador necesita que reinicies Chrome para aplicar una actualización. No se volverán a abrir las # ventanas de incógnito.}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">Estás por acceder con una cuenta administrada, lo que significa que proporcionarás al administrador el control sobre tu perfil de Google Chrome. Tus datos de Google Chrome, como las aplicaciones, los favoritos, el historial, las contraseñas y otros parámetros de configuración quedarán vinculados a <ph name="USER_NAME" /> de forma permanente. Podrás eliminar estos datos a través del Panel de control de Cuentas de Google, pero no podrás asociarlos a otra cuenta. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">El instalador no pudo descomprimir el archivo. Descargue Google Chrome nuevamente.</translation> <translation id="4191857738314598978">{0,plural, =1{Reinicia Chrome en el transcurso de 1 día}other{Reinicia Chrome en el transcurso de # días}}</translation> +<translation id="4205939740494406371">Chrome no puede revisar las contraseñas. Vuelve a intentarlo dentro de 24 horas o <ph name="BEGIN_LINK" />revisa las contraseñas en tu Cuenta de Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">¿Quieres salir de Chrome?</translation> <translation id="4251615635259297716">¿Quieres vincular tus datos de Google Chrome con esta cuenta?</translation> <translation id="4293420128516039005">Accede para sincronizar y personalizar Chrome en todos tus dispositivos</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">Chrome bloqueó este archivo porque es peligroso.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation> <translation id="840084489713044809">Google Chrome desea exportar tus contraseñas.</translation> -<translation id="8455999171311319804">Opcional: Para ayudarnos a mejorar el Sistema operativo Chrome, envía datos de uso y diagnóstico a Google.</translation> <translation id="8498858610309223613">Se acaba de instalar una actualización de seguridad especial para Google Chrome. Reinicia el navegador ahora (se restablecerán tus pestañas).</translation> <translation id="8521348052903287641">Regla de entrada para que Google Chrome Dev permita el tráfico mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index 987f21a..18d3f0e 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Borrar también los datos de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome necesita acceder a tu ubicación para compartirla con este sitio web</translation> <translation id="3533694711092285624">No hay ninguna contraseña guardada. Chrome puede comprobar tus contraseñas cuando las guardas.</translation> +<translation id="3541482654983822893">Chrome no puede comprobar tus contraseñas. Vuelve a intentarlo en 24 horas.</translation> <translation id="3576528680708590453">El administrador del sistema ha configurado Google Chrome para que abra otro navegador al acceder a <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Sincroniza y personaliza Chrome en todos tus dispositivos</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Tu administrador pide que reinicies Chrome para aplicar una actualización}=1{Tu administrador pide que reinicies Chrome para aplicar una actualización. La ventana de incógnito no se volverá a abrir.}other{Tu administrador pide que reinicies Chrome para aplicar una actualización. Las # ventanas de incógnito no se volverán a abrir.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Vas a iniciar sesión con una cuenta gestionada, lo que significa que proporcionarás a su administrador control sobre tu perfil de Google Chrome. Tus datos de Chrome como, por ejemplo, tus aplicaciones, tus marcadores, tu historial, tus contraseñas y otras opciones se vincularán de forma permanente a la cuenta <ph name="USER_NAME" />. Podrás eliminar estos datos a través del Panel de control de cuentas de Google, pero no podrás asociar estos datos a otra cuenta. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">El programa de instalación no ha podido descomprimir el archivo. Vuelve a descargar Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Reiniciar Chrome en el transcurso de 1 día}other{Reiniciar Chrome en el transcurso de # días}}</translation> +<translation id="4205939740494406371">Chrome no puede comprobar tus contraseñas. Vuelve a intentarlo en 24 horas o <ph name="BEGIN_LINK" />comprueba las contraseñas en tu cuenta de Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">¿Quieres cerrar sesión en Chrome?</translation> <translation id="4251615635259297716">¿Quieres vincular tus datos de Chrome a esta cuenta?</translation> <translation id="4293420128516039005">Inicia sesión para sincronizar y personalizar Chrome en todos tus dispositivos</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Este archivo es peligroso, por lo que Chrome lo ha bloqueado.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation> <translation id="840084489713044809">Google Chrome quiere exportar tus contraseñas.</translation> -<translation id="8455999171311319804">Opcional: Envía datos de uso y diagnóstico automáticamente a Google para ayudarnos a mejorar Chrome OS.</translation> <translation id="8498858610309223613">Se acaba de instalar una actualización de seguridad especial para Google Chrome. Reinicia ahora y restauraremos las pestañas.</translation> <translation id="8521348052903287641">Regla entrante para que Google Chrome Dev permita tráfico mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index 10af93e..2ea5a1f 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -90,6 +90,7 @@ <translation id="34857402635545079">Kustuta andmed ka Chrome'ist (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome vajab juurdepääsu teie asukohale, et seda selle saidiga jagada</translation> <translation id="3533694711092285624">Salvestatud paroole ei ole. Chrome saab teie paroole kontrollida, kui olete need salvestanud.</translation> +<translation id="3541482654983822893">Chrome ei saa teie paroole kontrollida. Proovige uuesti 24 tunni pärast.</translation> <translation id="3576528680708590453">Teie süsteemiadministraator on konfigureerinud Google Chrome'i avama alternatiivset brauserit, et saada juurdepääs lehele <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Sünkroonige ja isikupärastage Chrome kõigis oma seadmetes</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Administraator nõuab, et käivitaksite Chrome'i värskenduse rakendamiseks uuesti}=1{Administraator nõuab, et käivitaksite Chrome'i värskenduse rakendamiseks uuesti. Teie inkognito akent ei avata uuesti.}other{Administraator nõuab, et käivitaksite Chrome'i värskenduse rakendamiseks uuesti. Teie # inkognito akent ei avata uuesti.}}</translation> @@ -107,6 +108,7 @@ <translation id="4147555960264124640">Logite sisse hallatud kontoga ja annate selle administraatorile üle Google Chrome'i profiili juhtimise. Teie Chrome'i andmed, nagu rakendused, järjehoidjad, ajalugu, paroolid ja muud seaded seotakse jäädavalt kasutajaga <ph name="USER_NAME" />. Saate need andmed Google'i kontode juhtpaneeli kaudu kustutada, kuid te ei saa neid seostada teise kontoga. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Installijal ei õnnestunud arhiivi lahti pakkida. Palun laadige Google Chrome uuesti alla.</translation> <translation id="4191857738314598978">{0,plural, =1{Käivitage Chrome uuesti päeva jooksul}other{Käivitage Chrome uuesti # päeva jooksul}}</translation> +<translation id="4205939740494406371">Chrome ei saa teie paroole kontrollida. Proovige uuesti 24 tunni pärast või <ph name="BEGIN_LINK" />kontrollige oma Google'i kontol paroole<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Kas logida Chrome'ist välja?</translation> <translation id="4251615635259297716">Kas soovite linkida Chrome'i andmed selle kontoga?</translation> <translation id="4293420128516039005">Logige sisse, et Chrome kõigis oma seadmetes sünkroonida ja isikupärastada</translation> @@ -231,7 +233,6 @@ <translation id="8342675569599923794">Chrome blokeeris faili, kuna see on ohtlik.</translation> <translation id="8370517070665726704">Autoriõigus <ph name="YEAR" /> Google LLC. Kõik õigused on kaitstud.</translation> <translation id="840084489713044809">Google Chrome soovib teie paroole eksportida.</translation> -<translation id="8455999171311319804">Valikuline: aitate Chrome OS-i täiustada, kui lubate diagnostika- ja kasutusandmete automaatse saatmise Google'ile.</translation> <translation id="8498858610309223613">Äsja rakendati Google Chrome'i spetsiaalne turvavärskendus. Taaskäivitage brauser, misjärel taastame teie vahelehed.</translation> <translation id="8521348052903287641">Sissetuleku reegel Google Chrome Devile mDNS-liikluse lubamiseks.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index 16a09d6..466e0b92 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">Fitxategia arriskutsua da; horregatik, blokeatu egin du Chrome-k.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Eskubide guztiak erreserbatuta.</translation> <translation id="840084489713044809">Google Chrome-k pasahitzak esportatu nahi ditu.</translation> -<translation id="8455999171311319804">Aukerakoa: lagundu Chrome OS hobetzen Google-ri diagnostikoak eta erabilera-datuak automatikoki bidalita.</translation> <translation id="8498858610309223613">Google Chrome-ren segurtasun-eguneratze berezi bat aplikatu berri da. Berrabiarazi gailua, eta fitxak leheneratuko dizkizugu.</translation> <translation id="8521348052903287641">Google Chrome Dev-ek mDNS trafikoa baimentzeko sarrerako araua.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 490a4da1..8acac25 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">همچنین دادهها از Chrome پاک شود (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome برای همرسانی مکانتان با این سایت باید به مکان شما دسترسی داشته باشد</translation> <translation id="3533694711092285624">گذرواژه ذخیرهشدهای وجود ندارد. Chrome زمانی میتواند گذرواژههایتان را بررسی کند که آنها را ذخیره کرده باشید.</translation> +<translation id="3541482654983822893">Chrome نمیتواند گذرواژههایتان را بررسی کند. بعد از ۲۴ ساعت دوباره امتحان کنید.</translation> <translation id="3576528680708590453">سرپرست سیستم برای باز شدن مرورگری دیگر جهت دسترسی به <ph name="TARGET_URL_HOSTNAME" />، Google Chrome را پیکربندی کرده است.</translation> <translation id="3582972582564653026">Chrome را در همه دستگاههایتان همگامسازی و شخصیسازی کنید</translation> <translation id="3596080736082218006">{COUNT,plural, =0{سرپرست سیستم لازم میداند برای اعمال بهروزرسانی، Chrome را راهاندازی مجدد کنید}=1{سرپرست سیستم لازم میداند برای اعمال بهروزرسانی، Chrome را راهاندازی مجدد کنید. پنجره ناشناس بازگشایی نمیشود.}one{سرپرست سیستم لازم میداند برای اعمال بهروزرسانی، Chrome را راهاندازی مجدد کنید. # پنجره ناشناس بازگشایی نمیشود.}other{سرپرست سیستم لازم میداند برای اعمال بهروزرسانی، Chrome را راهاندازی مجدد کنید. # پنجره ناشناس بازگشایی نمیشود.}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">شما با حساب مدیریتشده وارد سیستم میشوید و به سرپرست آن اجازه کنترل بر نمایه Google Chrome خود را میدهید. دادههای Chrome شما شامل برنامهها، نشانکها، سابقه، گذرواژهها و سایر تنظیمات برای همیشه به <ph name="USER_NAME" /> مرتبط خواهد شد. میتوانید این دادهها را از طریق داشبورد حسابهای Google حذف کنید اما نمیتوانید این دادهها را به حساب دیگری مرتبط سازید. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">نصبکننده در خارج کردن آرشیو از حالت فشرده ناموفق بود. لطفاً دوباره Google Chrome را بارگیری کنید.</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome را ظرف یک روز راهاندازی مجدد کنید}one{Chrome را ظرف # روز راهاندازی مجدد کنید}other{Chrome را ظرف # روز راهاندازی مجدد کنید}}</translation> +<translation id="4205939740494406371">Chrome نمیتواند گذرواژههایتان را بررسی کند. بعد از ۲۴ ساعت دوباره امتحان کنید یا <ph name="BEGIN_LINK" />گذرواژهها را در «حساب Google» خود بررسی کنید<ph name="END_LINK" />.</translation> <translation id="424864128008805179">از سیستم Chrome خارج می شوید؟</translation> <translation id="4251615635259297716">دادههای Chrome شما به این حساب مرتبط شوند؟</translation> <translation id="4293420128516039005">برای همگامسازی و شخصیسازی Chrome در همه دستگاههایتان، به سیستم وارد شوید</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">این فایل خطرناک است، بنابراین Chrome آن را مسدود کرده است.</translation> <translation id="8370517070665726704">حق نسخهبرداری <ph name="YEAR" /> Google LLC. کلیه حقوق محفوظ است.</translation> <translation id="840084489713044809">Google Chrome میخواهد گذرواژههای شما را صادر کند.</translation> -<translation id="8455999171311319804">اختیاری: با ارسال خودکار دادههای تشخیصی و میزان استفاده به Google، به بهبود سیستم عامل Chrome کمک کنید.</translation> <translation id="8498858610309223613">لحظاتی پیش بهروزرسانی امنیتی ویژهای برای Google Chrome اعمال شد. هماکنون بازراهاندازی کنید و ما برگههایتان را بازیابی خواهیم کرد.</translation> <translation id="8521348052903287641">قانون ترافیک ورودی Google Chrome نسخه Dev برای امکان دادن به ترافیک mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 7008da45e..304d1df 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Tämä tiedosto on vaarallinen, joten Chrome on estänyt sen.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Kaikki oikeudet pidätetään.</translation> <translation id="840084489713044809">Google Chrome yrittää viedä salasanojasi tiedostoon.</translation> -<translation id="8455999171311319804">Valinnainen: Lähetä automaattisesti diagnostiikka- ja käyttötietoja Googlelle Chrome-käyttöjärjestelmän kehittämiseksi.</translation> <translation id="8498858610309223613">Google Chromen tärkeä tietoturvapäivitys on asennettu. Käynnistä selain uudelleen – palautamme avoimet välilehdet.</translation> <translation id="8521348052903287641">Google Chromen kehittäjäversion saapuvien yhteyksien sääntö, joka sallii mDNS-liikenteen.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index dab208a..436a1839 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">I-clear din ang data sa Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Kailangan ng Chrome ng access sa iyong lokasyon upang ibahagi ang lokasyon mo sa site na ito</translation> <translation id="3533694711092285624">Walang naka-save na password. Masusuri ng Chrome ang iyong mga password kapag na-save mo ang mga ito.</translation> +<translation id="3541482654983822893">Hindi masuri ng Chrome ang iyong mga password. Subukan ulit pagkalipas ng 24 na oras.</translation> <translation id="3576528680708590453">Na-configure ng iyong system administrator ang Google Chrome na magbukas ng alternatibong browser para i-access ang <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">I-sync at i-personalize ang Chrome sa lahat ng iyong device</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Ipinag-aatas ng iyong administrator na ilunsad mo ulit ang Chrome para mailapat ang isang update}=1{Ipinag-aatas ng iyong administrator na ilunsad mo ulit ang Chrome para mailapat ang isang update. Hindi bubukas ulit ang iyong Incognito window.}one{Ipinag-aatas ng iyong administrator na ilunsad mo ulit ang Chrome para mailapat ang isang update. Hindi bubukas ulit ang iyong # Incognito window.}other{Ipinag-aatas ng iyong administrator na ilunsad mo ulit ang Chrome para mailapat ang isang update. Hindi bubukas ulit ang iyong # na Incognito window.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Nagsa-sign in ka gamit ang isang pinamamahalaang account at nagbibigay sa administrator nito ng kontrol sa iyong profile sa Google Chrome. Permanenteng mauugnay ang iyong data sa Chrome, gaya ng iyong apps, mga bookmark, kasaysayan, password, at iba pang setting sa <ph name="USER_NAME" />. Matatanggal mo ang data na ito sa Google Accounts Dashboard, ngunit hindi mo maiuugnay ang data na ito sa isa pang account. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Nabigo ang installer sa pag-uncompress ng archive. Paki-download muli ang Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Muling ilunsad ang Chrome sa loob ng isang araw}one{Muling ilunsad ang Chrome sa loob ng # araw}other{Muling ilunsad ang Chrome sa loob ng # na araw}}</translation> +<translation id="4205939740494406371">Hindi masuri ng Chrome ang iyong mga password. Subukan ulit pagkalipas ng 24 na oras o <ph name="BEGIN_LINK" />suriin ang mga password sa iyong Google Account<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Mag-sign out sa Chrome?</translation> <translation id="4251615635259297716">I-link ang iyong data sa Chrome sa account na ito</translation> <translation id="4293420128516039005">Mag-sign in para i-sync at i-personalize ang Chrome sa lahat ng iyong device</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Mapanganib ang file na ito, kaya na-block ito ng Chrome.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Nakalaan ang lahat ng karapatan.</translation> <translation id="840084489713044809">Gustong i-export ng Google Chrome ang iyong mga password.</translation> -<translation id="8455999171311319804">Opsyonal: Tulungang mas pahusayin ang Chrome OS sa pamamagitan ng awtomatikong pagpapadala ng data ng diagnostic at paggamit sa Google.</translation> <translation id="8498858610309223613">Naglapat ng espesyal na update sa seguridad para sa Google Chrome. Mag-restart na at ire-restore namin ang iyong mga tab.</translation> <translation id="8521348052903287641">Inbound na panuntunan para sa Google Chrome Dev upang payagan ang trapiko ng mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb index 2e4c907..f0825a1 100644 --- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb +++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -235,7 +235,6 @@ <translation id="8342675569599923794">Chrome a bloqué ce fichier, car il est dangereux.</translation> <translation id="8370517070665726704">© <ph name="YEAR" /> Google LLC. Tous droits réservés.</translation> <translation id="840084489713044809">Google Chrome veut exporter vos mots de passe.</translation> -<translation id="8455999171311319804">Facultatif : aidez-nous à améliorer Google Chrome OS en envoyant automatiquement un diagnostic et des données d'utilisation à Google.</translation> <translation id="8498858610309223613">Une mise à jour de sécurité spéciale pour Google Chrome vient d'être effectuée. Redémarrez maintenant, et nous restaurerons vos onglets.</translation> <translation id="8521348052903287641">Règle de trafic entrant pour Google Chrome Dev autorisant le trafic mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index b18f7b9..4226e0d 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -90,6 +90,7 @@ <translation id="34857402635545079">Effacer également les données issues de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome a besoin d'accéder à votre position pour la partager avec ce site</translation> <translation id="3533694711092285624">Aucun mot de passe enregistré. Chrome ne peut vérifier vos mots de passe que si vous les enregistrez.</translation> +<translation id="3541482654983822893">Chrome ne parvient pas à vérifier vos mots de passe. Réessayez dans 24 heures.</translation> <translation id="3576528680708590453">Votre administrateur système a configuré Google Chrome pour que <ph name="TARGET_URL_HOSTNAME" /> s'ouvre dans un autre navigateur.</translation> <translation id="3582972582564653026">Synchroniser et personnaliser Chrome sur vos appareils</translation> <translation id="3596080736082218006">{COUNT,plural, =0{À la demande de votre administrateur, vous devez relancer Chrome pour installer une mise à jour}=1{À la demande de votre administrateur, vous devez relancer Chrome pour installer une mise à jour. Sachez que la fenêtre de navigation privée ne sera pas rouverte.}one{À la demande de votre administrateur, vous devez relancer Chrome pour installer une mise à jour. Sachez que la fenêtre de navigation privée (#) ne sera pas rouverte.}other{À la demande de votre administrateur, vous devez relancer Chrome pour installer une mise à jour. Sachez que les # fenêtres de navigation privée ne seront pas rouvertes.}}</translation> @@ -107,6 +108,7 @@ <translation id="4147555960264124640">Vous vous connectez avec un compte géré et donnez le contrôle de votre profil Google Chrome à son administrateur. Vos données Chrome, telles que les applications, les favoris, l'historique, les mots de passe et les autres paramètres, vont être définitivement associées à <ph name="USER_NAME" />. Vous pouvez supprimer ces données via le tableau de bord des comptes Google, mais vous ne pouvez pas les associer à un autre compte. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Échec de la décompression de l'archive par le programme d'installation. Veuillez télécharger de nouveau Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Relancer Chrome d'ici un jour}one{Relancer Chrome d'ici # jour}other{Relancer Chrome d'ici # jours}}</translation> +<translation id="4205939740494406371">Chrome ne parvient pas à vérifier vos mots de passe. Réessayez dans 24 heures ou <ph name="BEGIN_LINK" />vérifiez les mots de passe enregistrés dans votre compte Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Se déconnecter de Chrome ?</translation> <translation id="4251615635259297716">Associer vos données Chrome à ce compte ?</translation> <translation id="4293420128516039005">Se connecter pour synchroniser et personnaliser Chrome sur vos appareils</translation> @@ -232,7 +234,6 @@ <translation id="8342675569599923794">Chrome a bloqué ce fichier, car ce dernier est dangereux.</translation> <translation id="8370517070665726704">© <ph name="YEAR" /> Google LLC. Tous droits réservés.</translation> <translation id="840084489713044809">Google Chrome veut exporter vos mots de passe.</translation> -<translation id="8455999171311319804">Facultatif : contribuez à améliorer Google Chrome OS en envoyant automatiquement des données de diagnostic et d'utilisation à Google.</translation> <translation id="8498858610309223613">Une mise à jour spéciale de sécurité pour Google Chrome vient d'être installée. Veuillez redémarrer le navigateur. Vos onglets seront restaurés.</translation> <translation id="8521348052903287641">Règle de trafic entrant pour Google Chrome pour les développeurs autorisant le trafic mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index 0d46e3b..08a84cb 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">Este ficheiro é perigoso, así que Chrome bloqueouno.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos os dereitos reservados.</translation> <translation id="840084489713044809">Google Chrome quere exportar os teus contrasinais.</translation> -<translation id="8455999171311319804">Opcional: axuda a mellorar Chrome OS enviando de forma automática datos de uso e diagnóstico a Google.</translation> <translation id="8498858610309223613">Acábase de aplicar unha actualización especial de seguranza para Google Chrome. Reinicia agora o navegador para restaurar as pestanas.</translation> <translation id="8521348052903287641">Regra de entrada para que Google Chrome Dev permita tráfico mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index c7c5237..921edca 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Chromeમાંથી પણ ડેટા કાઢી નાખો (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chromeને આ સાઇટ સાથે તમારું સ્થાન શેર કરવા માટે તમારા સ્થાનના ઍક્સેસની જરૂર પડે છે</translation> <translation id="3533694711092285624">કોઈ સાચવેલો પાસવર્ડ નથી. જ્યારે તમે તમારા પાસવર્ડ સાચવો ત્યારે Chrome તેને ચેક કરી શકે છે.</translation> +<translation id="3541482654983822893">Chrome તમારા પાસવર્ડ ચેક કરી શકતું નથી. 24 કલાક પછી ફરી પ્રયાસ કરો.</translation> <translation id="3576528680708590453">તમારા સિસ્ટમ વ્યવસ્થાપકે <ph name="TARGET_URL_HOSTNAME" />ને ઍક્સેસ કરવા Google Chromeને વૈકલ્પિક બ્રાઉઝર ખોલવા માટે ગોઠવેલું છે.</translation> <translation id="3582972582564653026">તમારા બધા ડિવાઇસ પર Chromeને સિંક કરો અને મનગમતું બનાવો</translation> <translation id="3596080736082218006">{COUNT,plural, =0{અપડેટ લાગુ કરવા માટે તમે Chromeને ફરીથી લૉન્ચ કરો એવું તમારા વ્યવસ્થાપક ઇચ્છે છે}=1{અપડેટ લાગુ કરવા માટે તમે Chromeને ફરીથી લૉન્ચ કરો એવું તમારા વ્યવસ્થાપક ઇચ્છે છે. તમારી છુપી વિન્ડો ફરીથી ખૂલશે નહીં.}one{અપડેટ લાગુ કરવા માટે તમે Chromeને ફરીથી લૉન્ચ કરો એવું તમારા વ્યવસ્થાપક ઇચ્છે છે. તમારી # છુપી વિન્ડો ફરીથી ખૂલશે નહીં.}other{અપડેટ લાગુ કરવા માટે તમે Chromeને ફરીથી લૉન્ચ કરો એવું તમારા વ્યવસ્થાપક ઇચ્છે છે. તમારી # છુપી વિન્ડો ફરીથી ખૂલશે નહીં.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">તમે મેનેજ કરેલા એકાઉન્ટ સાથે સાઇન ઇન કરી રહ્યાં છો અને તમારી Google Chrome પ્રોફાઇલ પર એનું એડમિન નિયંત્રણ આપી રહ્યાં છો. તમારો Chrome ડેટા, જેમ કે તમારી ઍપ, બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને બીજા સેટિંગ, કાયમ માટે <ph name="USER_NAME" />થી બંધાયેલ રહેશે. તમે Google એકાઉન્ટ ડૅશબોર્ડથી આ ડેટાને કાઢી શકશો, પરંતુ તમે આ ડેટાને બીજા એકાઉન્ટ સાથે સાંકળી શકશો નહિ. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ઇન્સ્ટૉલર આર્કાઇવને અનકોમ્પ્રેસ કરવામાં નિષ્ફળ. કૃપા કરીને Google Chrome ફરીથી ડાઉનલોડ કરો.</translation> <translation id="4191857738314598978">{0,plural, =1{એક દિવસની અંદર Chromeને ફરીથી લૉન્ચ કરો}one{# દિવસની અંદર Chromeને ફરીથી લૉન્ચ કરો}other{# દિવસની અંદર Chromeને ફરીથી લૉન્ચ કરો}}</translation> +<translation id="4205939740494406371">Chrome તમારા પાસવર્ડ ચેક કરી શકતું નથી. 24 કલાક પછી ફરી પ્રયાસ કરજો અથવા <ph name="BEGIN_LINK" />તમારા Google એકાઉન્ટમાં પાસવર્ડ ચેક કરો<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chromeમાંથી સાઇન આઉટ કરીએ?</translation> <translation id="4251615635259297716">તમારા Chrome ડેટાને આ એકાઉન્ટ સાથે લિંક કરીએ?</translation> <translation id="4293420128516039005">તમારા બધા ડિવાઇસ પર Chromeને સિંક અને વ્યક્તિગત કરવા માટે સાઇન ઇન કરો</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">આ ફાઇલ જોખમી છે, તેથી Chrome એ તેને અવરોધિત કરેલ છે.</translation> <translation id="8370517070665726704">કૉપિરાઇટ <ph name="YEAR" /> Google LLC. સર્વાધિકાર સુરક્ષિત.</translation> <translation id="840084489713044809">Google Chrome તમારા પાસવર્ડની નિકાસ કરવા માગે છે.</translation> -<translation id="8455999171311319804">વૈકલ્પિક: Googleને નિદાન અને વપરાશ ડેટા ઑટોમૅટિક રીતે મોકલીને Chrome OSને વધુ સારી બનાવવામાં સહાય કરો.</translation> <translation id="8498858610309223613">Google Chrome માટેનું વિશેષ સુરક્ષા અપડેટ હમણાં જ લાગુ કરવામાં આવ્યું. ફરી શરૂ કરો અને અમે તમારાં ટૅબની પુનઃસ્થાપના કરીશું.</translation> <translation id="8521348052903287641">mDNS ટ્રાફિકને મંજૂરી આપવા માટે Google Chrome Dev માટે ઇનબાઉન્ડ નિયમ.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index 5a191ec..fd479e2 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">साथ ही, Chrome (<ph name="URL" />) का डेटा साफ़ करें</translation> <translation id="3503306920980160878">इस साइट से आपकी जगह की जानकारी शेयर करने के लिए Chrome को आपकी जगह की जानकारी का एक्सेस चाहिए</translation> <translation id="3533694711092285624">सेव किया हुआ कोई भी पासवर्ड नहीं है. Chrome आपके पासवर्ड की जांच तब कर सकता है, जब आप उन्हें सेव करें.</translation> +<translation id="3541482654983822893">Chrome आपके पासवर्ड की जांच नहीं कर सकता. 24 घंटे बाद कोशिश करें.</translation> <translation id="3576528680708590453">आपके सिस्टम एडमिन ने Google Chrome को इस तरह कॉन्फ़िगर किया है कि वह <ph name="TARGET_URL_HOSTNAME" /> को ऐक्सेस करने के लिए कोई दूसरा ब्राउज़र खोले.</translation> <translation id="3582972582564653026">Chrome को अपने सभी डिवाइस पर सिंक करें और मनमुताबिक बनाएं</translation> <translation id="3596080736082218006">{COUNT,plural, =0{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें}=1{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें. आपकी गुप्त विंडो फिर से नहीं खुलेगी.}one{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}other{आपका एडमिन चाहता है कि आप अपडेट लागू करने के लिए Chrome को फिर से लॉन्च करें. आपकी # गुप्त विंडो फिर से नहीं खुलेंगी.}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">आप प्रबंधित खाते से साइन इन कर रहे हैं और उसके एडमिन को अपनी Google Chrome प्रोफ़ाइल पर नियंत्रण दे रहे हैं. आपका Chrome डेटा, जैसे आपके ऐप्लिकेशन, बुकमार्क, इतिहास, पासवर्ड, और दूसरे सेटिंग <ph name="USER_NAME" /> से स्थायी रूप से जुड़ जाएंगे. आप Google खाता डैशबोर्ड से इस डेटा को मिटा सकेंगे, लेकिन आप किसी दूसरे खाते से इस डेटा को जोड़ नहीं सकेंगे. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">इंस्टॉलर, संग्रह को विस्तारित करने में विफल हुआ. कृपया Google Chrome फिर से डाउनलोड करें.</translation> <translation id="4191857738314598978">{0,plural, =1{एक दिन के अंदर Chrome को फिर से लॉन्च करें}one{# दिनों के अंदर Chrome को फिर से लॉन्च करें}other{# दिनों के अंदर Chrome को फिर से लॉन्च करें}}</translation> +<translation id="4205939740494406371">Chrome आपके पासवर्ड की जांच नहीं कर सकता. 24 घंटे बाद कोशिश करें या <ph name="BEGIN_LINK" />अपने Google खाते के पासवर्ड की जांच करें<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome से साइन आउट करें?</translation> <translation id="4251615635259297716">आपके Chrome डेटा को इस खाते से लिंक करें?</translation> <translation id="4293420128516039005">Chrome को अपने सभी डिवाइस पर सिंक करने और मनमुताबिक बनाने के लिए साइन इन करें</translation> @@ -231,7 +233,6 @@ <translation id="8342675569599923794">यह फ़ाइल खतरनाक है, इसलिए Chrome ने इसे रोक दिया है.</translation> <translation id="8370517070665726704">कॉपीराइट <ph name="YEAR" /> Google LLC. सर्वाधिकार सुरक्षित.</translation> <translation id="840084489713044809">Google Chrome आपके पासवर्ड निर्यात करना चाहता है.</translation> -<translation id="8455999171311319804">वैकल्पिक: Google को गड़बड़ी और उपयोग का डेटा अपने आप भेजकर Chrome OS को बेहतर बनाने में सहायता करें.</translation> <translation id="8498858610309223613">Google Chrome के लिए एक खास सुरक्षा अपडेट अभी-अभी लागू किया गया था. अभी रीस्टार्ट करें और हम आपके टैब बहाल कर देंगे.</translation> <translation id="8521348052903287641">mDNS ट्रैफ़िक की अनुमति देने के लिए Google Chrome का इनबाउंड नियम.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index f5a577e..e174d03 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">Izbriši i podatke s Chromea (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome treba dopuštenje za pristup vašoj lokaciji da bi je podijelio s ovom web-lokacijom</translation> <translation id="3533694711092285624">Nema nijedne spremljene zaporke. Chrome može provjeriti vaše zaporke kad ih spremite.</translation> +<translation id="3541482654983822893">Chrome ne može provjeriti vaše zaporke. Pokušajte ponovno nakon 24 sata.</translation> <translation id="3576528680708590453">Vaš administrator sustava konfigurirao je Google Chrome da otvara zamjenski preglednik za pristup URL-u <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Uključite sinkronizaciju Chromea kako bi vam bio prilagođen na svim vašim uređajima</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Vaš administrator zahtijeva da ponovno pokrenete Chrome radi primjene ažuriranja}=1{Vaš administrator zahtijeva da ponovno pokrenete Chrome radi primjene ažuriranja. Anonimni se prozor neće ponovno otvoriti.}one{Vaš administrator zahtijeva da ponovno pokrenete Chrome radi primjene ažuriranja. Vaš # anonimni prozor neće se ponovno otvoriti.}few{Vaš administrator zahtijeva da ponovno pokrenete Chrome radi primjene ažuriranja. Vaša # anonimna prozora neće se ponovno otvoriti.}other{Vaš administrator zahtijeva da ponovno pokrenete Chrome radi primjene ažuriranja. Vaših # anonimnih prozora neće se ponovno otvoriti.}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">Prijavljujete se upravljanim računom i dajete administratoru kontrolu nad svojim profilom u sustavu Google Chrome. Vaši podaci u sustavu Chrome, primjerice, aplikacije, oznake, povijest, zaporke i ostale postavke, trajno će se povezati s korisnikom <ph name="USER_NAME" />. Moći ćete izbrisati te podatke putem Nadzorne ploče Google računa, ali ih nećete moći povezati s nekim drugim računom. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Program za instalaciju nije dekomprimirao arhivu. Ponovno preuzmite program Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Ponovo pokrenite Chrome u roku od jednog dana}one{Ponovo pokrenite Chrome u roku od # dana}few{Ponovo pokrenite Chrome u roku od # dana}other{Ponovo pokrenite Chrome u roku od # dana}}</translation> +<translation id="4205939740494406371">Chrome ne može provjeriti vaše zaporke. Pokušajte ponovno nakon 24 sata ili <ph name="BEGIN_LINK" />provjerite zaporke na svojem Google računu<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Želite li se odjaviti s Chromea?</translation> <translation id="4251615635259297716">Želite li povezati svoje podatke sustava Chrome s tim računom?</translation> <translation id="4293420128516039005">Prijavite se da biste sinkronizirali i prilagodili Chrome na svim svojim uređajima</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">Datoteka je opasna i Chrome ju je blokirao.</translation> <translation id="8370517070665726704">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava pridržana.</translation> <translation id="840084489713044809">Google Chrome želi izvesti vaše zaporke.</translation> -<translation id="8455999171311319804">Dodatno: automatskim slanjem podataka o upotrebi i dijagnostici Googleu pomognite nam da poboljšamo OS Chrome.</translation> <translation id="8498858610309223613">Upravo je primijenjeno posebno sigurnosno ažuriranje za Google Chrome. Ponovo pokrenite sustav i vratit ćemo vaše kartice.</translation> <translation id="8521348052903287641">Ulazno pravilo kako bi Google Chrome Dev dopustio mDNS promet.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index af50dc7..e0aef058 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -227,7 +227,6 @@ <translation id="8342675569599923794">Ez a fájl veszélyes, ezért a Chrome letiltotta.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Minden jog fenntartva.</translation> <translation id="840084489713044809">A Google Chrome exportálni szeretné a jelszavakat.</translation> -<translation id="8455999171311319804">Nem kötelező: Segítse a Chrome OS fejlesztését azzal, hogy automatikusan elküldi a diagnosztikai és használati adatokat a Google-nak.</translation> <translation id="8498858610309223613">A rendszer egy speciális biztonsági frissítést alkalmazott a Google Chrome-on. Indítsa újra a számítógépet, a lapokat majd mi visszaállítjuk.</translation> <translation id="8521348052903287641">Bejövő szabály a Google Chrome Devhez az mDNS forgalom engedélyezése céljából.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb index 75928fb..b66b2cd6 100644 --- a/chrome/app/resources/google_chrome_strings_hy.xtb +++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -235,7 +235,6 @@ <translation id="8342675569599923794">Այս ֆայլը վտանգավոր է, և Chrome-ն արգելափակել է այն:</translation> <translation id="8370517070665726704">© Google LLC <ph name="YEAR" />։ Բոլոր իրավունքները պահպանված են:</translation> <translation id="840084489713044809">Google Chrome-ն ուզում է արտահանել ձեր գաղտնաբառերը:</translation> -<translation id="8455999171311319804">Կամընտիր. Օգնեք կատարելագործել Chrome OS-ը՝ Google-ին ավտոմատ ուղարկելով ախտորոշման և օգտագործման տվյալները:</translation> <translation id="8498858610309223613">Google Chrome-ի անվտանգությունն ապահովող հատուկ թարմացումը տեղադրվել է: Վերագործարկեք Chrome-ը, և ձեր ներդիրները կվերականգնվեն:</translation> <translation id="8521348052903287641">Թույլատրել Google Chrome Dev-ում մուտքային հոսքի փոխանցումը mDNS հաղորդակարգով:</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 305a179d..d9bde1d 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">Hapus juga data dari Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome memerlukan akses ke lokasi Anda untuk berbagi lokasi dengan situs ini</translation> <translation id="3533694711092285624">Tidak ada sandi yang tersimpan. Chrome dapat memeriksa sandi Anda saat menyimpannya.</translation> +<translation id="3541482654983822893">Chrome tidak dapat memeriksa sandi Anda. Coba lagi setelah 24 jam.</translation> <translation id="3576528680708590453">Administrator sistem Anda telah mengonfigurasi Google Chrome untuk membuka browser alternatif guna mengakses <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Menyinkronkan dan mempersonalisasi Chrome di perangkat Anda</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Administrator mewajibkan Anda meluncurkan kembali Chrome untuk menerapkan update}=1{Administrator mewajibkan Anda meluncurkan kembali Chrome untuk menerapkan update. Jendela samaran Anda tidak akan dibuka kembali.}other{Administrator mewajibkan Anda meluncurkan kembali Chrome untuk menerapkan update. # jendela samaran Anda tidak akan dibuka kembali.}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">Anda masuk dengan akun terkelola dan memberikan administratornya kontrol atas profil Google Chrome Anda. Data Chrome Anda, seperti aplikasi, bookmark, histori, sandi, dan setelan lain selamanya akan dikaitkan ke <ph name="USER_NAME" />. Anda dapat menghapus data ini melalui Dasbor Akun Google, namun Anda tidak akan dapat mengaitkan data ini dengan akun yang lain. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Instalatur gagal mendekompresi arsip. Download kembali Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Luncurkan ulang Chrome dalam satu hari}other{Luncurkan ulang Chrome dalam # hari}}</translation> +<translation id="4205939740494406371">Chrome tidak dapat memeriksa sandi Anda. Coba lagi setelah 24 jam atau <ph name="BEGIN_LINK" />periksa sandi di Akun Google Anda<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Logout dari Chrome?</translation> <translation id="4251615635259297716">Tautkan data Chrome Anda ke akun ini?</translation> <translation id="4293420128516039005">Login untuk menyinkronkan dan mempersonalisasi Chrome di perangkat Anda</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">File ini berbahaya, jadi Chrome telah memblokirnya.</translation> <translation id="8370517070665726704">Hak cipta <ph name="YEAR" /> Google LLC. Semua hak dilindungi undang-undang.</translation> <translation id="840084489713044809">Google Chrome ingin mengekspor sandi.</translation> -<translation id="8455999171311319804">Opsional: Bantu Chrome OS menjadi lebih baik dengan mengirimkan data diagnostik dan penggunaan secara otomatis ke Google.</translation> <translation id="8498858610309223613">Update keamanan khusus untuk Google Chrome baru saja diterapkan. Mulai ulang Google Chrome sekarang dan kami akan memulihkan tab Anda.</translation> <translation id="8521348052903287641">Inbound rule untuk Google Chrome Dev guna mengizinkan traffic mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb index 9f3535c..0b5d6eb5 100644 --- a/chrome/app/resources/google_chrome_strings_is.xtb +++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">Þessi skrá er hættuleg og þess vegna útilokaði Chrome hana.</translation> <translation id="8370517070665726704">Höfundarréttur <ph name="YEAR" /> Google LLC. Öll réttindi áskilin.</translation> <translation id="840084489713044809">Google Chrome vill flytja út aðgangsorðin þín.</translation> -<translation id="8455999171311319804">Valfrjálst: Hjálpaðu til við að bæta Chrome OS með því að senda greiningar- og notkunargögn sjálfkrafa til Google.</translation> <translation id="8498858610309223613">Sérstök öryggisuppfærsla fyrir Google Chrome var tekin í notkun. Endurræstu núna og við opnum flipana þína aftur.</translation> <translation id="8521348052903287641">Innleiðarregla til að láta Google Chrome Dev leyfa mDNS-umferð.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index 3ffb88b..d9c5463 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -87,6 +87,7 @@ <translation id="34857402635545079">Cancella anche i dati di Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome deve poter accedere alla tua posizione per condividerla con questo sito</translation> <translation id="3533694711092285624">Nessuna password salvata. Chrome può controllare le password quando le salvi.</translation> +<translation id="3541482654983822893">Chrome non può controllare le tue password. Riprova tra 24 ore.</translation> <translation id="3576528680708590453">L'amministratore di sistema ha configurato Google Chrome per l'apertura di un browser alternativo per accedere a <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Sincronizza e personalizza Chrome sui tuoi dispositivi</translation> <translation id="3596080736082218006">{COUNT,plural, =0{L'amministratore richiede il riavvio di Chrome per installare un aggiornamento}=1{L'amministratore richiede il riavvio di Chrome per installare un aggiornamento. La finestra di navigazione in incognito non verrà riaperta.}other{L'amministratore richiede il riavvio di Chrome per installare un aggiornamento. Le # finestre di navigazione in incognito non verranno riaperte.}}</translation> @@ -104,6 +105,7 @@ <translation id="4147555960264124640">Stai per accedere con un account gestito e per dare al relativo amministratore il controllo del tuo profilo Google Chrome. I tuoi dati di Chrome, come app, Preferiti, cronologia, password e altre impostazioni, verranno collegati definitivamente a <ph name="USER_NAME" />. Potrai eliminare questi dati tramite la Dashboard di Google Account, ma non potrai associare questi dati a un altro account. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Il programma di installazione non è riuscito a decomprimere il file. Scarica nuovamente Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Riavvia Chrome entro un giorno}other{Riavvia Chrome entro # giorni}}</translation> +<translation id="4205939740494406371">Chrome non può controllare le tue password. Riprova tra 24 ore oppure <ph name="BEGIN_LINK" />controlla le password nel tuo Account Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Uscire da Chrome?</translation> <translation id="4251615635259297716">Collegare i tuoi dati Chrome a questo account?</translation> <translation id="4293420128516039005">Accedi per sincronizzare e personalizzare Chrome sui tuoi dispositivi</translation> @@ -225,7 +227,6 @@ <translation id="8342675569599923794">Questo file è pericoloso, pertanto è stato bloccato da Chrome.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC Tutti i diritti riservati.</translation> <translation id="840084489713044809">Google Chrome vuole esportare le password.</translation> -<translation id="8455999171311319804">Facoltativo. Aiutaci a migliorare Chrome OS inviando automaticamente a Google dati di diagnostica e utilizzo.</translation> <translation id="8498858610309223613">È stato appena applicato un aggiornamento di sicurezza speciale per Google Chrome. Riavvia ora e le schede verranno ripristinate.</translation> <translation id="8521348052903287641">Regola inbound per consentire il traffico mDNS in Google Chrome Dev.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index f36c60c..fcf873c 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Chrome חסם את הקובץ הזה כי הוא מסוכן.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. כל הזכויות שמורות.</translation> <translation id="840084489713044809">Google Chrome רוצה לייצא את הסיסמאות שלך.</translation> -<translation id="8455999171311319804">אופציונלי: שלח אל Google נתוני אבחון ושימוש באופן אוטומטי ועזור לשפר את מערכת ההפעלה של Chrome.</translation> <translation id="8498858610309223613">בוצע עדכון אבטחה מיוחד של Google Chrome. עכשיו עליך להפעיל מחדש את Chrome ואנחנו נשחזר את הכרטיסיות.</translation> <translation id="8521348052903287641">כלל נכנס לגרסת הפיתוח של Google Chrome כדי לאפשר תנועת mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index 1727400315..82be6ff 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">Chrome のデータ(<ph name="URL" />)も消去する</translation> <translation id="3503306920980160878">このサイトで現在地を共有するには、Chrome で位置情報の使用を許可する必要があります</translation> <translation id="3533694711092285624">保存されているパスワードがありません。パスワードを保存すると Chrome で確認できるようになります。</translation> +<translation id="3541482654983822893">Chrome でパスワードを確認できません。24 時間後にもう一度お試しください。</translation> <translation id="3576528680708590453">システム管理者が、<ph name="TARGET_URL_HOSTNAME" /> へのアクセスに代替ブラウザを開くよう Google Chrome を設定しています。</translation> <translation id="3582972582564653026">同期してカスタマイズした Chrome をどのデバイスでも使用できます</translation> <translation id="3596080736082218006">{COUNT,plural, =0{管理者が、アップデートを適用するために Chrome を再起動するよう求めています}=1{管理者が、アップデートを適用するために Chrome を再起動するよう求めています。シークレット ウィンドウは、再起動後は自動的には開きません。}other{管理者が、アップデートを適用するために Chrome を再起動するよう求めています。現在開いている # 個のシークレット ウィンドウは、再起動後は自動的には開きません。}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">現在、管理対象アカウントでログインしており、あなたの Google Chrome プロフィールを管理者が制御できる状態になっています。あなたの Chrome データ(アプリ、ブックマーク、履歴、パスワードなどの設定)は永続的に <ph name="USER_NAME" /> に関連付けられます。このデータは Google アカウントのダッシュボードを介して削除できますが、このデータを別のアカウントに関連付けることはできなくなります。<ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">インストーラー アーカイブを解凍できませんでした。Google Chrome をダウンロードし直してください。</translation> <translation id="4191857738314598978">{0,plural, =1{1 日以内に Chrome を再起動してください}other{# 日以内に Chrome を再起動してください}}</translation> +<translation id="4205939740494406371">Chrome でパスワードを確認できません。24 時間後にもう一度お試しいただくか、<ph name="BEGIN_LINK" />Google アカウントでパスワードをご確認ください<ph name="END_LINK" />。</translation> <translation id="424864128008805179">Chrome からログアウトしますか?</translation> <translation id="4251615635259297716">Chrome データをこのアカウントにリンクしますか?</translation> <translation id="4293420128516039005">ログインすると、同期してカスタマイズした Chrome をどのデバイスでも使用できます</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">このファイルは危険なファイルであるため、Chrome でブロックしました。</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation> <translation id="840084489713044809">Google Chrome からパスワードをエクスポートするための許可を求められています。</translation> -<translation id="8455999171311319804">オプション: 診断と使用状況のデータを Google に自動送信して Chrome OS の機能向上に役立てる。</translation> <translation id="8498858610309223613">Google Chrome の特別なセキュリティ アップデートが適用されました。今すぐ再起動してください。タブは復元されます。</translation> <translation id="8521348052903287641">mDNS トラフィックを許可する Google Chrome Dev のインバウンド ルールです。</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb index 3fed27e..dea7b76 100644 --- a/chrome/app/resources/google_chrome_strings_ka.xtb +++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -91,6 +91,7 @@ <translation id="34857402635545079">მონაცემების Chrome-იდანაც გასუფთავება (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome საჭიროებს თქვენს მდებარეობაზე წვდომის ნებართვას ამ საიტისთვის გასაზიარებლად</translation> <translation id="3533694711092285624">შენახული პაროლები არ არის. პაროლების შემოწმებას Chrome მოახერხებს მათი შენახვის შემდეგ.</translation> +<translation id="3541482654983822893">Chrome ვერ ახერხებს პაროლების შემოწმებას. ცადეთ 24 საათში.</translation> <translation id="3576528680708590453">თქვენი სისტემის ადმინისტრატორმა მოახდინა Google Chrome-ის კონფიგურაცია იმგვარად, რომ <ph name="TARGET_URL_HOSTNAME" />-ზე წვდომისთვის საჭიროა ალტერნატიული ბრაუზერის გახსნა.</translation> <translation id="3582972582564653026">მოახდინეთ Chrome-ის სინქრონიზაცია და პერსონალიზება თქვენს ყველა მოწყობილობას შორის</translation> <translation id="3596080736082218006">{COUNT,plural, =0{განახლების მისასადაგებლად თქვენი ადმინისტრატორი მოითხოვს Chrome-ის ხელახლა გაშვებას}=1{განახლების მისასადაგებლად თქვენი ადმინისტრატორი მოითხოვს Chrome-ის ხელახლა გაშვებას. თქვენი ინკოგნიტო ფანჯარა ხელახლა არ გაიხსნება.}other{განახლების მისასადაგებლად თქვენი ადმინისტრატორი მოითხოვს Chrome-ის ხელახლა გაშვებას. თქვენი # ინკოგნიტო ფანჯარა ხელახლა არ გაიხსნება.}}</translation> @@ -108,6 +109,7 @@ <translation id="4147555960264124640">თქვენ სისტემაში შედიხართ მართული ანგარიშზით და მის ადმინისტრატორს აძლევთ თქვენი Google Chrome-ის პროფილის კონტროლის შესაძლებლობას. თქვენი Chrome მონაცემები, როგორიცაა თქვენი პროგრამები, სანიშნეები, ისტორია, პაროლები, და სხვა პარამეტრები გახდება მუდმივად <ph name="USER_NAME" />-თან მიბმული. თქვენ შეძლებთ ამ მონაცემების წაშლას Google Accounts Dashboard-ის მეშვეობით, მაგრამ თქვენ ვერ შეძლებთ ამ მონაცემების დაკავშირებას სხვა ანგარიშთან. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ინსტალაციის პროგრამამ ვერ ამოიღო ფაილები არქივიდან. ხელახლა ჩამოტვირთეთ Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{ხელახლა გაუშვით Chrome დღის განმავლობაში}other{ხელახლა გაუშვით Chrome # დღის განმავლობაში}}</translation> +<translation id="4205939740494406371">Chrome ვერ ახერხებს პაროლების შემოწმებას. ცადეთ 24 საათში ან <ph name="BEGIN_LINK" />შეამოწმეთ პაროლები თქვენს Google ანგარიშში<ph name="END_LINK" />.</translation> <translation id="424864128008805179">გსურთ Chrome-იდან გამოსვლა?</translation> <translation id="4251615635259297716">მივამაგროთ Chrome-ის მონაცემები ამ ანგარიშზე?</translation> <translation id="4293420128516039005">შედით სისტემაში, რათა მოახდინოთ Chrome-ის სინქრონიზაცია და პერსონალიზება თქვენს ყველა მოწყობილობას შორის</translation> @@ -233,7 +235,6 @@ <translation id="8342675569599923794">Chrome-მა დაბლოკა ეს ფაილი, რადგან ის სახიფათოა.</translation> <translation id="8370517070665726704">© <ph name="YEAR" />, Google LLC. ყველა უფლება დაცულია.</translation> <translation id="840084489713044809">Google Chrome ითხოვს თქვენი პაროლების ექსპორტირებას.</translation> -<translation id="8455999171311319804">არასავალდებულო: ხელი შეუწყვეთ Chrome OS-ის გაუმჯობესებას, დიაგნოსტიკური და გამოყენების შესახებ მონაცემების Google-ისთვის ავტომატურად გაგზავნით.</translation> <translation id="8498858610309223613">Google Chrome-ს ეს-ესაა მიესადაგა უსაფრთხოების საგანგებო განახლება. გადატვირთეთ ის ახლავე და თქვენი ჩანართებიც აღდგება.</translation> <translation id="8521348052903287641">შემომავალი წესი Google Chrome Dev-ისთვის mDNS ტრაფიკის დასაშვებად.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb index 5e8954c..e8fea69 100644 --- a/chrome/app/resources/google_chrome_strings_kk.xtb +++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Chrome браузеріндегі деректер де өшірілсін (<ph name="URL" />)</translation> <translation id="3503306920980160878">Бұл сайтқа көрсету үшін Chrome браузері орналасқан жеріңізді білуі керек</translation> <translation id="3533694711092285624">Ешқандай құпия сөз сақталмаған. Құпия сөздер сақталған кезде, Chrome оларды тексере алады.</translation> +<translation id="3541482654983822893">Chrome сіздің құпия сөздеріңізді тексере алмай жатыр. 24 сағаттан кейін қайталап көріңіз.</translation> <translation id="3576528680708590453">Жүйе әкімшісі Google Chrome браузерін <ph name="TARGET_URL_HOSTNAME" /> бетіне кіргенде қосымша браузер ашылатын етіп конфигурациялады.</translation> <translation id="3582972582564653026">Chrome браузерін барлық құрылғыларда синхрондап, параметрлерін жекелендіріңіз.</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Жаңартылған нұсқаны қолдану үшін әкімшіңіз Chrome браузерін қайта іске қосуыңызды талап етеді.}=1{Жаңартылған нұсқаны қолдану үшін әкімшіңіз Chrome браузерін қайта іске қосуыңызды талап етеді. Инкогнито терезесі қайта ашылмайды.}other{Жаңартылған нұсқаны қолдану үшін әкімшіңіз Chrome браузерін қайта іске қосуыңызды талап етеді. # инкогнито терезесі қайта ашылмайды.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Бақыланатын есептік жазба арқылы кірдіңіз және оның әкімшісіне Google Chrome профиліңізді бақылау рұқсатын бердіңіз. Қолданбалар, бетбелгілер, журнал, құпия сөздер сияқты Chrome деректеріңіз және басқа параметрлер біржола <ph name="USER_NAME" /> пайдаланушысына байланыстырылады. Бұл деректерді Google есептік жазба бақылау тақтасы арқылы жоя аласыз, бірақ бұл деректерді басқа есептік жазбамен байланыстыра алмайсыз. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Орнату құралы мұрағаттан шығара алмады. Google Chrome қолданбасын қайта жүктеңіз.</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome браузерін бір күннің ішінде қайта іске қосыңыз}other{Chrome браузерін # күннің ішінде қайта іске қосыңыз}}</translation> +<translation id="4205939740494406371">Chrome сіздің құпия сөздеріңізді тексере алмай жатыр. 24 сағаттан кейін қайталап көріңіз немесе <ph name="BEGIN_LINK" />құпия сөздерді Google есептік жазбасынан тексеріңіз<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome жүйесінен шығасыз ба?</translation> <translation id="4251615635259297716">Chrome деректеріңізді осы есептік жазбаға байланыстырасыз ба?</translation> <translation id="4293420128516039005">Chrome браузерін барлық құрылғыларда синхрондап, параметрлерін жекелендіру үшін есептік жазбаңызға кіріңіз.</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Бұл файл қауіпті болғандықтан, Chrome оны бөгеді.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Барлық құқықтары қорғалған.</translation> <translation id="840084489713044809">Google Chrome құпия сөздерді экспорттағысы келеді.</translation> -<translation id="8455999171311319804">Қосымша: диагностикалық және пайдалану деректерін Google қызметіне автоматты жіберу арқылы Chrome ОЖ-н жақсартыңыз.</translation> <translation id="8498858610309223613">Google Chrome браузеріне қазір ғана қауіпсіздік бойынша арнайы жаңартылған нұсқа қолданылды. Оны қазір қайта ашсаңыз, ондағы қойындылар қалпына келтіріледі.</translation> <translation id="8521348052903287641">mDNS трафигіне рұқсат беретін Google Chrome Dev кіріс ережесі.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb index df9ab56..e1e943f 100644 --- a/chrome/app/resources/google_chrome_strings_km.xtb +++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">សម្អាតទិន្នន័យពី Chrome (<ph name="URL" />) ផងដែរ</translation> <translation id="3503306920980160878">Chrome ត្រូវការសិទ្ធិចូលប្រើទីតាំងរបស់អ្នក ដើម្បីចែករំលែកទីតាំងរបស់អ្នកជាមួយទំព័រនេះ</translation> <translation id="3533694711092285624">គ្មានពាក្យសម្ងាត់ដែលបានរក្សាទុកទេ។ Chrome អាចពិនិត្យពាក្យសម្ងាត់របស់អ្នក នៅពេលអ្នករក្សាទុកពាក្យសម្ងាត់ទាំងនោះ។</translation> +<translation id="3541482654983822893">Chrome មិនអាចពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀតក្រោយរយៈពេល 24 ម៉ោង។</translation> <translation id="3576528680708590453">អ្នកគ្រប់គ្រងប្រព័ន្ធរបស់អ្នកបានកំណត់រចនាសម្ព័ន្ធ Google Chrome ឱ្យបើកកម្មវិធីរុករកតាមអ៊ីនធឺណិតផ្សេងសម្រាប់ចូលប្រើ <ph name="TARGET_URL_HOSTNAME" /> ។</translation> <translation id="3582972582564653026">ធ្វើសមកាលកម្ម និងកំណត់ Chrome ឱ្យស្របនឹងអ្នកនៅលើឧបករណ៍នានា</translation> <translation id="3596080736082218006">{COUNT,plural, =0{អ្នកគ្រប់គ្រងរបស់អ្នកតម្រូវឱ្យអ្នកចាប់ផ្ដើម Chrome ឡើងវិញ ដើម្បីប្រើកំណែថ្មី}=1{អ្នកគ្រប់គ្រងរបស់អ្នកតម្រូវឱ្យអ្នកចាប់ផ្ដើម Chrome ឡើងវិញ ដើម្បីប្រើកំណែថ្មី។ ផ្ទាំងឯកជនរបស់អ្នកនឹងមិនបើកឡើងវិញទេ។}other{អ្នកគ្រប់គ្រងរបស់អ្នកតម្រូវឱ្យអ្នកចាប់ផ្ដើម Chrome ឡើងវិញ ដើម្បីប្រើកំណែថ្មី។ ផ្ទាំងឯកជន # របស់អ្នកនឹងមិនបើកឡើងវិញទេ។}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">អ្នកកំពុងចុះហត្ថលេខាជាមួយគណនីដែលបានគ្រប់គ្រង ហើយផ្តល់ឲ្យអ្នកគ្រប់គ្រងត្រួតត្រាលើទម្រង់ Google Chrome របស់អ្នក។ ទិន្នន័យ Chrome របស់អ្នក ដូចជាកម្មវិធី ចំណាំ ប្រវត្តិ ពាក្យសម្ងាត់ និងការកំណត់ផ្សេងទៀតជាប់ជាអចិន្ត្រៃយ៍ជាមួយ <ph name="USER_NAME" />។ អ្នកនិងអាចលុបទិន្នន័យនេះតាមរយៈ Google Account Dashboard ប៉ុន្តែអ្នកមិនអាចភ្ជាប់ទិន្នន័យនេះជាមួយគណនីដ៏ទៃទេ។ <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">កម្មវិធីតំឡើងបានបរាជ័យក្នុងការពន្លាបណ្ណាសារ។ សូមទាញយក Google Chrome ម្តងទៀត។</translation> <translation id="4191857738314598978">{0,plural, =1{ចាប់ផ្ដើម Chrome ឡើងវិញក្នុងរយៈពេលមួយថ្ងៃទៀត}other{ចាប់ផ្ដើម Chrome ឡើងវិញក្នុងរយៈពេល # ថ្ងៃទៀត}}</translation> +<translation id="4205939740494406371">Chrome មិនអាចពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀតក្រោយរយៈពេល 24 ម៉ោង ឬ<ph name="BEGIN_LINK" />ពិនិត្យពាក្យសម្ងាត់នៅក្នុងគណនី Google របស់អ្នក<ph name="END_LINK" />។</translation> <translation id="424864128008805179">ចង់ចេញពី Chrome មែនទេ?</translation> <translation id="4251615635259297716">ភ្ជាប់ទិន្នន័យ Chrome របស់អ្នកទៅគណនីនេះទេ?</translation> <translation id="4293420128516039005">ចូលគណនីដើម្បីធ្វើសមកាលកម្ម និងកំណត់ Chrome ឱ្យស្របនឹងអ្នកនៅលើឧបករណ៍នានា</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">ឯកសារនេះមានបង្កគ្រោះថ្នាក់ ហេតុដូច្នេះហើយបានជា Chrome រារាំងវា។</translation> <translation id="8370517070665726704">រក្សាសិទ្ធិ <ph name="YEAR" /> Google LLC ។ រក្សាសិទ្ធិគ្រប់យ៉ាង។</translation> <translation id="840084489713044809">Google Chrome ចង់នាំចេញពាក្យសម្ងាត់របស់អ្នក។</translation> -<translation id="8455999171311319804">ស្រេចចិត្ត៖ ជួយធ្វើឲ្យ Chrome OS ប្រសើរជាងមុនដោយការផ្ញើការវិនិច្ឆ័យ និងទិន្នន័យប្រើប្រាស់ទៅកាន់ Google ដោយស្វ័យប្រវត្តិ។</translation> <translation id="8498858610309223613">ការធ្វើបច្ចុប្បន្នភាពផ្នែកសុវត្ថិភាពពិសេសសម្រាប់ Google Chrome ទើបតែត្រូវបានអនុវត្ត។ សូមចាប់ផ្ដើមឡើងវិញឥឡូវនេះ នោះយើងនឹងស្ដារផ្ទាំងរបស់អ្នក។</translation> <translation id="8521348052903287641">ក្បួនត្រលប់ចូលសម្រាប់ Google Chrome Dev ដែលត្រូវអនុញ្ញាតលើការធ្វើចរាចររបស់ mDNS ។</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index 1c03499a..f1f49e6 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -89,6 +89,7 @@ <translation id="34857402635545079">Chrome ನಿಂದಲೂ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ (<ph name="URL" />)</translation> <translation id="3503306920980160878">ಈ ಸೈಟ್ ಜೊತೆ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು Chrome ಗೆ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸುವ ಅಗತ್ಯವಿದೆ</translation> <translation id="3533694711092285624">ಉಳಿಸಿರುವ ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ಗಳಿಲ್ಲ. ನೀವು ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಿದಾಗ, Chrome ಅವುಗಳನ್ನು ಪರಿಶೀಲಿಸಬಹುದು.</translation> +<translation id="3541482654983822893">Chrome ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. 24 ಗಂಟೆಗಳ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="3576528680708590453"><ph name="TARGET_URL_HOSTNAME" /> ಗೆ ಪ್ರವೇಶಿಸಲು ಒಂದು ಪರ್ಯಾಯ ಬ್ರೌಸರ್ ತೆರೆಯುವಂತೆ ನಿಮ್ಮ ಸಿಸ್ಟಂ ನಿರ್ವಾಹಕರು Google Chrome ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದಾರೆ.</translation> <translation id="3582972582564653026">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ Chrome ಅನ್ನು ಸಿಂಕ್ ಮಾಡಿ ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಿ</translation> <translation id="3596080736082218006">{COUNT,plural, =0{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ}=1{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ. ನಿಮ್ಮ ಅಜ್ಞಾತ ವಿಂಡೋವನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}one{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}other{ಅಪ್ಡೇಟ್ ಅನ್ವಯಿಸಲು ನೀವು Chrome ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆಂದು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಬಯಸುತ್ತಾರೆ. ನಿಮ್ಮ # ಅಜ್ಞಾತ ವಿಂಡೋಗಳನ್ನು ತೆರೆಯಲಾಗುವುದಿಲ್ಲ.}}</translation> @@ -106,6 +107,7 @@ <translation id="4147555960264124640">ನಿರ್ವಹಿಸಲಾದ ಖಾತೆ ಮತ್ತು ನಿಮ್ಮ Google Chrome ಪ್ರೊಫೈಲ್ನಾದ್ಯಂತ ಅದರ ನಿರ್ವಾಹಕ ನಿಯಂತ್ರಣವನ್ನು ನೀಡುವುದರ ಮೂಲಕ ನೀವು ಸೈನ್ ಇನ್ ಮಾಡುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್ವರ್ಡ್ಗಳು ಹಾಗೂ ಇತರ ಸೆಟ್ಟಿಂಗ್ಗಳಂತಹ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು <ph name="USER_NAME" /> ಅವರಿಗೆ ಶಾಶ್ವತವಾಗಿ ಬಂಧಿಸಲಾಗುತ್ತದೆ. Google ಖಾತೆಗಳ ಡ್ಯಾಶ್ಬೋರ್ಡ್ ಮೂಲಕ ಈ ಡೇಟಾವನ್ನು ಅಳಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯ, ಆದರೆ ಬೇರೊಂದು ಖಾತೆಯೊಂದಿಗೆ ಈ ಡೇಟಾವನ್ನು ಸಂಯೋಜಿಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ಆರ್ಕೈವ್ ಅನ್ನು ವಿಕಸನ ಮಾಡಲು ಇನ್ಸ್ಟಾಲರ್ ವಿಫಲವಾಗಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೊಮ್ಮೆ Google Chrome ಅನ್ನು ಡೌನ್ಲೋಡ್ ಮಾಡಿ.</translation> <translation id="4191857738314598978">{0,plural, =1{ಒಂದು ದಿನದ ಒಳಗೆ Chrome ಮರುಪ್ರಾರಂಭಿಸಿ}one{# ದಿನಗಳ ಒಳಗೆ Chrome ಮರುಪ್ರಾರಂಭಿಸಿ}other{# ದಿನಗಳ ಒಳಗೆ Chrome ಮರುಪ್ರಾರಂಭಿಸಿ}}</translation> +<translation id="4205939740494406371">Chrome ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. 24 ಗಂಟೆಗಳ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ ಅಥವಾ <ph name="BEGIN_LINK" />ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿರುವ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome ನಿಂದ ಸೈನ್ ಔಟ್ ಮಾಡುವುದೇ?</translation> <translation id="4251615635259297716">ಈ ಖಾತೆಗೆ ನಿಮ್ಮ Chrome ಡೇಟಾವನ್ನು ಲಿಂಕ್ ಮಾಡುವುದೇ?</translation> <translation id="4293420128516039005">ನಿಮ್ಮ ಸಾಧನಗಳಲ್ಲಿ Chrome ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿದೆ, ಹೀಗಾಗಿ Chrome ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation> <translation id="8370517070665726704">ಕೃತಿಸ್ವಾಮ್ಯ <ph name="YEAR" /> Google LLC. ಎಲ್ಲ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ.</translation> <translation id="840084489713044809">Google Chrome ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ರಫ್ತು ಮಾಡಲು ಬಯಸುತ್ತದೆ.</translation> -<translation id="8455999171311319804">ಐಚ್ಛಿಕ: Google ಗೆ ಡಯಾಗ್ನಸ್ಟಿಕ್ ಮತ್ತು ಡೇಟಾ ಬಳಕೆಯನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಕಳುಹಿಸುವ ಮೂಲಕ Chrome OS ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ.</translation> <translation id="8498858610309223613">Google Chrome ಗೆ ವಿಶೇಷ ಸುರಕ್ಷತೆಯ ಅಪ್ಡೇಟ್ ಅನ್ನು ಈಗ ತಾನೇ ಅನ್ವಯಿಸಲಾಗಿದೆ. ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸಿ ಮತ್ತು ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳನ್ನು ನಾವು ಮರುಸ್ಥಾಪಿಸುತ್ತೇವೆ.</translation> <translation id="8521348052903287641">mDNS ಟ್ರಾಫಿಕ್ಗೆ ಅನುಮತಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ Google Chrome ಬೀಟಾಗೆ ಒಳಬರುವ ನಿಯಮ.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 5c08e632..bf34142 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Chrome(<ph name="URL" />)에서도 데이터 삭제</translation> <translation id="3503306920980160878">이 사이트와 위치를 공유하려면 Chrome에 내 위치 액세스 권한이 있어야 합니다</translation> <translation id="3533694711092285624">저장된 비밀번호가 없습니다. 비밀번호를 저장하면 Chrome에서 확인할 수 있습니다.</translation> +<translation id="3541482654983822893">Chrome에서 비밀번호를 확인할 수 없습니다. 24시간 후 다시 시도해 보세요.</translation> <translation id="3576528680708590453">시스템 관리자가 <ph name="TARGET_URL_HOSTNAME" /> 액세스를 위해 다른 브라우저를 실행하도록 Chrome을 구성했습니다.</translation> <translation id="3582972582564653026">모든 기기에서 Chrome을 동기화하고 맞춤설정하세요.</translation> <translation id="3596080736082218006">{COUNT,plural, =0{관리자의 요구에 따라 업데이트를 적용하려면 Chrome을 다시 실행해야 합니다.}=1{관리자의 요구에 따라 업데이트를 적용하려면 Chrome을 다시 실행해야 합니다. 시크릿 창이 다시 열리지 않습니다.}other{관리자의 요구에 따라 업데이트를 적용하려면 Chrome을 다시 실행해야 합니다. 시크릿 창 #개가 다시 열리지 않습니다.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">관리 계정으로 로그인하여 관리자에게 Chrome 프로필에 대한 제어권을 부여하려고 합니다. 앱, 북마크, 방문 기록, 비밀번호 및 기타 설정과 같은 Chrome 데이터가 <ph name="USER_NAME" /> 계정에 영구적으로 연결됩니다. 이후 이 데이터를 Google 계정 대시보드에서 삭제할 수는 있지만 다른 계정에 연결할 수는 없습니다. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">설치 프로그램이 보관 파일 압축 풀기에 실패했습니다. Chrome을 다시 다운로드하세요.</translation> <translation id="4191857738314598978">{0,plural, =1{1일 이내로 Chrome을 다시 시작해 주세요}other{#일 이내로 Chrome을 다시 시작해 주세요}}</translation> +<translation id="4205939740494406371">Chrome에서 비밀번호를 확인할 수 없습니다. 24시간 후에 다시 시도해 보거나 <ph name="BEGIN_LINK" />Google 계정에서 비밀번호를 확인<ph name="END_LINK" />하세요.</translation> <translation id="424864128008805179">Chrome에서 로그아웃하시겠습니까?</translation> <translation id="4251615635259297716">Chrome 데이터를 이 계정에 연결하시겠습니까?</translation> <translation id="4293420128516039005">로그인하여 모든 기기에서 Chrome을 동기화하고 맞춤설정하세요.</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">이 파일은 위험하므로 Chrome에서 차단했습니다.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. All rights reserved.</translation> <translation id="840084489713044809">Chrome에서 비밀번호를 내보내려고 합니다.</translation> -<translation id="8455999171311319804">선택사항: 진단 및 사용 데이터가 Google로 자동 전송되도록 선택하면 Chrome OS 개선에 도움이 됩니다.</translation> <translation id="8498858610309223613">Chrome 특별 보안 업데이트를 방금 적용했습니다. 다시 시작하면 탭이 복원됩니다.</translation> <translation id="8521348052903287641">Chrome 개발자에서 mDNS 트래픽을 허용할 때 사용되는 인바운드 규칙입니다.</translation> <translation id="8540666473246803645">Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index ffede4a08..6c01ddee 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Chrome'догу дайындар да тазалансын (<ph name="URL" />)</translation> <translation id="3503306920980160878">Бул сайт менен бөлүшүү үчүн Chrome жайгашкан жериңиз тууралуу маалыматты алышы керек</translation> <translation id="3533694711092285624">Сакталган сырсөздөр жок. Сырсөздөрүңүздү сактаганда Chrome аларды текшере алат.</translation> +<translation id="3541482654983822893">Chrome сырсөздөрүңүздү текшере албай жатат. 24 сааттан кийин кайра аракет кылыңыз.</translation> <translation id="3576528680708590453">Тутумуңуздун администратору Google Chrome'ду <ph name="TARGET_URL_HOSTNAME" /> шилтемесин кошумча серепчиде ачылгыдай кылып конфигурациялады.</translation> <translation id="3582972582564653026">Chrome'ду бардык түзмөктөрүңүздө шайкештирип, жекелештиресиз</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Администраторуңуз жаңыртууну колдонуу үчүн Chrome'ду кайра иштетүүнү талап кылууда}=1{Администраторуңуз жаңыртууну колдонуу үчүн Chrome'ду кайра иштетүүнү талап кылууда. Жашыруун терезеңиз кайра ачылбайт.}other{Администраторуңуз жаңыртууну колдонуу үчүн Chrome'ду кайра иштетүүнү талап кылууда. # жашыруун терезеңиз кайра ачылбайт.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Башкарылган аккаунт менен кирип, анын администраторуна Google Chrome профилиңизди көзөмөлдөө мүмкүнчүлүгүн берип жатасыз. Колдонмолоруңуз, кыстармалар, таржымал, сырсөздөр жана башка жөндөөлөр сыяктуу Chrome дайын-даректериңиз эми биротоло <ph name="USER_NAME" /> менен байланып калат. Бул дайындарды Google Каттоо эсептеринин Жеке кеңсеси аркылуу жок кылсаңыз болот, бирок башка аккаунтка байланыштыра албайсыз. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Орноткуч архивди чыгара албай койду. Google Chrome'ду кайра жүктөп алыңыз.</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome 1 күндүн ичинде кайра иштетилет}other{Chrome # күндүн ичинде кайра иштетилет}}</translation> +<translation id="4205939740494406371">Chrome сырсөздөрүңүздү текшере албай жатат. 24 сааттан кийин кайра аракет кылыңыз же <ph name="BEGIN_LINK" />Google аккаунтуңуздагы сырсөздөрдү текшериңиз<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome каттоо эсебинен чыгасызбы?</translation> <translation id="4251615635259297716">Chrome дайын-даректериңиз бул аккаунтка байлансынбы?</translation> <translation id="4293420128516039005">Chrome'ду бардык түзмөктөрүңүздө шайкештирип, жекелештирүү үчүн аккаунтуңузга кириңиз</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Бул файл кооптуу, ошондуктан Chrome аны бөгөттөп койду.</translation> <translation id="8370517070665726704">© Google LLC, <ph name="YEAR" /> Баардык укуктар корголгон.</translation> <translation id="840084489713044809">Google Chrome сырсөздөрүңүздү экспорттогону жатат.</translation> -<translation id="8455999171311319804">Кошумча: Google'га автоматтык түрдө мүчүлүштүктөрдү аныктоо жана колдонуу дайындары жөнүндө кабар берүү менен Chrome OS'ти өркүндөтүүгө кол кабыш кылыңыз.</translation> <translation id="8498858610309223613">Жаңы эле Google Chrome үчүн өзгөчө коопсуздук жаңыртуулары орнотулду. Өтмөктөрдү калыбына келтирүү үчүн аны өчүрүп күйгүзүңүз.</translation> <translation id="8521348052903287641">mDNS трафигине уруксат берүү үчүн Google Chrome Dev'дин кирүүчү туташуу эрежеси.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 2483d0d..e90ccac 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">ໄຟລ໌ນີ້ເປັນອັນຕະລາຍ, ສະນັ້ນ Chrome ໄດ້ບລັອກມັນໄວ້ແລ້ວ.</translation> <translation id="8370517070665726704">ລິຂະສິດ <ph name="YEAR" /> Google LLC. ສະຫງວນລິຂະສິດ.</translation> <translation id="840084489713044809">Google Chrome ຕ້ອງການສົ່ງອອກລະຫັດຜ່ານຂອງທ່ານ.</translation> -<translation id="8455999171311319804">ເລືອກໄດ້: ຊ່ວຍເຮັດໃຫ້ Chrome OS ດີຂຶ້ນໂດຍການສົ່ງຂໍ້ມູນການວິເຄາະ ແລະ ການໃຊ້ຫາ Google.</translation> <translation id="8498858610309223613">ຫາກໍນຳໃຊ້ການອັບເດດຄວາມປອດໄພພິເສດສຳລັບ Google Chrome. ກະລຸນາປິດເປີດໃໝ່ຕອນນີ້ເລີຍ ແລ້ວພວກເຮົາຈະກູ້ຄືນແຖບຂອງທ່ານ.</translation> <translation id="8521348052903287641">ກົດລະບຽບຂາເຂົ້າສໍາລັບ Google Chrome Dev ເພື່ອອະນຸຍາດການຮັບສົ່ງຂໍ້ມູນ mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index 53b8b98..087f5b3 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Taip pat išvalyti duomenis iš „Chrome“ (<ph name="URL" />)</translation> <translation id="3503306920980160878">„Chrome“ reikia leidimo, kad galėtų naudoti vietovės informaciją ir bendrinti ją su šia svetaine</translation> <translation id="3533694711092285624">Nėra išsaugotų slaptažodžių. „Chrome“ gali tikrinti jūsų slaptažodžius, kai juos išsaugote.</translation> +<translation id="3541482654983822893">„Chrome“ negali patikrinti jūsų slaptažodžių. Bandykite dar kartą po 24 val.</translation> <translation id="3576528680708590453">Sistemos administratorius sukonfigūravo „Google Chrome“ atidaryti alternatyvią naršyklę, norint pasiekti <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Sinchronizuokite ir suasmeninkite „Chrome“ skirtinguose įrenginiuose</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Administratorius reikalauja paleisti „Chrome“ iš naujo, kad būtų galima pritaikyti naujinį}=1{Administratorius reikalauja paleisti „Chrome“ iš naujo, kad būtų galima pritaikyti naujinį. Inkognito langas nebus atidarytas iš naujo.}one{Administratorius reikalauja paleisti „Chrome“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito langas nebus atidarytas iš naujo.}few{Administratorius reikalauja paleisti „Chrome“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito langai nebus atidaryti iš naujo.}many{Administratorius reikalauja paleisti „Chrome“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito lango nebus atidaryta iš naujo.}other{Administratorius reikalauja paleisti „Chrome“ iš naujo, kad būtų galima pritaikyti naujinį. # inkognito langų nebus atidaryta iš naujo.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Prisijungiate su valdoma paskyra ir leidžiate jos administratoriui valdyti jūsų „Google Chrome“ profilį. „Chrome“ duomenys, pvz., programos, žymės, istorija, slaptažodžiai ir kiti nustatymai, bus visam laikui susieti su <ph name="USER_NAME" />. Galėsite ištrinti šiuos duomenis naudodami „Google“ paskyrų informacijos suvestinę, bet negalėsite susieti šių duomenų su kita paskyra. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Diegimo programai nepavyko išpakuoti archyvo. Atsisiųskite „Google Chrome“ dar kartą.</translation> <translation id="4191857738314598978">{0,plural, =1{„Chrome“ paleidimas iš naujo po dienos}one{„Chrome“ paleidimas iš naujo po # dienos}few{„Chrome“ paleidimas iš naujo po # dienų}many{„Chrome“ paleidimas iš naujo po # dienos}other{„Chrome“ paleidimas iš naujo po # dienų}}</translation> +<translation id="4205939740494406371">„Chrome“ negali patikrinti jūsų slaptažodžių. Bandykite dar kartą po 24 val. arba <ph name="BEGIN_LINK" />patikrinkite slaptažodžius „Google“ paskyroje<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Atsijungti nuo „Chrome“?</translation> <translation id="4251615635259297716">Susisieti „Chrome“ duomenis su šia paskyra?</translation> <translation id="4293420128516039005">Prisijunkite, kad galėtumėte sinchronizuoti ir suasmeninti „Chrome“ skirtinguose įrenginiuose</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Šis failas pavojingas, todėl „Chrome“ jį užblokavo.</translation> <translation id="8370517070665726704">Autorių teisės „Google LLC.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation> <translation id="840084489713044809">„Google Chrome“ nori eksportuoti jūsų slaptažodžius.</translation> -<translation id="8455999171311319804">Pasirenkama: padėkite patobulinti „Chrome“ OS automatiškai siųsdami diagnostikos ir naudojimo duomenis į sistemą „Google“.</translation> <translation id="8498858610309223613">Ką tik pritaikytas specialus „Google Chrome“ skirtas saugos naujinys. Dabar paleiskite naršyklę iš naujo ir atkursime visus skirtukus.</translation> <translation id="8521348052903287641">„Dev“ versijos „Google Chrome“ skirta taisyklė, pagal kurią leidžiamas gaunamas mDNS srautas.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index 6c47639..8d8f1d2 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -233,7 +233,6 @@ <translation id="8342675569599923794">Šis fails ir bīstams, tāpēc Chrome to bloķēja.</translation> <translation id="8370517070665726704">Autortiesības: <ph name="YEAR" /> Google LLC. Visas tiesības paturētas.</translation> <translation id="840084489713044809">Pārlūkā Google Chrome tiek mēģināts eksportēt jūsu paroles.</translation> -<translation id="8455999171311319804">Neobligāti: palīdziet uzlabot Chrome OS, automātiski nosūtot Google serveriem diagnostikas un lietojuma datus.</translation> <translation id="8498858610309223613">Tikko tika piemērots īpašs Google Chrome drošības atjauninājums. Restartējiet tūlīt, un mēs atjaunosim jūsu cilnes.</translation> <translation id="8521348052903287641">Ienākošo savienojumu kārtula pārlūkam Google Chrome Dev, lai atļautu mDNS datplūsmu.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index c0e80ed..80ad6a7 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Избриши ги и податоците од Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">На Chrome му треба пристап до вашата локација за да ја сподели со сајтов</translation> <translation id="3533694711092285624">Нема зачувани лозинки. Chrome може да ги проверува вашите лозинки кога ги зачувувате.</translation> +<translation id="3541482654983822893">Chrome не може да ги провери вашите лозинки. Обидете се пак по 24 часа.</translation> <translation id="3576528680708590453">Администраторот на системот го конфигурирал Google Chrome да отвора друг прелистувач за пристап до <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Синхронизирајте го и персонализирајте го Chrome на сите ваши уреди</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Администраторот бара да го рестартирате Chrome за да се примени ажурирање}=1{Администраторот бара да го рестартирате Chrome за да се примени ажурирање. Прозорецот „Инкогнито“ нема да се отвори повторно.}one{Администраторот бара да го рестартирате Chrome за да се примени ажурирање. # прозорец „Инкогнито“ нема да се отвори повторно.}other{Администраторот бара да го рестартирате Chrome за да се примени ажурирање. # прозорци „Инкогнито“ нема да се отворат повторно.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Се најавувате со управувана сметка и на нејзиниот администратор му давате контрола врз вашиот профил на Google Chrome. Вашите податоци на Chrome, како што се апликации, обележувачи, историја, лозинки и други поставки, трајно ќе се поврзат со <ph name="USER_NAME" />. Ќе може да ги избришете податоците преку информациската табла на сметките на Google, но нема да може да ги поврзете со друга сметка. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Инсталаторот не успеа да ја декомпримира архивата. Преземете го Google Chrome повторно.</translation> <translation id="4191857738314598978">{0,plural, =1{Рестартирајте го Chrome во рок од еден ден}one{Рестартирајте го Chrome во рок од # ден}other{Рестартирајте го Chrome во рок од # дена}}</translation> +<translation id="4205939740494406371">Chrome не може да ги провери вашите лозинки. Обидете се пак по 24 часа или <ph name="BEGIN_LINK" />проверете ги лозинките во сметката на Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Ќе се одјавите од Chrome?</translation> <translation id="4251615635259297716">Да се поврзат вашите податоци на Chrome со оваа сметка?</translation> <translation id="4293420128516039005">Најавете се за да го синхронизирате и персонализирате Chrome на сите ваши уреди</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Датотекава е опасна, па затоа Chrome ја блокираше.</translation> <translation id="8370517070665726704">Авторски права <ph name="YEAR" /> Google LLC. Сите права се задржани.</translation> <translation id="840084489713044809">Google Chrome сака да ги извезе вашите лозинки.</translation> -<translation id="8455999171311319804">Изборно: помогнете да се подобри ОС на Chrome со автоматско испраќање дијагностички податоци и податоци за користењето во Google.</translation> <translation id="8498858610309223613">Тукушто применивме посебно безбедносно ажурирање за Google Chrome. Рестартирајте сега и ќе ви ги вратиме картичките.</translation> <translation id="8521348052903287641">Дојдовно правило за Google Chrome Dev за овозможување mDNS-сообраќај.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index 228fd7a9..11418262 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Chrome-ൽ നിന്നും ഡാറ്റ മായ്ക്കുക (<ph name="URL" />)</translation> <translation id="3503306920980160878">ഈ സൈറ്റുമായി ലൊക്കേഷൻ പങ്കിടാൻ Chrome-ന് നിങ്ങളുടെ ലൊക്കേഷനിലേക്കുള്ള ആക്സസ് ആവശ്യമാണ്</translation> <translation id="3533694711092285624">സംരക്ഷിച്ച പാസ്വേഡുകളൊന്നുമില്ല. നിങ്ങളുടെ പാസ്വേഡുകൾ സംരക്ഷിക്കുകയാണങ്കിൽ, Chrome-ന് അവ പരിശോധിക്കാനാവും.</translation> +<translation id="3541482654983822893">Chrome-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. 24 മണിക്കൂറിന് ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="3576528680708590453"><ph name="TARGET_URL_HOSTNAME" /> ആക്സസ് ചെയ്യാൻ ഇതര ബ്രൗസർ തുറക്കുന്നതിനായി നിങ്ങളുടെ സിസ്റ്റം അഡ്മിൻ Google Chrome കോൺഫിഗർ ചെയ്തു.</translation> <translation id="3582972582564653026">നിങ്ങളുടെ ഉപകരണങ്ങളിലുടനീളം Chrome സമന്വയിപ്പിച്ച് വ്യക്തിഗതമാക്കുക</translation> <translation id="3596080736082218006">{COUNT,plural, =0{അപ്ഡേറ്റ് ബാധകമാക്കുന്നതിന് Chrome വീണ്ടും ആരംഭിക്കാൻ നിങ്ങളുടെ അഡ്മിൻ ആവശ്യപ്പെടുന്നു}=1{അപ്ഡേറ്റ് ബാധകമാക്കുന്നതിന് Chrome വീണ്ടും ആരംഭിക്കാൻ നിങ്ങളുടെ അഡ്മിൻ ആവശ്യപ്പെടുന്നു. നിങ്ങളുടെ അദൃശ്യ വിൻഡോ വീണ്ടും തുറക്കില്ല.}other{അപ്ഡേറ്റ് ബാധകമാക്കുന്നതിന് Chrome വീണ്ടും ആരംഭിക്കാൻ നിങ്ങളുടെ അഡ്മിൻ ആവശ്യപ്പെടുന്നു. നിങ്ങളുടെ # അദൃശ്യ വിൻഡോകൾ വീണ്ടും തുറക്കില്ല.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">നിങ്ങൾ ഒരു നിയന്ത്രിത അക്കൗണ്ട് ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്ത് അതിന്റെ അഡ്മിനിസ്ട്രേറ്റർക്ക് നിങ്ങളുടെ Google Chrome പ്രൊഫൈലിന്റെ നിയന്ത്രണം നൽകുന്നു. നിങ്ങളുടെ ആപ്പുകൾ, ബുക്ക്മാർക്കുകൾ, ചരിത്രം, പാസ്വേഡുകൾ, മറ്റ് ക്രമീകരണങ്ങൾ എന്നിവ പോലെയുള്ള Chrome ഡാറ്റ <ph name="USER_NAME" /> എന്നതുമായി ശാശ്വതമായി ബന്ധിപ്പിച്ചതായിത്തീരും. Google അക്കൗണ്ട്സ് ഡാഷ്ബോർഡ് വഴി നിങ്ങൾക്ക് ഈ ഡാറ്റ ഇല്ലാതാക്കാൻ കഴിയുമെങ്കിലും ഈ ഡാറ്റ മറ്റൊരു അക്കൗണ്ടുമായി ബന്ധപ്പെടുത്താനാകില്ല. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ആര്ക്കൈവ് അണ്കംപ്രസ് ചെയ്യാന് ഇന്സ്റ്റാളറിന് കഴിഞ്ഞില്ല. ദയവായി Google Chrome വീണ്ടും ഡൗൺലോഡ് ചെയ്യുക.</translation> <translation id="4191857738314598978">{0,plural, =1{ഒരു ദിവസത്തിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കുക}other{# ദിവസത്തിനുള്ളിൽ Chrome വീണ്ടും സമാരംഭിക്കുക}}</translation> +<translation id="4205939740494406371">Chrome-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. 24 മണിക്കൂറിന് ശേഷം വീണ്ടും ശ്രമിക്കുക അല്ലെങ്കിൽ <ph name="BEGIN_LINK" />നിങ്ങളുടെ Google അക്കൗണ്ടിലെ പാസ്വേഡുകൾ പരിശോധിക്കുക<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome-ൽ നിന്ന് സൈൻ ഔട്ട് ചെയ്യണോ?</translation> <translation id="4251615635259297716">നിങ്ങളുടെ Chrome ഡാറ്റ ഈ അക്കൗണ്ടുമായി ലിങ്ക് ചെയ്യണോ?</translation> <translation id="4293420128516039005">നിങ്ങളുടെ ഉപകരണങ്ങളിലുടനീളം Chrome സമന്വയിപ്പിച്ച് വ്യക്തിഗതമാക്കാൻ സൈൻ ഇൻ ചെയ്യുക</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">ഈ ഫയൽ അപകടകരമായതിനാൽ Chrome ഇതിനെ ബ്ലോക്കുചെയ്തു.</translation> <translation id="8370517070665726704">പകർപ്പവകാശം <ph name="YEAR" /> Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്തം.</translation> <translation id="840084489713044809">നിങ്ങളുടെ പാസ്വേഡുകൾ എക്സ്പോർട്ട് ചെയ്യാൻ Google Chrome ആഗ്രഹിക്കുന്നു.</translation> -<translation id="8455999171311319804">ഓപ്ഷണൽ: ഡയഗണോസ്റ്റിക്, ഉപയോഗ വിവരങ്ങൾ Google-ന് സ്വയം അയച്ചുകൊണ്ട് Chrome OS മെച്ചപ്പെടുത്താൻ സഹായിക്കുക.</translation> <translation id="8498858610309223613">Google Chrome-നുള്ള ഒരു പ്രത്യേക സുരക്ഷാ അപ്ഡേറ്റ് പ്രയോഗിച്ചിരിക്കുന്നു. ഇപ്പോൾ റീസ്റ്റാർട്ട് ചെയ്യുക, ഞങ്ങൾ നിങ്ങളുടെ ടാബുകൾ പുനഃസ്ഥാപിക്കും.</translation> <translation id="8521348052903287641">mDNS ട്രാഫിക് അനുവദിക്കുന്നതിന് Google Chrome Dev-ന് വേണ്ടിയുള്ള ഇൻബൗണ്ട് റൂൾ.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index be49248..064ee41 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Chrome-н (<ph name="URL" />) өгөгдлийг мөн адил устгах</translation> <translation id="3503306920980160878">Энэ сайтаар таны байршлыг хуваалцахын тулд Chrome-д таны байршилд хандах зөвшөөрөл шаардлагатай</translation> <translation id="3533694711092285624">Хадгалсан ямар ч нууц үг байхгүй байна. Таныг нууц үгсээ хадгалах үед Chrome тэднийг шалгах боломжтой.</translation> +<translation id="3541482654983822893">Chrome таны нууц үгсийг шалгах боломжгүй байна. 24 цагийн дараа дахин оролдоно уу.</translation> <translation id="3576528680708590453">Таны системийн админ Google Chrome-г <ph name="TARGET_URL_HOSTNAME" />-д хандахын тулд өөр хөтөч нээхээр тохируулсан байна.</translation> <translation id="3582972582564653026">Төхөөрөмжүүддээ Chrome-г синк хийж, хувийн болгох</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Шинэчлэлтийг хэрэгжүүлэхийн тулд Chrome-г дахин ачаалахыг таны администратор танаас шаардаж байна}=1{Шинэчлэлтийг хэрэгжүүлэхийн тулд Chrome-г дахин ачаалахыг таны администратор танаас шаардаж байна. Таны нууцлалтай цонхыг дахин нээхгүй.}other{Шинэчлэлтийг хэрэгжүүлэхийн тулд Chrome-г дахин ачаалахыг таны администратор танаас шаардаж байна. Таны # нууцлалтай цонхыг дахин нээхгүй.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Та хяналтанд байдаг дансаар нэвтэрч байгаа бөгөөд администраторт таны Google Chrome-ийн профайлыг хянах боломжийг олгож байна. Таны апп, хавчуурга, түүх, нууц үг болон бусад тохиргоо гэх мэт Chrome дата нь байнга <ph name="USER_NAME" />-д хадгалагдана. Та Google Accounts Dashboard-ийн тусламжтай эдгээр датаг устгаж болох боловч энэ датаг өөр данстай хуваалцах боломжгүй. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Суурьлуулагч Archive файлыг задалж чадсангүй. Google Chrome-ыг дахин татаж авна уу.</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome-г 1 хоногийн дотор дахин ажиллуулна уу}other{Chrome-г # хоногийн дотор дахин ажиллуулна уу}}</translation> +<translation id="4205939740494406371">Chrome таны нууц үгсийг шалгах боломжгүй байна. 24 цагийн дараа дахин оролдоно уу эсвэл <ph name="BEGIN_LINK" />өөрийн Google Бүртгэл дэх нууц үгсийг шалгана уу<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome-с гарах уу?</translation> <translation id="4251615635259297716">Chrome өгөгдлөө энэ бүртгэл рүү холбох уу?</translation> <translation id="4293420128516039005">Төхөөрөмжүүддээ Chrome-г синк хийж, хувийн болгохын тулд нэвтрэх</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Энэ файл аюултай тул Chrome блоклосон байна.</translation> <translation id="8370517070665726704">Зохиогчийн эрх <ph name="YEAR" /> Google ХХК. Бүх эрх хуулиар хамгаалагдсан.</translation> <translation id="840084489713044809">Google Chrome таны нууц үгийг экспортлох хүсэлтэй байна.</translation> -<translation id="8455999171311319804">Сонголтын: Оношилгоо болон хэрэглээний өгөгдлийг Google-д илгээж, Chrome үйлдлийн системийг сайжруулахад тусална уу.</translation> <translation id="8498858610309223613">Google Chrome-н аюулгүй байдлын тусгай шинэчлэлтийг хийж дууслаа. Одоо дахин эхлүүлнэ үү. Бид таны табыг сэргээх болно.</translation> <translation id="8521348052903287641">mDNS урсгалыг зөвшөөрөх Google Chrome-н дотоод дүрэм.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index 9cdef82..d1755b7 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -235,7 +235,6 @@ <translation id="8342675569599923794">ही फाईल धोकादायक आहे, त्यामुळे Chrome ने ती अवरोधित केली आहे.</translation> <translation id="8370517070665726704">कॉपीराइट <ph name="YEAR" /> Google LLC. सर्व हक्क राखीव.</translation> <translation id="840084489713044809">Google Chrome ला तुमचे पासवर्ड एक्सपोर्ट करायचे आहेत.</translation> -<translation id="8455999171311319804">पर्यायी: निदान आणि वापर डेटा Google कडे स्वयंचलितपणे पाठवून Chrome OS ला आणखी चांगले बनविण्यात मदत करा.</translation> <translation id="8498858610309223613">Google Chrome साठी आत्ताच एक विशिष्ट सुरक्षितता अपडेट लागू करण्यात आला. आता रीस्टार्ट करा आणि आम्ही तुमचे टॅब रिस्टोअर करू.</translation> <translation id="8521348052903287641">Google Chrome विकासकाने mDNS रहदारीस अनुमती देण्यासाठी इनबाउंड नियम.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index 6c556c0c..58a163d 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Fail ini berbahaya, maka Chrome telah menyekatnya.</translation> <translation id="8370517070665726704">Hak Cipta <ph name="YEAR" /> Google LLC. Hak cipta terpelihara.</translation> <translation id="840084489713044809">Google Chrome mahu mengeksport kata laluan anda.</translation> -<translation id="8455999171311319804">Pilihan: Bantu jadikan OS Chrome lebih baik dengan menghantar data diagnostik dan penggunaan kepada Google secara automatik.</translation> <translation id="8498858610309223613">Kemas kini keselamatan khas untuk Google Chrome baru sahaja diterapkan. Mulakan semula sekarang dan kami akan memulihkan tab anda.</translation> <translation id="8521348052903287641">Peraturan masuk bagi Google Chrome Dev untuk membenarkan trafik mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index 92a7d550..7c306b0 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">ဤဖိုင်သည် အန္တရာယ်ရှိပါသည်။ ထို့ကြောင့် Chrome သည် ၎င်းကို ပိတ်ဆို့ထားပါသည်။</translation> <translation id="8370517070665726704">မူပိုင် <ph name="YEAR" /> Google LLC. မူပိုင်ခွင့်အားလုံး ယူထားသည်။</translation> <translation id="840084489713044809">Google Chrome သည် သင်၏ စကားဝှက်များကို တင်ပို့လိုသည်။</translation> -<translation id="8455999171311319804">ချန်လှပ်ထားနိုင်သည်− Google သို့ အသုံးပြုမှုဒေတာများနှင့် ချွတ်ယွင်းချက်ရှာဖွေခြင်းဒေတာများကို အလိုအလျောက်ပို့ခြင်းဖြင့် Chrome OS ပိုမိုကောင်းမွန်အောင် ပြုလုပ်ရာတွင် ကူညီပါ။</translation> <translation id="8498858610309223613">Google Chrome အတွက် အထူးလုံခြုံရေးအပ်ဒိတ်ကို ယခုလေးတင် ထည့်သွင်းထားသည်။ ယခုပြန်လည်စတင်လိုက်ပါက သင်၏ တဘ်များကို ပြန်ဖွင့်ပေးပါမည်။</translation> <translation id="8521348052903287641">Google Chrome Dev က mDNS အသွားအလာကို ခွင့်ပြုပေးနိုင်ရန်အတွက် ချမှတ်ထားသော အတွင်းစည်းမျဉ်း။</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb index 0416641..579ab1b 100644 --- a/chrome/app/resources/google_chrome_strings_ne.xtb +++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -231,7 +231,6 @@ <translation id="8342675569599923794">यो फाइल खतरनाक छ, त्यसैले Chrome ले यसमाथि रोक लगाएको छ।</translation> <translation id="8370517070665726704">प्रतिलिपि अधिकार <ph name="YEAR" /> Google LLC। सर्वाधिकार सुरक्षित।</translation> <translation id="840084489713044809">Google Chrome तपाईंका पासवर्डहरू निर्यात गर्न चाहन्छ।</translation> -<translation id="8455999171311319804">ऐच्छिक: निदान र प्रयोगको डेटा स्वत: Google मा पठाएर Chrome OS लाई अझ राम्रो बनाउन मद्दत गर्नुहोस्।</translation> <translation id="8498858610309223613">Google Chrome को एक विशेष सुरक्षा अद्यावधिक भर्खरै लागू गरियो। पुनः सुरु गर्नुहोस् र हामी तपाईंका ट्याबहरू पुनर्स्थापना गर्ने छाैँ।</translation> <translation id="8521348052903287641">mDNS ट्राफिकलाई अनुमति दिने Google Chrome Dev को अन्तर्गामी नियम।</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index 549e2cb..2c3eb2c 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -233,7 +233,6 @@ <translation id="8342675569599923794">Dit bestand is gevaarlijk en is daarom door Chrome geblokkeerd.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Alle rechten voorbehouden.</translation> <translation id="840084489713044809">Google Chrome wil je wachtwoorden exporteren.</translation> -<translation id="8455999171311319804">Optioneel: Help Chrome OS beter te maken door automatisch diagnostische en gebruiksgegevens te verzenden naar Google.</translation> <translation id="8498858610309223613">Er is zojuist een speciale beveiligingsupdate voor Google Chrome toegepast. Start nu opnieuw op. Je tabbladen worden hersteld.</translation> <translation id="8521348052903287641">Inkomende regel zodat Google Chrome Dev mDNS-verkeer toestaat.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 8a14762b..fa5f38f1a4 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Denne filen er farlig, så Chrome har blokkert den.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Med enerett.</translation> <translation id="840084489713044809">Google Chrome forsøker å eksportere passordene dine.</translation> -<translation id="8455999171311319804">Valgfritt: Bidra til å gjøre Chrome OS bedre ved å sende diagnostikk og brukerdata automatisk til Google.</translation> <translation id="8498858610309223613">En spesiell sikkerhetsoppdatering for Google Chrome ble nettopp installert. Start på nytt nå, så gjenoppretter vi fanene dine.</translation> <translation id="8521348052903287641">Regel for å tillate innkommende mDNS-trafikk i Google Chrome Dev.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb index 430f71d..d33259f5 100644 --- a/chrome/app/resources/google_chrome_strings_or.xtb +++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -233,7 +233,6 @@ <translation id="8342675569599923794">ଏହି ଫାଇଲ୍ ବିପଜ୍ଜନକ ଅଟେ, ତେଣୁ Chrome ଏହାକୁ ଅବରୋଧ କରିଛି।</translation> <translation id="8370517070665726704">କପିରାଇଟ୍ <ph name="YEAR" /> Google LLC। ସମସ୍ତ ଅଧିକାର ସଂରକ୍ଷିତ ଅଛି।</translation> <translation id="840084489713044809">Google Chrome ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡଗୁଡିକୁ ଏକ୍ସପୋର୍ଟ୍ କରିବାକୁ ଚାହେଁ।</translation> -<translation id="8455999171311319804">ଇଚ୍ଛାଧୀନ: Googleକୁ ସ୍ୱଚାଳିତ ଭାବେ ଡାଏଗ୍ନୋଷ୍ଟିକ୍ ଓ ବ୍ୟବହୃତ ଡାଟା ପଠାଇ Chrome OSକୁ ଉନ୍ନତ କରିବାରେ ସାହାଯ୍ୟ କରନ୍ତୁ।</translation> <translation id="8498858610309223613">କିଛି ସମୟ ପୂର୍ବରୁ Google Chrome ପାଇଁ ଏକ ବିଶେଷ ସୁରକ୍ଷା ଅପ୍ଡେଟ୍ ଲାଗୁ କରାଯାଇଛି। ବର୍ତ୍ତମାନ ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ ଏବଂ ଆମେ ଆପଣଙ୍କ ଟାବ୍ ରିଷ୍ଟୋର୍ କରିବୁ।</translation> <translation id="8521348052903287641">mDNS ଟ୍ରାଫିକ୍କୁ ଅନୁମତି ଦେବାକୁ Google Chrome Dev ପାଇଁ ଇନ୍ବାଉଣ୍ଡ ନିୟମ।</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index 67a44b4..c72d4cf 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Chrome (<ph name="URL" />) ਤੋਂ ਵੀ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="3503306920980160878">Chrome ਨੂੰ ਇਸ ਸਾਈਟ ਨਾਲ ਤੁਹਾਡੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਸਾਂਝੀ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਟਿਕਾਣੇ 'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦੀ ਲੋੜ ਹੈ</translation> <translation id="3533694711092285624">ਕੋਈ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਨਹੀਂ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਆਪਣੇ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨ 'ਤੇ Chrome ਉਹਨਾਂ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦਾ ਹੈ।</translation> +<translation id="3541482654983822893">Chrome ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ। 24 ਘੰਟਿਆਂ ਬਾਅਦ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="3576528680708590453">ਤੁਹਾਡੇ ਸਿਸਟਮ ਪ੍ਰਸ਼ਾਸਕ ਨੇ <ph name="TARGET_URL_HOSTNAME" /> ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਵਾਸਤੇ ਕੋਈ ਵਿਕਲਪਿਕ ਬ੍ਰਾਊਜ਼ਰ ਖੋਲ੍ਹਣ ਲਈ Google Chrome ਦਾ ਸੰਰੂਪਣ ਕੀਤਾ ਹੈ।</translation> <translation id="3582972582564653026">ਸਮਕਾਲੀਕਰਨ ਕਰਕੇ ਆਪਣੇ ਡੀਵਾਈਸਾਂ ਵਿਚਾਲੇ Chrome ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਓ</translation> <translation id="3596080736082218006">{COUNT,plural, =0{ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਚਾਹੁੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ}=1{ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਚਾਹੁੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ। ਤੁਹਾਡੀ ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਦੁਬਾਰਾ ਨਹੀਂ ਖੁੱਲ੍ਹੇਗੀ।}other{ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਚਾਹੁੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਅੱਪਡੇਟ ਲਾਗੂ ਕਰਨ ਲਈ Chrome ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰੋ। ਤੁਹਾਡੀਆਂ # ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋ ਦੁਬਾਰਾ ਨਹੀਂ ਖੁੱਲ੍ਹਣਗੀਆਂ।}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">ਤੁਸੀਂ ਇੱਕ ਪ੍ਰਬੰਧਿਤ ਖਾਤੇ ਨਾਲ ਸਾਈਨ-ਇਨ ਕਰ ਰਹੇ ਹੋ ਅਤੇ ਇਸ ਪ੍ਰਬੰਧਕ ਨੂੰ ਆਪਣੀ Google Chrome ਪ੍ਰੋਫਾਈਲ 'ਤੇ ਕੰਟਰੋਲ ਪ੍ਰਦਾਨ ਕਰ ਰਹੇ ਹੋ। ਤੁਹਾਡਾ Chrome ਡਾਟਾ, ਜਿਵੇਂ ਕਿ ਤੁਹਾਡੀਆਂ ਐਪਾਂ, ਬੁੱਕਮਾਰਕਾਂ, ਇਤਿਹਾਸ, ਪਾਸਵਰਡਾਂ ਅਤੇ ਹੋਰ ਸੈਟਿੰਗਾਂ <ph name="USER_NAME" /> ਨਾਲ ਸਥਾਈ ਤੌਰ 'ਤੇ ਜੋੜੀਆਂ ਜਾਣਗੀਆਂ। ਤੁਸੀਂ ਇਸ ਡਾਟਾ ਨੂੰ Google ਖਾਤੇ ਡੈਸ਼ਬੋਰਡ ਰਾਹੀਂ ਮਿਟਾ ਸਕੋਗੇ, ਪਰੰਤੂ ਤੁਸੀਂ ਇਸ ਡਾਟਾ ਨੂੰ ਦੂਜੇ ਖਾਤੇ ਨਾਲ ਨਹੀਂ ਜੋੜ ਸਕੋਗੇ। <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ਸਥਾਪਨਾਕਾਰ ਪੁਰਾਲੇਖ ਦੇ ਨਪੀੜਨ ਨੂੰ ਵਾਪਸ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਿਹਾ। ਕਿਰਪਾ ਕਰਕੇ Google Chrome ਨੂੰ ਦੁਬਾਰਾ ਡਾਊਨਲੋਡ ਕਰੋ।</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome ਨੂੰ ਇੱਕ ਦਿਨ ਦੇ ਅੰਦਰ ਮੁੜ-ਲਾਂਚ ਕਰੋ}one{Chrome ਨੂੰ # ਦਿਨ ਦੇ ਅੰਦਰ ਮੁੜ-ਲਾਂਚ ਕਰੋ}other{Chrome ਨੂੰ # ਦਿਨਾਂ ਦੇ ਅੰਦਰ ਮੁੜ-ਲਾਂਚ ਕਰੋ}}</translation> +<translation id="4205939740494406371">Chrome ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ। 24 ਘੰਟਿਆਂ ਬਾਅਦ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਜਾਂ <ph name="BEGIN_LINK" />ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰੋ<ph name="END_LINK" />।</translation> <translation id="424864128008805179">ਕੀ Chrome ਤੋਂ ਸਾਈਨ-ਆਊਟ ਹੋਣਾ ਹੈ?</translation> <translation id="4251615635259297716">ਕੀ ਤੁਹਾਡਾ Chrome ਡਾਟਾ ਇਸ ਖਾਤੇ ਨਾਲ ਲਿੰਕ ਕਰਨਾ ਹੈ?</translation> <translation id="4293420128516039005">ਸਮਕਾਲੀਕਰਨ ਕਰਨ ਲਈ ਸਾਈਨ-ਇਨ ਕਰਕੇ ਆਪਣੇ ਡੀਵਾਈਸਾਂ ਵਿਚਾਲੇ Chrome ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਓ</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">ਇਹ ਫ਼ਾਈਲ ਖਤਰਨਾਕ ਹੈ, ਇਸ ਲਈ Chrome ਨੇ ਇਸਨੂੰ ਬਲਾਕ ਕਰ ਦਿੱਤਾ ਹੈ।</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. ਸਾਰੇ ਹੱਕ ਰਾਖਵੇਂ ਹਨ।</translation> <translation id="840084489713044809">Google Chrome ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਨਿਰਯਾਤ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹੈ।</translation> -<translation id="8455999171311319804">ਵਿਕਲਪਿਕ: ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਤਸ਼ਖੀਸੀ ਅਤੇ ਵਰਤੋਂ ਡਾਟਾ Google ਨੂੰ ਭੇਜ ਕੇ Chrome OS ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਵਿੱਚ ਮਦਦ ਕਰੋ।</translation> <translation id="8498858610309223613">Google Chrome ਲਈ ਇੱਕ ਖਾਸ ਸੁਰੱਖਿਆ ਅੱਪਡੇਟ ਹੁਣੇ ਲਾਗੂ ਕੀਤਾ ਗਿਆ ਸੀ। ਹੁਣ ਇਸਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰੋ ਅਤੇ ਅਸੀਂ ਤੁਹਾਡੀਆਂ ਟੈਬਾਂ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕਰਾਂਗੇ।</translation> <translation id="8521348052903287641">mDNS ਟ੍ਰੈਫਿਕ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਵਾਸਤੇ Google Chrome Dev ਲਈ ਇਨਬਾਊਂਡ ਨਿਯਮ।</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index 3082c55..4fa070d3 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -227,7 +227,6 @@ <translation id="8342675569599923794">Ten plik jest niebezpieczny, dlatego został zablokowany przez Chrome.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Wszelkie prawa zastrzeżone.</translation> <translation id="840084489713044809">Google Chrome chce wyeksportować Twoje hasła.</translation> -<translation id="8455999171311319804">Opcjonalnie: pomóż ulepszyć system operacyjny Chrome OS, automatycznie wysyłając do Google dane diagnostyczne i informacje o użytkowaniu.</translation> <translation id="8498858610309223613">Właśnie została zastosowana specjalna aktualizacja zabezpieczeń Google Chrome. Uruchom ponownie Chrome teraz. Karty zostaną przywrócone.</translation> <translation id="8521348052903287641">Reguła dla ruchu przychodzącego w wersji deweloperskiej Google Chrome zezwalająca na ruch mDNS.</translation> <translation id="8540666473246803645">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 19615f5..62fa8bb 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -227,7 +227,6 @@ <translation id="8342675569599923794">Esse arquivo é perigoso, por isso ele foi bloqueado pelo Chrome.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos os direitos reservados.</translation> <translation id="840084489713044809">O Google Chrome quer exportar suas senhas.</translation> -<translation id="8455999171311319804">Opcional: Ajude a melhorar o Chrome OS enviando automaticamente dados de uso e diagnóstico ao Google.</translation> <translation id="8498858610309223613">Uma atualização especial de segurança para o Google Chrome acabou de ser aplicada. Reinicie agora, e suas guias serão restauradas.</translation> <translation id="8521348052903287641">Regra interna do Google Chrome Dev que permite o tráfego mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index 0260d4f..7cf9442 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Este ficheiro é perigoso. Como tal, o Chrome bloqueou-o.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos os direitos reservados.</translation> <translation id="840084489713044809">O Google Chrome pretende exportar as suas palavras-passe.</translation> -<translation id="8455999171311319804">Opcional: ajude a melhorar o Chrome OS ao enviar automaticamente dados de diagnóstico e de utilização para a Google.</translation> <translation id="8498858610309223613">Acabou de ser instalada uma atualização de segurança especial para o Google Chrome. Reinicie agora e iremos restaurar os seus separadores.</translation> <translation id="8521348052903287641">Regra de importação para o Google Chrome Dev permitir o tráfego mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index e876c12..b3b7cd5 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Fișierul este periculos, așadar Chrome l-a blocat.</translation> <translation id="8370517070665726704">Drept de autor <ph name="YEAR" /> Google LLC. Toate drepturile rezervate.</translation> <translation id="840084489713044809">Google Chrome vrea să îți exporte parolele.</translation> -<translation id="8455999171311319804">Opțional: contribuie la îmbunătățirea sistemului de operare Chrome trimițând automat date de diagnosticare și de utilizare la Google.</translation> <translation id="8498858610309223613">Tocmai a fost aplicată o actualizare de securitate specială pentru Google Chrome. Repornește acum și filele vor fi restabilite.</translation> <translation id="8521348052903287641">Regula de intrare pentru Google Chrome Dev pentru a permite traficul mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 0fe45e0..930c3e1 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -227,7 +227,6 @@ <translation id="8342675569599923794">Chrome заблокировал этот файл как опасный.</translation> <translation id="8370517070665726704">© Google LLC, <ph name="YEAR" />. Все права защищены.</translation> <translation id="840084489713044809">Вы собираетесь экспортировать пароли из Google Chrome.</translation> -<translation id="8455999171311319804">Автоматически отправлять статистику использования и данные диагностики в Google, чтобы помочь улучшить Chrome OS (необязательно)</translation> <translation id="8498858610309223613">Установлено специальное обновление системы безопасности. Перезапустите Google Chrome (все вкладки будут восстановлены).</translation> <translation id="8521348052903287641">Разрешить в Google Chrome для разработчиков передачу входящего трафика по протоколу mDNS</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb index 7c72370a..bcb5d31d 100644 --- a/chrome/app/resources/google_chrome_strings_si.xtb +++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">මෙම ගොනුව අනතුරුදායකයි, එනිසා Chrome එය අවහිර කර ඇත.</translation> <translation id="8370517070665726704">ප්රකාශන හිමිකම <ph name="YEAR" /> Google LLC. සියලුම හිමිකම් ඇවිරිණි.</translation> <translation id="840084489713044809">Google Chrome හට ඔබගේ මුරපද නිර්යාත කිරීමට අවශ්යය.</translation> -<translation id="8455999171311319804">විකල්පමය: Google වෙත දෝෂහරණ සහ භාවිතයේ දත්ත ස්වයංක්රීයව යැවීමෙන් Chrome OS වඩා හොඳ කිරීමට උදවු කරන්න.</translation> <translation id="8498858610309223613">Google Chrome සඳහා විශේෂ ආරක්ෂක යාවත්කාලීනයක් දැන් යොදා ගත්තා. දැන් යළි අරඹන්න, අපි ඔබේ පටිති ප්රතිසාධන කරන්නම්.</translation> <translation id="8521348052903287641">mDNS තදබදයට ඉඩ දීමට Google Chrome Dev සඳහා බන්ධිත රීතිය.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 8b60f00..e3273ffe 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -89,6 +89,7 @@ <translation id="34857402635545079">Tiež vymazať údaje z Chromu (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome potrebuje prístup k vašej polohe, aby ju mohol zdieľať s týmto webom</translation> <translation id="3533694711092285624">Žiadne uložené heslá. Chrome môže skontrolovať heslá, keď ich uložíte.</translation> +<translation id="3541482654983822893">Chrome nemôže skontrolovať heslá. Skúste to znova o 24 hodín.</translation> <translation id="3576528680708590453">Správca systému nakonfiguroval Google Chrome, aby web <ph name="TARGET_URL_HOSTNAME" /> otváral v alternatívnom prehliadači.</translation> <translation id="3582972582564653026">Synchronizujte a prispôsobte si Chrome v rôznych zariadeniach</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Správca požaduje nové spustenie Chromu, aby sa použila aktualizácia}=1{Správca požaduje nové spustenie Chromu, aby sa použila aktualizácia. Vaše okno inkognito sa neotvorí.}few{Správca požaduje nové spustenie Chromu, aby sa použila aktualizácia. Vaše # okná inkognito sa neotvoria.}many{Správca požaduje nové spustenie Chromu, aby sa použila aktualizácia. Your # Incognito windows won't reopen.}other{Správca požaduje nové spustenie Chromu, aby sa použila aktualizácia. Vašich # okien inkognito sa neotvorí.}}</translation> @@ -106,6 +107,7 @@ <translation id="4147555960264124640">Prihlasujete sa pomocou spravovaného účtu a jeho správcovi dávate kontrolu nad vaším profilom prehliadača Chrome. Vaše údaje prehliadača Chrome, ako sú aplikácie, záložky, história, heslá a iné nastavenia, sa natrvalo priradia k účtu <ph name="USER_NAME" />. Tieto údaje budete môcť odstrániť len pomocou panela Dashboard v Účtoch Google, ale nebudete ich môcť priradiť k inému účtu. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Inštalátor pri dekomprimovaní archívu zlyhal. Stiahnite prehliadač Google Chrome znova.</translation> <translation id="4191857738314598978">{0,plural, =1{Chrome znova spustite do jedného dňa}few{Chrome znova spustite do # dní}many{Chrome znova spustite do # dňa}other{Chrome znova spustite do # dní}}</translation> +<translation id="4205939740494406371">Chrome nemôže skontrolovať heslá. Skúste to znova o 24 hodín alebo <ph name="BEGIN_LINK" />skontrolujte heslá vo svojom účte Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Odhlásiť sa z Chromu?</translation> <translation id="4251615635259297716">Chcete prepojiť údaje prehliadača Chrome s týmto účtom?</translation> <translation id="4293420128516039005">Po prihlásení budete môcť Chrome synchronizovať a prispôsobiť v rôznych zariadeniach.</translation> @@ -231,7 +233,6 @@ <translation id="8342675569599923794">Tento súbor je nebezpečný, a preto ho Chrome zablokoval.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Všetky práva vyhradené.</translation> <translation id="840084489713044809">Google Chrome sa pokúša exportovať vaše heslá.</translation> -<translation id="8455999171311319804">Voliteľné: Pomáhať s vylepšením systému Chrome OS automatickým odosielaním diagnostík a údajov o využívaní Googlu.</translation> <translation id="8498858610309223613">Práve bola použitá mimoriadna bezpečnostná aktualizácia pre prehliadač Google Chrome. Po reštartovaní obnovíme vaše karty.</translation> <translation id="8521348052903287641">Pravidlo pre prichádzajúce prenosy pre prehliadač Google Chrome verzie pre vývojárov, ktoré povoľuje prenos dát mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index dc23b93..b7a8bfb 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -237,7 +237,6 @@ <translation id="8342675569599923794">Ta datoteka je nevarna, zato jo je Chrome blokiral.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Vse pravice pridržane.</translation> <translation id="840084489713044809">Google Chrome želi izvoziti gesla.</translation> -<translation id="8455999171311319804">Izbirno: pomagajte izboljšati OS Chrome s samodejnim pošiljanjem diagnostičnih podatkov in podatkov o uporabi Googlu.</translation> <translation id="8498858610309223613">Pravkar je bila nameščena posebna varnostna posodobitev za Google Chrome. Znova ga zaženite (vaše zavihke bomo obnovili).</translation> <translation id="8521348052903287641">Pravilo za dohodni promet za Google Chrome Dev, ki dovoli promet mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb index dfc07a21..3a07550 100644 --- a/chrome/app/resources/google_chrome_strings_sq.xtb +++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Pastro po ashtu të dhënat nga Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome ka nevojë për qasje te vendndodhja jote për të ndarë vendndodhjen me këtë sajt</translation> <translation id="3533694711092285624">Nuk ka asnjë fjalëkalim të ruajtur. Chrome mund t'i kontrollojë fjalëkalimet e tua kur ti i ruan ato.</translation> +<translation id="3541482654983822893">Chrome nuk mund t'i kontrollojë fjalëkalimet e tua. Provo përsëri pas 24 orësh.</translation> <translation id="3576528680708590453">Administratori i sistemit ka konfiguruar Google Chrome që të hapë një shfletues alternativ për t'u qasur te <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Sinkronizo dhe personalizo Chrome nëpër pajisjet e tua</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Administratori yt kërkon që të hapësh përsëri Chrome për të zbatuar këtë përditësim}=1{Administratori yt kërkon që të hapësh përsëri Chrome për të zbatuar këtë përditësim Dritarja jote "e fshehtë" nuk do të rihapet.}other{Administratori yt kërkon që të hapësh përsëri Chrome për të zbatuar këtë përditësim # dritaret e tua "të fshehta" nuk do të rihapen.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Po identifikohesh me një llogari të menaxhuar dhe po i jep administratorit të saj kontroll mbi profilin tënd të Google Chrome. Të dhënat e tua të Chrome, siç janë aplikacionet, faqeshënuesit, fjalëkalimet dhe cilësime të tjera do të lidhen në mënyrë të përhershme me <ph name="USER_NAME" />. Ti do të jesh në gjendje t'i fshish këto të dhëna përmes Panelit të llogarive të Google, por nuk do të jesh në gjendje t'i shoqërosh këto të dhëna me një llogari tjetër. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Instaluesi nuk arriti ta nxjerrë arkivin. Shkarko përsëri Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Hap përsëri Chrome brenda një dite}other{Hap përsëri Chrome brenda # ditësh}}</translation> +<translation id="4205939740494406371">Chrome nuk mund t'i kontrollojë fjalëkalimet e tua. Provo përsëri pas 24 orësh ose <ph name="BEGIN_LINK" />kontrollo fjalëkalimet në "Llogarinë tënde të Google"<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Do të dalësh nga Chrome?</translation> <translation id="4251615635259297716">Të lidhen të dhënat e tua të Chrome me këtë llogari?</translation> <translation id="4293420128516039005">Identifikohu për të sinkronizuar dhe personalizuar Chrome nëpër pajisjet e tua</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Ky skedar është i rrezikshëm, prandaj Chrome e ka bllokuar atë.</translation> <translation id="8370517070665726704">Të drejtat e autorit <ph name="YEAR" /> Google LLC. Të gjitha të drejtat e rezervuara.</translation> <translation id="840084489713044809">Google Chrome dëshiron të eksportojë fjalëkalimet e tua.</translation> -<translation id="8455999171311319804">Opsionale: Ndihmo në përmirësimin e sistemit operativ Chrome duke dërguar automatikisht te Google të dhëna përdorimi dhe diagnostikuese.</translation> <translation id="8498858610309223613">Sapo është zbatuar një përditësim special i sigurisë për Google Chrome. Rinise tani dhe do të restaurojmë skedat e tua.</translation> <translation id="8521348052903287641">Rregulli hyrës për Google Chrome Dev për të lejuar trafikun mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb index a4338b2a..4e99d38 100644 --- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb +++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Obriši podatke i iz Chrome-a (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome traži pristup vašoj lokaciji da biste je delili sa ovim sajtom</translation> <translation id="3533694711092285624">Nema sačuvanih lozinki. Chrome može da proverava lozinke kada ih sačuvate.</translation> +<translation id="3541482654983822893">Chrome ne može da vam proverava lozinke. Probajte ponovo za 24 sata.</translation> <translation id="3576528680708590453">Administrator sistema je konfigurisao Chrome da otvara alternativni pregledač za pristup URL-u <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Sinhronizujte i personalizujte Chrome na svim uređajima</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Administrator zahteva da ponovo pokrenete Chrome da biste primenili ažuriranje}=1{Administrator zahteva da ponovo pokrenete Chrome da biste primenili ažuriranje. Prozor bez arhiviranja se neće ponovo otvoriti.}one{Administrator zahteva da ponovo pokrenete Chrome da biste primenili ažuriranje. # prozor bez arhiviranja se neće ponovo otvoriti.}few{Administrator zahteva da ponovo pokrenete Chrome da biste primenili ažuriranje. # prozora bez arhiviranja se neće ponovo otvoriti.}other{Administrator zahteva da ponovo pokrenete Chrome da biste primenili ažuriranje. # prozora bez arhiviranja se neće ponovo otvoriti.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Prijavljujete se pomoću naloga kojim se upravlja i dajete njegovom administratoru kontrolu nad Google Chrome profilom. Chrome podaci, kao što su aplikacije, obeleživači, istorija, lozinke i druga podešavanja, biće trajno povezani sa nalogom <ph name="USER_NAME" />. Moći ćete da izbrišete te podatke preko Kontrolne table Google naloga, ali nećete moći da ih povežete sa nekim drugim nalogom. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Program za instalaciju nije uspeo da dekomprimuje arhivu. Preuzmite Google Chrome ponovo.</translation> <translation id="4191857738314598978">{0,plural, =1{Ponovo pokrenite Chrome za jedan dan}one{Ponovo pokrenite Chrome za # dan}few{Ponovo pokrenite Chrome za # dana}other{Ponovo pokrenite Chrome za # dana}}</translation> +<translation id="4205939740494406371">Chrome ne može da vam proverava lozinke. Probajte ponovo posle 24 sata ili <ph name="BEGIN_LINK" />proverite lozinke na Google nalogu<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Želite li da se odjavite iz Chrome-a?</translation> <translation id="4251615635259297716">Želite li da povežete Chrome podatke sa ovim nalogom?</translation> <translation id="4293420128516039005">Prijavite se da biste sinhronizovali i personalizovali Chrome na svim uređajima</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Ova datoteka je opasna, pa ju je Chrome blokirao.</translation> <translation id="8370517070665726704">Autorska prava <ph name="YEAR" />. Google LLC. Sva prava zadržana.</translation> <translation id="840084489713044809">Google Chrome želi da izveze lozinke.</translation> -<translation id="8455999171311319804">Opcionalno: Pomozite nam da poboljšamo Chrome OS tako što ćete automatski slati Google-u dijagnostiku i podatke o korišćenju.</translation> <translation id="8498858610309223613">Posebno bezbednosno ažuriranje za Google Chrome je upravo primenjeno. Restartujte ga i vratićemo vam kartice.</translation> <translation id="8521348052903287641">Pravilo za dolazni saobraćaj za programersku verziju Google Chrome-a da biste omogućili mDNS saobraćaj.</translation> <translation id="8540666473246803645">Google Chrome</translation> @@ -249,7 +250,7 @@ <translation id="873133009373065397">Google Chrome ne može da odredi ni da podesi podrazumevani pregledač</translation> <translation id="8823341990149967727">Chrome je zastareo</translation> <translation id="8834965163890861871">Google Chrome pokušava da izmeni lozinke. Unesite lozinku za Windows da biste to omogućili.</translation> -<translation id="884296878221830158">Kontroliše i stranicu koja se prikazuje kada pokrenete Chrome ili kliknete na dugme Početna.</translation> +<translation id="884296878221830158">Kontroliše i stranicu koja se prikazuje kada pokrenete Chrome ili kliknete na dugme Početak.</translation> <translation id="8862326446509486874">Nemate odgovarajuća prava za instalaciju na nivou sistema. Probajte ponovo da pokrenete program za instalaciju, ovoga puta kao administrator.</translation> <translation id="8914504000324227558">Ponovo pokreni Chrome</translation> <translation id="8999208279178790196">{0,plural, =0{Ažuriranje za Chrome je dostupno}=1{Ažuriranje za Chrome je dostupno}one{Ažuriranje za Chrome je dostupno već # dan}few{Ažuriranje za Chrome je dostupno već # dana}other{Ažuriranje za Chrome je dostupno već # dana}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index 84de897e..ffecb7c 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Обриши податке и из Chrome-а (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome тражи приступ вашој локацији да бисте је делили са овим сајтом</translation> <translation id="3533694711092285624">Нема сачуваних лозинки. Chrome може да проверава лозинке када их сачувате.</translation> +<translation id="3541482654983822893">Chrome не може да вам проверава лозинке. Пробајте поново за 24 сата.</translation> <translation id="3576528680708590453">Администратор система је конфигурисао Chrome да отвара алтернативни прегледач за приступ URL-у <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Синхронизујте и персонализујте Chrome на свим уређајима</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Администратор захтева да поново покренете Chrome да бисте применили ажурирање}=1{Администратор захтева да поново покренете Chrome да бисте применили ажурирање. Прозор без архивирања се неће поново отворити.}one{Администратор захтева да поново покренете Chrome да бисте применили ажурирање. # прозор без архивирања се неће поново отворити.}few{Администратор захтева да поново покренете Chrome да бисте применили ажурирање. # прозора без архивирања се неће поново отворити.}other{Администратор захтева да поново покренете Chrome да бисте применили ажурирање. # прозора без архивирања се неће поново отворити.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Пријављујете се помоћу налога којим се управља и дајете његовом администратору контролу над Google Chrome профилом. Chrome подаци, као што су апликације, обележивачи, историја, лозинке и друга подешавања, биће трајно повезани са налогом <ph name="USER_NAME" />. Моћи ћете да избришете те податке преко Контролне табле Google налога, али нећете моћи да их повежете са неким другим налогом. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Програм за инсталацију није успео да декомпримује архиву. Преузмите Google Chrome поново.</translation> <translation id="4191857738314598978">{0,plural, =1{Поново покрените Chrome за један дан}one{Поново покрените Chrome за # дан}few{Поново покрените Chrome за # дана}other{Поново покрените Chrome за # дана}}</translation> +<translation id="4205939740494406371">Chrome не може да вам проверава лозинке. Пробајте поново после 24 сата или <ph name="BEGIN_LINK" />проверите лозинке на Google налогу<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Желите ли да се одјавите из Chrome-а?</translation> <translation id="4251615635259297716">Желите ли да повежете Chrome податке са овим налогом?</translation> <translation id="4293420128516039005">Пријавите се да бисте синхронизовали и персонализовали Chrome на свим уређајима</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Ова датотека је опасна, па ју је Chrome блокирао.</translation> <translation id="8370517070665726704">Ауторска права <ph name="YEAR" />. Google LLC. Сва права задржана.</translation> <translation id="840084489713044809">Google Chrome жели да извезе лозинке.</translation> -<translation id="8455999171311319804">Опционално: Помозите нам да побољшамо Chrome ОС тако што ћете аутоматски слати Google-у дијагностику и податке о коришћењу.</translation> <translation id="8498858610309223613">Посебно безбедносно ажурирање за Google Chrome је управо примењено. Рестартујте га и вратићемо вам картице.</translation> <translation id="8521348052903287641">Правило за долазни саобраћај за програмерску верзију Google Chrome-а да бисте омогућили mDNS саобраћај.</translation> <translation id="8540666473246803645">Google Chrome</translation> @@ -249,7 +250,7 @@ <translation id="873133009373065397">Google Chrome не може да одреди ни да подеси подразумевани прегледач</translation> <translation id="8823341990149967727">Chrome је застарео</translation> <translation id="8834965163890861871">Google Chrome покушава да измени лозинке. Унесите лозинку за Windows да бисте то омогућили.</translation> -<translation id="884296878221830158">Контролише и страницу која се приказује када покренете Chrome или кликнете на дугме Почетна.</translation> +<translation id="884296878221830158">Контролише и страницу која се приказује када покренете Chrome или кликнете на дугме Почетак.</translation> <translation id="8862326446509486874">Немате одговарајућа права за инсталацију на нивоу система. Пробајте поново да покренете програм за инсталацију, овога пута као администратор.</translation> <translation id="8914504000324227558">Поново покрени Chrome</translation> <translation id="8999208279178790196">{0,plural, =0{Ажурирање за Chrome је доступно}=1{Ажурирање за Chrome је доступно}one{Ажурирање за Chrome је доступно већ # дан}few{Ажурирање за Chrome је доступно већ # дана}other{Ажурирање за Chrome је доступно већ # дана}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 9922496..3733cd074 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -238,7 +238,6 @@ <translation id="8342675569599923794">Filen är farlig och har blockerats av Chrome.</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Med ensamrätt.</translation> <translation id="840084489713044809">Lösenorden exporteras från Google Chrome.</translation> -<translation id="8455999171311319804">Valfritt: Hjälp oss att göra Chrome bättre genom att automatiskt skicka diagnostik- och användningsdata till Google.</translation> <translation id="8498858610309223613">En särskild säkerhetsuppdatering för Google Chrome installerades precis. Starta om webbläsaren nu. Flikarna återställs efteråt.</translation> <translation id="8521348052903287641">Regel som tillåter inkommande mDNS-trafik för Google Chrome Dev.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index c2e59205..36a8334d 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -133,7 +133,7 @@ <translation id="4750550185319565338">Zima na uwashe Chrome tena ili uwashe <ph name="PLUGIN_NAME" /></translation> <translation id="4754614261631455953">Google Chrome Canary (mDNS-In)</translation> <translation id="4771048833395599659">Huenda faili hii ni hatari, kwa hivyo Chrome imeizuia.</translation> -<translation id="479167709087336770">Huduma hii hutumia kikagua maendelezo sawa na kinachotumika kwenye Huduma ya Tafuta na Google. Maandishi unayoandika kwenye kivinjari yanatumwa kwa Google. Unaweza kubadilisha hali hii katika mipangilio wakati wowote.</translation> +<translation id="479167709087336770">Huduma hii hutumia kikagua tahajia sawa na kinachotumika kwenye Huduma ya Tafuta na Google. Maandishi unayoandika kwenye kivinjari yanatumwa kwa Google. Unaweza kubadilisha hali hii katika mipangilio wakati wowote.</translation> <translation id="4891791193823137474">Ruhusu Google Chrome iendeshe katika mandharinyuma</translation> <translation id="4895437082222824641">Fungua kiungo katika kichupo kipya cha Chrome</translation> <translation id="4953650215774548573">Weka Google Chrome iwe kivinjari chako chaguomsingi</translation> @@ -236,7 +236,6 @@ <translation id="8342675569599923794">Faili hii ni hatari, kwa hivyo Chrome imeizuia.</translation> <translation id="8370517070665726704">Hakimiliki <ph name="YEAR" /> Google LLC. Haki zote zimehifadhiwa.</translation> <translation id="840084489713044809">Google Chrome ingependa kuhamisha manenosiri yako.</translation> -<translation id="8455999171311319804">Hiari: Saidia kuboresha Mfumo wa Uendeshaji wa Chrome kwa kutuma data ya uchunguzi na matumizi kwa Google kiotomatiki.</translation> <translation id="8498858610309223613">Sasisho maalum la usalama wa Google Chrome limewekwa sasa hivi. Ifunge kisha uifungue sasa na tutarejesha vichupo vyako.</translation> <translation id="8521348052903287641">Sheria ya kuingia ya Google Chrome Dev ili kuruhusu trafiki ya mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index 0a54ffc..e3fa9c8 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">Chromeமிலிருந்தும் தரவை அழி (<ph name="URL" />)</translation> <translation id="3503306920980160878">இந்தத் தளத்துடன் இருப்பிடத்தைப் பகிர Chromeமுக்கு உங்கள் இருப்பிடத்திற்கான அணுகல் தேவை</translation> <translation id="3533694711092285624">சேமித்த கடவுச்சொற்கள் எதுவும் இல்லை. நீங்கள் அவற்றைச் சேமிக்கும்போது Chromeமால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியும்.</translation> +<translation id="3541482654983822893">Chrome உலாவியால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியவில்லை. 24 மணிநேரத்திற்குப் பிறகு முயலவும்.</translation> <translation id="3576528680708590453"><ph name="TARGET_URL_HOSTNAME" />ஐ அணுக Google Chrome அதை மாற்று உலாவியில் திறக்கும்படி உங்கள் சிஸ்டம் நிர்வாகி உள்ளமைத்துள்ளார்.</translation> <translation id="3582972582564653026">உங்கள் எல்லாச் சாதனங்களிலும் Chromeஐ ஒத்திசைக்கலாம், தனிப்பயனாக்கலாம்</translation> <translation id="3596080736082218006">{COUNT,plural, =0{புதுப்பிப்பைப் பயன்படுத்த Chromeமை மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி சொல்கிறார்}=1{புதுப்பிப்பைப் பயன்படுத்த Chromeமை மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி சொல்கிறார். உங்கள் மறைநிலை சாளரம் மீண்டும் திறக்காது.}other{புதுப்பிப்பைப் பயன்படுத்த Chromeமை மீண்டும் தொடங்கும்படி உங்கள் நிர்வாகி சொல்கிறார். உங்கள் # மறைநிலை சாளரங்கள் மீண்டும் திறக்காது.}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">நீங்கள் நிர்வகிக்கப்படும் கணக்கு மூலம் உள்நுழைகிறீர்கள், மேலும் அதன் நிர்வாகிக்கு உங்கள் Google Chrome சுயவிவரத்தின் கட்டுப்பாட்டை வழங்குகிறீர்கள். உங்கள் ஆப்ஸ், புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் போன்ற உங்கள் Chrome தரவு மற்றும் பிற அமைப்புகள் நிரந்தரமாக <ph name="USER_NAME" /> உடன் இணைக்கப்படும். இந்தத் தரவை Google கணக்குகளின் டாஷ்போர்டு வழியாக நீக்க முடியும், ஆனால் இந்தத் தரவை வேறொரு கணக்குடன் தொடர்புப்படுத்த முடியாது. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">காப்பகத்தை விரிவுபடுத்துவதில் இன்ஸ்டாலர் தோல்வியுற்றது. Google Chromeமை மீண்டும் பதிவிறக்குக.</translation> <translation id="4191857738314598978">{0,plural, =1{ஒரு நாளுக்குள் Chromeமை மீண்டும் தொடங்கவும்}other{# நாட்களுக்குள் Chromeமை மீண்டும் தொடங்கவும்}}</translation> +<translation id="4205939740494406371">Chrome உலாவியால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியவில்லை. 24 மணிநேரத்திற்குப் பிறகு மீண்டும் முயலவும் அல்லது <ph name="BEGIN_LINK" />உங்கள் Google கணக்கில் கடவுச்சொற்களைச் சரிபார்க்கவும்<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome இலிருந்து வெளியேறவா?</translation> <translation id="4251615635259297716">உங்கள் Chrome தரவை இந்தக் கணக்குடன் இணைக்கவா?</translation> <translation id="4293420128516039005">உங்கள் எல்லாச் சாதனங்களிலும் Chromeஐ ஒத்திசைக்க மற்றும் தனிப்பயனாக்க, உள்நுழையவும்</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">இந்தக் கோப்பு ஆபத்தானது என்பதால், அதை Chrome தடுத்துள்ளது.</translation> <translation id="8370517070665726704">பதிப்புரிமை <ph name="YEAR" /> Google LLC. அனைத்து உரிமைகளும் பாதுகாக்கப்பட்டவை.</translation> <translation id="840084489713044809">Google Chrome உங்கள் கடவுச்சொற்களை ஏற்ற விரும்புகிறது.</translation> -<translation id="8455999171311319804">விருப்பத்தேர்வுக்குரியது: பிழை அறிக்கையையும் உபயோகத் தரவையும் Googleக்குத் தானாக அனுப்புவதன் மூலம், Chrome OSஐ இன்னும் சிறப்பாக்க உதவவும்.</translation> <translation id="8498858610309223613">Google Chromeமுக்கான சிறப்புப் பாதுகாப்புப் புதுப்பிப்பு சற்றுமுன் இயக்கப்பட்டது. இப்போது Chromeமை மீண்டும் தொடங்கவும், உங்கள் தாவல்களை மீண்டும் காண்பிப்போம்.</translation> <translation id="8521348052903287641">mDNS ட்ராஃபிக்கை அனுமதிக்க, Google Chrome Devக்கான உள்வரும் விதி.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index a2451d4a..8aebef0 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">అలాగే (<ph name="URL" />)లో ఉన్న Chromeకి సంబంధించిన డేటాని తీసివేయి</translation> <translation id="3503306920980160878">ఈ సైట్తో మీ స్థానాన్ని షేర్ చేయడానికి Chromeకు మీ స్థాన యాక్సెస్ అవసరం</translation> <translation id="3533694711092285624">సేవ్ చేసిన పాస్వర్డ్లు లేవు. మీరు మీ పాస్వర్డ్లను సేవ్ చేసినప్పుడు Chrome వాటిని చెక్ చేయగలదు.</translation> +<translation id="3541482654983822893">మీ పాస్వర్డ్లను Chrome చెక్ చేయలేకపోయింది. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి.</translation> <translation id="3576528680708590453"><ph name="TARGET_URL_HOSTNAME" />ను యాక్సెస్ చేయడం కోసం ఒక ప్రత్యామ్నాయ బ్రౌజర్ను తెరిచే విధంగా Google Chromeను మీ సిస్టమ్ నిర్వాహకులు కాన్ఫిగర్ చేశారు.</translation> <translation id="3582972582564653026">మీ పరికరాల అంతటా Chromeను సింక్ చేయండి మరియు వ్యక్తిగతీకరించండి</translation> <translation id="3596080736082218006">{COUNT,plural, =0{అప్డేట్ను వర్తింపజేయడం కోసం మీరు Chromeను పునఃప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు}=1{అప్డేట్ను వర్తింపజేయడం కోసం మీరు Chromeను పునఃప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు. మీ అజ్ఞాత విండో మళ్లీ తెరవబడదు.}other{అప్డేట్ను వర్తింపజేయడం కోసం మీరు Chromeను పునఃప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు. మీ # అజ్ఞాత విండోలు మళ్లీ తెరవబడవు.}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Google Chrome ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chrome డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">ఆర్కైవ్ను విస్తరించడంలో ఇన్స్టాలర్ విఫలమైంది. దయచేసి Google Chromeను మళ్లీ డౌన్లోడ్ చేయండి.</translation> <translation id="4191857738314598978">{0,plural, =1{ఒక రోజులోపు Chromeను తిరిగి ప్రారంభించండి}other{# రోజులలోపు Chromeను తిరిగి ప్రారంభించండి}}</translation> +<translation id="4205939740494406371">మీ పాస్వర్డ్లను Chrome చెక్ చేయలేకపోయింది. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి లేదా <ph name="BEGIN_LINK" />మీ Google ఖాతాలో పాస్వర్డ్లను చెక్ చేయండి<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Chrome నుండి సైన్ అవుట్ చేయాలా?</translation> <translation id="4251615635259297716">మీ Chrome డేటాను ఈ ఖాతాకు జోడించాలా?</translation> <translation id="4293420128516039005">మీ పరికరాల అంతటా Chromeను సింక్ చేయడానికి, వ్యక్తిగతీకరించడానికి సైన్ ఇన్ చేయండి</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">ఈ ఫైల్ అపాయకరమైనది, కాబట్టి Chrome దీన్ని బ్లాక్ చేసింది.</translation> <translation id="8370517070665726704">కాపీరైట్ <ph name="YEAR" /> Google LLC. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation> <translation id="840084489713044809">Google Chrome మీ పాస్వర్డ్లను ఎగుమతి చేయాలనుకుంటోంది.</translation> -<translation id="8455999171311319804">ఐచ్ఛికం: విశ్లేషణ మరియు వినియోగ డేటాను ఆటోమేటిక్గా Googleకు పంపడం ద్వారా Chrome OSను మెరుగుపరచడంలో సహాయం అందించండి.</translation> <translation id="8498858610309223613">Google Chromeకి సంబంధించిన ప్రత్యేక భద్రతా అప్డేట్ వర్తింపజేయబడింది. ఇప్పుడే పునఃప్రారంభించండి, మేము మీ ట్యాబ్లను పునరుద్ధరిస్తాము.</translation> <translation id="8521348052903287641">mDNS ట్రాఫిక్ను అనుమతించడానికి Google Chrome డెవలపర్ కోసం ఇన్బౌండ్ నియమం.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index 71419c32..fa97d3f2 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -227,7 +227,6 @@ <translation id="8342675569599923794">ไฟล์นี้อันตราย Chrome จึงบล็อกไว้</translation> <translation id="8370517070665726704">ลิขสิทธิ์ <ph name="YEAR" /> Google LLC สงวนลิขสิทธิ์</translation> <translation id="840084489713044809">Google Chrome ต้องการส่งออกรหัสผ่านของคุณ</translation> -<translation id="8455999171311319804">ไม่บังคับ: ช่วยทำให้ Chrome OS ดียิ่งขึ้นโดยการส่งข้อมูลการวินิจฉัยและการใช้งานไปยัง Google โดยอัตโนมัติ</translation> <translation id="8498858610309223613">ระบบเพิ่งนำการอัปเดตความปลอดภัยพิเศษไปใช้กับ Google Chrome รีสตาร์ทเลย แล้วเราจะคืนค่าแท็บให้คุณ</translation> <translation id="8521348052903287641">กฎขาเข้าสำหรับ Google Chrome Dev เพื่ออนุญาตการเข้าชมแบบ mDNS</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index 42c9f62..b6e7480 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -231,7 +231,6 @@ <translation id="8342675569599923794">Bu dosya tehlikeli olduğu için Chrome tarafından engellendi.</translation> <translation id="8370517070665726704">Telif hakkı <ph name="YEAR" /> Google LLC. Tüm hakları saklıdır.</translation> <translation id="840084489713044809">Google Chrome, şifrelerinizi dışa aktarmak istiyor.</translation> -<translation id="8455999171311319804">İsteğe bağlı: Teşhis ve kullanım verilerini Google'a otomatik olarak gönderin ve Chrome OS'in iyileştirilmesine yardımcı olun.</translation> <translation id="8498858610309223613">Google Chrome için özel bir güvenlik güncellemesi uygulandı. Uygulamayı hemen yeniden başlatın; açık sekmeleriniz geri yüklenir.</translation> <translation id="8521348052903287641">Google Chrome Dev'in mDNS trafiğine izin vermeyi sağlayan gelen trafik kuralı.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index f61bb9e..27988dc5 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -229,7 +229,6 @@ <translation id="8342675569599923794">Цей файл небезпечний, тому Chrome заблокував його.</translation> <translation id="8370517070665726704">Авторське право <ph name="YEAR" /> Google LLC. Усі права захищено.</translation> <translation id="840084489713044809">Google Chrome хоче експортувати ваші паролі.</translation> -<translation id="8455999171311319804">Додатково. Допоможіть покращити ОС Chrome, автоматично надсилаючи в Google дані про діагностику та використання.</translation> <translation id="8498858610309223613">Щойно було застосовано спеціальне оновлення для захисту Google Chrome. Перезапустіть веб-переглядач, і ваші вкладки буде відновлено.</translation> <translation id="8521348052903287641">Вхідне правило для Google Chrome для розробників дозволяє трафік mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 86ebc5f..21b3f36 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -235,7 +235,6 @@ <translation id="8342675569599923794">یہ فائل خطرناک ہے، اس لیے Chrome نے اسے مسدود کر دیا ہے۔</translation> <translation id="8370517070665726704">کاپی رائٹ<ph name="YEAR" /> Google LLC۔ جملہ حقوق محفوظ ہیں۔</translation> <translation id="840084489713044809">Google Chrome آپ کے پاس ورڈز برآمد کرنا چاہتا ہے۔</translation> -<translation id="8455999171311319804">اختیاری: Google کو ڈائیگنوسٹک اور استعمال کا ڈیٹا خودکار طور پر بھیج کر Chrome OS کو بہتر بنانے میں مدد کریں۔</translation> <translation id="8498858610309223613">Google Chrome کے لیے ایک خاص سیکیورٹی اپ ڈیٹ ابھی ابھی لاگو کیا گیا ہے۔ ابھی دوبارہ شروع کریں اور ہم آپ کے ٹیبز کو بحال کر دیں گے۔</translation> <translation id="8521348052903287641">mDNS ٹریفک کی اجازت دینے کے لیے Google Chrome Dev کے لیے ان باؤنڈ اصول۔</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb index bca37ed..1591500 100644 --- a/chrome/app/resources/google_chrome_strings_uz.xtb +++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -234,7 +234,6 @@ <translation id="8342675569599923794">Bu fayl zararli edi va u Chrome tomonidan bloklandi.</translation> <translation id="8370517070665726704">© Google LLC, <ph name="YEAR" /> Barcha huquqlar himoyalangan.</translation> <translation id="840084489713044809">Google Chrome parollaringizni eksport qilmoqchi.</translation> -<translation id="8455999171311319804">Ixtiyoriy: Google serverlariga diagnostika va foydalanish statistikasi ma’lumotlarini yuborish orqali Chrome OS tizimini takomillashtirishga yordam bering.</translation> <translation id="8498858610309223613">Google Chrome xavfsizlik tizimiga maxsus yangilanish oʻrnatildi. Qayta ishga tushiring va ochiq sahifalarni tiklang.</translation> <translation id="8521348052903287641">Google Chrome Dev mDNS trafigiga ruxsat berishiga oid kiruvchi qoida.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index fec2bd5..54a90bfb 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -90,6 +90,7 @@ <translation id="34857402635545079">Đồng thời xóa dữ liệu khỏi Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome cần quyền truy cập vào vị trí của bạn để chia sẻ thông tin vị trí với trang web này</translation> <translation id="3533694711092285624">Bạn chưa lưu mật khẩu nào. Chrome có thể kiểm tra các mật khẩu của bạn khi bạn lưu các mật khẩu đó.</translation> +<translation id="3541482654983822893">Chrome không thể kiểm tra mật khẩu của bạn. Hãy thử lại sau 24 giờ.</translation> <translation id="3576528680708590453">Quản trị viên hệ thống của bạn đã định cấu hình Google Chrome để mở một trình duyệt thay thế khi truy cập vào <ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Đồng bộ hóa và cá nhân hóa Chrome trên các thiết bị của bạn</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Quản trị viên của bạn yêu cầu bạn chạy lại Chrome để áp dụng bản cập nhật}=1{Quản trị viên của bạn yêu cầu bạn chạy lại Chrome để áp dụng bản cập nhật. Cửa sổ ẩn danh của bạn sẽ không mở lại.}other{Quản trị viên của bạn yêu cầu bạn chạy lại Chrome để áp dụng bản cập nhật. # cửa sổ ẩn danh của bạn sẽ không mở lại.}}</translation> @@ -107,6 +108,7 @@ <translation id="4147555960264124640">Bạn đang đăng nhập bằng tài khoản được quản lý và cấp cho quản trị viên của tài khoản quyền kiểm soát cấu hình trên Google Chrome của bạn. Dữ liệu Chrome của bạn, chẳng hạn như ứng dụng, dấu trang, lịch sử, mật khẩu và các cài đặt khác sẽ vĩnh viễn được liên kết với <ph name="USER_NAME" />. Bạn có thể xóa dữ liệu này thông qua Trang tổng quan của tài khoản Google nhưng không thể liên kết dữ liệu này với tài khoản khác. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Trình cài đặt không thể giải nén lưu trữ được. Vui lòng tải xuống lại Google Chrome.</translation> <translation id="4191857738314598978">{0,plural, =1{Khởi động lại Chrome trong vòng một ngày}other{Khởi động lại Chrome trong vòng # ngày}}</translation> +<translation id="4205939740494406371">Chrome không thể kiểm tra mật khẩu của bạn. Hãy thử lại sau 24 giờ hoặc <ph name="BEGIN_LINK" />kiểm tra các mật khẩu trong Tài khoản Google của bạn<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Đăng xuất khỏi Chrome?</translation> <translation id="4251615635259297716">Bạn muốn liên kết dữ liệu Chrome của bạn với tài khoản này?</translation> <translation id="4293420128516039005">Đăng nhập để đồng bộ hóa và cá nhân hóa Chrome trên các thiết bị của bạn</translation> @@ -231,7 +233,6 @@ <translation id="8342675569599923794">Tệp này nguy hiểm, do đó Chrome đã chặn tệp.</translation> <translation id="8370517070665726704">Bản quyền <ph name="YEAR" /> Google LLC. Mọi quyền được bảo lưu.</translation> <translation id="840084489713044809">Google Chrome muốn xuất các mật khẩu của bạn.</translation> -<translation id="8455999171311319804">Tùy chọn: Giúp cải thiện Chrome OS bằng cách tự động gửi dữ liệu chẩn đoán và dữ liệu sử dụng cho Google.</translation> <translation id="8498858610309223613">Google Chrome vừa áp dụng một bản cập nhật bảo mật đặc biệt. Vui lòng khởi động lại ngay bây giờ và chúng tôi sẽ khôi phục các tab của bạn.</translation> <translation id="8521348052903287641">Quy tắc kết nối để Google Chrome Dev cho phép lưu lượng truy cập mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index 2ff2703..e9cc3c1 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -88,6 +88,7 @@ <translation id="34857402635545079">一并清除 Chrome (<ph name="URL" />) 中的数据</translation> <translation id="3503306920980160878">Chrome 需要获得位置权限,才能将您的位置信息共享给此网站</translation> <translation id="3533694711092285624">尚未保存任何密码。您需要先保存密码才能使用 Chrome 的密码检查功能。</translation> +<translation id="3541482654983822893">Chrome 无法检查您的密码。请过 24 小时再试。</translation> <translation id="3576528680708590453">您的系统管理员已将 Google Chrome 配置为使用备用浏览器访问 <ph name="TARGET_URL_HOSTNAME" />。</translation> <translation id="3582972582564653026">在您的所有设备上同步并个性化设置 Chrome</translation> <translation id="3596080736082218006">{COUNT,plural, =0{您的管理员要求您重新启动 Chrome 以应用一项更新}=1{您的管理员要求您重新启动 Chrome 以应用一项更新。您的无痕式窗口不会重新打开。}other{您的管理员要求您重新启动 Chrome 以应用一项更新。您的 # 个无痕式窗口不会重新打开。}}</translation> @@ -105,6 +106,7 @@ <translation id="4147555960264124640">您目前登录的帐号是一个托管帐号,该帐号的管理员将能够控制您的 Google Chrome 个人资料。您的 Chrome 数据(例如您的应用、书签、历史记录、密码和其他设置)将永远与 <ph name="USER_NAME" /> 相关联。您可以通过 Google 帐号信息中心删除这些数据,但无法将这些数据与其他帐号相关联。<ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">安装程序无法解压缩存档文件。请重新下载 Google Chrome。</translation> <translation id="4191857738314598978">{0,plural, =1{请于 1 天内重新启动 Chrome}other{请于 # 天内重新启动 Chrome}}</translation> +<translation id="4205939740494406371">Chrome 无法检查您的密码。请过 24 小时再试,或者<ph name="BEGIN_LINK" />检查您的 Google 帐号中的密码<ph name="END_LINK" />。</translation> <translation id="424864128008805179">退出 Chrome?</translation> <translation id="4251615635259297716">是否将您的 Chrome 数据与此帐号相关联?</translation> <translation id="4293420128516039005">登录即可在您的所有设备上同步并个性化设置 Chrome</translation> @@ -227,7 +229,6 @@ <translation id="8342675569599923794">此文件存在危险,因此 Chrome 已将其拦截。</translation> <translation id="8370517070665726704">版权所有 <ph name="YEAR" /> Google LLC. 保留所有权利。</translation> <translation id="840084489713044809">Google Chrome 想导出您的密码。</translation> -<translation id="8455999171311319804">可选:将诊断数据和使用情况数据自动发送给 Google,协助我们改进 Chrome 操作系统。</translation> <translation id="8498858610309223613">Google Chrome 刚刚应用了一项特殊的安全更新。请立即重启,以便系统恢复您的标签页。</translation> <translation id="8521348052903287641">Google Chrome 开发者版的入站规则,允许 mDNS 流量。</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index 79be387..16c1a8d 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -235,7 +235,6 @@ <translation id="8342675569599923794">此檔案不安全,因此 Chrome 已封鎖此檔案。</translation> <translation id="8370517070665726704">版權所有 <ph name="YEAR" /> Google LLC。保留所有權利。</translation> <translation id="840084489713044809">Google Chrome 想匯出您的密碼。</translation> -<translation id="8455999171311319804">選用:將診斷和使用情況資料自動傳送給 Google,協助我們改善 Chrome 作業系統。</translation> <translation id="8498858610309223613">Google Chrome 剛套用了特別的安全性更新。請立即重新啟動,我們將會還原您的分頁。</translation> <translation id="8521348052903287641">允許 mDNS 流量的 Google Chrome 開發人員版輸入規則。</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index ffbc6cf..2aa09d9 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -231,7 +231,6 @@ <translation id="8342675569599923794">這個檔案並不安全,因此遭到 Chrome 封鎖。</translation> <translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. 保留所有權利。</translation> <translation id="840084489713044809">Google Chrome 要求匯出你的密碼。</translation> -<translation id="8455999171311319804">選擇性:自動將診斷資料和使用情況資料傳送給 Google,協助我們讓 Chrome 作業系統更臻完善。</translation> <translation id="8498858610309223613">Google Chrome 剛才套用了特殊的安全性更新。請立即重新啟動,系統會恢復你原先開啟的分頁。</translation> <translation id="8521348052903287641">允許 mDNS 流量的 Google Chrome 開發人員版輸入規則。</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index 45fa10d..b446971 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -92,6 +92,7 @@ <translation id="34857402635545079">Futhi sula idatha kusuka ku-Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">I-Chrome idinga ukufinyelela kundawo yakho ukuze yabelane ngendawo yakho naleli sayithi</translation> <translation id="3533694711092285624">Awekho amaphasiwedi alondoloziwe. I-Chrome ingahlola amaphasiwedi akho uma uwalondolozile.</translation> +<translation id="3541482654983822893">I-Chrome ayikwazi ukuhlola amaphasiwedi akho. Zama futhi emva kwamahora angu-24.</translation> <translation id="3576528680708590453">Umlawuli wakho wesistimu ulungise i-Google Chrome ukuvula esinye isiphequluli ikufinyelela i-<ph name="TARGET_URL_HOSTNAME" />.</translation> <translation id="3582972582564653026">Vumelanisa uphinde wenze kube ngeyakho i-Chrome kumadivayisi akho onkana</translation> <translation id="3596080736082218006">{COUNT,plural, =0{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chrome ukuze kusetshenziswe isibuyekezo}=1{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chrome ukuze usebenzise isibuyekezo. Iwindi lakho le-Incognito ngeke liphinde livuleke.}one{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chrome ukuze usebenzise isibuyekezo. Amawindi akho angu-# e-Incognito ngeke aze aphinde avuleke.}other{Umlawuli wakho udinga ukuthi uqalise kabusha i-Chrome ukuze usebenzise isibuyekezo. Amawindi akho angu-# e-Incognito ngeke aze aphinde avuleke.}}</translation> @@ -109,6 +110,7 @@ <translation id="4147555960264124640">Ungena ngemvume nge-akhawunti ephethwe futhi unikeza umlawuli wayo ukulawula okungaphezulu kwephrofayela yakho ye-Google Chrome. Idatha yakho ye-Chrome, efana nezinhlelo zokusebenza zakho, amabhukhimakhi, umlando, amaphasiwedi, nezinye izilungiselelo zizoboshezelwa ngonaphakade ku-<ph name="USER_NAME" />. Uzokwazi ukususa le datha nge-Google ama-Akhawunti we-Ideshibhodi, kodwa ngeke uze ukwazi ukuhlobanisa le datha nenye i-akhawunti. <ph name="LEARN_MORE" /></translation> <translation id="4149882025268051530">Isifaki sihlulekile ukungaminyanisi ingobo yomlando. Sicela ulande i-Google Chrome futhi.</translation> <translation id="4191857738314598978">{0,plural, =1{Qalisa kabusha i-Chrome phakathi nosuku}one{Qalisa kabusha i-Chrome phakathi kwezinsuku ezingu-#}other{Qalisa kabusha i-Chrome phakathi kwezinsuku ezingu-#}}</translation> +<translation id="4205939740494406371">I-Chrome ayikwazi ukuhlola amaphasiwedi akho. Zama futhi ngemva kwamahora angu-24 noma <ph name="BEGIN_LINK" />hlola amaphasiwedi ku-akhawunti yakho ye-Google<ph name="END_LINK" />.</translation> <translation id="424864128008805179">Phuma ngemvume ku-Chrome?</translation> <translation id="4251615635259297716">Xhumanisa idatha yakho ye-Chrome kule akhawunti?</translation> <translation id="4293420128516039005">Ngena ngemvume ukuze uvumelanise uphinde wenze kube ngeyakho i-Chrome kuwo onke amadivayisi akho</translation> @@ -235,7 +237,6 @@ <translation id="8342675569599923794">Leli fayela liyingozi, ngakho-ke i-Chrome ilivimbile.</translation> <translation id="8370517070665726704">© <ph name="YEAR" /> Google LLC. Wonke amalungelo agodliwe.</translation> <translation id="840084489713044809">I-Google Chrome ifuna ukuthumela amaphasiwedi akho.</translation> -<translation id="8455999171311319804">Inketho: Siza wenze i-Chrome OS ibe ngcono ngokuthumela ngokuzenzakalela idatha yokuxilonga neyokusetshenziswa ku-Google.</translation> <translation id="8498858610309223613">Isibuyekezo esibalulekile sokuvikela se-Google Chrome sisanda kusetshenziswa. Qalisa kabusha manje bese sizobuyisela amathebhu akho.</translation> <translation id="8521348052903287641">Umyalo wokubophezeleka ngaphakathi kwe-beta ye-Google Chrome ukuze kuvunyelwe ithrafikhi ye-mDNS.</translation> <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 0723a281..36f6f2c 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -742,6 +742,8 @@ "media/router/media_router_feature.h", "media/webrtc/audio_debug_recordings_handler.cc", "media/webrtc/audio_debug_recordings_handler.h", + "media/webrtc/camera_pan_tilt_zoom_permission_context.cc", + "media/webrtc/camera_pan_tilt_zoom_permission_context.h", "media/webrtc/desktop_media_list.h", "media/webrtc/desktop_media_list_base.cc", "media/webrtc/desktop_media_list_base.h", @@ -2575,7 +2577,6 @@ "android/instantapps/instant_apps_settings.h", "android/intent_helper.cc", "android/intent_helper.h", - "android/intercept_navigation_delegate_impl.cc", "android/large_icon_bridge.cc", "android/large_icon_bridge.h", "android/locale/locale_manager.cc", @@ -5922,14 +5923,14 @@ "chromeos/arc/extensions/fake_arc_support.h", "chromeos/file_manager/fake_disk_mount_manager.cc", "chromeos/file_manager/fake_disk_mount_manager.h", + "chromeos/input_method/mock_assistive_window_controller.cc", + "chromeos/input_method/mock_assistive_window_controller.h", "chromeos/input_method/mock_candidate_window_controller.cc", "chromeos/input_method/mock_candidate_window_controller.h", "chromeos/input_method/mock_input_method_engine.cc", "chromeos/input_method/mock_input_method_engine.h", "chromeos/input_method/mock_input_method_manager_impl.cc", "chromeos/input_method/mock_input_method_manager_impl.h", - "chromeos/input_method/mock_suggestion_window_controller.cc", - "chromeos/input_method/mock_suggestion_window_controller.h", "chromeos/login/screens/mock_device_disabled_screen_view.cc", "chromeos/login/screens/mock_device_disabled_screen_view.h", "chromeos/login/session/user_session_manager_test_api.cc",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 078d783a..724a3a7e 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -42,6 +42,7 @@ "+components/bookmarks/test", "+components/browser_ui/settings", "+components/browser_ui/util", + "+components/browser_ui/widget", "+components/browser_sync", "+components/browser_ui/site_settings", "+components/browser_watcher",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index e8d8e2e..df3a4ce 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1153,15 +1153,6 @@ {"6 matches", kOmniboxMaxURLMatches6, base::size(kOmniboxMaxURLMatches6), nullptr}}; -#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || \ - defined(OS_CHROMEOS) -const FeatureEntry::FeatureParam kTranslateBubbleUITab[] = { - {language::kTranslateUIBubbleKey, language::kTranslateUIBubbleTabValue}}; - -const FeatureEntry::FeatureVariation kTranslateBubbleUIVariations[] = { - {"Tab", kTranslateBubbleUITab, base::size(kTranslateBubbleUITab), nullptr}}; -#endif // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS - const FeatureEntry::FeatureParam kMarkHttpAsDangerous[] = { {security_state::features::kMarkHttpAsFeatureParameterName, security_state::features::kMarkHttpAsParameterDangerous}}; @@ -2307,15 +2298,6 @@ "OverrideTranslateTriggerInIndia")}, #endif // OS_ANDROID -#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) || \ - defined(OS_CHROMEOS) - {"translate-ui-bubble-options", flag_descriptions::kTranslateBubbleUIName, - flag_descriptions::kTranslateBubbleUIDescription, kOsDesktop, - FEATURE_WITH_PARAMS_VALUE_TYPE(language::kUseButtonTranslateBubbleUi, - kTranslateBubbleUIVariations, - "UseButtonTranslateBubbleUI")}, -#endif // OS_LINUX || OS_MACOSX || OS_WIN || OS_CHROMEOS - #if BUILDFLAG(ENABLE_NATIVE_NOTIFICATIONS) && !defined(OS_CHROMEOS) {"enable-native-notifications", flag_descriptions::kNotificationsNativeFlagName, @@ -2910,10 +2892,6 @@ flag_descriptions::kPassiveDocumentEventListenersName, flag_descriptions::kPassiveDocumentEventListenersDescription, kOsAll, FEATURE_VALUE_TYPE(features::kPassiveDocumentEventListeners)}, - {"document-passive-wheel-event-listeners", - flag_descriptions::kPassiveDocumentWheelEventListenersName, - flag_descriptions::kPassiveDocumentWheelEventListenersDescription, kOsAll, - FEATURE_VALUE_TYPE(features::kPassiveDocumentWheelEventListeners)}, {"passive-event-listeners-due-to-fling", flag_descriptions::kPassiveEventListenersDueToFlingName, flag_descriptions::kPassiveEventListenersDueToFlingDescription, kOsAll, @@ -3962,6 +3940,13 @@ kOsDesktop, FEATURE_VALUE_TYPE(features::kHappinessTrackingSurveysForDesktopDemo)}, + {"happiness-tracking-surveys-for-desktop-migration", + flag_descriptions::kHappinessTrackingSurveysForDesktopMigrationName, + flag_descriptions::kHappinessTrackingSurveysForDesktopMigrationDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + features::kHappinessTrackingSurveysForDesktopMigration)}, + {"happiness-tracking-surveys-for-desktop-settings", flag_descriptions::kHappinessTrackingSurveysForDesktopSettingsName, flag_descriptions::kHappinessTrackingSurveysForDesktopSettingsDescription, @@ -5249,6 +5234,10 @@ {"app-cache", flag_descriptions::kAppCacheName, flag_descriptions::kAppCacheDescription, kOsAll, FEATURE_VALUE_TYPE(blink::features::kAppCache)}, + {"enable-autofill-cache-server-card-info", + flag_descriptions::kEnableAutofillCacheServerCardInfoName, + flag_descriptions::kEnableAutofillCacheServerCardInfoDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kAutofillCacheServerCardInfo)}, // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
diff --git a/chrome/browser/android/autofill_assistant/generic_ui_controller_android.cc b/chrome/browser/android/autofill_assistant/generic_ui_controller_android.cc index 05a091b..b6bdb60e 100644 --- a/chrome/browser/android/autofill_assistant/generic_ui_controller_android.cc +++ b/chrome/browser/android/autofill_assistant/generic_ui_controller_android.cc
@@ -309,7 +309,7 @@ ? base::android::ConvertUTF8ToJavaString( env, proto.attributes().content_description()) : nullptr, - proto.attributes().visible()); + proto.attributes().visible(), proto.attributes().enabled()); } if (proto.has_layout_params()) { Java_AssistantViewFactory_setViewLayoutParams(
diff --git a/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc b/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc index 35564be..69558135 100644 --- a/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc +++ b/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.cc
@@ -272,6 +272,35 @@ ui_controller_android_utils::ToJavaValue(env, *visible_value)); } +void SetViewEnabled( + base::WeakPtr<UserModel> user_model, + const SetViewEnabledProto& proto, + std::map<std::string, base::android::ScopedJavaGlobalRef<jobject>>* views) { + if (!user_model) { + return; + } + + auto jview = views->find(proto.view_identifier()); + if (jview == views->end()) { + DVLOG(2) << "Failed to enable/disable view " << proto.view_identifier() + << ": view not found"; + return; + } + + auto enabled_value = user_model->GetValue(proto.enabled()); + if (!enabled_value.has_value() || + enabled_value->booleans().values_size() != 1) { + DVLOG(2) << "Failed to enable/disable view " << proto.view_identifier() + << ": " << proto.enabled() << " did not contain single boolean"; + return; + } + + JNIEnv* env = base::android::AttachCurrentThread(); + Java_AssistantViewInteractions_setViewEnabled( + env, jview->second, + ui_controller_android_utils::ToJavaValue(env, *enabled_value)); +} + void RunConditionalCallback( base::WeakPtr<BasicInteractions> basic_interactions, const std::string& condition_identifier,
diff --git a/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.h b/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.h index a048cbe4..7b8d248 100644 --- a/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.h +++ b/chrome/browser/android/autofill_assistant/generic_ui_interactions_android.h
@@ -67,6 +67,12 @@ const SetViewVisibilityProto& proto, std::map<std::string, base::android::ScopedJavaGlobalRef<jobject>>* views); +// Enables or disables a view. +void SetViewEnabled( + base::WeakPtr<UserModel> user_model, + const SetViewEnabledProto& proto, + std::map<std::string, base::android::ScopedJavaGlobalRef<jobject>>* views); + // A simple wrapper around a basic interaction, needed because we can't directly // bind a repeating callback to a method with non-void return value. void RunConditionalCallback(
diff --git a/chrome/browser/android/autofill_assistant/interaction_handler_android.cc b/chrome/browser/android/autofill_assistant/interaction_handler_android.cc index ffc3b4a..27941044 100644 --- a/chrome/browser/android/autofill_assistant/interaction_handler_android.cc +++ b/chrome/browser/android/autofill_assistant/interaction_handler_android.cc
@@ -194,6 +194,21 @@ base::BindRepeating(&android_interactions::SetViewVisibility, user_model->GetWeakPtr(), proto.set_view_visibility(), views)); + case CallbackProto::kSetViewEnabled: + if (proto.set_view_enabled().view_identifier().empty()) { + VLOG(1) << "Error creating SetViewEnabled interaction: " + "view_identifier not set"; + return base::nullopt; + } + if (!proto.set_view_enabled().has_enabled()) { + VLOG(1) << "Error creating SetViewEnabled interaction: " + "enabled not set"; + return base::nullopt; + } + return base::Optional<InteractionHandlerAndroid::InteractionCallback>( + base::BindRepeating(&android_interactions::SetViewEnabled, + user_model->GetWeakPtr(), + proto.set_view_enabled(), views)); case CallbackProto::KIND_NOT_SET: VLOG(1) << "Error creating interaction: kind not set"; return base::nullopt;
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.cc b/chrome/browser/android/omnibox/autocomplete_controller_android.cc index 6c18f7de..1c1bad0 100644 --- a/chrome/browser/android/omnibox/autocomplete_controller_android.cc +++ b/chrome/browser/android/omnibox/autocomplete_controller_android.cc
@@ -60,6 +60,8 @@ #include "third_party/metrics_proto/omnibox_event.pb.h" #include "ui/base/device_form_factor.h" #include "ui/base/window_open_disposition.h" +#include "url/android/gurl_android.h" +#include "url/gurl.h" using base::android::AttachCurrentThread; using base::android::ConvertJavaStringToUTF16; @@ -326,7 +328,7 @@ autocomplete_controller_->DeleteMatch(match); } -ScopedJavaLocalRef<jstring> AutocompleteControllerAndroid:: +ScopedJavaLocalRef<jobject> AutocompleteControllerAndroid:: UpdateMatchDestinationURLWithQueryFormulationTime( JNIEnv* env, const JavaParamRef<jobject>& obj, @@ -341,7 +343,7 @@ autocomplete_controller_->UpdateMatchDestinationURLWithQueryFormulationTime( base::TimeDelta::FromMilliseconds(elapsed_time_since_input_change), &match); - return ConvertUTF8ToJavaString(env, match.destination_url.spec()); + return url::GURLAndroid::FromNativeGURL(env, match.destination_url); } void AutocompleteControllerAndroid::Shutdown() { @@ -529,17 +531,14 @@ janswer = match.answer->CreateJavaObject(); ScopedJavaLocalRef<jstring> fill_into_edit = ConvertUTF16ToJavaString(env, match.fill_into_edit); - ScopedJavaLocalRef<jstring> destination_url = - ConvertUTF8ToJavaString(env, match.destination_url.spec()); - ScopedJavaLocalRef<jstring> image_url; + ScopedJavaLocalRef<jobject> destination_url = + url::GURLAndroid::FromNativeGURL(env, match.destination_url); + ScopedJavaLocalRef<jobject> image_url = + url::GURLAndroid::FromNativeGURL(env, match.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()); - } - if (!match.image_dominant_color.empty()) { image_dominant_color = ConvertUTF8ToJavaString(env, match.image_dominant_color);
diff --git a/chrome/browser/android/omnibox/autocomplete_controller_android.h b/chrome/browser/android/omnibox/autocomplete_controller_android.h index 2c4f2b3..3f32f9d 100644 --- a/chrome/browser/android/omnibox/autocomplete_controller_android.h +++ b/chrome/browser/android/omnibox/autocomplete_controller_android.h
@@ -74,7 +74,7 @@ const base::android::JavaParamRef<jobject>& obj, jint selected_index, jint hash_code); - base::android::ScopedJavaLocalRef<jstring> + base::android::ScopedJavaLocalRef<jobject> UpdateMatchDestinationURLWithQueryFormulationTime( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj,
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index 91ec5b2..559e5177 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm
@@ -87,7 +87,6 @@ #include "chrome/browser/web_applications/components/web_app_shortcut_mac.h" #include "chrome/common/chrome_paths_internal.h" #include "chrome/common/chrome_switches.h" -#include "chrome/common/cloud_print/cloud_print_class_mac.h" #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/mac/app_mode_common.h" #include "chrome/common/pref_names.h" @@ -107,6 +106,7 @@ #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" #include "net/base/filename_util.h" +#include "net/base/mac/url_conversions.h" #include "ui/base/cocoa/focus_window_set.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util_mac.h" @@ -407,8 +407,6 @@ NSAppleEventManager* em = [NSAppleEventManager sharedAppleEventManager]; [em removeEventHandlerForEventClass:kInternetEventClass andEventID:kAEGetURL]; - [em removeEventHandlerForEventClass:cloud_print::kAECloudPrintClass - andEventID:cloud_print::kAECloudPrintClass]; [em removeEventHandlerForEventClass:'WWW!' andEventID:'OURL']; [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -1427,6 +1425,23 @@ net::FilePathToFileURL(base::FilePath([file fileSystemRepresentation])); gurlVector.push_back(gurl); } + + if (!gurlVector.empty()) + [self openUrlsReplacingNTP:gurlVector]; + else + NOTREACHED() << "Nothing to open!"; + + [sender replyToOpenOrPrint:NSApplicationDelegateReplySuccess]; +} + +// TODO(avi): When Chromium requires 10.13 as a minimum, remove the +// -[NSApplication application:openFiles:] override and the +// kInternetEventClass/kAEGetURL Apple Event registration in -mainMenuCreated. +- (void)application:(NSApplication*)sender openURLs:(NSArray<NSURL*>*)urls { + std::vector<GURL> gurlVector; + for (NSURL* url in urls) + gurlVector.push_back(net::GURLWithNSURL(url)); + if (!gurlVector.empty()) [self openUrlsReplacingNTP:gurlVector]; else
diff --git a/chrome/browser/apps/app_service/app_service_proxy.cc b/chrome/browser/apps/app_service/app_service_proxy.cc index 03d21188..7def9d41 100644 --- a/chrome/browser/apps/app_service/app_service_proxy.cc +++ b/chrome/browser/apps/app_service/app_service_proxy.cc
@@ -335,6 +335,7 @@ continue; } + pending_pause_requests_.MaybeRemoveApp(app_id); app_service_->UnpauseApps(app_type, app_id); } } @@ -663,7 +664,9 @@ void AppServiceProxy::OnPauseDialogClosed(apps::mojom::AppType app_type, const std::string& app_id) { - app_service_->PauseApp(app_type, app_id); + if (pending_pause_requests_.IsPaused(app_id)) { + app_service_->PauseApp(app_type, app_id); + } } #endif // OS_CHROMEOS
diff --git a/chrome/browser/apps/app_service/web_apps.cc b/chrome/browser/apps/app_service/web_apps.cc index 1102359..3b3c50d 100644 --- a/chrome/browser/apps/app_service/web_apps.cc +++ b/chrome/browser/apps/app_service/web_apps.cc
@@ -541,7 +541,7 @@ app->show_in_launcher = show; app->show_in_search = show; app->show_in_management = - web_app->IsSystemApp() ? show : apps::mojom::OptionalBool::kFalse; + web_app->IsSystemApp() ? apps::mojom::OptionalBool::kFalse : show; } void WebApps::PopulatePermissions(const web_app::WebApp* web_app,
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc index 740a004..6599774 100644 --- a/chrome/browser/autofill/autofill_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -1036,9 +1036,11 @@ TryClearForm(); } +// TODO(crbug.com/967588): Disabled due to flakiness // Test that multiple autofillings work. -IN_PROC_BROWSER_TEST_F(AutofillInteractiveTest, - FillChangeSecondFieldRefillSecondFieldClearFirst) { +IN_PROC_BROWSER_TEST_F( + AutofillInteractiveTest, + DISABLED_FillChangeSecondFieldRefillSecondFieldClearFirst) { CreateTestProfile(); // Load the test page.
diff --git a/chrome/browser/autofill/automated_tests/cache_replayer.cc b/chrome/browser/autofill/automated_tests/cache_replayer.cc index 0322ad78..9d37fd21 100644 --- a/chrome/browser/autofill/automated_tests/cache_replayer.cc +++ b/chrome/browser/autofill/automated_tests/cache_replayer.cc
@@ -428,18 +428,12 @@ JSONReader::ValueWithError value_with_error = JSONReader().ReadAndReturnValueWithError( decompressed_json_text, JSONParserOptions::JSON_PARSE_RFC); - if (value_with_error.error_code != - JSONReader::JsonParseError::JSON_NO_ERROR) { + if (!value_with_error.value) { return ServerCacheReplayer::Status{ ServerCacheReplayer::StatusCode::kBadRead, base::StrCat({"Could not load cache from json file ", "because: ", value_with_error.error_message})}; } - if (value_with_error.value == base::nullopt) { - return ServerCacheReplayer::Status{ - ServerCacheReplayer::StatusCode::kBadRead, - "JSON Reader could not give any node object from json file"}; - } root_node = std::move(value_with_error.value.value()); }
diff --git a/chrome/browser/autofill/captured_sites_test_utils.cc b/chrome/browser/autofill/captured_sites_test_utils.cc index 4262f325..018092c8 100644 --- a/chrome/browser/autofill/captured_sites_test_utils.cc +++ b/chrome/browser/autofill/captured_sites_test_utils.cc
@@ -111,17 +111,12 @@ JSONReader::ValueWithError value_with_error = JSONReader().ReadAndReturnValueWithError( json_text, JSONParserOptions::JSON_PARSE_RFC); - if (value_with_error.error_code != - JSONReader::JsonParseError::JSON_NO_ERROR) { + if (!value_with_error.value) { LOG(WARNING) << "Could not load test config from json file: " << "`testcases.json` because: " << value_with_error.error_message; return sites; } - if (!value_with_error.value) { - LOG(WARNING) << "JSON Reader could not any object from `testcases.json`"; - return sites; - } root_node = std::move(value_with_error.value.value()); } base::Value* list_node = root_node.FindListKey("tests");
diff --git a/chrome/browser/chrome_resource_bundle_helper.cc b/chrome/browser/chrome_resource_bundle_helper.cc index c687360..4672bb8 100644 --- a/chrome/browser/chrome_resource_bundle_helper.cc +++ b/chrome/browser/chrome_resource_bundle_helper.cc
@@ -87,8 +87,8 @@ // method InitSharedInstance is ignored. std::string actual_locale = ui::ResourceBundle::InitSharedInstanceWithLocale( preferred_locale, nullptr, ui::ResourceBundle::LOAD_COMMON_RESOURCES); - if (actual_locale.empty()) - return actual_locale; + CHECK(!actual_locale.empty()) + << "Locale could not be found for " << preferred_locale; // First run prefs needs data from the ResourceBundle, so load it now. {
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 6a13105..3f82dfb 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -1255,6 +1255,10 @@ "input_method/accessibility.h", "input_method/assistive_suggester.cc", "input_method/assistive_suggester.h", + "input_method/assistive_window_controller.cc", + "input_method/assistive_window_controller.h", + "input_method/assistive_window_controller_impl.cc", + "input_method/assistive_window_controller_impl.h", "input_method/browser_state_monitor.cc", "input_method/browser_state_monitor.h", "input_method/candidate_window_controller.cc", @@ -1285,10 +1289,6 @@ "input_method/personal_info_suggester.h", "input_method/suggester.h", "input_method/suggestion_enums.h", - "input_method/suggestion_window_controller.cc", - "input_method/suggestion_window_controller.h", - "input_method/suggestion_window_controller_impl.cc", - "input_method/suggestion_window_controller_impl.h", "kerberos/kerberos_credentials_manager.cc", "kerberos/kerberos_credentials_manager.h", "kerberos/kerberos_credentials_manager_factory.cc", @@ -2311,6 +2311,8 @@ "system/automatic_reboot_manager.cc", "system/automatic_reboot_manager.h", "system/automatic_reboot_manager_observer.h", + "system/breakpad_consent_watcher.cc", + "system/breakpad_consent_watcher.h", "system/device_disabling_manager.cc", "system/device_disabling_manager.h", "system/device_disabling_manager_default_delegate.cc", @@ -2354,6 +2356,8 @@ "system_logs/system_logs_writer.h", "system_logs/touch_log_source.cc", "system_logs/touch_log_source.h", + "system_logs/ui_hierarchy_log_source.cc", + "system_logs/ui_hierarchy_log_source.h", "system_token_cert_db_initializer.cc", "system_token_cert_db_initializer.h", "tether/fake_tether_service.cc",
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 895aa01f..d4471b0b 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -111,6 +111,7 @@ #include "chrome/browser/chromeos/settings/device_settings_service.h" #include "chrome/browser/chromeos/settings/shutdown_policy_forwarder.h" #include "chrome/browser/chromeos/startup_settings_cache.h" +#include "chrome/browser/chromeos/system/breakpad_consent_watcher.h" #include "chrome/browser/chromeos/system/input_device_settings.h" #include "chrome/browser/chromeos/system/user_removal_manager.h" #include "chrome/browser/chromeos/system_token_cert_db_initializer.h" @@ -591,6 +592,19 @@ bulk_printers_calculator_factory_ = std::make_unique<BulkPrintersCalculatorFactory>(); + // StatsReportingController is created in + // ChromeBrowserMainParts::PreCreateThreads, so this must come afterwards. + chromeos::StatsReportingController* stats_controller = + chromeos::StatsReportingController::Get(); + // |stats_controller| can be nullptr if ChromeBrowserMainParts's + // browser_process_->GetApplicationLocale() returns empty. We're trying to + // show an error message in that case, so don't just crash. (See + // ChromeBrowserMainParts::PreCreateThreadsImpl()). + if (stats_controller != nullptr) { + breakpad_consent_watcher_ = + system::BreakpadConsentWatcher::Initialize(stats_controller); + } + ChromeBrowserMainPartsLinux::PreMainMessageLoopRun(); }
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h index 5d93530..a8412f02 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -84,6 +84,7 @@ namespace system { class DarkResumeController; +class BreakpadConsentWatcher; } // namespace system // ChromeBrowserMainParts implementation for chromeos specific code. @@ -194,6 +195,7 @@ login_screen_extensions_storage_cleaner_; std::unique_ptr<GnubbyNotification> gnubby_notification_; + std::unique_ptr<system::BreakpadConsentWatcher> breakpad_consent_watcher_; DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsChromeos); };
diff --git a/chrome/browser/chromeos/crostini/fake_crostini_features.cc b/chrome/browser/chromeos/crostini/fake_crostini_features.cc index 31e22fb3..2e62091 100644 --- a/chrome/browser/chromeos/crostini/fake_crostini_features.cc +++ b/chrome/browser/chromeos/crostini/fake_crostini_features.cc
@@ -15,6 +15,26 @@ CrostiniFeatures::SetForTesting(original_features_); } +void FakeCrostiniFeatures::SetAll(bool flag) { + allowed_ = flag; + ui_allowed_ = flag; + enabled_ = flag; + export_import_ui_allowed_ = flag; + root_access_allowed_ = flag; + container_upgrade_ui_allowed_ = flag; + can_change_adb_sideloading_ = flag; +} + +void FakeCrostiniFeatures::ClearAll() { + allowed_ = base::nullopt; + ui_allowed_ = base::nullopt; + enabled_ = base::nullopt; + export_import_ui_allowed_ = base::nullopt; + root_access_allowed_ = base::nullopt; + container_upgrade_ui_allowed_ = base::nullopt; + can_change_adb_sideloading_ = base::nullopt; +} + bool FakeCrostiniFeatures::IsAllowed(Profile* profile) { if (allowed_.has_value()) return *allowed_;
diff --git a/chrome/browser/chromeos/crostini/fake_crostini_features.h b/chrome/browser/chromeos/crostini/fake_crostini_features.h index 8f26afe..2b8fbfe 100644 --- a/chrome/browser/chromeos/crostini/fake_crostini_features.h +++ b/chrome/browser/chromeos/crostini/fake_crostini_features.h
@@ -31,6 +31,9 @@ bool IsContainerUpgradeUIAllowed(Profile*) override; bool CanChangeAdbSideloading(Profile* profile) override; + void SetAll(bool flag); + void ClearAll(); + void set_allowed(bool allowed) { allowed_ = allowed; }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc index 831a31c..29b26eb0 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_tasks.cc
@@ -12,12 +12,17 @@ #include <vector> #include "base/bind.h" +#include "base/feature_list.h" #include "chrome/browser/chromeos/drive/file_system_util.h" +#include "chrome/browser/chromeos/file_manager/app_id.h" #include "chrome/browser/chromeos/file_manager/fileapi_util.h" #include "chrome/browser/chromeos/fileapi/file_system_backend.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/web_applications/system_web_app_manager.h" +#include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/extensions/api/file_manager_private.h" #include "chrome/common/extensions/api/file_manager_private_internal.h" +#include "chromeos/constants/chromeos_features.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/api/file_handlers/directory_util.h" #include "extensions/browser/api/file_handlers/mime_util.h" @@ -65,6 +70,56 @@ return mime_types; } +// Returns whether |url| is a RAW image file according to its extension. Note +// that since none of the extensions of interest are "known" mime types (per +// net/mime_util.cc), it's enough to simply check the extension rather than +// using MimeTypeCollector. TODO(crbug/1030935): Remove this. +bool IsRawImage(const FileSystemURL& url) { + constexpr const char* kRawExtensions[] = {".arw", ".cr2", ".dng", ".nef", + ".nrw", ".orf", ".raf", ".rw2"}; + return base::Contains(kRawExtensions, url.path().Extension()); +} + +// Intercepts usage of executeTask(..) that wants to invoke the old "Gallery" +// chrome app. If the media app is enabled, substitute it. +// TODO(crbug/1030935): Remove this when the gallery app is properly removed and +// the camera app has a new API (not fileManagerPrivate) to invoke its +// "Camera Roll" viewer. +void MaybeAdjustTaskForGalleryAppRemoval( + file_manager::file_tasks::TaskDescriptor* task, + const std::vector<FileSystemURL>& urls, + Profile* profile) { + if (!base::FeatureList::IsEnabled(chromeos::features::kMediaApp)) + return; + if (task->app_id != file_manager::kGalleryAppId) + return; + + DCHECK_EQ(task->task_type, file_manager::file_tasks::TASK_TYPE_FILE_HANDLER); + + // Filter out any request with a RAW image type of a kind that the Gallery + // is known to register as a handler. Although from a product perspective, the + // Gallery should be entirely hidden, we still direct RAW images to Gallery + // until chrome://media-app supports them. + if (std::find_if(urls.begin(), urls.end(), &IsRawImage) != urls.end()) + return; + + auto* provider = web_app::WebAppProvider::Get(profile); + DCHECK(provider); + + base::Optional<web_app::AppId> optional_app_id = + provider->system_web_app_manager().GetAppIdForSystemApp( + web_app::SystemAppType::MEDIA); + DCHECK(optional_app_id); + + // Even if the flag is enabled, app installation can sometimes fail. Don't + // crash in that case. See https://crbug.com/1024042. + if (!optional_app_id) + return; + + task->task_type = file_manager::file_tasks::TASK_TYPE_WEB_APP; + task->app_id = *optional_app_id; +} + } // namespace FileManagerPrivateInternalExecuteTaskFunction:: @@ -103,6 +158,9 @@ urls.push_back(url); } + MaybeAdjustTaskForGalleryAppRemoval(&task, urls, + chrome_details_.GetProfile()); + const bool result = file_manager::file_tasks::ExecuteFileTask( chrome_details_.GetProfile(), source_url(), task, urls, base::BindOnce(
diff --git a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc index 68c1298..c847fde 100644 --- a/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc +++ b/chrome/browser/chromeos/file_manager/external_filesystem_apitest.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/drive/drive_integration_service.h" #include "chrome/browser/chromeos/drive/drivefs_test_support.h" +#include "chrome/browser/chromeos/file_manager/file_manager_test_util.h" #include "chrome/browser/chromeos/file_manager/mount_test_util.h" #include "chrome/browser/chromeos/file_manager/volume_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" @@ -22,13 +23,17 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/ash/cast_config_controller_media_router.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/web_applications/system_web_app_manager.h" +#include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/constants/chromeos_switches.h" #include "components/session_manager/core/session_manager.h" #include "content/public/browser/browser_context.h" +#include "content/public/browser/navigation_handle.h" #include "content/public/browser/notification_service.h" +#include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" #include "extensions/browser/notification_types.h" #include "extensions/test/result_catcher.h" @@ -128,6 +133,50 @@ const base::FilePath drivefs_root_; }; +// Waits for a WebContents of the background page of the extension under test +// to load, then injects some javascript into it to trigger a particular test. +class JSTestStarter : public content::TestNavigationObserver { + public: + explicit JSTestStarter(const std::string& test_name) + : TestNavigationObserver(GetUrlToWatch()), test_name_(test_name) { + WatchExistingWebContents(); + StartWatchingNewWebContents(); + } + + static GURL GetUrlToWatch() { + // Use the chrome-extension:// ID corresponding to the key used in the app + // manifests for tests in this file. An improvement to this would use the ID + // of the extension from LoadExtensionAsComponentWithManifest(), but that's + // potentially racy. + return GURL( + "chrome-extension://pkplfbidichfdicaijlchgnapepdginl/" + "_generated_background_page.html"); + } + + // TestNavigationObserver: + void OnDidFinishNavigation( + content::NavigationHandle* navigation_handle) override { + // If the background page scripts have run, the test will exist, so just run + // it. Otherwise, schedule the test to be run at the end of the background + // page script. + constexpr char kScript[] = R"( + if (self.$1) { + chrome.test.runTests([$1]) + } else { + self.testNameToRun = '$1'; + } + )"; + ASSERT_TRUE(content::ExecuteScript( + navigation_handle->GetRenderFrameHost(), + base::ReplaceStringPlaceholders(kScript, {test_name_}, nullptr))); + + TestNavigationObserver::OnDidFinishNavigation(navigation_handle); + } + + private: + const std::string test_name_; +}; + bool TouchFile(const base::FilePath& path, base::StringPiece mtime_string, base::StringPiece atime_string) { @@ -138,12 +187,40 @@ return result; } +// Configuration of a file residing in a "test_dir" of a created volume. +// If contents is null, creates a subdirectory. +struct TestDirConfig { + const char* mtime; + const char* atime; + const char* name; + const char* contents = kTestFileContent; +}; + +// An arbitrary time, for tests that don't care. +constexpr const char kArbitraryTime[] = "2011-04-03T11:11:10.000Z"; + +// The default configuration of entries in "test_dir" used in test harnesses. +constexpr const TestDirConfig kDefaultDirConfig[] = { + {"2011-11-02T04:00:00.000Z", "2011-11-02T04:00:00.000Z", "empty_dir", + nullptr}, + {"2011-04-01T18:34:08.234Z", "2012-01-02T00:00:01.000Z", "subdir", nullptr}, + {"2011-12-14T00:40:47.330Z", "2012-01-02T00:00:00.000Z", "test_file.xul"}, + {"2012-01-01T10:00:30.000Z", "2012-01-01T00:00:00.000Z", + "test_file.xul.foo"}, + {"2011-04-03T11:11:10.000Z", "2012-01-02T00:00:00.000Z", "test_file.tiff"}, + {"2011-12-14T00:40:47.330Z", "2010-01-02T00:00:00.000Z", + "test_file.tiff.foo"}, + {"2011-12-14T00:40:47.330Z", "2011-12-14T00:40:47.330Z", "empty_file.foo", + ""}, +}; + // Sets up the initial file system state for native local and restricted native // local file systems. The hierarchy is the same as for the drive file system. // The directory is created at unique_temp_dir/|mount_point_name| path. bool InitializeLocalFileSystem(std::string mount_point_name, base::ScopedTempDir* tmp_dir, - base::FilePath* mount_point_dir) { + base::FilePath* mount_point_dir, + const std::vector<TestDirConfig>& dir_contents) { if (!tmp_dir->CreateUniqueTempDir()) return false; @@ -152,71 +229,32 @@ if (!base::CreateDirectory(*mount_point_dir)) return false; - base::FilePath test_dir = mount_point_dir->AppendASCII("test_dir"); + constexpr TestDirConfig kTestDir = {"2012-01-02T00:00:00.000Z", + "2012-01-02T00:00:01.000Z", "test_dir", + nullptr}; + + const base::FilePath test_dir = mount_point_dir->AppendASCII(kTestDir.name); if (!base::CreateDirectory(test_dir)) return false; - base::FilePath test_subdir = test_dir.AppendASCII("empty_dir"); - if (!base::CreateDirectory(test_subdir)) - return false; + for (const auto& file : dir_contents) { + const base::FilePath test_path = test_dir.AppendASCII(file.name); + if (file.contents) { + if (!google_apis::test_util::WriteStringToFile(test_path, file.contents)) + return false; + } else { + if (!base::CreateDirectory(test_path)) + return false; + } + } - test_subdir = test_dir.AppendASCII("subdir"); - if (!base::CreateDirectory(test_subdir)) - return false; + for (const auto& file : dir_contents) { + if (!TouchFile(test_dir.Append(file.name), file.mtime, file.atime)) + return false; + } - base::FilePath test_file = test_dir.AppendASCII("test_file.xul"); - if (!google_apis::test_util::WriteStringToFile(test_file, kTestFileContent)) - return false; - - test_file = test_dir.AppendASCII("test_file.xul.foo"); - if (!google_apis::test_util::WriteStringToFile(test_file, kTestFileContent)) - return false; - - test_file = test_dir.AppendASCII("test_file.tiff"); - if (!google_apis::test_util::WriteStringToFile(test_file, kTestFileContent)) - return false; - - test_file = test_dir.AppendASCII("test_file.tiff.foo"); - if (!google_apis::test_util::WriteStringToFile(test_file, kTestFileContent)) - return false; - - test_file = test_dir.AppendASCII("empty_file.foo"); - if (!google_apis::test_util::WriteStringToFile(test_file, "")) - return false; - - if (!TouchFile(test_dir.Append("empty_dir"), "2011-11-02T04:00:00.000Z", - "2011-11-02T04:00:00.000Z")) { - return false; - } - if (!TouchFile(test_dir.Append("subdir"), "2011-04-01T18:34:08.234Z", - "2012-01-02T00:00:01.000Z")) { - return false; - } - if (!TouchFile(test_dir.Append("test_file.xul"), "2011-12-14T00:40:47.330Z", - "2012-01-02T00:00:00.000Z")) { - return false; - } - if (!TouchFile(test_dir.Append("test_file.xul.foo"), - "2012-01-01T10:00:30.000Z", "2012-01-01T00:00:00.000Z")) { - return false; - } - if (!TouchFile(test_dir.Append("test_file.tiff"), "2011-04-03T11:11:10.000Z", - "2012-01-02T00:00:00.000Z")) { - return false; - } - if (!TouchFile(test_dir.Append("test_file.tiff.foo"), - "2011-12-14T00:40:47.330Z", "2010-01-02T00:00:00.000Z")) { - return false; - } - if (!TouchFile(test_dir.Append("empty_file.foo"), "2011-12-14T00:40:47.330Z", - "2011-12-14T00:40:47.330Z")) { - return false; - } - if (!TouchFile(test_dir, "2012-01-02T00:00:00.000Z", - "2012-01-02T00:00:01.000Z")) { - return false; - } - return true; + // Touch the directory holding all the contents last. + return TouchFile(test_dir, kTestDir.mtime, kTestDir.atime); } // Helper class to wait for a background page to load or close again. @@ -253,6 +291,10 @@ FileSystemExtensionApiTestBase() = default; ~FileSystemExtensionApiTestBase() override = default; + virtual std::vector<TestDirConfig> GetTestDirContents() { + return {std::begin(kDefaultDirConfig), std::end(kDefaultDirConfig)}; + } + bool SetUpUserDataDirectory() override { return drive::SetUpUserDataDirectoryForDriveFsTest(); } @@ -338,6 +380,16 @@ return true; } + // Starts the app in |app_folder| then triggers the |test_name| on the + // background page using JSTestStarter. Does not configure a file handler app. + bool RunBackgroundPageTestCase(const std::string& app_folder, + const std::string& test_name) { + JSTestStarter starter(test_name); + return RunFileSystemExtensionApiTest("file_browser/" + app_folder, + FILE_PATH_LITERAL("manifest.json"), + std::string(), FLAGS_NONE); + } + protected: // Sets up initial test file system hierarchy. virtual void InitTestFileSystem() = 0; @@ -358,8 +410,9 @@ // FileSystemExtensionApiTestBase override. void InitTestFileSystem() override { - ASSERT_TRUE(InitializeLocalFileSystem( - kLocalMountPointName, &tmp_dir_, &mount_point_dir_)) + ASSERT_TRUE(InitializeLocalFileSystem(kLocalMountPointName, &tmp_dir_, + &mount_point_dir_, + GetTestDirContents())) << "Failed to initialize file system."; } @@ -388,8 +441,9 @@ // FileSystemExtensionApiTestBase override. void InitTestFileSystem() override { - ASSERT_TRUE(InitializeLocalFileSystem( - kRestrictedMountPointName, &tmp_dir_, &mount_point_dir_)) + ASSERT_TRUE(InitializeLocalFileSystem(kRestrictedMountPointName, &tmp_dir_, + &mount_point_dir_, + GetTestDirContents())) << "Failed to initialize file system."; } @@ -458,7 +512,7 @@ // could exist simultaneously. base::FilePath drivefs_mount_point; InitializeLocalFileSystem("drive-user/root", &drivefs_root_, - &drivefs_mount_point); + &drivefs_mount_point, GetTestDirContents()); fake_drivefs_helper_ = std::make_unique<drive::FakeDriveFsHelper>( profile, drivefs_mount_point.DirName()); return new drive::DriveIntegrationService( @@ -582,8 +636,9 @@ // FileSystemExtensionApiTestBase override. void InitTestFileSystem() override { - ASSERT_TRUE(InitializeLocalFileSystem( - kLocalMountPointName, &local_tmp_dir_, &local_mount_point_dir_)) + ASSERT_TRUE(InitializeLocalFileSystem(kLocalMountPointName, &local_tmp_dir_, + &local_mount_point_dir_, + GetTestDirContents())) << "Failed to initialize file system."; // Set up cache root to be used by DriveIntegrationService. This has to be @@ -627,7 +682,7 @@ // profiles could exist simultaneously. base::FilePath drivefs_mount_point; InitializeLocalFileSystem("drive-user/root", &drivefs_root_, - &drivefs_mount_point); + &drivefs_mount_point, GetTestDirContents()); fake_drivefs_helper_ = std::make_unique<drive::FakeDriveFsHelper>( profile, drivefs_mount_point.DirName()); return new drive::DriveIntegrationService( @@ -650,6 +705,83 @@ service_factory_for_test_; }; +// Mixin for starting one of the FileSystem test fixures with a specific app +// configuration, which may include default-installed apps. Currently set up +// to run with the chrome://media-app flag explicitly flipped (or not). +class FileSystemExtensionApiTestWithApps + : public LocalFileSystemExtensionApiTest, + public ::testing::WithParamInterface<bool> { + public: + FileSystemExtensionApiTestWithApps() { + if (MediaAppEnabled()) { + scoped_feature_list_.InitAndEnableFeature(chromeos::features::kMediaApp); + } else { + scoped_feature_list_.InitAndDisableFeature(chromeos::features::kMediaApp); + } + } + + // A more readable accessor to determine if the MediaApp is enabled. + bool MediaAppEnabled() const { return GetParam(); } + + // FileManagerPrivateApiTest: + void SetUpOnMainThread() override { + Profile* profile = browser()->profile(); + file_manager::test::AddDefaultComponentExtensionsOnMainThread(profile); + web_app::WebAppProvider::Get(profile) + ->system_web_app_manager() + .InstallSystemAppsForTesting(); + LocalFileSystemExtensionApiTest::SetUpOnMainThread(); + } + + std::vector<TestDirConfig> GetTestDirContents() override { + return {{kArbitraryTime, kArbitraryTime, "test_file.png"}, + {kArbitraryTime, kArbitraryTime, "test_file.arw"}}; + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +namespace { + +// Constants from app_service_metrics.cc. +constexpr int kGalleryUmaBucket = 13; +constexpr int kMediaAppUmaBucket = 19; + +// Metric recorded as the result of the call to apps::RecordAppLaunch(). +constexpr char kAppLaunchMetric[] = "Apps.DefaultAppLaunch.FromFileManager"; + +std::string MediaAppBoolString(const testing::TestParamInfo<bool> info) { + return info.param ? "MediaApp" : "Gallery"; +} + +} // namespace + +// Check the interception of ExecuteTask calls to replace Gallery for PNGs. +IN_PROC_BROWSER_TEST_P(FileSystemExtensionApiTestWithApps, OpenGalleryForPng) { + base::HistogramTester histogram_tester; + EXPECT_TRUE(RunBackgroundPageTestCase("open_gallery", "testPngOpensGallery")) + << message_; + histogram_tester.ExpectBucketCount(kAppLaunchMetric, kGalleryUmaBucket, + MediaAppEnabled() ? 0 : 1); + histogram_tester.ExpectBucketCount(kAppLaunchMetric, kMediaAppUmaBucket, + MediaAppEnabled() ? 1 : 0); +} + +// Ensures requests to invoke Gallery for raw files *always* open Gallery. +IN_PROC_BROWSER_TEST_P(FileSystemExtensionApiTestWithApps, OpenGalleryForRaw) { + base::HistogramTester histogram_tester; + EXPECT_TRUE(RunBackgroundPageTestCase("open_gallery", "testRawOpensGallery")) + << message_; + histogram_tester.ExpectBucketCount(kAppLaunchMetric, kGalleryUmaBucket, 1); + histogram_tester.ExpectBucketCount(kAppLaunchMetric, kMediaAppUmaBucket, 0); +} + +INSTANTIATE_TEST_SUITE_P(All, + FileSystemExtensionApiTestWithApps, + testing::Bool(), + MediaAppBoolString); + // // LocalFileSystemExtensionApiTests. //
diff --git a/chrome/browser/chromeos/first_run/first_run.cc b/chrome/browser/chromeos/first_run/first_run.cc index 3ea2a790..ee6606c 100644 --- a/chrome/browser/chromeos/first_run/first_run.cc +++ b/chrome/browser/chromeos/first_run/first_run.cc
@@ -58,6 +58,13 @@ apps::AppServiceProxyFactory::GetForProfile(profile); DCHECK(proxy); + // Any user for whom the Help app launches after OOBE should see the getting + // started module. + profile->GetPrefs()->SetBoolean(prefs::kHelpAppShouldShowGetStarted, true); + // This is only used by the getting started module, so we can set it here. + profile->GetPrefs()->SetBoolean(prefs::kHelpAppTabletModeDuringOobe, + ash::TabletMode::Get()->InTabletMode()); + proxy->Launch(app_id, ui::EventFlags::EF_NONE, apps::mojom::LaunchSource::kFromChromeInternal, display::kInvalidDisplayId); @@ -107,6 +114,8 @@ // users will always see the welcome app on a new device. // See crbug.com/752361 registry->RegisterBooleanPref(prefs::kFirstRunTutorialShown, false); + registry->RegisterBooleanPref(prefs::kHelpAppShouldShowGetStarted, false); + registry->RegisterBooleanPref(prefs::kHelpAppTabletModeDuringOobe, false); } bool ShouldLaunchHelpApp(Profile* profile) {
diff --git a/chrome/browser/chromeos/hats/hats_dialog.cc b/chrome/browser/chromeos/hats/hats_dialog.cc index 3237fc74..ec44726 100644 --- a/chrome/browser/chromeos/hats/hats_dialog.cc +++ b/chrome/browser/chromeos/hats/hats_dialog.cc
@@ -62,9 +62,9 @@ // URL. std::string LoadLocalHtmlAsString(const std::string& site_id, const std::string& site_context) { - std::string html_data( - ui::ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_HATS_HTML)); + std::string html_data = + ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( + IDR_HATS_HTML); size_t pos = html_data.find(kScriptSrcReplacementToken); html_data.replace(pos, strlen(kScriptSrcReplacementToken),
diff --git a/chrome/browser/chromeos/input_method/DEPS b/chrome/browser/chromeos/input_method/DEPS index d40f7f3e2..dde8f27 100644 --- a/chrome/browser/chromeos/input_method/DEPS +++ b/chrome/browser/chromeos/input_method/DEPS
@@ -19,7 +19,7 @@ "+ash/shell.h", "+ash/wm/window_util.h", ], - "suggestion_window_controller_impl\.cc": [ + "assistive_window_controller_impl\.cc": [ "+ash/shell.h", "+ash/wm/window_util.h", ],
diff --git a/chrome/browser/chromeos/input_method/assistive_window_controller.cc b/chrome/browser/chromeos/input_method/assistive_window_controller.cc new file mode 100644 index 0000000..b3e49906 --- /dev/null +++ b/chrome/browser/chromeos/input_method/assistive_window_controller.cc
@@ -0,0 +1,19 @@ +// Copyright (c) 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/chromeos/input_method/assistive_window_controller.h" + +#include "chrome/browser/chromeos/input_method/assistive_window_controller_impl.h" + +namespace chromeos { +namespace input_method { + +// static +AssistiveWindowController* +AssistiveWindowController::CreateAssistiveWindowController() { + return new AssistiveWindowControllerImpl; +} + +} // namespace input_method +} // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/assistive_window_controller.h b/chrome/browser/chromeos/input_method/assistive_window_controller.h new file mode 100644 index 0000000..9ac3c143 --- /dev/null +++ b/chrome/browser/chromeos/input_method/assistive_window_controller.h
@@ -0,0 +1,30 @@ +// Copyright (c) 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. +// +// This file implements the assistive window used on Chrome OS. + +#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_ASSISTIVE_WINDOW_CONTROLLER_H_ +#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_ASSISTIVE_WINDOW_CONTROLLER_H_ + +namespace chromeos { +namespace input_method { + +// AssistiveWindowController is used for controlling the assistive window. +// Once the initialization is done, the controller starts monitoring signals +// sent from the the background input method daemon, and shows and hides the +// assistive window as needed. Upon deletion of the object, monitoring stops +// and the view used for rendering the assistive view is deleted. +class AssistiveWindowController { + public: + virtual ~AssistiveWindowController() = default; + + // Gets an instance of AssistiveWindowController. Caller has to delete the + // returned object. + static AssistiveWindowController* CreateAssistiveWindowController(); +}; + +} // namespace input_method +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_ASSISTIVE_WINDOW_CONTROLLER_H_
diff --git a/chrome/browser/chromeos/input_method/suggestion_window_controller_impl.cc b/chrome/browser/chromeos/input_method/assistive_window_controller_impl.cc similarity index 65% rename from chrome/browser/chromeos/input_method/suggestion_window_controller_impl.cc rename to chrome/browser/chromeos/input_method/assistive_window_controller_impl.cc index d952ea56..ac8f28c 100644 --- a/chrome/browser/chromeos/input_method/suggestion_window_controller_impl.cc +++ b/chrome/browser/chromeos/input_method/assistive_window_controller_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 "chrome/browser/chromeos/input_method/suggestion_window_controller_impl.h" +#include "chrome/browser/chromeos/input_method/assistive_window_controller_impl.h" #include <string> #include <vector> @@ -12,7 +12,6 @@ #include "ash/wm/window_util.h" // mash-ok #include "base/logging.h" #include "ui/base/ime/ime_bridge.h" -#include "ui/chromeos/ime/infolist_window.h" #include "ui/views/widget/widget.h" namespace chromeos { @@ -20,15 +19,15 @@ namespace {} // namespace -SuggestionWindowControllerImpl::SuggestionWindowControllerImpl() { - ui::IMEBridge::Get()->SetSuggestionWindowHandler(this); +AssistiveWindowControllerImpl::AssistiveWindowControllerImpl() { + ui::IMEBridge::Get()->SetAssistiveWindowHandler(this); } -SuggestionWindowControllerImpl::~SuggestionWindowControllerImpl() { - ui::IMEBridge::Get()->SetSuggestionWindowHandler(nullptr); +AssistiveWindowControllerImpl::~AssistiveWindowControllerImpl() { + ui::IMEBridge::Get()->SetAssistiveWindowHandler(nullptr); } -void SuggestionWindowControllerImpl::Init() { +void AssistiveWindowControllerImpl::Init() { if (suggestion_window_view_) return; @@ -48,7 +47,7 @@ widget->Show(); } -void SuggestionWindowControllerImpl::OnWidgetClosing(views::Widget* widget) { +void AssistiveWindowControllerImpl::OnWidgetClosing(views::Widget* widget) { if (suggestion_window_view_ && widget == suggestion_window_view_->GetWidget()) { widget->RemoveObserver(this); @@ -56,32 +55,33 @@ } } -void SuggestionWindowControllerImpl::Hide() { +void AssistiveWindowControllerImpl::HideSuggestion() { suggestion_text_ = base::EmptyString16(); if (suggestion_window_view_) suggestion_window_view_->GetWidget()->Close(); } -void SuggestionWindowControllerImpl::SetBounds(const gfx::Rect& cursor_bounds) { +void AssistiveWindowControllerImpl::SetBounds(const gfx::Rect& cursor_bounds) { if (suggestion_window_view_) suggestion_window_view_->SetBounds(cursor_bounds); } -void SuggestionWindowControllerImpl::FocusStateChanged() { +void AssistiveWindowControllerImpl::FocusStateChanged() { if (suggestion_window_view_) - Hide(); + HideSuggestion(); } -void SuggestionWindowControllerImpl::Show(const base::string16& text, - const base::string16& confirmed_text, - const bool show_tab) { +void AssistiveWindowControllerImpl::ShowSuggestion( + const base::string16& text, + const base::string16& confirmed_text, + const bool show_tab) { if (!suggestion_window_view_) Init(); suggestion_text_ = text; suggestion_window_view_->Show(text, confirmed_text, show_tab); } -base::string16 SuggestionWindowControllerImpl::GetText() const { +base::string16 AssistiveWindowControllerImpl::GetSuggestionText() const { return suggestion_text_; }
diff --git a/chrome/browser/chromeos/input_method/assistive_window_controller_impl.h b/chrome/browser/chromeos/input_method/assistive_window_controller_impl.h new file mode 100644 index 0000000..9f93948 --- /dev/null +++ b/chrome/browser/chromeos/input_method/assistive_window_controller_impl.h
@@ -0,0 +1,56 @@ +// Copyright (c) 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_CHROMEOS_INPUT_METHOD_ASSISTIVE_WINDOW_CONTROLLER_IMPL_H_ +#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_ASSISTIVE_WINDOW_CONTROLLER_IMPL_H_ + +#include <memory> + +#include "base/macros.h" +#include "chrome/browser/chromeos/input_method/assistive_window_controller.h" +#include "ui/base/ime/ime_assistive_window_handler_interface.h" +#include "ui/chromeos/ime/suggestion_window_view.h" + +namespace views { +class Widget; +} // namespace views + +namespace chromeos { +namespace input_method { + +// The implementation of AssistiveWindowController. +// AssistiveWindowController controls different assistive windows. +class AssistiveWindowControllerImpl + : public AssistiveWindowController, + public views::WidgetObserver, + public IMEAssistiveWindowHandlerInterface { + public: + AssistiveWindowControllerImpl(); + ~AssistiveWindowControllerImpl() override; + + // IMEAssistiveWindowHandlerInterface implementation. + void SetBounds(const gfx::Rect& cursor_bounds) override; + void ShowSuggestion(const base::string16& text, + const base::string16& confirmed_text, + const bool show_tab) override; + void HideSuggestion() override; + base::string16 GetSuggestionText() const override; + void FocusStateChanged() override; + void OnWidgetClosing(views::Widget* widget) override; + + void Init(); + + // The suggestion window view. + ui::ime::SuggestionWindowView* suggestion_window_view_ = nullptr; + + bool is_focused_ = false; + base::string16 suggestion_text_; + + DISALLOW_COPY_AND_ASSIGN(AssistiveWindowControllerImpl); +}; + +} // namespace input_method +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_ASSISTIVE_WINDOW_CONTROLLER_IMPL_H_
diff --git a/chrome/browser/chromeos/input_method/browser_state_monitor.cc b/chrome/browser/chromeos/input_method/browser_state_monitor.cc index 20c2844e..2a9aea5 100644 --- a/chrome/browser/chromeos/input_method/browser_state_monitor.cc +++ b/chrome/browser/chromeos/input_method/browser_state_monitor.cc
@@ -58,6 +58,8 @@ SetUiSessionState(InputMethodManager::STATE_BROWSER_SCREEN); } else if (session_state == session_manager::SessionState::LOCKED) { SetUiSessionState(InputMethodManager::STATE_LOCK_SCREEN); + } else if (session_state == session_manager::SessionState::LOGIN_SECONDARY) { + SetUiSessionState(InputMethodManager::STATE_SECONDARY_LOGIN_SCREEN); } }
diff --git a/chrome/browser/chromeos/input_method/input_method_engine.cc b/chrome/browser/chromeos/input_method/input_method_engine.cc index 8ca7977e..f47f052b97 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine.cc
@@ -236,10 +236,10 @@ return false; } - IMESuggestionWindowHandlerInterface* sw_handler = - ui::IMEBridge::Get()->GetSuggestionWindowHandler(); - if (sw_handler) - sw_handler->Show(text, confirmed_text, show_tab); + IMEAssistiveWindowHandlerInterface* aw_handler = + ui::IMEBridge::Get()->GetAssistiveWindowHandler(); + if (aw_handler) + aw_handler->ShowSuggestion(text, confirmed_text, show_tab); return true; } @@ -253,10 +253,10 @@ return false; } - IMESuggestionWindowHandlerInterface* sw_handler = - ui::IMEBridge::Get()->GetSuggestionWindowHandler(); - if (sw_handler) - sw_handler->Hide(); + IMEAssistiveWindowHandlerInterface* aw_handler = + ui::IMEBridge::Get()->GetAssistiveWindowHandler(); + if (aw_handler) + aw_handler->HideSuggestion(); return true; } @@ -270,17 +270,17 @@ return false; } - IMESuggestionWindowHandlerInterface* sw_handler = - ui::IMEBridge::Get()->GetSuggestionWindowHandler(); - if (sw_handler) { - base::string16 suggestion_text = sw_handler->GetText(); + IMEAssistiveWindowHandlerInterface* aw_handler = + ui::IMEBridge::Get()->GetAssistiveWindowHandler(); + if (aw_handler) { + base::string16 suggestion_text = aw_handler->GetSuggestionText(); if (suggestion_text.empty()) { *error = kSuggestionNotFound; return false; } CommitText(context_id_, (base::UTF16ToUTF8(suggestion_text)).c_str(), error); - sw_handler->Hide(); + aw_handler->HideSuggestion(); } return true; }
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc index 8badd952..4c65d9b 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -29,9 +29,9 @@ #include "base/time/time.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_chromeos.h" +#include "chrome/browser/chromeos/input_method/assistive_window_controller.h" #include "chrome/browser/chromeos/input_method/candidate_window_controller.h" #include "chrome/browser/chromeos/input_method/component_extension_ime_manager_impl.h" -#include "chrome/browser/chromeos/input_method/suggestion_window_controller.h" #include "chrome/browser/chromeos/language_preferences.h" #include "chrome/browser/chromeos/login/session/user_session_manager.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" @@ -885,7 +885,7 @@ // indicator is used by only keyboard layout input methods. if (state_.get() == state) { MaybeInitializeCandidateWindowController(); - MaybeInitializeSuggestionWindowController(); + MaybeInitializeAssistiveWindowController(); } } @@ -902,7 +902,7 @@ // candidate window, infolist and mode indicator. Note, mode // indicator is used by only keyboard layout input methods. MaybeInitializeCandidateWindowController(); - MaybeInitializeSuggestionWindowController(); + MaybeInitializeAssistiveWindowController(); // Always call ChangeInputMethodInternal even when the input method id // remain unchanged, because onActivate event needs to be sent to IME @@ -939,13 +939,11 @@ const InputMethodDescriptors& descriptors = component_extension_ime_manager_->GetAllIMEAsInputMethodDescriptor(); util_.ResetInputMethods(descriptors); - chromeos::UserAddingScreen::Get()->AddObserver(this); } InputMethodManagerImpl::~InputMethodManagerImpl() { if (candidate_window_controller_.get()) candidate_window_controller_->RemoveObserver(this); - chromeos::UserAddingScreen::Get()->RemoveObserver(this); } void InputMethodManagerImpl::RecordInputMethodUsage( @@ -1002,21 +1000,11 @@ if (ui_session_ == STATE_TERMINATING) { if (candidate_window_controller_.get()) candidate_window_controller_.reset(); - if (suggestion_window_controller_.get()) - suggestion_window_controller_.reset(); + if (assistive_window_controller_.get()) + assistive_window_controller_.reset(); } } -void InputMethodManagerImpl::OnUserAddingStarted() { - if (ui_session_ == STATE_BROWSER_SCREEN) - SetUISessionState(STATE_SECONDARY_LOGIN_SCREEN); -} - -void InputMethodManagerImpl::OnUserAddingFinished() { - if (ui_session_ == STATE_SECONDARY_LOGIN_SCREEN) - SetUISessionState(STATE_BROWSER_SCREEN); -} - std::unique_ptr<InputMethodDescriptors> InputMethodManagerImpl::GetSupportedInputMethods() const { return std::unique_ptr<InputMethodDescriptors>(new InputMethodDescriptors); @@ -1233,9 +1221,9 @@ candidate_window_controller_->AddObserver(this); } -void InputMethodManagerImpl::SetSuggestionWindowControllerForTesting( - SuggestionWindowController* suggestion_window_controller) { - suggestion_window_controller_.reset(suggestion_window_controller); +void InputMethodManagerImpl::SetAssistiveWindowControllerForTesting( + AssistiveWindowController* assistive_window_controller) { + assistive_window_controller_.reset(assistive_window_controller); } void InputMethodManagerImpl::SetImeKeyboardForTesting(ImeKeyboard* keyboard) { @@ -1299,12 +1287,12 @@ candidate_window_controller_->AddObserver(this); } -void InputMethodManagerImpl::MaybeInitializeSuggestionWindowController() { - if (suggestion_window_controller_.get()) +void InputMethodManagerImpl::MaybeInitializeAssistiveWindowController() { + if (assistive_window_controller_.get()) return; - suggestion_window_controller_.reset( - SuggestionWindowController::CreateSuggestionWindowController()); + assistive_window_controller_.reset( + AssistiveWindowController::CreateAssistiveWindowController()); } void InputMethodManagerImpl::NotifyImeMenuItemsChanged(
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.h b/chrome/browser/chromeos/input_method/input_method_manager_impl.h index ac7a1c4b..846f944 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.h +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.h
@@ -15,10 +15,9 @@ #include "base/macros.h" #include "base/observer_list.h" #include "base/threading/thread_checker.h" +#include "chrome/browser/chromeos/input_method/assistive_window_controller.h" #include "chrome/browser/chromeos/input_method/candidate_window_controller.h" #include "chrome/browser/chromeos/input_method/ime_service_connector.h" -#include "chrome/browser/chromeos/input_method/suggestion_window_controller.h" -#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" #include "chrome/browser/profiles/profile.h" #include "ui/base/ime/chromeos/input_method_manager.h" #include "ui/base/ime/chromeos/input_method_util.h" @@ -37,8 +36,7 @@ // The implementation of InputMethodManager. class InputMethodManagerImpl : public InputMethodManager, - public CandidateWindowController::Observer, - public UserAddingScreen::Observer { + public CandidateWindowController::Observer { public: class StateImpl : public InputMethodManager::State { public: @@ -219,10 +217,6 @@ void NotifyInputMethodExtensionRemoved( const std::string& extension_id) override; - // chromeos::UserAddingScreen: - void OnUserAddingStarted() override; - void OnUserAddingFinished() override; - ImeKeyboard* GetImeKeyboard() override; InputMethodUtil* GetInputMethodUtil() override; ComponentExtensionIMEManager* GetComponentExtensionIMEManager() override; @@ -241,9 +235,9 @@ // Sets |candidate_window_controller_|. void SetCandidateWindowControllerForTesting( CandidateWindowController* candidate_window_controller); - // Sets |suggestion_window_controller_|. - void SetSuggestionWindowControllerForTesting( - SuggestionWindowController* suggestion_window_controller); + // Sets |assistive_window_controller_|. + void SetAssistiveWindowControllerForTesting( + AssistiveWindowController* assistive_window_controller); // Sets |keyboard_|. void SetImeKeyboardForTesting(ImeKeyboard* keyboard); // Initialize |component_extension_manager_|. @@ -261,9 +255,9 @@ // Creates and initializes |candidate_window_controller_| if it hasn't been // done. void MaybeInitializeCandidateWindowController(); - // Creates and initializes |suggestion_window_controller_| if it hasn't been + // Creates and initializes |assistive_window_controller_| if it hasn't been // done. - void MaybeInitializeSuggestionWindowController(); + void MaybeInitializeAssistiveWindowController(); // Returns Input Method that best matches given id. const InputMethodDescriptor* LookupInputMethod( @@ -311,9 +305,9 @@ // The candidate window. This will be deleted when the APP_TERMINATING // message is sent. std::unique_ptr<CandidateWindowController> candidate_window_controller_; - // The suggestion window. This will be deleted when the APP_TERMINATING + // The assistive window. This will be deleted when the APP_TERMINATING // message is sent. - std::unique_ptr<SuggestionWindowController> suggestion_window_controller_; + std::unique_ptr<AssistiveWindowController> assistive_window_controller_; // An object which provides miscellaneous input method utility functions. Note // that |util_| is required to initialize |keyboard_|.
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc index 708078ab..978a1fe 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc
@@ -18,9 +18,9 @@ #include "base/macros.h" #include "base/run_loop.h" #include "base/test/task_environment.h" +#include "chrome/browser/chromeos/input_method/mock_assistive_window_controller.h" #include "chrome/browser/chromeos/input_method/mock_candidate_window_controller.h" #include "chrome/browser/chromeos/input_method/mock_input_method_engine.h" -#include "chrome/browser/chromeos/input_method/mock_suggestion_window_controller.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/ash/ime_controller_client.h" #include "chrome/browser/ui/ash/keyboard/chrome_keyboard_controller_client_test_helper.h" @@ -136,7 +136,7 @@ InputMethodManagerImplTest() : delegate_(nullptr), candidate_window_controller_(nullptr), - suggestion_window_controller_(nullptr), + assistive_window_controller_(nullptr), keyboard_(nullptr) {} ~InputMethodManagerImplTest() override = default; @@ -148,9 +148,9 @@ manager_.reset(new InputMethodManagerImpl( std::unique_ptr<InputMethodDelegate>(delegate_), false)); manager_->GetInputMethodUtil()->UpdateHardwareLayoutCache(); - suggestion_window_controller_ = new MockSuggestionWindowController; - manager_->SetSuggestionWindowControllerForTesting( - suggestion_window_controller_); + assistive_window_controller_ = new MockAssistiveWindowController; + manager_->SetAssistiveWindowControllerForTesting( + assistive_window_controller_); candidate_window_controller_ = new MockCandidateWindowController; manager_->SetCandidateWindowControllerForTesting( candidate_window_controller_); @@ -181,7 +181,7 @@ delegate_ = nullptr; candidate_window_controller_ = nullptr; - suggestion_window_controller_ = nullptr; + assistive_window_controller_ = nullptr; keyboard_ = nullptr; manager_.reset(); } @@ -372,7 +372,7 @@ std::unique_ptr<InputMethodManagerImpl> manager_; FakeInputMethodDelegate* delegate_; MockCandidateWindowController* candidate_window_controller_; - MockSuggestionWindowController* suggestion_window_controller_; + MockAssistiveWindowController* assistive_window_controller_; std::unique_ptr<MockInputMethodEngine> mock_engine_handler_; FakeImeKeyboard* keyboard_; MockComponentExtIMEManagerDelegate* mock_delegate_;
diff --git a/chrome/browser/chromeos/input_method/input_method_persistence.cc b/chrome/browser/chromeos/input_method/input_method_persistence.cc index 143ecf6..227d96af 100644 --- a/chrome/browser/chromeos/input_method/input_method_persistence.cc +++ b/chrome/browser/chromeos/input_method/input_method_persistence.cc
@@ -8,6 +8,7 @@ #include "base/system/sys_info.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/language_preferences.h" +#include "chrome/browser/chromeos/login/lock/screen_locker.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/pref_names.h" @@ -121,6 +122,12 @@ Profile* profile, bool show_message) { DCHECK_EQ(input_method_manager_, manager); + // We might get here during the locking process. When locker is already + // created but session state has not changed yet. + if (ScreenLocker::default_screen_locker()) { + // We use a special set of input methods on the lock screen. Do not update. + return; + } const std::string current_input_method = manager->GetActiveIMEState()->GetCurrentInputMethod().id(); // Save the new input method id depending on the current browser state.
diff --git a/chrome/browser/chromeos/input_method/mock_assistive_window_controller.cc b/chrome/browser/chromeos/input_method/mock_assistive_window_controller.cc new file mode 100644 index 0000000..664a962 --- /dev/null +++ b/chrome/browser/chromeos/input_method/mock_assistive_window_controller.cc
@@ -0,0 +1,15 @@ +// Copyright (c) 2012 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/chromeos/input_method/mock_assistive_window_controller.h" + +namespace chromeos { +namespace input_method { + +MockAssistiveWindowController::MockAssistiveWindowController() {} + +MockAssistiveWindowController::~MockAssistiveWindowController() = default; + +} // namespace input_method +} // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/mock_assistive_window_controller.h b/chrome/browser/chromeos/input_method/mock_assistive_window_controller.h new file mode 100644 index 0000000..50fd0b38 --- /dev/null +++ b/chrome/browser/chromeos/input_method/mock_assistive_window_controller.h
@@ -0,0 +1,26 @@ +// Copyright (c) 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_CHROMEOS_INPUT_METHOD_MOCK_ASSISTIVE_WINDOW_CONTROLLER_H_ +#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_MOCK_ASSISTIVE_WINDOW_CONTROLLER_H_ + +#include "base/macros.h" +#include "chrome/browser/chromeos/input_method/assistive_window_controller.h" + +namespace chromeos { +namespace input_method { + +// The mock AssistiveWindowController implementation for testing. +class MockAssistiveWindowController : public AssistiveWindowController { + public: + MockAssistiveWindowController(); + ~MockAssistiveWindowController() override; + + DISALLOW_COPY_AND_ASSIGN(MockAssistiveWindowController); +}; + +} // namespace input_method +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_MOCK_ASSISTIVE_WINDOW_CONTROLLER_H_
diff --git a/chrome/browser/chromeos/input_method/mock_suggestion_window_controller.cc b/chrome/browser/chromeos/input_method/mock_suggestion_window_controller.cc deleted file mode 100644 index 6ed08bf..0000000 --- a/chrome/browser/chromeos/input_method/mock_suggestion_window_controller.cc +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright (c) 2012 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/chromeos/input_method/mock_suggestion_window_controller.h" - -namespace chromeos { -namespace input_method { - -MockSuggestionWindowController::MockSuggestionWindowController() {} - -MockSuggestionWindowController::~MockSuggestionWindowController() = default; - -} // namespace input_method -} // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/mock_suggestion_window_controller.h b/chrome/browser/chromeos/input_method/mock_suggestion_window_controller.h deleted file mode 100644 index d4f4e46..0000000 --- a/chrome/browser/chromeos/input_method/mock_suggestion_window_controller.h +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright (c) 2012 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_CHROMEOS_INPUT_METHOD_MOCK_SUGGESTION_WINDOW_CONTROLLER_H_ -#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_MOCK_SUGGESTION_WINDOW_CONTROLLER_H_ - -#include "base/macros.h" -#include "chrome/browser/chromeos/input_method/suggestion_window_controller.h" - -namespace chromeos { -namespace input_method { - -// The mock SuggestionWindowController implementation for testing. -class MockSuggestionWindowController : public SuggestionWindowController { - public: - MockSuggestionWindowController(); - ~MockSuggestionWindowController() override; - - DISALLOW_COPY_AND_ASSIGN(MockSuggestionWindowController); -}; - -} // namespace input_method -} // namespace chromeos - -#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_MOCK_SUGGESTION_WINDOW_CONTROLLER_H_
diff --git a/chrome/browser/chromeos/input_method/suggestion_window_controller.cc b/chrome/browser/chromeos/input_method/suggestion_window_controller.cc deleted file mode 100644 index c8667dd..0000000 --- a/chrome/browser/chromeos/input_method/suggestion_window_controller.cc +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright (c) 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/chromeos/input_method/suggestion_window_controller.h" - -#include "chrome/browser/chromeos/input_method/suggestion_window_controller_impl.h" - -namespace chromeos { -namespace input_method { - -// static -SuggestionWindowController* -SuggestionWindowController::CreateSuggestionWindowController() { - return new SuggestionWindowControllerImpl; -} - -} // namespace input_method -} // namespace chromeos
diff --git a/chrome/browser/chromeos/input_method/suggestion_window_controller.h b/chrome/browser/chromeos/input_method/suggestion_window_controller.h deleted file mode 100644 index 699060e0..0000000 --- a/chrome/browser/chromeos/input_method/suggestion_window_controller.h +++ /dev/null
@@ -1,31 +0,0 @@ -// Copyright (c) 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. -// -// This file implements the input method suggestion window used on Chrome OS. - -#ifndef CHROME_BROWSER_CHROMEOS_INPUT_METHOD_SUGGESTION_WINDOW_CONTROLLER_H_ -#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_SUGGESTION_WINDOW_CONTROLLER_H_ - -namespace chromeos { -namespace input_method { - -// SuggestionWindowController is used for controlling the input method -// suggestion window. Once the initialization is done, the controller -// starts monitoring signals sent from the the background input method -// daemon, and shows and hides the suggestion window as needed. Upon -// deletion of the object, monitoring stops and the view used for -// rendering the suggestion view is deleted. -class SuggestionWindowController { - public: - virtual ~SuggestionWindowController() = default; - - // Gets an instance of SuggestionWindowController. Caller has to delete the - // returned object. - static SuggestionWindowController* CreateSuggestionWindowController(); -}; - -} // namespace input_method -} // namespace chromeos - -#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_SUGGESTION_WINDOW_CONTROLLER_H_
diff --git a/chrome/browser/chromeos/input_method/suggestion_window_controller_impl.h b/chrome/browser/chromeos/input_method/suggestion_window_controller_impl.h deleted file mode 100644 index 066f40d..0000000 --- a/chrome/browser/chromeos/input_method/suggestion_window_controller_impl.h +++ /dev/null
@@ -1,56 +0,0 @@ -// Copyright (c) 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_CHROMEOS_INPUT_METHOD_SUGGESTION_WINDOW_CONTROLLER_IMPL_H_ -#define CHROME_BROWSER_CHROMEOS_INPUT_METHOD_SUGGESTION_WINDOW_CONTROLLER_IMPL_H_ - -#include <memory> - -#include "base/macros.h" -#include "chrome/browser/chromeos/input_method/suggestion_window_controller.h" -#include "ui/base/ime/ime_suggestion_window_handler_interface.h" -#include "ui/chromeos/ime/suggestion_window_view.h" - -namespace views { -class Widget; -} // namespace views - -namespace chromeos { -namespace input_method { - -// The implementation of SuggestionWindowController. -// SuggestionWindowController controls the SuggestionWindow. -class SuggestionWindowControllerImpl - : public SuggestionWindowController, - public views::WidgetObserver, - public IMESuggestionWindowHandlerInterface { - public: - SuggestionWindowControllerImpl(); - ~SuggestionWindowControllerImpl() override; - - // IMESuggestionWindowHandlerInterface implementation. - void SetBounds(const gfx::Rect& cursor_bounds) override; - void Show(const base::string16& text, - const base::string16& confirmed_text, - const bool show_tab) override; - void Hide() override; - base::string16 GetText() const override; - void FocusStateChanged() override; - void OnWidgetClosing(views::Widget* widget) override; - - void Init(); - - // The suggestion window view. - ui::ime::SuggestionWindowView* suggestion_window_view_ = nullptr; - - bool is_focused_ = false; - base::string16 suggestion_text_; - - DISALLOW_COPY_AND_ASSIGN(SuggestionWindowControllerImpl); -}; - -} // namespace input_method -} // namespace chromeos - -#endif // CHROME_BROWSER_CHROMEOS_INPUT_METHOD_SUGGESTION_WINDOW_CONTROLLER_IMPL_H_
diff --git a/chrome/browser/chromeos/login/lock/lock_screen_browsertest.cc b/chrome/browser/chromeos/login/lock/lock_screen_browsertest.cc new file mode 100644 index 0000000..5eabbb6 --- /dev/null +++ b/chrome/browser/chromeos/login/lock/lock_screen_browsertest.cc
@@ -0,0 +1,101 @@ +// 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 "ash/public/cpp/login_screen_test_api.h" +#include "chrome/browser/chromeos/login/lock/screen_locker_tester.h" +#include "chrome/browser/chromeos/login/login_manager_test.h" +#include "chrome/browser/chromeos/login/test/login_manager_mixin.h" +#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" +#include "components/user_manager/user_manager.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/ime/chromeos/input_method_manager.h" + +namespace chromeos { +namespace { + +class LockScreenTest : public LoginManagerTest { + public: + LockScreenTest() { login_manager_.AppendRegularUsers(2); } + + void SetUpOnMainThread() override { + LoginManagerTest::SetUpOnMainThread(); + user_input_methods_.push_back("xkb:fr::fra"); + user_input_methods_.push_back("xkb:de::ger"); + + chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods( + &user_input_methods_); + } + + ~LockScreenTest() override = default; + + protected: + std::vector<std::string> user_input_methods_; + LoginManagerMixin login_manager_{&mixin_host_}; +}; + +IN_PROC_BROWSER_TEST_F(LockScreenTest, CheckIMESwitches) { + const auto& users = login_manager_.users(); + LoginUser(users[0].account_id); + scoped_refptr<input_method::InputMethodManager::State> ime_states[2] = { + nullptr, nullptr}; + input_method::InputMethodManager* input_manager = + input_method::InputMethodManager::Get(); + ime_states[0] = input_manager->GetActiveIMEState(); + ASSERT_TRUE(ime_states[0]->EnableInputMethod(user_input_methods_[0])); + ime_states[0]->ChangeInputMethod(user_input_methods_[0], false); + EXPECT_EQ(ime_states[0]->GetCurrentInputMethod().id(), + user_input_methods_[0]); + + UserAddingScreen::Get()->Start(); + AddUser(users[1].account_id); + EXPECT_EQ(users[1].account_id, + user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()); + ime_states[1] = input_manager->GetActiveIMEState(); + ASSERT_TRUE(ime_states[1]->EnableInputMethod(user_input_methods_[1])); + ime_states[1]->ChangeInputMethod(user_input_methods_[1], false); + EXPECT_EQ(ime_states[1]->GetCurrentInputMethod().id(), + user_input_methods_[1]); + + ASSERT_NE(ime_states[0], ime_states[1]); + + ScreenLockerTester locker_tester; + locker_tester.Lock(); + EXPECT_EQ(2, ash::LoginScreenTestApi::GetUsersCount()); + // IME state should be lock screen specific. + EXPECT_NE(ime_states[0], input_manager->GetActiveIMEState()); + EXPECT_NE(ime_states[1], input_manager->GetActiveIMEState()); + + EXPECT_EQ(users[0].account_id, ash::LoginScreenTestApi::GetFocusedUser()); + EXPECT_EQ(input_manager->GetActiveIMEState()->GetCurrentInputMethod().id(), + user_input_methods_[0]); + locker_tester.UnlockWithPassword(users[0].account_id, "password"); + locker_tester.WaitForUnlock(); + EXPECT_EQ(users[0].account_id, + user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()); + EXPECT_EQ(ime_states[0], input_manager->GetActiveIMEState()); + EXPECT_EQ(ime_states[0]->GetCurrentInputMethod().id(), + user_input_methods_[0]); + + locker_tester.Lock(); + EXPECT_EQ(2, ash::LoginScreenTestApi::GetUsersCount()); + // IME state should be lock screen specific. + EXPECT_NE(ime_states[0], input_manager->GetActiveIMEState()); + EXPECT_NE(ime_states[1], input_manager->GetActiveIMEState()); + + EXPECT_EQ(users[0].account_id, ash::LoginScreenTestApi::GetFocusedUser()); + EXPECT_EQ(input_manager->GetActiveIMEState()->GetCurrentInputMethod().id(), + user_input_methods_[0]); + EXPECT_TRUE(ash::LoginScreenTestApi::FocusUser(users[1].account_id)); + EXPECT_EQ(input_manager->GetActiveIMEState()->GetCurrentInputMethod().id(), + user_input_methods_[1]); + locker_tester.UnlockWithPassword(users[1].account_id, "password"); + EXPECT_EQ(users[1].account_id, + user_manager::UserManager::Get()->GetActiveUser()->GetAccountId()); + EXPECT_EQ(ime_states[1], input_manager->GetActiveIMEState()); + EXPECT_EQ(ime_states[1]->GetCurrentInputMethod().id(), + user_input_methods_[1]); +} + +} // namespace +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/lock/screen_locker_tester.cc b/chrome/browser/chromeos/login/lock/screen_locker_tester.cc index 5ece595..3cb2050 100644 --- a/chrome/browser/chromeos/login/lock/screen_locker_tester.cc +++ b/chrome/browser/chromeos/login/lock/screen_locker_tester.cc
@@ -96,6 +96,17 @@ base::RunLoop().RunUntilIdle(); } +void ScreenLockerTester::WaitForUnlock() { + content::WindowedNotificationObserver lock_state_observer( + chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED, + content::NotificationService::AllSources()); + if (IsLocked()) + lock_state_observer.Wait(); + ASSERT_TRUE(!IsLocked()); + ASSERT_EQ(session_manager::SessionState::ACTIVE, + session_manager::SessionManager::Get()->session_state()); +} + void ScreenLockerTester::SetUnlockPassword(const AccountId& account_id, const std::string& password) { UserContext user_context(user_manager::UserType::USER_TYPE_REGULAR,
diff --git a/chrome/browser/chromeos/login/lock/screen_locker_tester.h b/chrome/browser/chromeos/login/lock/screen_locker_tester.h index ed24015..54ae4f5 100644 --- a/chrome/browser/chromeos/login/lock/screen_locker_tester.h +++ b/chrome/browser/chromeos/login/lock/screen_locker_tester.h
@@ -22,6 +22,8 @@ // Synchronously lock the device. void Lock(); + void WaitForUnlock(); + // Injects authenticators that only authenticate with the given password. void SetUnlockPassword(const AccountId& account_id, const std::string& password);
diff --git a/chrome/browser/chromeos/login/login_ui_browsertest.cc b/chrome/browser/chromeos/login/login_ui_browsertest.cc index bd4caf3..0fa27e2 100644 --- a/chrome/browser/chromeos/login/login_ui_browsertest.cc +++ b/chrome/browser/chromeos/login/login_ui_browsertest.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/login/test/device_state_mixin.h" #include "chrome/browser/chromeos/login/test/js_checker.h" +#include "chrome/browser/chromeos/login/test/local_state_mixin.h" #include "chrome/browser/chromeos/login/test/login_manager_mixin.h" #include "chrome/browser/chromeos/login/test/oobe_base_test.h" #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" @@ -20,16 +21,23 @@ namespace chromeos { -IN_PROC_BROWSER_TEST_F(OobeBaseTest, PRE_InterruptedAutoStartEnrollment) { - StartupUtils::MarkOobeCompleted(); - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kDeviceEnrollmentAutoStart, true); - prefs->SetBoolean(prefs::kDeviceEnrollmentCanExit, false); -} +class InterruptedAutoStartEnrollmentTest : public OobeBaseTest, + public LocalStateMixin::Delegate { + public: + InterruptedAutoStartEnrollmentTest() = default; + ~InterruptedAutoStartEnrollmentTest() override = default; + + void SetUpLocalState() override { + StartupUtils::MarkOobeCompleted(); + PrefService* prefs = g_browser_process->local_state(); + prefs->SetBoolean(prefs::kDeviceEnrollmentAutoStart, true); + prefs->SetBoolean(prefs::kDeviceEnrollmentCanExit, false); + } +}; // Tests that the default first screen is the welcome screen after OOBE // when auto enrollment is enabled and device is not yet enrolled. -IN_PROC_BROWSER_TEST_F(OobeBaseTest, InterruptedAutoStartEnrollment) { +IN_PROC_BROWSER_TEST_F(InterruptedAutoStartEnrollmentTest, ShowsWelcome) { OobeScreenWaiter(WelcomeView::kScreenId).Wait(); }
diff --git a/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc index e46636d..8b5b4aed 100644 --- a/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc +++ b/chrome/browser/chromeos/login/login_ui_keyboard_browsertest.cc
@@ -10,11 +10,13 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/input_method/input_method_persistence.h" #include "chrome/browser/chromeos/language_preferences.h" +#include "chrome/browser/chromeos/login/lock_screen_utils.h" #include "chrome/browser/chromeos/login/login_manager_test.h" #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/login/test/js_checker.h" #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h" #include "chrome/browser/chromeos/login/ui/login_display_host.h" +#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" #include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h" #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" #include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h" @@ -34,6 +36,11 @@ constexpr char kTestUser3[] = "test-user3@gmail.com"; constexpr char kTestUser3GaiaId[] = "3333333333"; +void Append_en_US_InputMethod(std::vector<std::string>* out) { + out->push_back("xkb:us::eng"); + chromeos::input_method::InputMethodManager::Get()->MigrateInputMethods(out); +} + void Append_en_US_InputMethods(std::vector<std::string>* out) { out->push_back("xkb:us::eng"); out->push_back("xkb:us:intl:eng"); @@ -87,6 +94,70 @@ std::vector<AccountId> test_users_; }; +class LoginUIUserAddingKeyboardTest : public LoginUIKeyboardTest { + public: + LoginUIUserAddingKeyboardTest() { + test_users_.push_back( + AccountId::FromUserEmailGaiaId(kTestUser3, kTestUser3GaiaId)); + } + + protected: + void FocusUserPod(const AccountId& account_id) { + test::ExecuteOobeJS( + base::StringPrintf(R"($('pod-row').focusPod($('pod-row'))" + R"(.getPodWithUsername_('%s'), true))", + account_id.Serialize().c_str())); + } +}; + +IN_PROC_BROWSER_TEST_F(LoginUIUserAddingKeyboardTest, PRE_CheckPODSwitches) { + RegisterUser(test_users_[0]); + RegisterUser(test_users_[1]); + RegisterUser(test_users_[2]); + InitUserLastInputMethod(); + StartupUtils::MarkOobeCompleted(); +} + +IN_PROC_BROWSER_TEST_F(LoginUIUserAddingKeyboardTest, CheckPODSwitches) { + EXPECT_EQ( + lock_screen_utils::GetUserLastInputMethod(test_users_[2].GetUserEmail()), + std::string()); + LoginUser(test_users_[2]); + UserAddingScreen::Get()->Start(); + OobeScreenWaiter(OobeScreen::SCREEN_ACCOUNT_PICKER).Wait(); + + std::vector<std::string> expected_input_methods; + expected_input_methods.push_back(user_input_methods[0]); + // Append just one. + Append_en_US_InputMethod(&expected_input_methods); + + EXPECT_EQ(expected_input_methods, input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->GetActiveInputMethodIds()); + + EXPECT_EQ(user_input_methods[0], input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->GetCurrentInputMethod() + .id()); + + FocusUserPod(test_users_[1]); + EXPECT_EQ(user_input_methods[1], input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->GetCurrentInputMethod() + .id()); + + FocusUserPod(test_users_[0]); + EXPECT_EQ(user_input_methods[0], input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->GetCurrentInputMethod() + .id()); + + // Check that logged in user settings did not change. + EXPECT_EQ( + lock_screen_utils::GetUserLastInputMethod(test_users_[2].GetUserEmail()), + std::string()); +} + IN_PROC_BROWSER_TEST_F(LoginUIKeyboardTest, PRE_CheckPODScreenDefault) { RegisterUser(test_users_[0]); RegisterUser(test_users_[1]); @@ -141,6 +212,13 @@ ->GetActiveIMEState() ->GetCurrentInputMethod() .id()); + + EXPECT_TRUE(ash::LoginScreenTestApi::FocusUser(test_users_[0])); + + EXPECT_EQ(user_input_methods[0], input_method::InputMethodManager::Get() + ->GetActiveIMEState() + ->GetCurrentInputMethod() + .id()); } class LoginUIKeyboardTestWithUsersAndOwner : public chromeos::LoginManagerTest {
diff --git a/chrome/browser/chromeos/login/reset_browsertest.cc b/chrome/browser/chromeos/login/reset_browsertest.cc index c7945741..742f3d2 100644 --- a/chrome/browser/chromeos/login/reset_browsertest.cc +++ b/chrome/browser/chromeos/login/reset_browsertest.cc
@@ -8,12 +8,12 @@ #include "base/command_line.h" #include "base/scoped_observer.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/chromeos/login/login_wizard.h" #include "chrome/browser/chromeos/login/oobe_screen.h" #include "chrome/browser/chromeos/login/screens/reset_screen.h" #include "chrome/browser/chromeos/login/startup_utils.h" #include "chrome/browser/chromeos/login/test/js_checker.h" +#include "chrome/browser/chromeos/login/test/local_state_mixin.h" #include "chrome/browser/chromeos/login/test/login_manager_mixin.h" #include "chrome/browser/chromeos/login/test/oobe_base_test.h" #include "chrome/browser/chromeos/login/test/oobe_screen_exit_waiter.h" @@ -113,65 +113,16 @@ "open", {kResetScreen, kConfirmationDialog, kHelpDialog}); } -// Helper class that tracks whether 'login-prompt-visible' signal was requested -// from the session manager service. -class LoginPromptVisibleObserver : public SessionManagerClient::Observer { - public: - explicit LoginPromptVisibleObserver( - SessionManagerClient* session_manager_client) { - observer_.Add(session_manager_client); - } - ~LoginPromptVisibleObserver() override = default; - - bool signal_emitted() const { return signal_emitted_; } - - // SessionManagerClient::Observer: - void EmitLoginPromptVisibleCalled() override { - ASSERT_FALSE(signal_emitted_); - signal_emitted_ = true; - } - - private: - bool signal_emitted_ = false; - - ScopedObserver<SessionManagerClient, SessionManagerClient::Observer> - observer_{this}; - - DISALLOW_COPY_AND_ASSIGN(LoginPromptVisibleObserver); -}; - } // namespace -class ResetTest : public MixinBasedInProcessBrowserTest { +class ResetTest : public OobeBaseTest, public LocalStateMixin::Delegate { public: ResetTest() = default; ~ResetTest() override = default; - // LoginManagerTest overrides: - void SetUpInProcessBrowserTestFixture() override { - std::unique_ptr<DBusThreadManagerSetter> dbus_setter = - chromeos::DBusThreadManager::GetSetterForTesting(); - update_engine_client_ = new FakeUpdateEngineClient; - dbus_setter->SetUpdateEngineClient( - std::unique_ptr<UpdateEngineClient>(update_engine_client_)); - - SessionManagerClient::InitializeFakeInMemory(); - login_prompt_visible_observer_ = - std::make_unique<LoginPromptVisibleObserver>( - SessionManagerClient::Get()); - - MixinBasedInProcessBrowserTest::SetUpInProcessBrowserTestFixture(); - } - - void TearDownOnMainThread() override { - login_prompt_visible_observer_.reset(); - MixinBasedInProcessBrowserTest::TearDownOnMainThread(); - } - // Simulates reset screen request from views based login. void InvokeResetScreen() { chromeos::LoginDisplayHost::default_host()->ShowResetScreen(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); OobeScreenWaiter(ResetView::kScreenId).Wait(); test::OobeJS() .CreateVisibilityWaiter(true /* visible */, {kResetScreen}) @@ -180,8 +131,9 @@ ExpectConfirmationDialogClosed(); } - FakeUpdateEngineClient* update_engine_client_ = nullptr; - std::unique_ptr<LoginPromptVisibleObserver> login_prompt_visible_observer_; + void SetUpLocalState() override {} + + LocalStateMixin local_state_mixin_{&mixin_host_, this}; private: LoginManagerMixin::TestUserInfo test_user_{ @@ -223,25 +175,19 @@ command_line->AppendSwitch(switches::kFirstExecAfterBoot); } - void SetUpOnMainThread() override { - DBusThreadManager::Get() - ->GetShillManagerClient() - ->GetTestInterface() - ->SetupDefaultEnvironment(); + void SetUpLocalState() override { + PrefService* prefs = g_browser_process->local_state(); + prefs->SetBoolean(prefs::kFactoryResetRequested, true); } }; -class ResetFirstAfterBootTestWithRollback : public ResetTest { +class ResetFirstAfterBootTestWithRollback : public ResetFirstAfterBootTest { public: ~ResetFirstAfterBootTestWithRollback() override = default; - void SetUpCommandLine(base::CommandLine* command_line) override { - ResetTest::SetUpCommandLine(command_line); - command_line->AppendSwitch(switches::kFirstExecAfterBoot); - } void SetUpInProcessBrowserTestFixture() override { - ResetTest::SetUpInProcessBrowserTestFixture(); - update_engine_client_->set_can_rollback_check_result(true); + ResetFirstAfterBootTest::SetUpInProcessBrowserTestFixture(); + update_engine_client()->set_can_rollback_check_result(true); } }; @@ -297,6 +243,15 @@ tpm_firmware_update_checker_callback_; }; +class ResetTestWithTpmFirmwareUpdateRequested + : public ResetTestWithTpmFirmwareUpdate { + public: + void SetUpLocalState() override { + PrefService* prefs = g_browser_process->local_state(); + prefs->SetBoolean(prefs::kFactoryResetRequested, true); + } +}; + IN_PROC_BROWSER_TEST_F(ResetTest, ShowAndCancel) { EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown()); InvokeResetScreen(); @@ -345,26 +300,13 @@ EXPECT_EQ(0, update_engine_client()->rollback_call_count()); } -// TODO(http://crbug.com/990362): Times out on MSAN buildbots. -#if defined(MEMORY_SANITIZER) -#define MAYBE_PRE_ViewsLogic DISABLED_PRE_ViewsLogic -#else -#define MAYBE_PRE_ViewsLogic PRE_ViewsLogic -#endif - -IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, MAYBE_PRE_ViewsLogic) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); - update_engine_client_->set_can_rollback_check_result(false); -} - // See http://crbug.com/990362 for details. // TODO(crbug.com/1049789): Re-enable this test. IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, DISABLED_ViewsLogic) { PrefService* prefs = g_browser_process->local_state(); // Rollback unavailable. Show and cancel. - update_engine_client_->set_can_rollback_check_result(false); + update_engine_client()->set_can_rollback_check_result(false); InvokeResetScreen(); CloseResetScreenAndWait(); EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown()); @@ -385,7 +327,7 @@ EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown()); // Rollback available. Show and cancel from confirmation screen. - update_engine_client_->set_can_rollback_check_result(true); + update_engine_client()->set_can_rollback_check_result(true); prefs->SetBoolean(prefs::kFactoryResetRequested, true); InvokeResetScreen(); InvokeRollbackOption(); @@ -401,14 +343,8 @@ EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown()); } -IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_ShowAfterBootIfRequested) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); -} - IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, ShowAfterBootIfRequested) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); test::OobeJS().CreateVisibilityWaiter(true, {kResetScreen})->Wait(); @@ -417,23 +353,18 @@ EXPECT_TRUE(ash::LoginScreenTestApi::IsGuestButtonShown()); } -IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, PRE_RollbackUnavailable) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); -} - IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTest, RollbackUnavailable) { InvokeResetScreen(); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); InvokeRollbackOption(); // No changes ClickToConfirmButton(); ClickResetButton(); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); CloseResetScreenAndWait(); // Next invocation leads to rollback view. @@ -444,16 +375,10 @@ ClickResetButton(); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); CloseResetScreenAndWait(); } -IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, - PRE_RollbackAvailable) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); -} - // TODO(http://crbug.com/990362): Times out on MSAN buildbots. // TODO(http://crbug.com/990362): Flaky failures. IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, @@ -464,17 +389,16 @@ OobeScreenWaiter(ResetView::kScreenId).Wait(); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_FALSE(ash::LoginScreenTestApi::IsGuestButtonShown()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); ClickToConfirmButton(); ClickResetButton(); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(1, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); CloseResetScreenAndWait(); // Next invocation leads to simple reset, not rollback view. @@ -491,7 +415,7 @@ ClickResetButton(); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); CloseResetScreenAndWait(); prefs->SetBoolean(prefs::kFactoryResetRequested, true); @@ -501,23 +425,16 @@ ClickResetButton(); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(2, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(1, update_engine_client_->rollback_call_count()); -} - -IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, - PRE_ErrorOnRollbackRequested) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); + EXPECT_EQ(1, update_engine_client()->rollback_call_count()); } IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, ErrorOnRollbackRequested) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); test::OobeJS().ExpectHasNoClass("revert-promise-view", {kResetScreen}); InvokeRollbackOption(); @@ -526,12 +443,12 @@ EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(1, update_engine_client_->rollback_call_count()); + EXPECT_EQ(1, update_engine_client()->rollback_call_count()); test::OobeJS().ExpectHasClass("revert-promise-view", {kResetScreen}); update_engine::StatusResult error_update_status; error_update_status.set_current_operation(update_engine::Operation::ERROR); - update_engine_client_->NotifyObserversThatStatusChanged(error_update_status); + update_engine_client()->NotifyObserversThatStatusChanged(error_update_status); OobeScreenWaiter(ErrorScreenView::kScreenId).Wait(); // Clicking 'ok' on the error screen will either show the previous OOBE screen @@ -542,22 +459,15 @@ OobeWindowVisibilityWaiter(false).Wait(); } -IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, - PRE_RevertAfterCancel) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); -} - // TODO(http://crbug.com/1025926): Times out on MSAN buildbots. // TODO(http://crbug.com/990362): Flaky failures. IN_PROC_BROWSER_TEST_F(ResetFirstAfterBootTestWithRollback, DISABLED_RevertAfterCancel) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls()); EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count()); - EXPECT_EQ(0, update_engine_client_->rollback_call_count()); + EXPECT_EQ(0, update_engine_client()->rollback_call_count()); test::OobeJS().ExpectVisible(kResetScreen); test::OobeJS().ExpectHasNoClass("rollback-proposal-view", {kResetScreen}); @@ -591,7 +501,6 @@ IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ResetFromSigninWithFirmwareUpdate) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck()); FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash}); @@ -619,16 +528,9 @@ FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode()); } -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, - PRE_TpmFirmwareUpdateAvailableButNotSelected) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); -} - -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, +IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdateRequested, TpmFirmwareUpdateAvailableButNotSelected) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); ASSERT_TRUE(HasPendingTpmFirmwareUpdateCheck()); FinishPendingTpmFirmwareUpdateCheck({tpm_firmware_update::Mode::kPowerwash}); @@ -646,17 +548,20 @@ EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); } -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, - PRE_ResetWithTpmCleanUp) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); - prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode, - static_cast<int>(tpm_firmware_update::Mode::kCleanup)); -} +class ResetTestWithTpmFirmwareUpdateCleanup + : public ResetTestWithTpmFirmwareUpdate { + public: + void SetUpLocalState() override { + PrefService* prefs = g_browser_process->local_state(); + prefs->SetBoolean(prefs::kFactoryResetRequested, true); + prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode, + static_cast<int>(tpm_firmware_update::Mode::kCleanup)); + } +}; -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, ResetWithTpmCleanUp) { +IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdateCleanup, + ResetWithTpmCleanUp) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); test::OobeJS() @@ -680,19 +585,21 @@ FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode()); } -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, - PRE_ResetWithTpmUpdatePreservingDeviceState) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); - prefs->SetInteger( - prefs::kFactoryResetTPMFirmwareUpdateMode, - static_cast<int>(tpm_firmware_update::Mode::kPreserveDeviceState)); -} +class ResetTestWithTpmFirmwareUpdatePreserve + : public ResetTestWithTpmFirmwareUpdate { + public: + void SetUpLocalState() override { + PrefService* prefs = g_browser_process->local_state(); + prefs->SetBoolean(prefs::kFactoryResetRequested, true); + prefs->SetInteger( + prefs::kFactoryResetTPMFirmwareUpdateMode, + static_cast<int>(tpm_firmware_update::Mode::kPreserveDeviceState)); + } +}; -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, +IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdatePreserve, ResetWithTpmUpdatePreservingDeviceState) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); test::OobeJS() @@ -718,21 +625,23 @@ FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode()); } -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, - PRE_TpmFirmwareUpdateRequestedBeforeShowNotEditable) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); - prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode, - static_cast<int>(tpm_firmware_update::Mode::kPowerwash)); -} +class ResetTestWithTpmFirmwareUpdatePowerwash + : public ResetTestWithTpmFirmwareUpdate { + public: + void SetUpLocalState() override { + PrefService* prefs = g_browser_process->local_state(); + prefs->SetBoolean(prefs::kFactoryResetRequested, true); + prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode, + static_cast<int>(tpm_firmware_update::Mode::kPowerwash)); + } +}; // Tests that clicking TPM firmware update checkbox is no-op if the update was // requested before the Reset screen was shown (e.g. on previous boot in // settings, or by policy). -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, +IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdatePowerwash, TpmFirmwareUpdateRequestedBeforeShowNotEditable) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); test::OobeJS() @@ -760,18 +669,9 @@ FakeSessionManagerClient::Get()->last_tpm_firmware_update_mode()); } -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, - PRE_AvailableTpmUpdateModesChangeDuringRequest) { - PrefService* prefs = g_browser_process->local_state(); - prefs->SetBoolean(prefs::kFactoryResetRequested, true); - prefs->SetInteger(prefs::kFactoryResetTPMFirmwareUpdateMode, - static_cast<int>(tpm_firmware_update::Mode::kPowerwash)); -} - -IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdate, +IN_PROC_BROWSER_TEST_F(ResetTestWithTpmFirmwareUpdatePowerwash, AvailableTpmUpdateModesChangeDuringRequest) { OobeScreenWaiter(ResetView::kScreenId).Wait(); - EXPECT_TRUE(login_prompt_visible_observer_->signal_emitted()); EXPECT_FALSE(HasPendingTpmFirmwareUpdateCheck()); test::OobeJS()
diff --git a/chrome/browser/chromeos/login/screens/gesture_navigation_screen.cc b/chrome/browser/chromeos/login/screens/gesture_navigation_screen.cc index 1ca1a7c..9c976c7 100644 --- a/chrome/browser/chromeos/login/screens/gesture_navigation_screen.cc +++ b/chrome/browser/chromeos/login/screens/gesture_navigation_screen.cc
@@ -104,6 +104,7 @@ ash::prefs::kGestureEducationNotificationShown, true); RecordPageShownTimeMetrics(); + was_shown_ = true; exit_callback_.Run(Result::NEXT); } else { BaseScreen::OnUserAction(action_id);
diff --git a/chrome/browser/chromeos/login/screens/gesture_navigation_screen.h b/chrome/browser/chromeos/login/screens/gesture_navigation_screen.h index cb854d3..c975f96 100644 --- a/chrome/browser/chromeos/login/screens/gesture_navigation_screen.h +++ b/chrome/browser/chromeos/login/screens/gesture_navigation_screen.h
@@ -37,6 +37,9 @@ return exit_callback_; } + // Returns whether the gesture screen was shown. + bool was_shown() const { return was_shown_; } + // Called when the currently shown page is changed. void GesturePageChange(const std::string& new_page); @@ -65,6 +68,9 @@ // The starting time for the most recently shown page. base::TimeTicks start_time_; + + // Whether the gesture screen was shown. + bool was_shown_ = false; }; } // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc index 4634ab8..16f8be2 100644 --- a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc +++ b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.cc
@@ -22,8 +22,10 @@ #include "chrome/browser/chromeos/login/screen_manager.h" #include "chrome/browser/chromeos/login/screens/gesture_navigation_screen.h" #include "chrome/browser/chromeos/login/users/chrome_user_manager_util.h" +#include "chrome/browser/chromeos/login/wizard_controller.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/ui/webui/chromeos/login/gesture_navigation_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h" #include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" @@ -154,6 +156,14 @@ */ view_->SetEmailToggleState(IsDefaultOptInCountry(country_)); + // Only show the link for accessibility settings if the gesture navigation + // screen was shown. + view_->UpdateA11ySettingsButtonVisibility( + static_cast<GestureNavigationScreen*>( + WizardController::default_controller()->screen_manager()->GetScreen( + GestureNavigationScreenView::kScreenId)) + ->was_shown()); + view_->UpdateA11yShelfNavigationButtonToggle(prefs->GetBoolean( ash::prefs::kAccessibilityTabletModeShelfNavigationButtonsEnabled)); @@ -196,6 +206,10 @@ ExitScreen(); } +void MarketingOptInScreen::SetA11yButtonVisibilityForTest(bool shown) { + view_->UpdateA11ySettingsButtonVisibility(shown); +} + void MarketingOptInScreen::ExitScreen() { if (!active_) return;
diff --git a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.h b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.h index c1611032..58adb707 100644 --- a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.h +++ b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen.h
@@ -48,6 +48,8 @@ // On "Get Started" button pressed. void OnGetStarted(bool chromebook_email_opt_in); + void SetA11yButtonVisibilityForTest(bool shown); + void set_exit_callback_for_testing( const base::RepeatingClosure& exit_callback) { exit_callback_ = exit_callback;
diff --git a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc index 8021fde7..4b1b5eec 100644 --- a/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc +++ b/chrome/browser/chromeos/login/screens/marketing_opt_in_screen_browsertest.cc
@@ -54,9 +54,8 @@ void SetUpOnMainThread() override { ash::ShellTestApi().SetTabletModeEnabledForTest(true); - MarketingOptInScreen* marketing_screen = static_cast<MarketingOptInScreen*>( - WizardController::default_controller()->screen_manager()->GetScreen( - MarketingOptInScreenView::kScreenId)); + MarketingOptInScreen* marketing_screen = MarketingOptInScreen::Get( + WizardController::default_controller()->screen_manager()); marketing_screen->set_exit_callback_for_testing(base::BindRepeating( &MarketingOptInScreenTest::HandleScreenExit, base::Unretained(this))); @@ -80,6 +79,12 @@ WaitForScreenExit(); } + void ShowAccessibilityButtonForTest() { + MarketingOptInScreen* marketing_screen = MarketingOptInScreen::Get( + WizardController::default_controller()->screen_manager()); + marketing_screen->SetA11yButtonVisibilityForTest(true /* shown */); + } + void WaitForScreenExit() { if (screen_exited_) return; @@ -245,6 +250,7 @@ // the screen. IN_PROC_BROWSER_TEST_F(MarketingOptInScreenTest, EnableShelfNavigationButtons) { ShowMarketingOptInScreen(); + ShowAccessibilityButtonForTest(); OobeScreenWaiter(MarketingOptInScreenView::kScreenId).Wait(); // Tap on accessibility settings link, and wait for the accessibility settings @@ -286,6 +292,7 @@ // Tests that the user can exit the screen from the accessibility page. IN_PROC_BROWSER_TEST_F(MarketingOptInScreenTest, ExitScreenFromA11yPage) { ShowMarketingOptInScreen(); + ShowAccessibilityButtonForTest(); OobeScreenWaiter(MarketingOptInScreenView::kScreenId).Wait(); // Tap on accessibility settings link, and wait for the accessibility settings
diff --git a/chrome/browser/chromeos/login/test/device_state_mixin.cc b/chrome/browser/chromeos/login/test/device_state_mixin.cc index a29630a8..c7256d2 100644 --- a/chrome/browser/chromeos/login/test/device_state_mixin.cc +++ b/chrome/browser/chromeos/login/test/device_state_mixin.cc
@@ -12,8 +12,6 @@ #include "base/numerics/safe_conversions.h" #include "base/path_service.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chrome_browser_main.h" -#include "chrome/browser/chrome_browser_main_extra_parts.h" #include "chrome/browser/chromeos/policy/device_policy_builder.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/pref_names.h" @@ -69,55 +67,13 @@ base::WriteFile(path, blob.data(), blob.length())); } -// Set of values that should be written to local state. -struct LocalStateValues { - base::Optional<bool> oobe_complete; - base::Optional<bool> enrollment_recovery_required; - base::Optional<int> device_registered; -}; - -// Chrome main extra part used to initialize local state prefs to indicate the -// configured device state. Injected into browser main parts in -// CreatedBrowserMainParts() override. -class TestLocalStateInitializerMainExtra : public ChromeBrowserMainExtraParts { - public: - explicit TestLocalStateInitializerMainExtra( - LocalStateValues local_state_values) - : local_state_values_(std::move(local_state_values)) {} - ~TestLocalStateInitializerMainExtra() override = default; - - // ChromeBrowserMainExtraParts: - void PostEarlyInitialization() override { - PrefService* local_state = g_browser_process->local_state(); - - if (local_state_values_.oobe_complete.has_value()) { - local_state->SetBoolean(prefs::kOobeComplete, - *local_state_values_.oobe_complete); - } - - if (local_state_values_.enrollment_recovery_required.has_value()) { - local_state->SetBoolean( - prefs::kEnrollmentRecoveryRequired, - *local_state_values_.enrollment_recovery_required); - } - - if (local_state_values_.device_registered.has_value()) { - local_state->SetInteger(prefs::kDeviceRegistered, - *local_state_values_.device_registered); - } - } - - private: - LocalStateValues local_state_values_; - - DISALLOW_COPY_AND_ASSIGN(TestLocalStateInitializerMainExtra); -}; - } // namespace DeviceStateMixin::DeviceStateMixin(InProcessBrowserTestMixinHost* host, State initial_state) - : InProcessBrowserTestMixin(host), state_(initial_state) { + : InProcessBrowserTestMixin(host), + state_(initial_state), + local_state_mixin_(host, this) { DCHECK(!g_instance_created); g_instance_created = true; } @@ -147,29 +103,22 @@ } } -void DeviceStateMixin::CreatedBrowserMainParts( - content::BrowserMainParts* browser_main_parts) { - LocalStateValues local_state_values; - +void DeviceStateMixin::SetUpLocalState() { + PrefService* local_state = g_browser_process->local_state(); switch (state_) { case DeviceStateMixin::State::OOBE_COMPLETED_CLOUD_ENROLLED: case DeviceStateMixin::State::OOBE_COMPLETED_ACTIVE_DIRECTORY_ENROLLED: case DeviceStateMixin::State::OOBE_COMPLETED_CONSUMER_OWNED: case DeviceStateMixin::State::OOBE_COMPLETED_DEMO_MODE: case DeviceStateMixin::State::OOBE_COMPLETED_UNOWNED: - local_state_values.device_registered = 1; - local_state_values.enrollment_recovery_required = false; - local_state_values.oobe_complete = true; + local_state->SetBoolean(prefs::kOobeComplete, true); + local_state->SetInteger(prefs::kDeviceRegistered, 1); + local_state->SetBoolean(prefs::kEnrollmentRecoveryRequired, false); break; case DeviceStateMixin::State::BEFORE_OOBE: - local_state_values.device_registered = 0; + local_state->SetInteger(prefs::kDeviceRegistered, 0); break; } - - // |browser_main_parts| take ownership of TestUserRegistrationMainExtra. - static_cast<ChromeBrowserMainParts*>(browser_main_parts) - ->AddParts(new TestLocalStateInitializerMainExtra( - std::move(local_state_values))); } std::unique_ptr<ScopedDevicePolicyUpdate>
diff --git a/chrome/browser/chromeos/login/test/device_state_mixin.h b/chrome/browser/chromeos/login/test/device_state_mixin.h index a1f8601e..de3a122 100644 --- a/chrome/browser/chromeos/login/test/device_state_mixin.h +++ b/chrome/browser/chromeos/login/test/device_state_mixin.h
@@ -13,6 +13,7 @@ #include "base/memory/weak_ptr.h" #include "base/values.h" #include "chrome/browser/chromeos/login/demo_mode/demo_session.h" +#include "chrome/browser/chromeos/login/test/local_state_mixin.h" #include "chrome/browser/chromeos/login/test/scoped_policy_update.h" #include "chrome/test/base/mixin_based_in_process_browser_test.h" @@ -30,7 +31,8 @@ // It will initialized the fake in-memory client in // SetUpInProcessBrowserTestFixture(), provided that a session manager was not // initialized previously. -class DeviceStateMixin : public InProcessBrowserTestMixin { +class DeviceStateMixin : public InProcessBrowserTestMixin, + public LocalStateMixin::Delegate { public: enum class State { BEFORE_OOBE, @@ -47,8 +49,9 @@ // InProcessBrowserTestMixin: bool SetUpUserDataDirectory() override; void SetUpInProcessBrowserTestFixture() override; - void CreatedBrowserMainParts( - content::BrowserMainParts* browser_main_parts) override; + + // LocalStateMixin::Delegate: + void SetUpLocalState() override; // Returns a ScopedDevicePolicyUpdate instance that can be used to update // local device policy blob (kept in fake session manager client). @@ -113,6 +116,8 @@ std::map<std::string, policy::UserPolicyBuilder> device_local_account_policies_; + LocalStateMixin local_state_mixin_; + base::WeakPtrFactory<DeviceStateMixin> weak_factory_{this}; DISALLOW_COPY_AND_ASSIGN(DeviceStateMixin);
diff --git a/chrome/browser/chromeos/login/test/local_state_mixin.cc b/chrome/browser/chromeos/login/test/local_state_mixin.cc new file mode 100644 index 0000000..ce9fb2cd --- /dev/null +++ b/chrome/browser/chromeos/login/test/local_state_mixin.cc
@@ -0,0 +1,43 @@ +// 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/chromeos/login/test/local_state_mixin.h" + +#include "chrome/browser/browser_process.h" +#include "chrome/browser/chrome_browser_main.h" +#include "chrome/browser/chrome_browser_main_extra_parts.h" + +namespace chromeos { + +namespace { + +class TestMainExtraPart : public ChromeBrowserMainExtraParts { + public: + explicit TestMainExtraPart(LocalStateMixin::Delegate* delegate) + : delegate_(delegate) {} + ~TestMainExtraPart() override = default; + + // ChromeBrowserMainExtraParts: + void PostEarlyInitialization() override { delegate_->SetUpLocalState(); } + + private: + LocalStateMixin::Delegate* const delegate_; +}; + +} // namespace + +LocalStateMixin::LocalStateMixin(InProcessBrowserTestMixinHost* host, + Delegate* delegate) + : InProcessBrowserTestMixin(host), delegate_(delegate) {} + +LocalStateMixin::~LocalStateMixin() = default; + +void LocalStateMixin::CreatedBrowserMainParts( + content::BrowserMainParts* browser_main_parts) { + // |browser_main_parts| take ownership of TestUserRegistrationMainExtra. + static_cast<ChromeBrowserMainParts*>(browser_main_parts) + ->AddParts(new TestMainExtraPart(delegate_)); +} + +} // namespace chromeos
diff --git a/chrome/browser/chromeos/login/test/local_state_mixin.h b/chrome/browser/chromeos/login/test/local_state_mixin.h new file mode 100644 index 0000000..9634ef8 --- /dev/null +++ b/chrome/browser/chromeos/login/test/local_state_mixin.h
@@ -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. + +#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_TEST_LOCAL_STATE_MIXIN_H_ +#define CHROME_BROWSER_CHROMEOS_LOGIN_TEST_LOCAL_STATE_MIXIN_H_ + +#include "chrome/test/base/mixin_based_in_process_browser_test.h" + +namespace chromeos { + +// Mixin browser tests can use for setting up local state environment. +class LocalStateMixin : public InProcessBrowserTestMixin { + public: + class Delegate { + public: + // Implement this function to setup g_browser_process->local_state() + virtual void SetUpLocalState() = 0; + }; + LocalStateMixin(InProcessBrowserTestMixinHost* host, Delegate* delegate); + + ~LocalStateMixin() override; + void CreatedBrowserMainParts( + content::BrowserMainParts* browser_main_parts) override; + + private: + Delegate* const delegate_; +}; + +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_LOGIN_TEST_LOCAL_STATE_MIXIN_H_
diff --git a/chrome/browser/chromeos/login/test/login_manager_mixin.cc b/chrome/browser/chromeos/login/test/login_manager_mixin.cc index f8f68c1..47d47e8 100644 --- a/chrome/browser/chromeos/login/test/login_manager_mixin.cc +++ b/chrome/browser/chromeos/login/test/login_manager_mixin.cc
@@ -10,13 +10,12 @@ #include "base/command_line.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/chrome_browser_main.h" -#include "chrome/browser/chrome_browser_main_extra_parts.h" #include "chrome/browser/chromeos/login/existing_user_controller.h" #include "chrome/browser/chromeos/login/session/user_session_manager.h" #include "chrome/browser/chromeos/login/session/user_session_manager_test_api.h" #include "chrome/browser/chromeos/login/signin_specifics.h" #include "chrome/browser/chromeos/login/startup_utils.h" +#include "chrome/browser/chromeos/login/test/local_state_mixin.h" #include "chrome/browser/chromeos/login/test/session_manager_state_waiter.h" #include "chromeos/constants/chromeos_switches.h" #include "chromeos/login/auth/key.h" @@ -35,65 +34,6 @@ // Ensure LoginManagerMixin is only created once. bool g_instance_created = false; -// Chrome main extra part used for login manager tests to set up initially -// registered users. The main part injects itself into browser startup after -// local state has been set up, but before the user manager instance is created. -// It adds list of "known" users to the local state, so user manager can load -// them during its initialization. -// When users are registered, it marks OOBE as complete. -class TestUserRegistrationMainExtra : public ChromeBrowserMainExtraParts { - public: - explicit TestUserRegistrationMainExtra( - const std::vector<LoginManagerMixin::TestUserInfo>& users) - : users_(users) {} - ~TestUserRegistrationMainExtra() override = default; - - // ChromeBrowserMainExtraParts: - void PostEarlyInitialization() override { - // SaveKnownUser depends on UserManager to get the local state that has to - // be updated, and do ephemeral user checks. - // Given that user manager does not exist yet (by design), create a - // temporary fake user manager instance. - { - auto user_manager = std::make_unique<user_manager::FakeUserManager>(); - user_manager->set_local_state(g_browser_process->local_state()); - user_manager::ScopedUserManager scoper(std::move(user_manager)); - for (const auto& user : users_) { - ListPrefUpdate users_pref(g_browser_process->local_state(), - "LoggedInUsers"); - users_pref->AppendIfNotPresent( - std::make_unique<base::Value>(user.account_id.GetUserEmail())); - - DictionaryPrefUpdate user_type_update(g_browser_process->local_state(), - "UserType"); - user_type_update->SetKey(user.account_id.GetAccountIdKey(), - base::Value(static_cast<int>(user.user_type))); - - DictionaryPrefUpdate user_token_update(g_browser_process->local_state(), - "OAuthTokenStatus"); - user_token_update->SetKey( - user.account_id.GetUserEmail(), - base::Value(static_cast<int>(user.token_status))); - - user_manager::known_user::UpdateId(user.account_id); - - if (user.user_type == user_manager::USER_TYPE_CHILD) { - user_manager::known_user::SetProfileRequiresPolicy( - user.account_id, - user_manager::known_user::ProfileRequiresPolicy::kPolicyRequired); - } - } - } - - StartupUtils::MarkOobeCompleted(); - } - - private: - const std::vector<LoginManagerMixin::TestUserInfo> users_; - - DISALLOW_COPY_AND_ASSIGN(TestUserRegistrationMainExtra); -}; - void AppendUsers(LoginManagerMixin::UserList* users, const std::string& domain, int n) { @@ -129,13 +69,13 @@ } LoginManagerMixin::LoginManagerMixin(InProcessBrowserTestMixinHost* host) - : InProcessBrowserTestMixin(host) { - g_instance_created = true; -} + : LoginManagerMixin(host, UserList()) {} LoginManagerMixin::LoginManagerMixin(InProcessBrowserTestMixinHost* host, const UserList& initial_users) - : InProcessBrowserTestMixin(host), initial_users_(initial_users) { + : InProcessBrowserTestMixin(host), + initial_users_(initial_users), + local_state_mixin_(host, this) { DCHECK(!g_instance_created); g_instance_created = true; } @@ -157,11 +97,43 @@ return true; } -void LoginManagerMixin::CreatedBrowserMainParts( - content::BrowserMainParts* browser_main_parts) { - // |browser_main_parts| take ownership of TestUserRegistrationMainExtra. - static_cast<ChromeBrowserMainParts*>(browser_main_parts) - ->AddParts(new TestUserRegistrationMainExtra(initial_users_)); +void LoginManagerMixin::SetUpLocalState() { + // SaveKnownUser depends on UserManager to get the local state that has to + // be updated, and do ephemeral user checks. + // Given that user manager does not exist yet (by design), create a + // temporary fake user manager instance. + { + auto user_manager = std::make_unique<user_manager::FakeUserManager>(); + user_manager->set_local_state(g_browser_process->local_state()); + user_manager::ScopedUserManager scoper(std::move(user_manager)); + for (const auto& user : initial_users_) { + ListPrefUpdate users_pref(g_browser_process->local_state(), + "LoggedInUsers"); + users_pref->AppendIfNotPresent( + std::make_unique<base::Value>(user.account_id.GetUserEmail())); + + DictionaryPrefUpdate user_type_update(g_browser_process->local_state(), + "UserType"); + user_type_update->SetKey(user.account_id.GetAccountIdKey(), + base::Value(static_cast<int>(user.user_type))); + + DictionaryPrefUpdate user_token_update(g_browser_process->local_state(), + "OAuthTokenStatus"); + user_token_update->SetKey( + user.account_id.GetUserEmail(), + base::Value(static_cast<int>(user.token_status))); + + user_manager::known_user::UpdateId(user.account_id); + + if (user.user_type == user_manager::USER_TYPE_CHILD) { + user_manager::known_user::SetProfileRequiresPolicy( + user.account_id, + user_manager::known_user::ProfileRequiresPolicy::kPolicyRequired); + } + } + } + + StartupUtils::MarkOobeCompleted(); } void LoginManagerMixin::SetUpOnMainThread() {
diff --git a/chrome/browser/chromeos/login/test/login_manager_mixin.h b/chrome/browser/chromeos/login/test/login_manager_mixin.h index 39fd7e9..a2b2c6e5 100644 --- a/chrome/browser/chromeos/login/test/login_manager_mixin.h +++ b/chrome/browser/chromeos/login/test/login_manager_mixin.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/macros.h" +#include "chrome/browser/chromeos/login/test/local_state_mixin.h" #include "chrome/browser/chromeos/login/test/session_flags_manager.h" #include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "components/account_id/account_id.h" @@ -25,7 +26,8 @@ // initializes user manager with a list of pre-registered users. // The mixin will mark the OOBE flow as complete during test setup, so it's not // suitable for OOBE tests. -class LoginManagerMixin : public InProcessBrowserTestMixin { +class LoginManagerMixin : public InProcessBrowserTestMixin, + public LocalStateMixin::Delegate { public: // Represents test user. struct TestUserInfo { @@ -87,11 +89,12 @@ // InProcessBrowserTestMixin: bool SetUpUserDataDirectory() override; - void CreatedBrowserMainParts( - content::BrowserMainParts* browser_main_parts) override; void SetUpOnMainThread() override; void TearDownOnMainThread() override; + // LocalStateMixin::Delegate: + void SetUpLocalState() override; + // Starts login attempt for a user, using the stub authenticator provided by // |authenticator_builder|. // Note that this will not wait for the login attempt to finish. @@ -125,6 +128,7 @@ // Whether the user session manager should skip browser launch steps for // testing. bool should_launch_browser_ = false; + LocalStateMixin local_state_mixin_; DISALLOW_COPY_AND_ASSIGN(LoginManagerMixin); };
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc index 8f7a952e..4ae3f923 100644 --- a/chrome/browser/chromeos/login/wizard_controller.cc +++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -1231,17 +1231,6 @@ void WizardController::OnChangedMetricsReportingState(bool enabled) { StatsReportingController::Get()->SetEnabled( ProfileManager::GetActiveUserProfile(), enabled); - if (crash_reporter::IsCrashpadEnabled()) { - return; - } - - if (!enabled) - return; -#if BUILDFLAG(GOOGLE_CHROME_BRANDING) - base::ThreadPool::PostTask( - FROM_HERE, {base::MayBlock()}, - base::BindOnce(&breakpad::InitCrashReporter, std::string())); -#endif } void WizardController::OnDeviceModificationCanceled() {
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc index 59ee08f..ad73d16 100644 --- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc +++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -2012,7 +2012,8 @@ CheckCurrentScreen(UpdateView::kScreenId); } -class WizardControllerScreenPriorityTest : public LoginManagerTest { +class WizardControllerScreenPriorityTest : public LoginManagerTest, + public LocalStateMixin::Delegate { protected: WizardControllerScreenPriorityTest() { login_manager_mixin_.AppendRegularUsers(1); @@ -2026,21 +2027,19 @@ WizardController::default_controller()->current_screen()); } + // LocalStateMixin::Delegate: + void SetUpLocalState() override { + // Set pref to show reset screen on startup. + g_browser_process->local_state()->SetBoolean(prefs::kFactoryResetRequested, + true); + } + private: base::test::ScopedFeatureList feature_list_; LoginManagerMixin login_manager_mixin_{&mixin_host_}; + LocalStateMixin local_state_mixin_{&mixin_host_, this}; }; -// TODO(https://crbug.com/1064271) Replace this PRE test with adding adding a -// custom part to |ChromeBrowserMainParts| in CreatedBrowserMainParts(...) and -// then setting the pref value in the custom part's PostEarlyInitialization(). -IN_PROC_BROWSER_TEST_F(WizardControllerScreenPriorityTest, - PRE_CanNavigateToTest) { - // Set pref to show reset screen on startup. - g_browser_process->local_state()->SetBoolean(prefs::kFactoryResetRequested, - true); -} - IN_PROC_BROWSER_TEST_F(WizardControllerScreenPriorityTest, CanNavigateToTest) { WizardController* const wizard_controller = WizardController::default_controller();
diff --git a/chrome/browser/chromeos/policy/component_active_directory_policy_service.cc b/chrome/browser/chromeos/policy/component_active_directory_policy_service.cc index eb7da574..42d7cf0f 100644 --- a/chrome/browser/chromeos/policy/component_active_directory_policy_service.cc +++ b/chrome/browser/chromeos/policy/component_active_directory_policy_service.cc
@@ -76,7 +76,7 @@ base::JSONReader::ValueWithError value_with_error = base::JSONReader::ReadAndReturnValueWithError( json, base::JSON_ALLOW_TRAILING_COMMAS); - if (value_with_error.error_code != base::JSONReader::JSON_NO_ERROR) { + if (!value_with_error.value) { LOG(ERROR) << "Could not parse policy value as JSON: " << value_with_error.error_message; return base::nullopt;
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc index 12f0155d..450723c 100644 --- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc +++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -1799,7 +1799,7 @@ base::JSONReader::ValueWithError value_with_error = base::JSONReader::ReadAndReturnValueWithError( json_string, base::JSON_ALLOW_TRAILING_COMMAS); - if (value_with_error.error_code != base::JSONReader::JSON_NO_ERROR) { + if (!value_with_error.value) { *error = "Invalid JSON string: " + value_with_error.error_message; return base::nullopt; }
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc index 7c4e99c..529eb552 100644 --- a/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc +++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector.cc
@@ -908,17 +908,25 @@ } } - const auto& memory_info = probe_result->memory_info; - if (!memory_info.is_null()) { - em::MemoryInfo* const memory_info_out = - response_params_.device_status->mutable_memory_info(); - memory_info_out->set_total_memory_kib(memory_info->total_memory_kib); - memory_info_out->set_free_memory_kib(memory_info->free_memory_kib); - memory_info_out->set_available_memory_kib( - memory_info->available_memory_kib); - memory_info_out->set_page_faults_since_last_boot( - memory_info->page_faults_since_last_boot); + // Process MemoryResult. + const auto& memory_result = probe_result->memory_result; + if (!memory_result.is_null()) { + if (memory_result->is_error()) { + LOG(ERROR) << "cros_healthd: Error getting memory info: " + << memory_result->get_error()->msg; + } else { + const auto& memory_info = memory_result->get_memory_info(); + em::MemoryInfo* const memory_info_out = + response_params_.device_status->mutable_memory_info(); + memory_info_out->set_total_memory_kib(memory_info->total_memory_kib); + memory_info_out->set_free_memory_kib(memory_info->free_memory_kib); + memory_info_out->set_available_memory_kib( + memory_info->available_memory_kib); + memory_info_out->set_page_faults_since_last_boot( + memory_info->page_faults_since_last_boot); + } } + const auto& backlight_info = probe_result->backlight_info; if (backlight_info.has_value()) { for (const auto& backlight : backlight_info.value()) {
diff --git a/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc index 6cdc44e..5c0e7a1 100644 --- a/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc +++ b/chrome/browser/chromeos/policy/status_collector/device_status_collector_browsertest.cc
@@ -484,8 +484,11 @@ chromeos::cros_healthd::mojom::TimezoneResult::NewTimezoneInfo( chromeos::cros_healthd::mojom::TimezoneInfo::New(kPosixTimezone, kTimezoneRegion)); - chromeos::cros_healthd::mojom::MemoryInfo memory_info( - kFakeTotalMemory, kFakeFreeMemory, kFakeAvailableMemory, kFakePageFaults); + auto memory_result = + chromeos::cros_healthd::mojom::MemoryResult::NewMemoryInfo( + chromeos::cros_healthd::mojom::MemoryInfo::New( + kFakeTotalMemory, kFakeFreeMemory, kFakeAvailableMemory, + kFakePageFaults)); std::vector<chromeos::cros_healthd::mojom::BacklightInfoPtr> backlight_vector; chromeos::cros_healthd::mojom::BacklightInfo backlight_info( kFakeBacklightPath, kFakeMaxBrightness, kFakeBrightness); @@ -498,7 +501,7 @@ chromeos::cros_healthd::mojom::TelemetryInfo fake_info( battery_info.Clone(), std::move(block_device_info), cached_vpd_info.Clone(), std::move(cpu_result), - std::move(timezone_result), memory_info.Clone(), + std::move(timezone_result), std::move(memory_result), std::move(backlight_vector), std::move(fan_result)); // Create fake SampledData.
diff --git a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc index f6e4a356..25481d7a 100644 --- a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc +++ b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.cc
@@ -58,8 +58,7 @@ } void IdleActionWarningDialogView::CloseDialog() { - update_timer_.Stop(); - CancelDialog(); + GetWidget()->Close(); } void IdleActionWarningDialogView::Update(base::TimeTicks idle_action_time) { @@ -85,10 +84,6 @@ return false; } -bool IdleActionWarningDialogView::Cancel() { - return !update_timer_.IsRunning(); -} - gfx::Size IdleActionWarningDialogView::CalculatePreferredSize() const { const int default_width = views::LayoutProvider::Get()->GetDistanceMetric( DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH); @@ -97,8 +92,7 @@ GetLayoutManager()->GetPreferredHeightForWidth(this, default_width)); } -IdleActionWarningDialogView::~IdleActionWarningDialogView() { -} +IdleActionWarningDialogView::~IdleActionWarningDialogView() = default; void IdleActionWarningDialogView::UpdateTitle() { GetWidget()->UpdateWindowTitle();
diff --git a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.h b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.h index 5f91177..dbe29c1 100644 --- a/chrome/browser/chromeos/power/idle_action_warning_dialog_view.h +++ b/chrome/browser/chromeos/power/idle_action_warning_dialog_view.h
@@ -27,7 +27,6 @@ ui::ModalType GetModalType() const override; base::string16 GetWindowTitle() const override; bool ShouldShowCloseButton() const override; - bool Cancel() override; // views::View: gfx::Size CalculatePreferredSize() const override;
diff --git a/chrome/browser/chromeos/system/breakpad_consent_watcher.cc b/chrome/browser/chromeos/system/breakpad_consent_watcher.cc new file mode 100644 index 0000000..f0fd8fb --- /dev/null +++ b/chrome/browser/chromeos/system/breakpad_consent_watcher.cc
@@ -0,0 +1,64 @@ +// 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/chromeos/system/breakpad_consent_watcher.h" + +#include <string> + +#include "base/bind.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "chrome/installer/util/google_update_settings.h" +#include "components/crash/core/app/breakpad_linux.h" +#include "components/crash/core/app/crashpad.h" + +namespace chromeos { +namespace system { + +BreakpadConsentWatcher::BreakpadConsentWatcher() = default; +BreakpadConsentWatcher::~BreakpadConsentWatcher() = default; + +std::unique_ptr<BreakpadConsentWatcher> BreakpadConsentWatcher::Initialize( + StatsReportingController* stat_controller) { + DCHECK(stat_controller != nullptr); + if (crash_reporter::IsCrashpadEnabled()) { + // Crashpad is always installed, regardless of consent. (crash_reporter is + // responsible for discarding the reports if consent is off.) Therefore, we + // do not need to watch the consent setting. + return nullptr; + } + + if (breakpad::IsCrashReporterEnabled()) { + // Already enabled, no need to enable it again. (If consent is revoked, + // crash_reporter will discard any resulting crashes.) + return nullptr; + } + + auto watcher = base::WrapUnique(new BreakpadConsentWatcher); + watcher->subscription_ = stat_controller->AddObserver( + base::BindRepeating(BreakpadConsentWatcher::OnConsentChange)); + + return watcher; +} + +void BreakpadConsentWatcher::OnConsentChange() { + GoogleUpdateSettings::CollectStatsConsentTaskRunner()->PostTask( + FROM_HERE, + base::BindOnce( + &BreakpadConsentWatcher::OnConsentChangeCollectStatsConsentThread)); +} + +void BreakpadConsentWatcher::OnConsentChangeCollectStatsConsentThread() { + if (breakpad::IsCrashReporterEnabled()) { + // No need to enable breakpad twice. + return; + } + + // Breakpad will check the consent setting in InitCrashReporter. No need to + // check it here. + breakpad::InitCrashReporter(std::string()); +} + +} // namespace system +} // namespace chromeos
diff --git a/chrome/browser/chromeos/system/breakpad_consent_watcher.h b/chrome/browser/chromeos/system/breakpad_consent_watcher.h new file mode 100644 index 0000000..ae1fd79 --- /dev/null +++ b/chrome/browser/chromeos/system/breakpad_consent_watcher.h
@@ -0,0 +1,55 @@ +// 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_CHROMEOS_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_ +#define CHROME_BROWSER_CHROMEOS_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_ + +#include <memory> + +#include "chrome/browser/chromeos/settings/stats_reporting_controller.h" + +namespace chromeos { +namespace system { + +// Watches the crash reporting consent setting (cros.metrics.reportingEnabled). +// If crash reporting is enabled, installs Breakpad if it isn't already +// installed. +// +// This class is only created in the main browser process. Unfortunately, that +// means changing the consent setting only installs Breakpad in the browser +// process. Renderer and GPU processes started before consent was given will +// still discard any crashes. This problem will be fixed when we move to +// Crashpad. +class BreakpadConsentWatcher { + public: + ~BreakpadConsentWatcher(); + + // Create a BreakpadConsentWatcher. Returns nullptr if this process doesn't + // need a BreakpadConsentWatcher. Returning nullptr is NOT indicitive of an + // error. + static std::unique_ptr<BreakpadConsentWatcher> Initialize( + StatsReportingController* stat_controller); + + private: + BreakpadConsentWatcher(); + BreakpadConsentWatcher(const BreakpadConsentWatcher&) = delete; + BreakpadConsentWatcher& operator=(const BreakpadConsentWatcher&) = delete; + + // Callback function. Called whenever the crash reporting consent is changed. + static void OnConsentChange(); + + // Callback function that happens on the + // GoogleUpdateSettings::CollectStatsConsentTaskRunner() thread. We must be + // on that thread to avoid races. Also, InitCrashReporter() calls blocking + // functions so we must be on a blockable thread. + // Called whenever the crash reporting consent is changed. + static void OnConsentChangeCollectStatsConsentThread(); + + std::unique_ptr<StatsReportingController::ObserverSubscription> subscription_; +}; + +} // namespace system +} // namespace chromeos + +#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_BREAKPAD_CONSENT_WATCHER_H_
diff --git a/chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.cc b/chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.cc new file mode 100644 index 0000000..ab58f49 --- /dev/null +++ b/chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.cc
@@ -0,0 +1,40 @@ +// 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/chromeos/system_logs/ui_hierarchy_log_source.h" + +#include <memory> +#include <utility> + +#include "ash/public/cpp/debug_utils.h" + +namespace system_logs { + +void UiHierarchyLogSource::Fetch(SysLogsSourceCallback callback) { + DCHECK(!callback.is_null()); + + auto response = std::make_unique<SystemLogsResponse>(); + + { + std::ostringstream out; + ash::debug::PrintWindowHierarchy(&out); + response->emplace("UI Hierarchy: Windows", out.str()); + } + + { + std::ostringstream out; + ash::debug::PrintViewHierarchy(&out); + response->emplace("UI Hierarchy: Views", out.str()); + } + + { + std::ostringstream out; + ash::debug::PrintLayerHierarchy(&out); + response->emplace("UI Hierarchy: Layers", out.str()); + } + + std::move(callback).Run(std::move(response)); +} + +} // namespace system_logs
diff --git a/chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.h b/chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.h new file mode 100644 index 0000000..7a57ef66c --- /dev/null +++ b/chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.h
@@ -0,0 +1,27 @@ +// 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_CHROMEOS_SYSTEM_LOGS_UI_HIERARCHY_LOG_SOURCE_H_ +#define CHROME_BROWSER_CHROMEOS_SYSTEM_LOGS_UI_HIERARCHY_LOG_SOURCE_H_ + +#include "base/macros.h" +#include "components/feedback/system_logs/system_logs_source.h" + +namespace system_logs { + +class UiHierarchyLogSource : public SystemLogsSource { + public: + UiHierarchyLogSource() : SystemLogsSource("UiHierarchy") {} + UiHierarchyLogSource(const UiHierarchyLogSource&) = delete; + UiHierarchyLogSource& operator=(const UiHierarchyLogSource&) = delete; + ~UiHierarchyLogSource() override = default; + + private: + // Overridden from SystemLogsSource: + void Fetch(SysLogsSourceCallback callback) override; +}; + +} // namespace system_logs + +#endif // CHROME_BROWSER_CHROMEOS_SYSTEM_LOGS_UI_HIERARCHY_LOG_SOURCE_H_
diff --git a/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc b/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc index 831982e..22f04a5 100644 --- a/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc +++ b/chrome/browser/chromeos/web_applications/chrome_help_app_ui_delegate.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/chrome_pages.h" +#include "chrome/common/pref_names.h" #include "chromeos/components/help_app_ui/url_constants.h" #include "chromeos/services/multidevice_setup/public/cpp/prefs.h" #include "chromeos/system/statistics_provider.h" @@ -58,6 +59,13 @@ Profile* profile = Profile::FromWebUI(web_ui_); PrefService* pref_service = profile->GetPrefs(); + // Add state from the OOBE flow. + source->AddBoolean( + "shouldShowGetStarted", + pref_service->GetBoolean(prefs::kHelpAppShouldShowGetStarted)); + source->AddBoolean( + "tabletModeDuringOOBE", + pref_service->GetBoolean(prefs::kHelpAppTabletModeDuringOobe)); // Checks if any of the MultiDevice features (e.g. Instant Tethering, // Messages, Smart Lock) is allowed on this device. source->AddBoolean(
diff --git a/chrome/browser/dev_ui_browser_resources.grd b/chrome/browser/dev_ui_browser_resources.grd index 1ea7216..cad2c93 100644 --- a/chrome/browser/dev_ui_browser_resources.grd +++ b/chrome/browser/dev_ui_browser_resources.grd
@@ -50,7 +50,7 @@ <include name="IDR_MEDIA_HISTORY_HTML" file="resources\media\media_history.html" flattenhtml="true" type="BINDATA" compress="gzip" allowexternalscript="true" /> <include name="IDR_MEDIA_HISTORY_JS" file="resources\media\media_history.js" flattenhtml="true" type="BINDATA" compress="gzip" /> <include name="IDR_MEDIA_HISTORY_STORE_MOJOM_LITE_JS" file="${root_gen_dir}\chrome\browser\media\history\media_history_store.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" /> - <include name="IDR_MEMORY_INTERNALS_HTML" file="resources\memory_internals\memory_internals.html" flattenhtml="true" type="BINDATA" compress="gzip" /> + <include name="IDR_MEMORY_INTERNALS_HTML" file="resources\memory_internals\memory_internals.html" type="BINDATA" compress="gzip" /> <include name="IDR_MEMORY_INTERNALS_JS" file="resources\memory_internals\memory_internals.js" type="BINDATA" compress="gzip" /> <include name="IDR_NOTIFICATIONS_INTERNALS_HTML" file="resources\notifications_internals\notifications_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" /> <include name="IDR_NOTIFICATIONS_INTERNALS_CSS" file="resources\notifications_internals\notifications_internals.css" type="BINDATA" compress="gzip" />
diff --git a/chrome/browser/extensions/api/history/history_apitest.cc b/chrome/browser/extensions/api/history/history_apitest.cc index 27e12e5a..0df631cb 100644 --- a/chrome/browser/extensions/api/history/history_apitest.cc +++ b/chrome/browser/extensions/api/history/history_apitest.cc
@@ -41,15 +41,13 @@ } }; -// Full text search indexing sometimes exceeds a timeout. (http://crbug/119505) -IN_PROC_BROWSER_TEST_F(HistoryApiTest, DISABLED_MiscSearch) { +IN_PROC_BROWSER_TEST_F(HistoryApiTest, MiscSearch) { ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(RunExtensionSubtest("history/regular", "misc_search.html")) << message_; } -// Same could happen here without the FTS (http://crbug/119505) -IN_PROC_BROWSER_TEST_F(HistoryApiTest, DISABLED_TimedSearch) { +IN_PROC_BROWSER_TEST_F(HistoryApiTest, TimedSearch) { ASSERT_TRUE(StartEmbeddedTestServer()); ASSERT_TRUE(RunExtensionSubtest("history/regular", "timed_search.html")) << message_;
diff --git a/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc b/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc index c5d9aea..153f67f1 100644 --- a/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc +++ b/chrome/browser/feedback/system_logs/about_system_logs_fetcher.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/feedback/system_logs/about_system_logs_fetcher.h" +#include <memory> + #include "build/build_config.h" #include "chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h" #include "chrome/browser/feedback/system_logs/log_sources/memory_details_log_source.h" @@ -15,6 +17,7 @@ #include "chrome/browser/chromeos/system_logs/debug_daemon_log_source.h" #include "chrome/browser/chromeos/system_logs/device_event_log_source.h" #include "chrome/browser/chromeos/system_logs/touch_log_source.h" +#include "chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.h" #endif namespace system_logs { @@ -32,6 +35,7 @@ fetcher->AddSource(std::make_unique<DBusLogSource>()); fetcher->AddSource(std::make_unique<DeviceEventLogSource>()); fetcher->AddSource(std::make_unique<TouchLogSource>()); + fetcher->AddSource(std::make_unique<UiHierarchyLogSource>()); // Debug Daemon data source - currently only this data source supports // the scrub_data parameter.
diff --git a/chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.cc b/chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.cc index 6d2fcdd..4b32286 100644 --- a/chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.cc +++ b/chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/feedback/system_logs/chrome_system_logs_fetcher.h" +#include <memory> + #include "build/build_config.h" #include "chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.h" #include "chrome/browser/feedback/system_logs/log_sources/crash_ids_source.h" @@ -18,6 +20,7 @@ #include "chrome/browser/chromeos/system_logs/device_event_log_source.h" #include "chrome/browser/chromeos/system_logs/iwlwifi_dump_log_source.h" #include "chrome/browser/chromeos/system_logs/touch_log_source.h" +#include "chrome/browser/chromeos/system_logs/ui_hierarchy_log_source.h" #endif namespace system_logs { @@ -37,6 +40,7 @@ fetcher->AddSource(std::make_unique<DeviceEventLogSource>()); fetcher->AddSource(std::make_unique<IwlwifiDumpChecker>()); fetcher->AddSource(std::make_unique<TouchLogSource>()); + fetcher->AddSource(std::make_unique<UiHierarchyLogSource>()); // Debug Daemon data source - currently only this data source supports // the scrub_data parameter, but the others still get scrubbed by
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index ffd4e5d..b5a3fa95 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -920,11 +920,6 @@ "expiry_milestone": 76 }, { - "name": "document-passive-wheel-event-listeners", - "owners": [ "sahel", "input-dev" ], - "expiry_milestone": 76 - }, - { "name": "double-buffer-compositing", "owners": [ "chromeos-gfx@google.com" ], "expiry_milestone": 86 @@ -1112,6 +1107,11 @@ "expiry_milestone": 83 }, { + "name": "enable-autofill-cache-server-card-info", + "owners": [ "annelim@google.com", "jsaul@google.com" ], + "expiry_milestone": 88 + }, + { "name": "enable-autofill-credit-card-ablation-experiment", "owners": [ "jsaul@google.com" ], "expiry_milestone": 88 @@ -2551,6 +2551,11 @@ "expiry_milestone": 84 }, { + "name": "happiness-tracking-surveys-for-desktop-migration", + "owners": [ "msramek", "chrome-friendly-settings@google.com" ], + "expiry_milestone": 90 + }, + { "name": "happiness-tracking-surveys-for-desktop-settings", "owners": [ "msramek", "chrome-friendly-settings@google.com" ], "expiry_milestone": 86 @@ -3963,11 +3968,6 @@ "expiry_milestone": 78 }, { - "name": "translate-ui-bubble-options", - "owners": [ "anthonyvd", "chrome-language@google.com" ], - "expiry_milestone": 82 - }, - { "name": "treat-unsafe-downloads-as-active-content", "owners": [ "jdeblasio", "cthomp" ], "expiry_milestone": 87
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 39d98f0..f098254f 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -455,6 +455,12 @@ const char kEnableAutofillAccountWalletStorageDescription[] = "Enable the ephemeral storage for account data for autofill."; +const char kEnableAutofillCacheServerCardInfoName[] = + "Enable Autofill to cache unmasked server card info"; +const char kEnableAutofillCacheServerCardInfoDescription[] = + "If enabled, when a server card is unmasked, its info will be cached until " + "page navigation to simplify consecutive fills on the same page."; + const char kEnableAutofillCreditCardAblationExperimentDisplayName[] = "Credit card autofill ablation experiment."; const char kEnableAutofillCreditCardAblationExperimentDescription[] = @@ -2792,6 +2798,11 @@ "Enable showing Happiness Tracking Surveys for Privacy Settings to users " "on Desktop"; +const char kHappinessTrackingSurveysForDesktopMigrationName[] = + "Happiness Tracking Surveys migration"; +const char kHappinessTrackingSurveysForDesktopMigrationDescription[] = + "Enable the latest version of Happiness Tracking Surveys."; + const char kIntentPickerName[] = "Intent picker"; const char kIntentPickerDescription[] = "When going to a site that has URL managable by a PWA, show the intent"
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index a833253..7636e58 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -282,6 +282,9 @@ extern const char kEnableAutofillAccountWalletStorageName[]; extern const char kEnableAutofillAccountWalletStorageDescription[]; +extern const char kEnableAutofillCacheServerCardInfoName[]; +extern const char kEnableAutofillCacheServerCardInfoDescription[]; + extern const char kEnableAutofillCreditCardAblationExperimentDisplayName[]; extern const char kEnableAutofillCreditCardAblationExperimentDescription[]; @@ -1601,6 +1604,9 @@ extern const char kHappinessTrackingSurveysForDesktopSettingsPrivacyDescription[]; +extern const char kHappinessTrackingSurveysForDesktopMigrationName[]; +extern const char kHappinessTrackingSurveysForDesktopMigrationDescription[]; + extern const char kIntentPickerName[]; extern const char kIntentPickerDescription[];
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java index d14c61c..6e279de 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -47,6 +47,7 @@ */ private static Map<String, Boolean> sDefaults = new HashMap<String, Boolean>() { { + put(ChromeFeatureList.ANDROID_PARTNER_CUSTOMIZATION_PHENOTYPE, false); put(ChromeFeatureList.HOMEPAGE_LOCATION_POLICY, false); put(ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD, false); put(ChromeFeatureList.SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH, false);
diff --git a/chrome/browser/media/feeds/media_feeds_converter.cc b/chrome/browser/media/feeds/media_feeds_converter.cc index ec100186..d39b916e 100644 --- a/chrome/browser/media/feeds/media_feeds_converter.cc +++ b/chrome/browser/media/feeds/media_feeds_converter.cc
@@ -138,15 +138,39 @@ return !property.values->date_time_values.empty(); } -// Gets a number from the property which may be stored as a long or double. -base::Optional<uint64_t> GetNumber(const Property& property) { - if (!property.values->long_values.empty()) - return property.values->long_values[0]; - if (!property.values->double_values.empty()) - return lround(property.values->double_values[0]); +// Gets a positive integer from the property which may be stored as a long or +// double. +base::Optional<uint64_t> GetPositiveIntegerFromProperty( + Entity* entity, + const std::string& property_name) { + auto* property = GetProperty(entity, property_name); + if (!property) + return base::nullopt; + + if (!property->values->long_values.empty() && + property->values->long_values[0] > 0) { + return property->values->long_values[0]; + } + + if (!property->values->double_values.empty() && + property->values->double_values[0] > 0) { + return lround(property->values->double_values[0]); + } + return base::nullopt; } +// Gets the duration from the property and store the result in item. Returns +// true if the duration was valid. +template <typename T> +bool GetDuration(const Property& property, T* item) { + if (property.values->time_values.empty()) + return false; + + item->duration = property.values->time_values[0]; + return true; +} + // Gets a list of media images from the property. The property should have at // least one media image and no more than kMaxImages. A media image is either a // valid URL string or an ImageObject entity containing a width, height, and @@ -337,9 +361,18 @@ } auto* value = GetProperty(identifier.get(), schema_org::property::kValue); - if (!value || !IsNonEmptyString(*value)) + if (!value) return false; - converted_identifier->value = value->values->string_values[0]; + + // The value must be a type we can unambiguously store as string. + if (!value->values->string_values.empty()) { + converted_identifier->value = value->values->string_values[0]; + } else if (!value->values->long_values.empty()) { + converted_identifier->value = + base::NumberToString(value->values->long_values[0]); + } else { + return false; + } item->identifiers.push_back(std::move(converted_identifier)); } @@ -387,11 +420,8 @@ if (!type.has_value() || item->interaction_counters.count(type.value()) > 0) return false; - auto* user_interaction_count = - GetProperty(stat.get(), schema_org::property::kUserInteractionCount); - if (!user_interaction_count) - return false; - base::Optional<uint64_t> count = GetNumber(*user_interaction_count); + base::Optional<uint64_t> count = GetPositiveIntegerFromProperty( + stat.get(), schema_org::property::kUserInteractionCount); if (!count.has_value()) return false; item->interaction_counters.insert( @@ -426,10 +456,45 @@ return true; } -// Gets the watchAction and actionStatus properties from an embedded entity and -// stores the result in item. Returns true if both the action and the action -// status were valid. -bool GetActionAndStatus(const Property& property, mojom::MediaFeedItem* item) { +// Gets the action status from embedded in the action property of the entity. +base::Optional<mojom::MediaFeedItemActionStatus> GetActionStatus( + Entity* entity) { + auto* action = GetProperty(entity, schema_org::property::kPotentialAction); + if (!action || action->values->entity_values.empty()) + return base::nullopt; + + auto* action_status = GetProperty(action->values->entity_values[0].get(), + schema_org::property::kActionStatus); + if (!action_status) + return base::nullopt; + if (!IsUrl(*action_status)) + return base::nullopt; + + auto status = schema_org::enums::CheckValidEnumString( + "http://schema.org/ActionStatusType", + action_status->values->url_values[0]); + switch (status.value()) { + case static_cast<int>( + schema_org::enums::ActionStatusType::kActiveActionStatus): + return mojom::MediaFeedItemActionStatus::kActive; + case static_cast<int>( + schema_org::enums::ActionStatusType::kPotentialActionStatus): + + return mojom::MediaFeedItemActionStatus::kPotential; + case static_cast<int>( + schema_org::enums::ActionStatusType::kCompletedActionStatus): + return mojom::MediaFeedItemActionStatus::kCompleted; + } + + return base::nullopt; +} + +// Gets the watchAction properties from an embedded entity and stores the result +// in item. Returns true if the action was valid. +template <typename T> +bool GetAction(mojom::MediaFeedItemActionStatus action_status, + const Property& property, + T* item) { if (property.values->entity_values.empty()) return false; @@ -444,71 +509,52 @@ return false; item->action->url = target->values->url_values[0]; - auto* action_status = - GetProperty(action.get(), schema_org::property::kActionStatus); - if (action_status) { - if (!IsUrl(*action_status)) - return false; + if (action_status == mojom::MediaFeedItemActionStatus::kUnknown) + return false; - auto status = schema_org::enums::CheckValidEnumString( - "http://schema.org/ActionStatusType", - action_status->values->url_values[0]); - if (status == base::nullopt) { + if (action_status == mojom::MediaFeedItemActionStatus::kActive) { + auto* start_time = + GetProperty(action.get(), schema_org::property::kStartTime); + if (!start_time || start_time->values->time_values.empty()) return false; - } else if (status.value() == - static_cast<int>( - schema_org::enums::ActionStatusType::kActiveActionStatus)) { - item->action_status = mojom::MediaFeedItemActionStatus::kActive; - auto* start_time = - GetProperty(action.get(), schema_org::property::kStartTime); - if (!start_time || start_time->values->time_values.empty()) - return false; - item->action->start_time = start_time->values->time_values[0]; - } else if (status.value() == - static_cast<int>(schema_org::enums::ActionStatusType:: - kPotentialActionStatus)) { - item->action_status = mojom::MediaFeedItemActionStatus::kPotential; - } else if (status.value() == - static_cast<int>(schema_org::enums::ActionStatusType:: - kCompletedActionStatus)) { - item->action_status = mojom::MediaFeedItemActionStatus::kCompleted; - } + item->action->start_time = start_time->values->time_values[0]; } + return true; } +// Represents a candidate for use as the item's main episode or play next +// candidate. +struct EpisodeCandidate { + Entity* entity; + mojom::MediaFeedItemActionStatus action_status; + int season_number; + int episode_number; +}; + // Gets the TV episode stored in an embedded entity and stores the result in // item. Returns true if the TV episode was valid. -bool GetEpisode(const Property& property, mojom::MediaFeedItem* item) { - if (property.values->entity_values.empty()) - return false; - - EntityPtr& episode = property.values->entity_values[0]; - if (episode->type != schema_org::entity::kTVEpisode) - return false; - +bool GetEpisode(const EpisodeCandidate& candidate, mojom::MediaFeedItem* item) { if (!item->tv_episode) item->tv_episode = mojom::TVEpisode::New(); - auto* episode_number = - GetProperty(episode.get(), schema_org::property::kEpisodeNumber); - if (!episode_number || !IsPositiveInteger(*episode_number)) - return false; - item->tv_episode->episode_number = episode_number->values->long_values[0]; + item->tv_episode->episode_number = candidate.episode_number; + item->tv_episode->season_number = candidate.season_number; + item->action_status = candidate.action_status; - auto* name = GetProperty(episode.get(), schema_org::property::kName); + auto* name = GetProperty(candidate.entity, schema_org::property::kName); if (!name || !IsNonEmptyString(*name)) return false; item->tv_episode->name = name->values->string_values[0]; if (!ConvertProperty<mojom::TVEpisode>( - episode.get(), item->tv_episode.get(), + candidate.entity, item->tv_episode.get(), schema_org::property::kIdentifier, false, base::BindOnce(&GetIdentifiers<mojom::TVEpisode>))) { return false; } - auto* image = GetProperty(episode.get(), schema_org::property::kImage); + auto* image = GetProperty(candidate.entity, schema_org::property::kImage); if (image) { auto converted_images = GetMediaImage(*image); if (!converted_images.has_value()) @@ -518,17 +564,207 @@ } if (!ConvertProperty<mojom::MediaFeedItem>( - episode.get(), item, schema_org::property::kPotentialAction, true, - base::BindOnce(&GetActionAndStatus))) { + candidate.entity, item, schema_org::property::kPotentialAction, true, + base::BindOnce(&GetAction<mojom::MediaFeedItem>, + candidate.action_status))) { return false; } return true; } -// Gets the TV season stored in an embedded entity and stores the result in -// item. Returns true if the TV season was valid. -bool GetSeason(const Property& property, mojom::MediaFeedItem* item) { +// Gets the PlayNextCandidate stored in an embedded entity and stores the result +// in item. Returns true if the PlayNextCandidate was valid. See the spec for +// this feature: https://wicg.github.io/media-feeds/#play-next-tv-episodes +bool GetPlayNextCandidate(const EpisodeCandidate& candidate, + mojom::MediaFeedItem* item) { + if (!item->play_next_candidate) + item->play_next_candidate = mojom::PlayNextCandidate::New(); + + item->play_next_candidate->episode_number = candidate.episode_number; + item->play_next_candidate->season_number = candidate.season_number; + + auto* name = GetProperty(candidate.entity, schema_org::property::kName); + if (!name || !IsNonEmptyString(*name)) + return false; + item->play_next_candidate->name = name->values->string_values[0]; + + if (!ConvertProperty<mojom::PlayNextCandidate>( + candidate.entity, item->play_next_candidate.get(), + schema_org::property::kIdentifier, false, + base::BindOnce(&GetIdentifiers<mojom::PlayNextCandidate>))) { + return false; + } + + auto* image = GetProperty(candidate.entity, schema_org::property::kImage); + if (image) { + auto converted_images = GetMediaImage(*image); + if (!converted_images.has_value()) + return false; + // TODO(sgbowen): Add an images field to TV episodes and store the converted + // images here. + } + + if (!ConvertProperty<mojom::PlayNextCandidate>( + candidate.entity, item->play_next_candidate.get(), + schema_org::property::kPotentialAction, true, + base::BindOnce(&GetAction<mojom::PlayNextCandidate>, + candidate.action_status))) { + return false; + } + + if (!ConvertProperty<mojom::PlayNextCandidate>( + candidate.entity, item->play_next_candidate.get(), + schema_org::property::kDuration, true, + base::BindOnce(&GetDuration<mojom::PlayNextCandidate>))) { + return false; + } + + return true; +} + +// Converts the entity to an EpisodeCandidate. +base::Optional<EpisodeCandidate> GetEpisodeCandidate(const EntityPtr& entity) { + if (entity->type != schema_org::entity::kTVEpisode) + return base::nullopt; + + EpisodeCandidate candidate; + candidate.entity = entity.get(); + + auto action_status = GetActionStatus(entity.get()); + if (!action_status) + return base::nullopt; + candidate.action_status = action_status.value(); + + auto episode_number = GetPositiveIntegerFromProperty( + entity.get(), schema_org::property::kEpisodeNumber); + if (!episode_number.has_value()) + return base::nullopt; + candidate.episode_number = episode_number.value(); + + return candidate; +} + +// Converts all the entity values in the property to episode candidates. Returns +// base::nullopt if any of the entities are not valid episode candidates. +base::Optional<std::vector<EpisodeCandidate>> GetEpisodeCandidatesFromProperty( + Property* property, + int season_number) { + std::vector<EpisodeCandidate> episodes; + if (!property) { + return episodes; + } + for (const EntityPtr& episode : property->values->entity_values) { + auto candidate = GetEpisodeCandidate(episode); + if (!candidate.has_value()) + return base::nullopt; + candidate.value().season_number = season_number; + episodes.push_back(std::move(candidate.value())); + } + return episodes; +} + +// Gets a list of EpisodeCandidates from the entity. These can be embedded +// either in the season or episode properties. Returns base::nullopt if any +// candidates were invalid. +base::Optional<std::vector<EpisodeCandidate>> GetEpisodeCandidates( + Entity* entity) { + std::vector<EpisodeCandidate> candidates; + auto* seasons = GetProperty(entity, schema_org::property::kContainsSeason); + if (seasons) { + for (const auto& season : seasons->values->entity_values) { + auto season_number = GetPositiveIntegerFromProperty( + season.get(), schema_org::property::kSeasonNumber); + if (!season_number.has_value()) + return base::nullopt; + auto season_episodes = GetEpisodeCandidatesFromProperty( + GetProperty(season.get(), schema_org::property::kEpisode), + season_number.value()); + if (!season_episodes.has_value()) + return base::nullopt; + candidates.insert(candidates.end(), season_episodes.value().begin(), + season_episodes.value().end()); + } + } + + auto embedded_episodes = GetEpisodeCandidatesFromProperty( + GetProperty(entity, schema_org::property::kEpisode), 0); + + if (!embedded_episodes.has_value()) + return base::nullopt; + + candidates.insert(candidates.end(), embedded_episodes.value().begin(), + embedded_episodes.value().end()); + return candidates; +} + +// Picks the main episode for the item from a list of candidates. Returns +// base::nullopt if there is no main episode. +base::Optional<EpisodeCandidate> PickMainEpisode( + std::vector<EpisodeCandidate> candidates) { + if (candidates.empty()) + return base::nullopt; + + if (candidates.size() == 1) + return candidates[0]; + + std::vector<EpisodeCandidate> main_candidates; + std::copy_if( + candidates.begin(), candidates.end(), std::back_inserter(main_candidates), + [](const EpisodeCandidate& e) { + return e.action_status == mojom::MediaFeedItemActionStatus::kActive || + e.action_status == mojom::MediaFeedItemActionStatus::kCompleted; + }); + + if (main_candidates.empty()) + return base::nullopt; + + return main_candidates[0]; +} + +// Picks the play next candidate for the item from a list of candidates. Returns +// base::nullopt if there is no matching candidate. +base::Optional<EpisodeCandidate> PickPlayNextCandidate( + std::vector<EpisodeCandidate> candidates, + const base::Optional<EpisodeCandidate>& main_episode, + const std::map<int, int>& number_of_episodes) { + if (!main_episode.has_value()) + return base::nullopt; + + // Try to find the number of episodes for the main episode's season so we know + // whether to look in the next season for the next episode. If we don't find + // it, just look for the next episode in the main episode's season. + auto find_num_episodes = + number_of_episodes.find(main_episode.value().season_number); + int next_episode = main_episode.value().episode_number + 1; + int next_season = main_episode.value().season_number; + if (find_num_episodes != number_of_episodes.end() && + next_episode > find_num_episodes->second) { + next_episode = 1; + next_season++; + } + + std::vector<EpisodeCandidate> next_candidates; + std::copy_if( + candidates.begin(), candidates.end(), std::back_inserter(next_candidates), + [](const EpisodeCandidate& e) { + return e.action_status == mojom::MediaFeedItemActionStatus::kPotential; + }); + auto it = std::find_if(next_candidates.begin(), next_candidates.end(), + [&](const EpisodeCandidate& e) { + return e.episode_number == next_episode && + e.season_number == next_season; + }); + if (it == next_candidates.end()) + return base::nullopt; + return *it; +} + +// Gets the TV season stored in an embedded entity and updates a map of (season +// number)->(number of episodes). Returns true if the TV season was valid. +// Embedded episodes are handled separately and not checked here. +bool GetSeason(const Property& property, + std::map<int, int>* number_of_episodes) { if (property.values->entity_values.empty()) return false; @@ -536,25 +772,18 @@ if (season->type != schema_org::entity::kTVSeason) return false; - if (!item->tv_episode) - item->tv_episode = mojom::TVEpisode::New(); - - auto* season_number = - GetProperty(season.get(), schema_org::property::kSeasonNumber); - if (!season_number || !IsPositiveInteger(*season_number)) - return false; - item->tv_episode->season_number = season_number->values->long_values[0]; - - auto* number_episodes = - GetProperty(season.get(), schema_org::property::kNumberOfEpisodes); - if (!number_episodes || !IsPositiveInteger(*number_episodes)) + auto season_number = GetPositiveIntegerFromProperty( + season.get(), schema_org::property::kSeasonNumber); + if (!season_number.has_value()) return false; - if (!ConvertProperty<mojom::MediaFeedItem>( - season.get(), item, schema_org::property::kEpisode, false, - base::BindOnce(&GetIdentifiers<mojom::MediaFeedItem>))) { + auto number_episodes = GetPositiveIntegerFromProperty( + season.get(), schema_org::property::kNumberOfEpisodes); + if (!number_episodes.has_value()) return false; - } + + number_of_episodes->insert( + std::make_pair(season_number.value(), number_episodes.value())); return true; } @@ -588,16 +817,6 @@ return true; } -// Gets the duration from the property and store the result in item. Returns -// true if the duration was valid. -bool GetDuration(const Property& property, mojom::MediaFeedItem* item) { - if (property.values->time_values.empty()) - return false; - - item->duration = property.values->time_values[0]; - return true; -} - // Given the schema.org data_feed_items, iterate through and convert all feed // items into MediaFeedItemPtr types. Store the converted items in // converted_feed_items. Skips invalid feed items. @@ -688,9 +907,9 @@ base::BindOnce(&GetMediaItemAuthor))) { continue; } - if (!convert_property.Run(schema_org::property::kDuration, - !converted_item->live, - base::BindOnce(&GetDuration))) { + if (!convert_property.Run( + schema_org::property::kDuration, !converted_item->live, + base::BindOnce(&GetDuration<mojom::MediaFeedItem>))) { continue; } if (!convert_property.Run(schema_org::property::kPublication, false, @@ -703,24 +922,40 @@ continue; } } else if (converted_item->type == mojom::MediaFeedItemType::kTVSeries) { - if (!convert_property.Run(schema_org::property::kEpisode, false, - base::BindOnce(&GetEpisode))) { + std::map<int, int> number_of_episodes; + auto* season = + GetProperty(item.get(), schema_org::property::kContainsSeason); + if (season && !GetSeason(*season, &number_of_episodes)) continue; - } - if (!convert_property.Run(schema_org::property::kContainsSeason, false, - base::BindOnce(&GetSeason))) { + auto episodes = GetEpisodeCandidates(item.get()); + if (!episodes.has_value()) + continue; + auto main_episode = PickMainEpisode(episodes.value()); + if (main_episode.has_value() && + !GetEpisode(main_episode.value(), converted_item.get())) + continue; + auto next_episode = PickPlayNextCandidate(episodes.value(), main_episode, + number_of_episodes); + if (next_episode.has_value() && + !GetPlayNextCandidate(next_episode.value(), converted_item.get())) { continue; } } bool has_embedded_action = item->type == schema_org::entity::kTVSeries && converted_item->action; - if (!convert_property.Run(schema_org::property::kPotentialAction, - !has_embedded_action, - base::BindOnce(&GetActionAndStatus))) { - continue; + if (!has_embedded_action) { + auto action_status = GetActionStatus(item.get()); + if (!action_status.has_value()) + continue; + converted_item->action_status = action_status.value(); + if (!convert_property.Run(schema_org::property::kPotentialAction, + !has_embedded_action, + base::BindOnce(&GetAction<mojom::MediaFeedItem>, + action_status.value()))) { + continue; + } } - converted_feed_items->push_back(std::move(converted_item)); } }
diff --git a/chrome/browser/media/feeds/media_feeds_converter_unittest.cc b/chrome/browser/media/feeds/media_feeds_converter_unittest.cc index 4a0583a..c4f6dd58 100644 --- a/chrome/browser/media/feeds/media_feeds_converter_unittest.cc +++ b/chrome/browser/media/feeds/media_feeds_converter_unittest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/media/feeds/media_feeds_converter.h" #include "base/strings/utf_string_conversions.h" +#include "base/time/time.h" #include "chrome/browser/media/feeds/media_feeds_store.mojom-forward.h" #include "chrome/browser/media/feeds/media_feeds_store.mojom-shared.h" #include "chrome/browser/media/feeds/media_feeds_store.mojom.h" @@ -33,7 +34,8 @@ MediaFeedsConverterTest() : extractor_({schema_org::entity::kCompleteDataFeed, schema_org::entity::kMovie, - schema_org::entity::kWatchAction}) {} + schema_org::entity::kWatchAction, + schema_org::entity::kTVEpisode}) {} protected: Property* GetProperty(Entity* entity, const std::string& name); @@ -47,8 +49,10 @@ PropertyPtr CreateDoubleProperty(const std::string& name, double value); PropertyPtr CreateEntityProperty(const std::string& name, EntityPtr value); EntityPtr ConvertJSONToEntityPtr(const std::string& json); - EntityPtr ValidWatchAction(); + EntityPtr ValidActiveWatchAction(); + EntityPtr ValidPotentialWatchAction(); EntityPtr ValidMediaFeed(); + EntityPtr ValidEpisode(int episode_number, EntityPtr action); EntityPtr ValidMediaFeedItem(); mojom::MediaFeedItemPtr ExpectedFeedItem(); EntityPtr AddItemToFeed(EntityPtr feed, EntityPtr item); @@ -144,7 +148,7 @@ return extractor_.Extract(json); } -EntityPtr MediaFeedsConverterTest::ValidWatchAction() { +EntityPtr MediaFeedsConverterTest::ValidActiveWatchAction() { return extractor_.Extract( R"END( { @@ -156,6 +160,18 @@ )END"); } +EntityPtr MediaFeedsConverterTest::ValidPotentialWatchAction() { + return extractor_.Extract( + R"END( + { + "@type": "WatchAction", + "target": "https://www.example.com", + "actionStatus": "https://schema.org/PotentialActionStatus", + "startTime": "01:00:00" + } + )END"); +} + EntityPtr MediaFeedsConverterTest::ValidMediaFeed() { return extractor_.Extract( R"END( @@ -176,6 +192,28 @@ )END"); } +EntityPtr MediaFeedsConverterTest::ValidEpisode(int episode_number, + EntityPtr action) { + EntityPtr episode = extractor_.Extract( + R"END( + { + "@type": "TVEpisode", + "name": "Pilot", + "identifier": { + "@type": "PropertyValue", + "propertyID": "TMS_ROOT_ID", + "value": "1" + }, + "duration": "PT1H" + } + )END"); + episode->properties.push_back( + CreateLongProperty(schema_org::property::kEpisodeNumber, episode_number)); + episode->properties.push_back(CreateEntityProperty( + schema_org::property::kPotentialAction, std::move(action))); + return episode; +} + EntityPtr MediaFeedsConverterTest::ValidMediaFeedItem() { EntityPtr item = extractor_.Extract( R"END( @@ -190,7 +228,7 @@ )END"); item->properties.push_back(CreateEntityProperty( - schema_org::property::kPotentialAction, ValidWatchAction())); + schema_org::property::kPotentialAction, ValidActiveWatchAction())); return item; } @@ -679,31 +717,10 @@ // embedded in the TV episode instead. GetProperty(item.get(), schema_org::property::kPotentialAction)->name = "not an action"; - item->properties.push_back( - CreateLongProperty(schema_org::property::kNumberOfEpisodes, 20)); - item->properties.push_back( - CreateLongProperty(schema_org::property::kNumberOfSeasons, 6)); - { - EntityPtr episode = Entity::New(); - episode->type = schema_org::entity::kTVEpisode; - episode->properties.push_back( - CreateLongProperty(schema_org::property::kEpisodeNumber, 1)); - episode->properties.push_back( - CreateStringProperty(schema_org::property::kName, "Pilot")); - EntityPtr identifier = Entity::New(); - identifier->type = schema_org::entity::kPropertyValue; - identifier->properties.push_back( - CreateStringProperty(schema_org::property::kPropertyID, "TMS_ROOT_ID")); - identifier->properties.push_back( - CreateStringProperty(schema_org::property::kValue, "1")); - episode->properties.push_back(CreateEntityProperty( - schema_org::property::kIdentifier, std::move(identifier))); - episode->properties.push_back(CreateEntityProperty( - schema_org::property::kPotentialAction, ValidWatchAction())); - item->properties.push_back(CreateEntityProperty( - schema_org::property::kEpisode, std::move(episode))); - } + item->properties.push_back( + CreateEntityProperty(schema_org::property::kEpisode, + ValidEpisode(1, ValidPotentialWatchAction()))); EntityPtr entity = AddItemToFeed(ValidMediaFeed(), std::move(item)); @@ -716,6 +733,9 @@ identifier->type = mojom::Identifier::Type::kTMSRootId; identifier->value = "1"; expected_item->tv_episode->identifiers.push_back(std::move(identifier)); + expected_item->action_status = mojom::MediaFeedItemActionStatus::kPotential; + expected_item->action->start_time = base::nullopt; + expected_item->action->url = GURL("https://www.example.com"); auto result = GetResults(std::move(entity)); @@ -740,7 +760,7 @@ episode->properties.push_back( CreateStringProperty(schema_org::property::kName, "")); episode->properties.push_back(CreateEntityProperty( - schema_org::property::kPotentialAction, ValidWatchAction())); + schema_org::property::kPotentialAction, ValidActiveWatchAction())); item->properties.push_back( CreateEntityProperty(schema_org::property::kEpisode, std::move(episode))); @@ -755,10 +775,6 @@ TEST_F(MediaFeedsConverterTest, SucceedsItemWithTVSeason) { EntityPtr item = ValidMediaFeedItem(); item->type = schema_org::entity::kTVSeries; - item->properties.push_back( - CreateLongProperty(schema_org::property::kNumberOfEpisodes, 20)); - item->properties.push_back( - CreateLongProperty(schema_org::property::kNumberOfSeasons, 6)); { EntityPtr season = Entity::New(); @@ -775,8 +791,6 @@ mojom::MediaFeedItemPtr expected_item = ExpectedFeedItem(); expected_item->type = mojom::MediaFeedItemType::kTVSeries; - expected_item->tv_episode = mojom::TVEpisode::New(); - expected_item->tv_episode->season_number = 1; auto result = GetResults(std::move(entity)); @@ -812,4 +826,194 @@ EXPECT_TRUE(result.value().empty()); } +TEST_F(MediaFeedsConverterTest, SucceedsItemWithPlayNextTwoSeasons) { + EntityPtr item = ValidMediaFeedItem(); + item->type = schema_org::entity::kTVSeries; + + PropertyPtr property = Property::New(); + property->name = schema_org::property::kContainsSeason; + property->values = Values::New(); + + { + EntityPtr season = Entity::New(); + season->type = schema_org::entity::kTVSeason; + season->properties.push_back( + CreateLongProperty(schema_org::property::kSeasonNumber, 1)); + season->properties.push_back( + CreateLongProperty(schema_org::property::kNumberOfEpisodes, 20)); + season->properties.push_back( + CreateEntityProperty(schema_org::property::kEpisode, + ValidEpisode(20, ValidActiveWatchAction()))); + property->values->entity_values.push_back(std::move(season)); + } + { + EntityPtr season = Entity::New(); + season->type = schema_org::entity::kTVSeason; + season->properties.push_back( + CreateLongProperty(schema_org::property::kSeasonNumber, 2)); + season->properties.push_back( + CreateLongProperty(schema_org::property::kNumberOfEpisodes, 20)); + season->properties.push_back( + CreateEntityProperty(schema_org::property::kEpisode, + ValidEpisode(1, ValidPotentialWatchAction()))); + property->values->entity_values.push_back(std::move(season)); + } + item->properties.push_back(std::move(property)); + + EntityPtr entity = AddItemToFeed(ValidMediaFeed(), std::move(item)); + + mojom::MediaFeedItemPtr expected_item = ExpectedFeedItem(); + expected_item->type = mojom::MediaFeedItemType::kTVSeries; + { + expected_item->tv_episode = mojom::TVEpisode::New(); + expected_item->tv_episode->episode_number = 20; + expected_item->tv_episode->season_number = 1; + expected_item->tv_episode->name = "Pilot"; + mojom::IdentifierPtr identifier = mojom::Identifier::New(); + identifier->type = mojom::Identifier::Type::kTMSRootId; + identifier->value = "1"; + expected_item->tv_episode->identifiers.push_back(std::move(identifier)); + } + { + expected_item->play_next_candidate = mojom::PlayNextCandidate::New(); + expected_item->play_next_candidate->episode_number = 1; + expected_item->play_next_candidate->season_number = 2; + expected_item->play_next_candidate->name = "Pilot"; + mojom::IdentifierPtr identifier = mojom::Identifier::New(); + identifier->type = mojom::Identifier::Type::kTMSRootId; + identifier->value = "1"; + expected_item->play_next_candidate->identifiers.push_back( + std::move(identifier)); + expected_item->play_next_candidate->duration = + base::TimeDelta::FromHours(1); + expected_item->play_next_candidate->action = mojom::Action::New(); + expected_item->play_next_candidate->action->url = + GURL("https://www.example.com"); + } + + auto result = GetResults(std::move(entity)); + + EXPECT_TRUE(result.has_value()); + ASSERT_EQ(result.value().size(), 1u); + EXPECT_EQ(expected_item, result.value()[0]); +} + +TEST_F(MediaFeedsConverterTest, SucceedsItemWithPlayNextSameSeason) { + EntityPtr item = ValidMediaFeedItem(); + item->type = schema_org::entity::kTVSeries; + + EntityPtr season = Entity::New(); + season->type = schema_org::entity::kTVSeason; + season->properties.push_back( + CreateLongProperty(schema_org::property::kSeasonNumber, 1)); + season->properties.push_back( + CreateLongProperty(schema_org::property::kNumberOfEpisodes, 20)); + + PropertyPtr property = Property::New(); + property->name = schema_org::property::kEpisode; + property->values = Values::New(); + property->values->entity_values.push_back( + ValidEpisode(15, ValidActiveWatchAction())); + property->values->entity_values.push_back( + ValidEpisode(16, ValidPotentialWatchAction())); + season->properties.push_back(std::move(property)); + + item->properties.push_back(CreateEntityProperty( + schema_org::property::kContainsSeason, std::move(season))); + + EntityPtr entity = AddItemToFeed(ValidMediaFeed(), std::move(item)); + + mojom::MediaFeedItemPtr expected_item = ExpectedFeedItem(); + expected_item->type = mojom::MediaFeedItemType::kTVSeries; + { + expected_item->tv_episode = mojom::TVEpisode::New(); + expected_item->tv_episode->episode_number = 15; + expected_item->tv_episode->season_number = 1; + expected_item->tv_episode->name = "Pilot"; + mojom::IdentifierPtr identifier = mojom::Identifier::New(); + identifier->type = mojom::Identifier::Type::kTMSRootId; + identifier->value = "1"; + expected_item->tv_episode->identifiers.push_back(std::move(identifier)); + } + { + expected_item->play_next_candidate = mojom::PlayNextCandidate::New(); + expected_item->play_next_candidate->episode_number = 16; + expected_item->play_next_candidate->season_number = 1; + expected_item->play_next_candidate->name = "Pilot"; + mojom::IdentifierPtr identifier = mojom::Identifier::New(); + identifier->type = mojom::Identifier::Type::kTMSRootId; + identifier->value = "1"; + expected_item->play_next_candidate->identifiers.push_back( + std::move(identifier)); + expected_item->play_next_candidate->duration = + base::TimeDelta::FromHours(1); + expected_item->play_next_candidate->action = mojom::Action::New(); + expected_item->play_next_candidate->action->url = + GURL("https://www.example.com"); + } + + auto result = GetResults(std::move(entity)); + + EXPECT_TRUE(result.has_value()); + ASSERT_EQ(result.value().size(), 1u); + EXPECT_EQ(result.value()[0]->tv_episode, expected_item->tv_episode); + EXPECT_EQ(result.value()[0]->play_next_candidate, + expected_item->play_next_candidate); + EXPECT_EQ(expected_item, result.value()[0]); +} + +TEST_F(MediaFeedsConverterTest, SucceedsItemWithPlayNextNoSeason) { + EntityPtr item = ValidMediaFeedItem(); + item->type = schema_org::entity::kTVSeries; + + PropertyPtr property = Property::New(); + property->name = schema_org::property::kEpisode; + property->values = Values::New(); + property->values->entity_values.push_back( + ValidEpisode(15, ValidActiveWatchAction())); + property->values->entity_values.push_back( + ValidEpisode(16, ValidPotentialWatchAction())); + item->properties.push_back(std::move(property)); + + EntityPtr entity = AddItemToFeed(ValidMediaFeed(), std::move(item)); + + mojom::MediaFeedItemPtr expected_item = ExpectedFeedItem(); + expected_item->type = mojom::MediaFeedItemType::kTVSeries; + { + expected_item->tv_episode = mojom::TVEpisode::New(); + expected_item->tv_episode->episode_number = 15; + expected_item->tv_episode->season_number = 0; + expected_item->tv_episode->name = "Pilot"; + mojom::IdentifierPtr identifier = mojom::Identifier::New(); + identifier->type = mojom::Identifier::Type::kTMSRootId; + identifier->value = "1"; + expected_item->tv_episode->identifiers.push_back(std::move(identifier)); + } + { + expected_item->play_next_candidate = mojom::PlayNextCandidate::New(); + expected_item->play_next_candidate->episode_number = 16; + expected_item->play_next_candidate->season_number = 0; + expected_item->play_next_candidate->name = "Pilot"; + mojom::IdentifierPtr identifier = mojom::Identifier::New(); + identifier->type = mojom::Identifier::Type::kTMSRootId; + identifier->value = "1"; + expected_item->play_next_candidate->identifiers.push_back( + std::move(identifier)); + expected_item->play_next_candidate->duration = + base::TimeDelta::FromHours(1); + expected_item->play_next_candidate->action = mojom::Action::New(); + expected_item->play_next_candidate->action->url = + GURL("https://www.example.com"); + } + + auto result = GetResults(std::move(entity)); + + EXPECT_TRUE(result.has_value()); + ASSERT_EQ(result.value().size(), 1u); + EXPECT_EQ(result.value()[0]->tv_episode, expected_item->tv_episode); + EXPECT_EQ(result.value()[0]->play_next_candidate, + expected_item->play_next_candidate); + EXPECT_EQ(expected_item, result.value()[0]); +} + } // namespace media_feeds
diff --git a/chrome/browser/media/feeds/media_feeds_store.mojom b/chrome/browser/media/feeds/media_feeds_store.mojom index 80a6d7c..04100f0 100644 --- a/chrome/browser/media/feeds/media_feeds_store.mojom +++ b/chrome/browser/media/feeds/media_feeds_store.mojom
@@ -48,6 +48,11 @@ // A display name for the feed. string display_name; + + // The audio+video watchtime percentile for this feed's origin. Calculated as + // the number of other origins with less watchtime divided by the total + // number of other origins. The value is between 0.0 and 100.0. + double origin_audio_video_watchtime_percentile; }; // The result of fetching the feed. This enum is committed to storage so do not
diff --git a/chrome/browser/media/history/media_history_feeds_table.cc b/chrome/browser/media/history/media_history_feeds_table.cc index a2cb35a0..31bc685 100644 --- a/chrome/browser/media/history/media_history_feeds_table.cc +++ b/chrome/browser/media/history/media_history_feeds_table.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/media/history/media_history_feeds_table.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/updateable_sequenced_task_runner.h" #include "chrome/browser/media/feeds/media_feeds.pb.h" @@ -134,23 +135,93 @@ } } -std::vector<media_feeds::mojom::MediaFeedPtr> -MediaHistoryFeedsTable::GetRows() { +std::vector<media_feeds::mojom::MediaFeedPtr> MediaHistoryFeedsTable::GetRows( + const MediaHistoryKeyedService::GetMediaFeedsRequest& request) { std::vector<media_feeds::mojom::MediaFeedPtr> feeds; if (!CanAccessDatabase()) return feeds; - sql::Statement statement(DB()->GetUniqueStatement( - "SELECT id, url, last_discovery_time_s, last_fetch_time_s, " - "user_status, last_fetch_result, fetch_failed_count, " - "last_fetch_time_not_cache_hit_s, " - "last_fetch_item_count, last_fetch_play_next_count, " - "last_fetch_content_types, " - "logo, display_name FROM mediaFeed")); + base::Optional<double> origin_count; + double rank = 0; + + std::vector<std::string> sql; + sql.push_back( + "SELECT " + "mediaFeed.id, " + "mediaFeed.url, " + "mediaFeed.last_discovery_time_s, " + "mediaFeed.last_fetch_time_s, " + "mediaFeed.user_status, " + "mediaFeed.last_fetch_result, " + "mediaFeed.fetch_failed_count, " + "mediaFeed.last_fetch_time_not_cache_hit_s, " + "mediaFeed.last_fetch_item_count, " + "mediaFeed.last_fetch_play_next_count, " + "mediaFeed.last_fetch_content_types, " + "mediaFeed.logo, " + "mediaFeed.display_name "); + + if (request.include_origin_watchtime_percentile_data) { + // If we need the percentile data we should select rows from the origin + // table and LEFT JOIN mediaFeed. This means there should be a row for each + // origin and if there is a media feed that will be included. + sql.push_back( + "FROM origin " + "LEFT JOIN mediaFeed " + "ON origin.id = mediaFeed.origin_id"); + } else if (request.audio_video_watchtime_min) { + // If we need to filter by |audio_video_watchtime_min| then we should join + // the origin table to get the watchtime data. + sql.push_back( + "FROM mediaFeed " + "LEFT JOIN origin " + "ON origin.id = mediaFeed.origin_id"); + } else { + sql.push_back("FROM mediaFeed"); + } + + // If we need a minimum watchtime then we should add it. + if (request.audio_video_watchtime_min) { + sql.push_back(base::StringPrintf( + "WHERE origin.aggregate_watchtime_audio_video_s > %f", + request.audio_video_watchtime_min->InSecondsF())); + } + + // Sorts the feeds in descending watchtime order. We also need the total count + // of the origins so we can calculate a percentile. + if (request.include_origin_watchtime_percentile_data) { + sql::Statement statement(DB()->GetCachedStatement( + SQL_FROM_HERE, "SELECT COUNT(id) FROM origin")); + + while (statement.Step()) { + origin_count = statement.ColumnDouble(0); + rank = *origin_count; + } + + DCHECK(origin_count.has_value()); + + sql.push_back("ORDER BY origin.aggregate_watchtime_audio_video_s DESC"); + } + + // Add a SQL limit if we need one. If we are calculating the percentile then + // we should use a C++ limit since we might have rows that do not have an + // associated media feed. + if (request.limit.has_value() && + !request.include_origin_watchtime_percentile_data) { + sql.push_back(base::StringPrintf("LIMIT %i", *request.limit)); + } + + sql::Statement statement( + DB()->GetUniqueStatement(base::JoinString(sql, " ").c_str())); while (statement.Step()) { - media_feeds::mojom::MediaFeedPtr feed(media_feeds::mojom::MediaFeed::New()); + rank--; + // If there is no mediaFeed data then skip this. + if (statement.GetColumnType(0) == sql::ColumnType::kNull) + continue; + + auto feed = media_feeds::mojom::MediaFeed::New(); feed->user_status = static_cast<media_feeds::mojom::FeedUserStatus>( statement.ColumnInt64(4)); feed->last_fetch_result = @@ -207,7 +278,17 @@ feed->display_name = statement.ColumnString(12); + if (request.include_origin_watchtime_percentile_data && origin_count > 1) { + feed->origin_audio_video_watchtime_percentile = + (rank / (*origin_count - 1)) * 100; + } + feeds.push_back(std::move(feed)); + + if (request.include_origin_watchtime_percentile_data && + request.limit.has_value() && feeds.size() >= *request.limit) { + break; + } } DCHECK(statement.Succeeded());
diff --git a/chrome/browser/media/history/media_history_feeds_table.h b/chrome/browser/media/history/media_history_feeds_table.h index e7a37bd..3d1da23 100644 --- a/chrome/browser/media/history/media_history_feeds_table.h +++ b/chrome/browser/media/history/media_history_feeds_table.h
@@ -8,6 +8,7 @@ #include <vector> #include "chrome/browser/media/feeds/media_feeds_store.mojom.h" +#include "chrome/browser/media/history/media_history_keyed_service.h" #include "chrome/browser/media/history/media_history_table_base.h" #include "sql/init_status.h" #include "url/gurl.h" @@ -62,7 +63,8 @@ const std::string& display_name); // Returns the feed rows in the database. - std::vector<media_feeds::mojom::MediaFeedPtr> GetRows(); + std::vector<media_feeds::mojom::MediaFeedPtr> GetRows( + const MediaHistoryKeyedService::GetMediaFeedsRequest& request); }; } // namespace media_history
diff --git a/chrome/browser/media/history/media_history_keyed_service.cc b/chrome/browser/media/history/media_history_keyed_service.cc index db8754e..4b482d90 100644 --- a/chrome/browser/media/history/media_history_keyed_service.cc +++ b/chrome/browser/media/history/media_history_keyed_service.cc
@@ -317,13 +317,29 @@ FROM_HERE, base::DoNothing(), std::move(callback)); } -void MediaHistoryKeyedService::GetMediaFeedsForDebug( +MediaHistoryKeyedService::GetMediaFeedsRequest::GetMediaFeedsRequest( + bool include_origin_watchtime_percentile_data, + base::Optional<unsigned> limit, + base::Optional<base::TimeDelta> audio_video_watchtime_min) + : include_origin_watchtime_percentile_data( + include_origin_watchtime_percentile_data), + limit(limit), + audio_video_watchtime_min(audio_video_watchtime_min) {} + +MediaHistoryKeyedService::GetMediaFeedsRequest::GetMediaFeedsRequest() = + default; + +MediaHistoryKeyedService::GetMediaFeedsRequest::GetMediaFeedsRequest( + const GetMediaFeedsRequest& t) = default; + +void MediaHistoryKeyedService::GetMediaFeeds( + const GetMediaFeedsRequest& request, base::OnceCallback<void(std::vector<media_feeds::mojom::MediaFeedPtr>)> callback) { base::PostTaskAndReplyWithResult( store_->GetForRead()->db_task_runner_.get(), FROM_HERE, - base::BindOnce(&MediaHistoryStore::GetMediaFeedsForDebug, - store_->GetForRead()), + base::BindOnce(&MediaHistoryStore::GetMediaFeeds, store_->GetForRead(), + request), std::move(callback)); }
diff --git a/chrome/browser/media/history/media_history_keyed_service.h b/chrome/browser/media/history/media_history_keyed_service.h index 5642d53..190454e 100644 --- a/chrome/browser/media/history/media_history_keyed_service.h +++ b/chrome/browser/media/history/media_history_keyed_service.h
@@ -134,9 +134,26 @@ // for waiting for database operations in tests. void PostTaskToDBForTest(base::OnceClosure callback); - // Returns all the rows in the media feeds table. This is only used for - // debugging because it loads all rows in the table. - void GetMediaFeedsForDebug( + // Returns Media Feeds. If |include_origin_watchtime_percentile_data| is true + // then we will return the feeds sorted by audio+video watchtime descending + // and we will also populate the |origin_audio_video_watchtime_percentile| + // field in |MediaFeedPtr|. If |limit| is specified then we will limit the + // number of results to this. If |audio_video_watchtime_min| is specified then + // this will require a minimum watchtime for feeds to be returned. + struct GetMediaFeedsRequest { + GetMediaFeedsRequest( + bool include_origin_watchtime_percentile_data, + base::Optional<unsigned> limit, + base::Optional<base::TimeDelta> audio_video_watchtime_min); + GetMediaFeedsRequest(); + GetMediaFeedsRequest(const GetMediaFeedsRequest& t); + + bool include_origin_watchtime_percentile_data = false; + base::Optional<unsigned> limit; + base::Optional<base::TimeDelta> audio_video_watchtime_min; + }; + void GetMediaFeeds( + const GetMediaFeedsRequest& request, base::OnceCallback<void(std::vector<media_feeds::mojom::MediaFeedPtr>)> callback);
diff --git a/chrome/browser/media/history/media_history_origin_table.cc b/chrome/browser/media/history/media_history_origin_table.cc index b2fba7ec..249b7b1 100644 --- a/chrome/browser/media/history/media_history_origin_table.cc +++ b/chrome/browser/media/history/media_history_origin_table.cc
@@ -45,6 +45,13 @@ kTableName) .c_str()); + if (success) { + success = DB()->Execute( + "CREATE INDEX IF NOT EXISTS " + "origin_aggregate_watchtime_audio_video_s_index ON " + "origin (aggregate_watchtime_audio_video_s)"); + } + if (!success) { ResetDB(); LOG(ERROR) << "Failed to create media history origin table.";
diff --git a/chrome/browser/media/history/media_history_store.cc b/chrome/browser/media/history/media_history_store.cc index 1a3cdbff..8e54fad53 100644 --- a/chrome/browser/media/history/media_history_store.cc +++ b/chrome/browser/media/history/media_history_store.cc
@@ -399,13 +399,13 @@ return playback_table_->GetPlaybackRows(); } -std::vector<media_feeds::mojom::MediaFeedPtr> -MediaHistoryStore::GetMediaFeedsForDebug() { +std::vector<media_feeds::mojom::MediaFeedPtr> MediaHistoryStore::GetMediaFeeds( + const MediaHistoryKeyedService::GetMediaFeedsRequest& request) { DCHECK(db_task_runner_->RunsTasksInCurrentSequence()); if (!CanAccessDatabase() || !feeds_table_) return std::vector<media_feeds::mojom::MediaFeedPtr>(); - return feeds_table_->GetRows(); + return feeds_table_->GetRows(request); } int MediaHistoryStore::GetTableRowCount(const std::string& table_name) {
diff --git a/chrome/browser/media/history/media_history_store.h b/chrome/browser/media/history/media_history_store.h index 60eab22..d931da3 100644 --- a/chrome/browser/media/history/media_history_store.h +++ b/chrome/browser/media/history/media_history_store.h
@@ -125,7 +125,8 @@ std::vector<mojom::MediaHistoryPlaybackRowPtr> GetMediaHistoryPlaybackRowsForDebug(); - std::vector<media_feeds::mojom::MediaFeedPtr> GetMediaFeedsForDebug(); + std::vector<media_feeds::mojom::MediaFeedPtr> GetMediaFeeds( + const MediaHistoryKeyedService::GetMediaFeedsRequest& request); void SavePlaybackSession( const GURL& url,
diff --git a/chrome/browser/media/history/media_history_store_unittest.cc b/chrome/browser/media/history/media_history_store_unittest.cc index 5e5ebd1..41bc821 100644 --- a/chrome/browser/media/history/media_history_store_unittest.cc +++ b/chrome/browser/media/history/media_history_store_unittest.cc
@@ -196,15 +196,18 @@ } std::vector<media_feeds::mojom::MediaFeedPtr> GetMediaFeedsSync( - MediaHistoryKeyedService* service) { + MediaHistoryKeyedService* service, + const MediaHistoryKeyedService::GetMediaFeedsRequest& request = + MediaHistoryKeyedService::GetMediaFeedsRequest()) { base::RunLoop run_loop; std::vector<media_feeds::mojom::MediaFeedPtr> out; - service->GetMediaFeedsForDebug(base::BindLambdaForTesting( - [&](std::vector<media_feeds::mojom::MediaFeedPtr> rows) { - out = std::move(rows); - run_loop.Quit(); - })); + service->GetMediaFeeds( + request, base::BindLambdaForTesting( + [&](std::vector<media_feeds::mojom::MediaFeedPtr> rows) { + out = std::move(rows); + run_loop.Quit(); + })); run_loop.Run(); return out; @@ -1119,6 +1122,20 @@ // The OTR service should have the same data. EXPECT_EQ(items, GetItemsForMediaFeedSync(otr_service(), feed_id_b)); } + + { + // Check the feeds limit function works. + auto feeds = GetMediaFeedsSync( + service(), MediaHistoryKeyedService::GetMediaFeedsRequest( + false, 1, base::nullopt)); + + if (IsReadOnly()) { + EXPECT_TRUE(feeds.empty()); + } else { + ASSERT_EQ(1u, feeds.size()); + EXPECT_EQ(feed_id_a, feeds[0]->id); + } + } } TEST_P(MediaHistoryStoreFeedsTest, StoreMediaFeedFetchResult_BadType) { @@ -1589,4 +1606,230 @@ } } +TEST_P(MediaHistoryStoreFeedsTest, GetMediaFeedsSortByWatchtimePercentile) { + // We add 111 origins with watchtime and feeds for all but one of these. + const unsigned kNumberOfOrigins = 111; + const unsigned kNumberOfFeeds = 110; + + // The starting percentile always has one percentage value taken off. This + // is because we have one extra origin with the highest watchtime that does + // not have a feed. + const double kPercentageValue = 100.0 / kNumberOfOrigins; + const double kStartingPercentile = 100 - kPercentageValue; + + // Generate a bunch of media feeds. + std::set<GURL> feeds; + for (unsigned i = 0; i < kNumberOfOrigins; i++) { + GURL url(base::StringPrintf("https://www.google%i.com/feed", i)); + feeds.insert(url); + + // Each origin will have a ascending amount of watchtime from 0 to + // |kNumberOfOrigins|. + auto watchtime = base::TimeDelta::FromMinutes(i); + content::MediaPlayerWatchTime watch_time(url, url.GetOrigin(), watchtime, + base::TimeDelta(), true, true); + + service()->SavePlayback(watch_time); + + if (i < kNumberOfFeeds) + service()->DiscoverMediaFeed(url); + } + + WaitForDB(); + + { + // Check the feeds and origins were stored. + auto feeds = GetMediaFeedsSync(service()); + auto origins = GetOriginRowsSync(service()); + + if (IsReadOnly()) { + EXPECT_TRUE(feeds.empty()); + EXPECT_TRUE(origins.empty()); + } else { + EXPECT_EQ(kNumberOfFeeds, feeds.size()); + EXPECT_EQ(kNumberOfOrigins, origins.size()); + + int i = 0; + for (auto& origin : origins) { + auto watchtime = base::TimeDelta::FromMinutes(i); + + EXPECT_EQ(watchtime, origin->cached_audio_video_watchtime); + EXPECT_EQ(watchtime, origin->actual_audio_video_watchtime); + + i++; + } + } + + // The OTR service should have the same data. + EXPECT_EQ(feeds, GetMediaFeedsSync(otr_service())); + EXPECT_EQ(origins, GetOriginRowsSync(otr_service())); + } + + { + // Check the media feed sorting by sort_by_audio_video_watchtime_desc works. + auto feeds = GetMediaFeedsSync( + service(), MediaHistoryKeyedService::GetMediaFeedsRequest( + true, base::nullopt, base::nullopt)); + + if (IsReadOnly()) { + EXPECT_TRUE(feeds.empty()); + } else { + EXPECT_EQ(kNumberOfFeeds, feeds.size()); + + unsigned count = kNumberOfFeeds; + double percentile = kStartingPercentile; + double last_percentile = 101.0; + for (auto& feed : feeds) { + GURL url( + base::StringPrintf("https://www.google%i.com/feed", count - 1)); + + EXPECT_EQ(count, feed->id); + EXPECT_EQ(url, feed->url); + EXPECT_FALSE(feed->last_fetch_time.has_value()); + EXPECT_EQ(media_feeds::mojom::FetchResult::kNone, + feed->last_fetch_result); + EXPECT_EQ(0, feed->fetch_failed_count); + EXPECT_FALSE(feed->last_fetch_time_not_cache_hit.has_value()); + EXPECT_EQ(0, feed->last_fetch_item_count); + EXPECT_EQ(0, feed->last_fetch_play_next_count); + EXPECT_EQ(0, feed->last_fetch_content_types); + EXPECT_TRUE(feed->logos.empty()); + EXPECT_TRUE(feed->display_name.empty()); + EXPECT_NEAR(percentile, feed->origin_audio_video_watchtime_percentile, + 1); + EXPECT_GT(last_percentile, + feed->origin_audio_video_watchtime_percentile); + + last_percentile = feed->origin_audio_video_watchtime_percentile; + percentile = percentile - kPercentageValue; + count--; + } + } + } + + { + // Check the media feed sorting by sort_by_audio_video_watchtime_desc works + // with a limit applied. + auto feeds = GetMediaFeedsSync( + service(), MediaHistoryKeyedService::GetMediaFeedsRequest( + true, 10, base::nullopt)); + + if (IsReadOnly()) { + EXPECT_TRUE(feeds.empty()); + } else { + EXPECT_EQ(10u, feeds.size()); + + unsigned count = kNumberOfFeeds; + double percentile = kStartingPercentile; + double last_percentile = 101.0; + for (auto& feed : feeds) { + GURL url( + base::StringPrintf("https://www.google%i.com/feed", count - 1)); + + EXPECT_EQ(count, feed->id); + EXPECT_EQ(url, feed->url); + EXPECT_NEAR(percentile, feed->origin_audio_video_watchtime_percentile, + 1); + EXPECT_GT(last_percentile, + feed->origin_audio_video_watchtime_percentile); + + last_percentile = feed->origin_audio_video_watchtime_percentile; + percentile = percentile - kPercentageValue; + count--; + } + } + } + + { + // Check the media feed sorting by sort_by_audio_video_watchtime_desc works + // with a minimum watchtime requirement and ranking. + auto feeds = GetMediaFeedsSync( + service(), MediaHistoryKeyedService::GetMediaFeedsRequest( + true, base::nullopt, base::TimeDelta::FromMinutes(30))); + + if (IsReadOnly()) { + EXPECT_TRUE(feeds.empty()); + } else { + EXPECT_EQ(79u, feeds.size()); + + unsigned count = kNumberOfFeeds; + double percentile = kStartingPercentile; + double last_percentile = 101.0; + for (auto& feed : feeds) { + GURL url( + base::StringPrintf("https://www.google%i.com/feed", count - 1)); + + EXPECT_EQ(count, feed->id); + EXPECT_EQ(url, feed->url); + EXPECT_NEAR(percentile, feed->origin_audio_video_watchtime_percentile, + 1); + EXPECT_GT(last_percentile, + feed->origin_audio_video_watchtime_percentile); + + last_percentile = feed->origin_audio_video_watchtime_percentile; + percentile = percentile - kPercentageValue; + count--; + } + } + } + + { + // Check the media feed sorting by sort_by_audio_video_watchtime_desc works + // with a minimum watchtime requirement, ranking and limit. + auto feeds = GetMediaFeedsSync( + service(), MediaHistoryKeyedService::GetMediaFeedsRequest( + true, 10, base::TimeDelta::FromMinutes(30))); + + if (IsReadOnly()) { + EXPECT_TRUE(feeds.empty()); + } else { + EXPECT_EQ(10u, feeds.size()); + + unsigned count = kNumberOfFeeds; + double percentile = kStartingPercentile; + double last_percentile = 101.0; + for (auto& feed : feeds) { + GURL url( + base::StringPrintf("https://www.google%i.com/feed", count - 1)); + + EXPECT_EQ(count, feed->id); + EXPECT_EQ(url, feed->url); + EXPECT_NEAR(percentile, feed->origin_audio_video_watchtime_percentile, + 1); + EXPECT_GT(last_percentile, + feed->origin_audio_video_watchtime_percentile); + + last_percentile = feed->origin_audio_video_watchtime_percentile; + percentile = percentile - kPercentageValue; + count--; + } + } + } + + { + // Check the media feed minimum watchtime ranking works without the + // percentile data. + auto feeds = GetMediaFeedsSync( + service(), MediaHistoryKeyedService::GetMediaFeedsRequest( + false, base::nullopt, base::TimeDelta::FromMinutes(30))); + + if (IsReadOnly()) { + EXPECT_TRUE(feeds.empty()); + } else { + EXPECT_EQ(79u, feeds.size()); + + unsigned count = 32; + for (auto& feed : feeds) { + GURL url( + base::StringPrintf("https://www.google%i.com/feed", count - 1)); + + EXPECT_EQ(count, feed->id); + EXPECT_EQ(url, feed->url); + + count++; + } + } + } +} + } // namespace media_history
diff --git a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.cc new file mode 100644 index 0000000..cecb85cd --- /dev/null +++ b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.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 "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h" + +#include "chrome/browser/content_settings/tab_specific_content_settings.h" +#include "components/permissions/permission_request_id.h" + +CameraPanTiltZoomPermissionContext::CameraPanTiltZoomPermissionContext( + content::BrowserContext* browser_context) + : PermissionContextBase(browser_context, + ContentSettingsType::CAMERA_PAN_TILT_ZOOM, + blink::mojom::FeaturePolicyFeature::kNotFound) {} + +CameraPanTiltZoomPermissionContext::~CameraPanTiltZoomPermissionContext() = + default; + +void CameraPanTiltZoomPermissionContext::DecidePermission( + content::WebContents* web_contents, + const permissions::PermissionRequestID& id, + const GURL& requesting_origin, + const GURL& embedding_origin, + bool user_gesture, + permissions::BrowserPermissionCallback callback) { + // TODO(crbug.com/934063): Remove when user prompt is implemented. + NOTREACHED(); +} + +bool CameraPanTiltZoomPermissionContext::IsRestrictedToSecureOrigins() const { + return true; +}
diff --git a/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h new file mode 100644 index 0000000..ddad91420 --- /dev/null +++ b/chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h
@@ -0,0 +1,36 @@ +// 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_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_ +#define CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_ + +#include "base/macros.h" +#include "components/permissions/permission_context_base.h" + +// Manage user permissions that only controls camera movement (pan/tilt/zoom). +class CameraPanTiltZoomPermissionContext + : public permissions::PermissionContextBase { + public: + explicit CameraPanTiltZoomPermissionContext( + content::BrowserContext* browser_context); + ~CameraPanTiltZoomPermissionContext() override; + + CameraPanTiltZoomPermissionContext( + const CameraPanTiltZoomPermissionContext&) = delete; + CameraPanTiltZoomPermissionContext& operator=( + const CameraPanTiltZoomPermissionContext&) = delete; + + private: + // PermissionContextBase + void DecidePermission( + content::WebContents* web_contents, + const permissions::PermissionRequestID& id, + const GURL& requesting_origin, + const GURL& embedding_origin, + bool user_gesture, + permissions::BrowserPermissionCallback callback) override; + bool IsRestrictedToSecureOrigins() const override; +}; + +#endif // CHROME_BROWSER_MEDIA_WEBRTC_CAMERA_PAN_TILT_ZOOM_PERMISSION_CONTEXT_H_
diff --git a/chrome/browser/omnibox/OWNERS b/chrome/browser/omnibox/OWNERS new file mode 100644 index 0000000..90b1b756 --- /dev/null +++ b/chrome/browser/omnibox/OWNERS
@@ -0,0 +1,3 @@ +file://components/omnibox/OWNERS + +# COMPONENT: UI>Browser>Omnibox
diff --git a/chrome/browser/omnibox/suggestions/answer/answer_suggestion_processor_unittest.cc b/chrome/browser/omnibox/suggestions/answer/answer_suggestion_processor_unittest.cc new file mode 100644 index 0000000..0de5fcb --- /dev/null +++ b/chrome/browser/omnibox/suggestions/answer/answer_suggestion_processor_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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/AnswerSuggestionProcessorUnitTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class AnswerSuggestionProcessorUnitTest : public ::testing::Test { + public: + AnswerSuggestionProcessorUnitTest() + : j_test_(Java_AnswerSuggestionProcessorUnitTest_Constructor( + AttachCurrentThread())) {} + + void SetUp() override { + Java_AnswerSuggestionProcessorUnitTest_setUp(AttachCurrentThread(), + j_test_); + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(AnswerSuggestionProcessorUnitTest, j_test())
diff --git a/chrome/browser/omnibox/suggestions/autocomplete_mediator_unittest.cc b/chrome/browser/omnibox/suggestions/autocomplete_mediator_unittest.cc new file mode 100644 index 0000000..2127ac3 --- /dev/null +++ b/chrome/browser/omnibox/suggestions/autocomplete_mediator_unittest.cc
@@ -0,0 +1,30 @@ +// 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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/AutocompleteMediatorUnitTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class AutocompleteMediatorUnitTest : public ::testing::Test { + public: + AutocompleteMediatorUnitTest() + : j_test_(Java_AutocompleteMediatorUnitTest_Constructor( + AttachCurrentThread())) {} + + void SetUp() override { + Java_AutocompleteMediatorUnitTest_setUp(AttachCurrentThread(), j_test_); + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(AutocompleteMediatorUnitTest, j_test())
diff --git a/chrome/browser/omnibox/suggestions/base/base_suggestion_processor_unittest.cc b/chrome/browser/omnibox/suggestions/base/base_suggestion_processor_unittest.cc new file mode 100644 index 0000000..724b189 --- /dev/null +++ b/chrome/browser/omnibox/suggestions/base/base_suggestion_processor_unittest.cc
@@ -0,0 +1,30 @@ +// 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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/BaseSuggestionProcessorTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class BaseSuggestionProcessorTest : public ::testing::Test { + public: + BaseSuggestionProcessorTest() + : j_test_(Java_BaseSuggestionProcessorTest_Constructor( + AttachCurrentThread())) {} + + void SetUp() override { + Java_BaseSuggestionProcessorTest_setUp(AttachCurrentThread(), j_test_); + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(BaseSuggestionProcessorTest, j_test())
diff --git a/chrome/browser/omnibox/suggestions/basic/basic_suggestion_processor_unittest.cc b/chrome/browser/omnibox/suggestions/basic/basic_suggestion_processor_unittest.cc new file mode 100644 index 0000000..b669950 --- /dev/null +++ b/chrome/browser/omnibox/suggestions/basic/basic_suggestion_processor_unittest.cc
@@ -0,0 +1,30 @@ +// 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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/BasicSuggestionProcessorUnitTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class BasicSuggestionProcessorUnitTest : public ::testing::Test { + public: + BasicSuggestionProcessorUnitTest() + : j_test_(Java_BasicSuggestionProcessorUnitTest_Constructor( + AttachCurrentThread())) {} + + void SetUp() override { + Java_BasicSuggestionProcessorUnitTest_setUp(AttachCurrentThread(), j_test_); + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(BasicSuggestionProcessorUnitTest, j_test())
diff --git a/chrome/browser/omnibox/suggestions/clipboard/clipboard_suggestion_processor_unittest.cc b/chrome/browser/omnibox/suggestions/clipboard/clipboard_suggestion_processor_unittest.cc new file mode 100644 index 0000000..1b9ee3f --- /dev/null +++ b/chrome/browser/omnibox/suggestions/clipboard/clipboard_suggestion_processor_unittest.cc
@@ -0,0 +1,30 @@ +// 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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/ClipboardSuggestionProcessorTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class ClipboardSuggestionProcessorTest : public ::testing::Test { + public: + ClipboardSuggestionProcessorTest() + : j_test_(Java_ClipboardSuggestionProcessorTest_Constructor( + AttachCurrentThread())) {} + + void SetUp() override { + Java_ClipboardSuggestionProcessorTest_setUp(AttachCurrentThread(), j_test_); + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(ClipboardSuggestionProcessorTest, j_test())
diff --git a/chrome/browser/omnibox/suggestions/editurl/edit_url_suggestions_unittest.cc b/chrome/browser/omnibox/suggestions/editurl/edit_url_suggestions_unittest.cc new file mode 100644 index 0000000..a3e56ec --- /dev/null +++ b/chrome/browser/omnibox/suggestions/editurl/edit_url_suggestions_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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/EditUrlSuggestionUnitTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class EditUrlSuggestionUnitTest : public ::testing::Test { + public: + EditUrlSuggestionUnitTest() + : j_test_( + Java_EditUrlSuggestionUnitTest_Constructor(AttachCurrentThread())) { + } + + void SetUp() override { + Java_EditUrlSuggestionUnitTest_setUp(AttachCurrentThread(), j_test_); + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(EditUrlSuggestionUnitTest, j_test())
diff --git a/chrome/browser/omnibox/suggestions/entity/entity_suggestions_processor_unittest.cc b/chrome/browser/omnibox/suggestions/entity/entity_suggestions_processor_unittest.cc new file mode 100644 index 0000000..881acbd1f7 --- /dev/null +++ b/chrome/browser/omnibox/suggestions/entity/entity_suggestions_processor_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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/EntitySuggestionProcessorUnitTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class EntitySuggestionProcessorUnitTest : public ::testing::Test { + public: + EntitySuggestionProcessorUnitTest() + : j_test_(Java_EntitySuggestionProcessorUnitTest_Constructor( + AttachCurrentThread())) {} + + void SetUp() override { + Java_EntitySuggestionProcessorUnitTest_setUp(AttachCurrentThread(), + j_test_); + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(EntitySuggestionProcessorUnitTest, j_test())
diff --git a/chrome/browser/omnibox/suggestions/omnibox_suggestion_unittest.cc b/chrome/browser/omnibox/suggestions/omnibox_suggestion_unittest.cc new file mode 100644 index 0000000..b358f174 --- /dev/null +++ b/chrome/browser/omnibox/suggestions/omnibox_suggestion_unittest.cc
@@ -0,0 +1,27 @@ +// 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 "base/android/jni_android.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/android/native_j_unittests_jni_headers/OmniboxSuggestionUnitTest_jni.h" +#include "testing/gtest/include/gtest/gtest.h" + +using base::android::AttachCurrentThread; + +class OmniboxSuggestionUnitTest : public ::testing::Test { + public: + OmniboxSuggestionUnitTest() + : j_test_( + Java_OmniboxSuggestionUnitTest_Constructor(AttachCurrentThread())) { + } + + const base::android::ScopedJavaGlobalRef<jobject>& j_test() { + return j_test_; + } + + private: + base::android::ScopedJavaGlobalRef<jobject> j_test_; +}; + +JAVA_TESTS(OmniboxSuggestionUnitTest, j_test())
diff --git a/chrome/browser/permissions/permission_manager_factory.cc b/chrome/browser/permissions/permission_manager_factory.cc index 7972a18..bbd7396 100644 --- a/chrome/browser/permissions/permission_manager_factory.cc +++ b/chrome/browser/permissions/permission_manager_factory.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/idle/idle_detection_permission_context.h" #include "chrome/browser/media/midi_permission_context.h" #include "chrome/browser/media/midi_sysex_permission_context.h" +#include "chrome/browser/media/webrtc/camera_pan_tilt_zoom_permission_context.h" #include "chrome/browser/media/webrtc/media_stream_device_permission_context.h" #include "chrome/browser/notifications/notification_permission_context.h" #include "chrome/browser/payments/payment_handler_permission_context.h" @@ -129,6 +130,8 @@ ContentSettingsType::AR); permission_contexts[ContentSettingsType::STORAGE_ACCESS] = std::make_unique<StorageAccessGrantPermissionContext>(profile); + permission_contexts[ContentSettingsType::CAMERA_PAN_TILT_ZOOM] = + std::make_unique<CameraPanTiltZoomPermissionContext>(profile); return permission_contexts; } } // namespace
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc index f9edd24f..a170101 100644 --- a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc +++ b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc
@@ -208,11 +208,12 @@ return std::string(); } - void MakeResponseAndWait(net::HttpStatusCode http_status, - net::Error net_error, - const std::string& mime_type, - std::vector<std::string> headers, - const std::string& body) { + void MakeResponseAndWait( + net::HttpStatusCode http_status, + net::Error net_error, + const std::string& mime_type, + std::vector<std::pair<std::string, std::string>> headers, + const std::string& body) { network::TestURLLoaderFactory::PendingRequest* request = test_url_loader_factory_.GetPendingRequest(0); ASSERT_TRUE(request); @@ -230,8 +231,8 @@ base::TimeDelta::FromMilliseconds(kConnectTimeDuration); head->mime_type = mime_type; - for (const std::string& header : headers) { - head->headers->AddHeader(header); + for (const auto& header : headers) { + head->headers->AddHeader(header.first, header.second); } network::URLLoaderCompletionStatus status(net_error); test_url_loader_factory_.AddResponse(request->request.url, std::move(head), @@ -733,7 +734,7 @@ network::ResourceRequest request = VerifyCommonRequestState(prediction_url); MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, - {"X-Testing: Hello World"}, kHTMLBody); + {{"X-Testing", "Hello World"}}, kHTMLBody); std::unique_ptr<PrefetchedMainframeResponseContainer> resp = tab_helper()->TakePrefetchResponse(prediction_url); @@ -1165,10 +1166,11 @@ ClearResponses(); } - void MakeFinalResponse(const GURL& final_url, - net::HttpStatusCode final_status, - std::vector<std::string> final_headers, - const std::string& final_body) { + void MakeFinalResponse( + const GURL& final_url, + net::HttpStatusCode final_status, + std::vector<std::pair<std::string, std::string>> final_headers, + const std::string& final_body) { auto final_head = network::CreateURLResponseHead(final_status); final_head->response_time = base::Time::Now(); @@ -1184,8 +1186,8 @@ final_head->mime_type = kHTMLMimeType; - for (const std::string& header : final_headers) { - final_head->headers->AddHeader(header); + for (const auto& header : final_headers) { + final_head->headers->AddHeader(header.first, header.second); } network::TestURLLoaderFactory::PendingRequest* request = test_url_loader_factory_.GetPendingRequest(0); @@ -1279,7 +1281,7 @@ VerifyCommonRequestState(prediction_url); WalkRedirectChainUntilFinalRequest({prediction_url, redirect_url}); - MakeFinalResponse(redirect_url, net::HTTP_OK, {"X-Testing: Hello World"}, + MakeFinalResponse(redirect_url, net::HTTP_OK, {{"X-Testing", "Hello World"}}, kHTMLBody); std::unique_ptr<PrefetchedMainframeResponseContainer> resp =
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 5773b2db9..0d5962b 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -18,6 +18,7 @@ "engagement:closure_compile", "interventions_internals:closure_compile", "media:closure_compile", + "memory_internals:closure_compile", "reset_password:closure_compile", ] if (is_linux || is_win || is_mac) { @@ -224,10 +225,7 @@ if (optimize_webui) { source = "settings/settings_resources_vulcanized.grd" - deps = [ - "//chrome/browser/resources/settings:build", - "//chrome/browser/resources/settings:build_polymer3", - ] + deps = [ "//chrome/browser/resources/settings:build_polymer3" ] } else { source = "settings/settings_resources.grd" deps = [ "//chrome/browser/resources/settings:polymer3_elements" ]
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js index 69ff6e72..35ae676 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/locale_output_helper.js
@@ -46,30 +46,16 @@ } /** - * Main entry point for locale switching logic. - * @param {string} text The text we want to queue for output. + * Computes |this.currentLocale_| and |outputString|, and returns them. + * @param {string} text * @param {AutomationNode} contextNode The AutomationNode that owns |text|. - * @param {function(string, string)} appendWithLocaleCallback + * @return {!{text: string, locale: string}} */ - assignLocalesAndAppend(text, contextNode, appendWithLocaleCallback) { + computeTextAndLocale(text, contextNode) { if (!text || !contextNode) { - return; + return {text, locale: LocaleOutputHelper.BROWSER_UI_LOCALE_}; } - this.processText_(text, contextNode, appendWithLocaleCallback); - } - - /** - * This method does the following: - * 1. Computes output locale. - * 2. Computes |outputString| - * 3. Calls |appendWithLocaleCallback| - * @param {string} text - * @param {!AutomationNode} contextNode The AutomationNode that owns |text|. - * @param {function(string, string)} appendWithLocaleCallback - * @private - */ - processText_(text, contextNode, appendWithLocaleCallback) { // Prefer the node's detected locale and fall back on the author-assigned // locale. const nodeLocale = @@ -99,7 +85,7 @@ Msgs.getMsg('voice_unavailable_for_language', [displayLanguage]); } - appendWithLocaleCallback(outputString, this.currentLocale_); + return {text: outputString, locale: this.currentLocale_}; } /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js index 41c977a..bccdb834 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output.js
@@ -748,7 +748,7 @@ const nameOrAnnotation = UserAnnotationHandler.getAnnotationForNode(node) || node.name; if (localStorage['languageSwitching'] === 'true') { - this.assignLocalesAndAppend(nameOrAnnotation, node, buff, options); + this.assignLocaleAndAppend_(nameOrAnnotation, node, buff, options); } else { this.append_(buff, nameOrAnnotation || '', options); } @@ -1669,7 +1669,7 @@ } if (localStorage['languageSwitching'] === 'true') { - this.assignLocalesAndAppend(text, node, buff, options); + this.assignLocaleAndAppend_(text, node, buff, options); } else { this.append_(buff, text, options); } @@ -2098,29 +2098,19 @@ * @param {!AutomationNode} contextNode * @param {!Array<Spannable>} buff * @param {{isUnique: (boolean|undefined), annotation: !Array<*>}} options + * @private */ - assignLocalesAndAppend(text, contextNode, buff, options) { - /** - * A callback that appends |outputString| to |buff| with |newLocale|. - * @param {!Array<Spannable>} buff - * @param {{isUnique: (boolean|undefined), - * annotation: !Array<*>}} options - * @param {string} outputString - * @param {string} newLocale - */ - const appendStringWithLocale = function( - buff, options, outputString, newLocale) { - const speechProps = new Output.SpeechProperties(); - speechProps.properties['lang'] = newLocale; - this.append_(buff, outputString, options); - // Attach associated SpeechProperties if the buffer is - // non-empty. - if (buff.length > 0) { - buff[buff.length - 1].setSpan(speechProps, 0, 0); - } - }; - LocaleOutputHelper.instance.assignLocalesAndAppend( - text, contextNode, appendStringWithLocale.bind(this, buff, options)); + assignLocaleAndAppend_(text, contextNode, buff, options) { + const data = + LocaleOutputHelper.instance.computeTextAndLocale(text, contextNode); + const speechProps = new Output.SpeechProperties(); + speechProps.properties['lang'] = data.locale; + this.append_(buff, data.text, options); + // Attach associated SpeechProperties if the buffer is + // non-empty. + if (buff.length > 0) { + buff[buff.length - 1].setSpan(speechProps, 0, 0); + } } };
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb index add0210..d8ff6af 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bn.xtb
@@ -167,7 +167,7 @@ <translation id="2347456970887948350">একটি লিঙ্ক</translation> <translation id="2381733276052567791">ভাষ্য চালু বা বন্ধ করুন</translation> <translation id="2390264819538553347">এগিয়ে যাওয়ার জন্য, enter টিপুন; ফিরে যেতে, backspace টিপুন।</translation> -<translation id="2398579267367951220">পৃষ্ঠাটি সার্চ করতে টাইপ করুন। সার্চের ফলাফলে সরাসরি চলে যেতে কীবোর্ড থেকে 'Enter' কী এবং ফলাফল ব্রাউজ করার জন্য 'Up' বা 'Down Arrow' কী প্রেস করুন। নতুন কোনও কিছু সার্চ করার জন্য টাইপ করতে থাকুন অথবা বাতিল করতে 'Escape' কী প্রেস করুন।</translation> +<translation id="2398579267367951220">পৃষ্ঠাতে সার্চ করতে টাইপ করুন। সার্চ ফলাফলে সরাসরি যেতে কীবোর্ড থেকে 'Enter' কী এবং ফলাফল ব্রাউজ করার জন্য 'Up' বা 'Down Arrow' কী প্রেস করুন। নতুন কোনও কিছু সার্চ করার জন্য টাইপ করতে থাকুন অথবা বাতিল করতে 'Escape' কী প্রেস করুন।</translation> <translation id="240709722712693803">নীলাভ বেগুনী</translation> <translation id="2416512023405990736">একটি টিকচিহ্ন উঠানো চেকবাক্স</translation> <translation id="2417569100218200841">কন্টেন্টর তথ্য</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb index 15edde8..7cad353 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_km.xtb
@@ -167,7 +167,7 @@ <translation id="2347456970887948350">តំណ</translation> <translation id="2381733276052567791">បិទ ឬបើកការនិយាយ</translation> <translation id="2390264819538553347">ដើម្បីបន្ត សូមចុចចូល ឬប្រសិនបើចង់ថយក្រោយ សូមចុចលុបថយក្រោយ។</translation> -<translation id="2398579267367951220">វាយបញ្ចូល ដើម្បីស្វែងរកទំព័រ។ ចុច enter ដើម្បីរំលងទៅលទ្ធផល ចុចព្រួញ up ឬ down ដើម្បីរុករកលទ្ធផល បន្តវាយបញ្ចូលដើម្បីប្ដូរការស្វែងរករបស់អ្នក ឬចុច escape ដើម្បីបោះបង់។</translation> +<translation id="2398579267367951220">វាយបញ្ចូល ដើម្បីស្វែងរកទំព័រ។ ចុច Enter ដើម្បីរំលងទៅលទ្ធផល ចុចព្រួញឡើងលើ ឬចុះក្រោម ដើម្បីរុករកលទ្ធផល បន្តវាយបញ្ចូលដើម្បីប្ដូរការស្វែងរករបស់អ្នក ឬចុច Escape ដើម្បីបោះបង់។</translation> <translation id="240709722712693803">ស្វាយចាស់</translation> <translation id="2416512023405990736">ប្រអប់ធីកដែលមិនបានធីក</translation> <translation id="2417569100218200841">ព័ត៌មានមាតិកា</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb index f8a1f37c..1ac6f77 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ky.xtb
@@ -267,7 +267,7 @@ <translation id="3103579948980282461">Орто кызгылтым көгүш кызыл</translation> <translation id="3104705064753753826">alrt dlg</translation> <translation id="3109724472072898302">Жыйналды</translation> -<translation id="3112457281078985179">ChromeVox'ту күйгүзүп же өчүрүү үчүн Control+Alt+Z баскычтарын басыңыз.</translation> +<translation id="3112457281078985179">ChromeVox'ту күйгүзүп же өчүрүү үчүн, Control+Alt+Z баскычтарын басыңыз.</translation> <translation id="3131002934070407451">Сандарды төмөнкүдөй окуу:</translation> <translation id="3134461040845705080">окуу үчүн гана</translation> <translation id="3137663468179739624">Күңүрт саргылтым жашыл</translation> @@ -346,7 +346,7 @@ <translation id="3681531118904532409">Папайя түсүндөй саргыч ыраң</translation> <translation id="3692274950075847560">И:<ph name="RESULT" /></translation> <translation id="370367311675896712">Сызылган</translation> -<translation id="3704037000573066734">Кошумча маалыматты көрүү үчүн Search+A, андан кийин J баскычтарын басыңыз</translation> +<translation id="3704037000573066734">Кошумча маалыматты көрүү үчүн, Search+A, андан кийин J баскычтарын басыңыз</translation> <translation id="3712520970944678024">Көзөмөлдөөчү кеп</translation> <translation id="371302509916403935">Алдын сызуу</translation> <translation id="3716845769494773620">Көп саптуу</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb index a553381..100af56 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_ne.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">एउटा लिंक</translation> <translation id="2381733276052567791">बोली सक्रिय वा निष्क्रिय पार्न टगल गर्नुहोस्</translation> <translation id="2390264819538553347">अगाडि बढ्न इन्टर थिच्नुहोस्; पछाडि जान ब्याकस्पेस थिच्नुहोस्</translation> +<translation id="2398579267367951220">यो पृष्ठमा खोज्न टाइप गर्नुहोस्। परिणामहरू भएको पृष्ठमा जान enter थिच्नुहोस्, परिणामहरू हेर्न माथि वा तल जनाउने तीर चिन्हहरू थिच्नुहोस्, अरू नै कुरा खोज्न टाइप गरिराख्नुहोस् वा खोज रद्द गर्न escape थिच्नुहोस्।</translation> <translation id="240709722712693803">निलो बैजनी</translation> <translation id="2416512023405990736">एउटा चेक हटाइएको जाँच बाकस</translation> <translation id="2417569100218200841">सामग्री जानकारी</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb index cb261558..8d1a0b2 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_nl.xtb
@@ -167,7 +167,7 @@ <translation id="2347456970887948350">Een link</translation> <translation id="2381733276052567791">Spraak in- of uitschakelen</translation> <translation id="2390264819538553347">Druk op Enter om door te gaan. Druk op Backspace om terug te gaan.</translation> -<translation id="2398579267367951220">Typ om op de pagina te zoeken. Druk op Enter om naar het resultaat te gaan of op de pijlen-omlaag om door resultaten te browsen, blijf typen om je zoekopdracht te wijzigen of druk op Escape om te annuleren.</translation> +<translation id="2398579267367951220">Typ om op de pagina te zoeken. Druk op Enter om naar het zoekresultaat te gaan of op de pijlen-omlaag om door resultaten te browsen, blijf typen om je zoekopdracht te wijzigen of druk op Escape om te annuleren.</translation> <translation id="240709722712693803">Violetblauw</translation> <translation id="2416512023405990736">Een niet-aangevinkt selectievakje</translation> <translation id="2417569100218200841">Informatie over content</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb index f5bfb2b..b825a56d 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
@@ -167,7 +167,7 @@ <translation id="2381733276052567791">Ovozli bildirgilarni yoqish yoki o‘chirib qo‘yish</translation> <translation id="2390264819538553347">Davom etish uchun “Enter” tugmasini, ortga qaytish uchun esa “Backspace” tugmasini bosing.</translation> <translation id="2398579267367951220">Sahifada qidirish uchun soʻrovni kiriting. Natijaga sakrash uchun Enter tugmasini, natijalarni qarab chiqish uchun yuqoriga yoki pastga strelkalarini bosing. Qidiruvni oʻzgartirish uchun soʻrovni kiritishda davom eting yoki bekor qilish uchun escape tugmasini bosing.</translation> -<translation id="240709722712693803">Koʻkimtir binafsharang</translation> +<translation id="240709722712693803">Koʻkimtir siyohrang</translation> <translation id="2416512023405990736">Belgilanmagan katakcha</translation> <translation id="2417569100218200841">Kontent haqida ma’lumot</translation> <translation id="2417948780551741035">Yakuniy izohlar</translation> @@ -238,7 +238,7 @@ <translation id="2909584066358367921">Keyingi tugma mavjud emas</translation> <translation id="2911433807131383493">ChromeVox qo‘llanmasini ochish</translation> <translation id="2937799153569150791">Bundan keyin boshqa 2-darajali sarlavha mavjud emas</translation> -<translation id="2942710183375260152">Koʻkimtir binafsharang</translation> +<translation id="2942710183375260152">Koʻkimtir siyohrang</translation> <translation id="2943596527105977722">Xira jigarrang</translation> <translation id="2964026537669811554">Sarlavhani guruhlash</translation> <translation id="2968634799764242930">Koʻkimtir yashil</translation> @@ -372,7 +372,7 @@ <translation id="3930383913623796990">Och bahoriy yashil</translation> <translation id="3930498801443296724">Iqtibos</translation> <translation id="3935615366277838204">Katta <ph name="LETTER" /></translation> -<translation id="3936394396199829062">Oqimtir binafsharang</translation> +<translation id="3936394396199829062">Oqimtir siyohrang</translation> <translation id="3943857333388298514">Joylash</translation> <translation id="3962990492275676168">Joriy joydan o‘qishni boshlash</translation> <translation id="3970951409746498040">Toʻq qumrang</translation> @@ -665,7 +665,7 @@ <translation id="6364795331201459219">h6</translation> <translation id="6368143427468974988">Avvalgi sarlavha</translation> <translation id="6376999910001533545">Toʻq qizgʻish</translation> -<translation id="6378394210114975876">Och binafsharang</translation> +<translation id="6378394210114975876">Och siyohrang</translation> <translation id="6385591741672306837">ustun</translation> <translation id="6387719785439924554">aside</translation> <translation id="6393014464788431702">Barcha hodisalar filtrlarini faolsizlashtirish</translation> @@ -679,7 +679,7 @@ <translation id="6493991254603208962">Yorqinlikni pasaytirish</translation> <translation id="6501595918865591267">Feruzarang</translation> <translation id="6508059270146105198">Breyl ekranini sahifa tepasiga joylash</translation> -<translation id="6521550811716689390">Toʻq binafsharang</translation> +<translation id="6521550811716689390">Toʻq siyohrang</translation> <translation id="6536157907112457272">Durrarang</translation> <translation id="6540201937398578274">ChromeVox funksiyasida “Search” tugmasi modifikator tugma hisoblanadi. Ko‘plab ChromeVox tezkor tugmalari “Search” tugmasi bilan boshlanadi. Shuningdek strelka tugmalari navigatsiya amallarini bajarishda foydalaniladi.</translation> <translation id="6544923685317771506">Oq tuproqrang</translation> @@ -703,7 +703,7 @@ <translation id="6730312624811567147">Home yoki End tugmalari oʻrniga Search va Chapga yoki Oʻngga, Control Home yoki End tugmalari oʻrniga Search Control va Chapga yoki Oʻngga, Page Up yoki Down tugmalari oʻrniga Search va Tepaga yoki Pastga strelkalardan foydalaning</translation> <translation id="6736510033526053669">yangi ichki oyna ochildi</translation> <translation id="675895815784134693">pgbar</translation> -<translation id="67862343314499040">Binafsharang</translation> +<translation id="67862343314499040">Siyohrang</translation> <translation id="6786800275320335305">Maqola</translation> <translation id="6793101435925451627">lstbx</translation> <translation id="6815255864998354418">Och limonrang</translation> @@ -750,7 +750,7 @@ <translation id="7140168702531682811">Ustki satr</translation> <translation id="7143034430156387447">6 yoki 8 nuqtali yozuvlar o‘rtasida almashish</translation> <translation id="7143207342074048698">Ulanmoqda</translation> -<translation id="7153618581592392745">Och binafsharang</translation> +<translation id="7153618581592392745">Och siyohrang</translation> <translation id="7157306005867877619">Annotatsiya</translation> <translation id="7161771961008409533">Qalqib chiquvchi tugma</translation> <translation id="7167657087543110">harflarning aytilishi</translation> @@ -950,7 +950,7 @@ <translation id="8851136666856101339">main</translation> <translation id="8882002077197914455">Satr sarlavhasi</translation> <translation id="8883850400338911892">url tahrir 8nuqta</translation> -<translation id="8896479570570613387">Oʻrtacha binafsharang</translation> +<translation id="8896479570570613387">Oʻrtacha siyohrang</translation> <translation id="8897030325301866860"><ph name="FONT_FAMILY" /> shrifti</translation> <translation id="8898516272131543774">Imloni qayta e’lon qilish</translation> <translation id="8908714597367957477">colhdr</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb index 489447ec..368a7e7 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_vi.xtb
@@ -167,6 +167,7 @@ <translation id="2347456970887948350">Liên kết</translation> <translation id="2381733276052567791">Bật hoặc tắt giọng nói</translation> <translation id="2390264819538553347">Để chuyển tới trang tiếp theo, nhấn enter; để quay lại trang trước, nhấn phím xóa lùi.</translation> +<translation id="2398579267367951220">Nhập để tìm kiếm trang. Nhấn phím Enter để xem kết quả, phím mũi tên lên hoặc xuống để duyệt qua kết quả, tiếp tục nhập để thay đổi nội dung tìm kiếm hoặc nhấn phím Escape để hủy.</translation> <translation id="240709722712693803">Màu lam tím</translation> <translation id="2416512023405990736">Hộp kiểm được bỏ chọn</translation> <translation id="2417569100218200841">Thông tin nội dung</translation>
diff --git a/chrome/browser/resources/chromeos/camera/.eslintignore b/chrome/browser/resources/chromeos/camera/.eslintignore index c0741c4..d25f4df 100644 --- a/chrome/browser/resources/chromeos/camera/.eslintignore +++ b/chrome/browser/resources/chromeos/camera/.eslintignore
@@ -1,2 +1 @@ -google-analytics-bundle.js -comlink.js +src/js/lib/*
diff --git a/chrome/browser/resources/chromeos/camera/BUILD.gn b/chrome/browser/resources/chromeos/camera/BUILD.gn index af8c9e69..cebca86 100644 --- a/chrome/browser/resources/chromeos/camera/BUILD.gn +++ b/chrome/browser/resources/chromeos/camera/BUILD.gn
@@ -140,8 +140,8 @@ copy("chrome_camera_app_js_lib") { sources = [ + "src/js/lib/analytics.js", "src/js/lib/comlink.js", - "src/js/lib/google-analytics-bundle.js", ] outputs = [ "$chrome_camera_app_dir/js/lib/{{source_file_part}}" ]
diff --git a/chrome/browser/resources/chromeos/camera/camera_resources.grd b/chrome/browser/resources/chromeos/camera/camera_resources.grd index eacbf35..b71a5b5 100644 --- a/chrome/browser/resources/chromeos/camera/camera_resources.grd +++ b/chrome/browser/resources/chromeos/camera/camera_resources.grd
@@ -14,7 +14,7 @@ <structures> <structure name="IDR_CAMERA_ASYNC_WRITER_JS" file="src/js/models/async_writer.js" type="chrome_html" /> <structure name="IDR_CAMERA_BACKGROUND_JS" file="src/js/background.js" type="chrome_html" /> - <structure name="IDR_CAMERA_BUNDLE_JS" file="src/js/lib/google-analytics-bundle.js" type="chrome_html" /> + <structure name="IDR_CAMERA_ANALYTICS_JS" file="src/js/lib/analytics.js" type="chrome_html" /> <structure name="IDR_CAMERA_CAMERA3_DEVICE_INFO_JS" file="src/js/device/camera3_device_info.js" type="chrome_html" /> <structure name="IDR_CAMERA_CAMERA_JS" file="src/js/views/camera.js" type="chrome_html" /> <structure name="IDR_CAMERA_CAMERA_INTENT_JS" file="src/js/views/camera_intent.js" type="chrome_html" />
diff --git a/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn b/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn index eaf9be78..6633a6b 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn +++ b/chrome/browser/resources/chromeos/camera/src/js/BUILD.gn
@@ -63,7 +63,7 @@ js_library("metrics") { deps = [ ":state", - "externs:chrome_platform_analytics", + "externs:universal_analytics_api", ] }
diff --git a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js index 8ede591..8872e96 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js +++ b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy.js
@@ -124,6 +124,13 @@ sendMessage(extensionId, message) { chrome.runtime.sendMessage(extensionId, message); } + + /** @override */ + addDummyHistoryIfNotAvailable() { + // Since GA will use history.length to generate hash but it is not available + // in platform apps, set it to 1 manually. + window.history.length = 1; + } } export const browserProxy = new ChromeAppBrowserProxy();
diff --git a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js index 46ab90a3..154b1a7e 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js +++ b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/browser_proxy_interface.js
@@ -117,4 +117,9 @@ * @abstract */ sendMessage(extensionId, message) {} + + /** + * @abstract + */ + addDummyHistoryIfNotAvailable() {} }
diff --git a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js index c5bfbd14..2971db50 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js +++ b/chrome/browser/resources/chromeos/camera/src/js/browser_proxy/webui_browser_proxy.js
@@ -136,6 +136,11 @@ sendMessage(extensionId, message) { NOTIMPLEMENTED(); } + + /** @override */ + addDummyHistoryIfNotAvailable() { + // no-ops + } } export const browserProxy = new WebUIBrowserProxy();
diff --git a/chrome/browser/resources/chromeos/camera/src/js/device/constraints_preferrer.js b/chrome/browser/resources/chromeos/camera/src/js/device/constraints_preferrer.js index 50cb9b6a..10ccd5e5 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/device/constraints_preferrer.js +++ b/chrome/browser/resources/chromeos/camera/src/js/device/constraints_preferrer.js
@@ -572,31 +572,47 @@ } /** - * @param {!ResolutionList} rs + * @param {!ResolutionList} resolutions * @return {!ResolutionList} */ - const sortPreview = (rs) => { - if (rs.length === 0) { + const sortPreview = (resolutions) => { + if (resolutions.length === 0) { return []; } - rs = [...rs].sort((r1, r2) => r2.width - r1.width); - // Promote resolution slightly larger than screen size to the first. - const /** number */ screenW = - Math.floor(window.screen.width * window.devicePixelRatio); - const /** number */ screenH = - Math.floor(window.screen.height * window.devicePixelRatio); - let /** ?number */ minIdx = null; - rs.forEach(({width, height}, idx) => { - if (width >= screenW && height >= screenH) { - minIdx = idx; - } - }); - if (minIdx !== null) { - rs.unshift(...rs.splice(minIdx, 1)); + // Sorts the preview resolution (Rp) according to the capture resolution + // (Rc) and the screen size (Rs) with the following orders: + // If |Rc| <= |Rs|: + // 1. All |Rp| <= |Rc|, and the larger, the better. + // 2. All |Rp| > |Rc|, and the smaller, the better. + // + // If |Rc| > |Rs|: + // 1. All |Rp| where |Rs| <= |Rp| <= |Rc|, and the smaller, the + // better. + // 2. All |Rp| < |Rs|, and the larger, the better. + // 3. All |Rp| > |Rc|, and the smaller, the better. + // + const Rs = Math.floor(window.screen.width * window.devicePixelRatio); + const Rc = captureR.width; + const cmpDescending = (r1, r2) => r2.width - r1.width; + const cmpAscending = (r1, r2) => r1.width - r2.width; + + if (Rc <= Rs) { + const notLargerThanRc = + resolutions.filter((r) => r.width <= Rc).sort(cmpDescending); + const largerThanRc = + resolutions.filter((r) => r.width > Rc).sort(cmpAscending); + return notLargerThanRc.concat(largerThanRc); + } else { + const betweenRsRc = + resolutions.filter((r) => Rs <= r.width && r.width <= Rc) + .sort(cmpAscending); + const smallerThanRs = + resolutions.filter((r) => r.width < Rs).sort(cmpDescending); + const largerThanRc = + resolutions.filter((r) => r.width > Rc).sort(cmpAscending); + return betweenRsRc.concat(smallerThanRs).concat(largerThanRc); } - - return rs; }; const /** !Array<!MediaStreamConstraints> */ previewCandidates =
diff --git a/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn b/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn index 7db53ba..e43198df 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn +++ b/chrome/browser/resources/chromeos/camera/src/js/externs/BUILD.gn
@@ -4,10 +4,10 @@ import("//third_party/closure_compiler/compile_js.gni") -js_library("chrome_platform_analytics") { +js_library("universal_analytics_api") { sources = [] - externs_list = [ "chrome_platform_analytics.js" ] + externs_list = [ "universal_analytics_api.js" ] } js_library("w3c_fileapi") {
diff --git a/chrome/browser/resources/chromeos/camera/src/js/externs/chrome_platform_analytics.js b/chrome/browser/resources/chromeos/camera/src/js/externs/chrome_platform_analytics.js deleted file mode 100644 index 0453150..0000000 --- a/chrome/browser/resources/chromeos/camera/src/js/externs/chrome_platform_analytics.js +++ /dev/null
@@ -1,67 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Externs for chrome-platform-analytics library. - * @see https://github.com/googlearchive/chrome-platform-analytics/wiki - * @externs - */ - -/* eslint-disable valid-jsdoc */ - -const analytics = {}; - -/** - * @constructor - * @struct - */ -analytics.EventBuilder = function() {}; - -/** - * @param {!analytics.EventBuilder.Dimension} dimension - * @return {!analytics.EventBuilder} - */ -analytics.EventBuilder.prototype.dimension = function(dimension) {}; - -/** - * @param {string} category - * @return {!analytics.EventBuilder} - */ -analytics.EventBuilder.prototype.category = function(category) {}; - -/** - * @param {string} action - * @return {!analytics.EventBuilder} - */ -analytics.EventBuilder.prototype.action = function(action) {}; - -/** - * @param {string} label - * @return {!analytics.EventBuilder} - */ -analytics.EventBuilder.prototype.label = function(label) {}; - -/** - * @param {number} value - * @return {!analytics.EventBuilder} - */ -analytics.EventBuilder.prototype.value = function(value) {}; - -/** - * @typedef {{ - * index: number, - * value: string - * }} - */ -analytics.EventBuilder.Dimension; - -/** - * @interface - */ -analytics.Tracker = function() {}; - -/** - * @param {!analytics.EventBuilder} eventBuilder - */ -analytics.Tracker.prototype.send;
diff --git a/chrome/browser/resources/chromeos/camera/src/js/externs/universal_analytics_api.js b/chrome/browser/resources/chromeos/camera/src/js/externs/universal_analytics_api.js new file mode 100644 index 0000000..febcbde --- /dev/null +++ b/chrome/browser/resources/chromeos/camera/src/js/externs/universal_analytics_api.js
@@ -0,0 +1,517 @@ +/* + * Copyright 2019 The Closure Compiler Authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable */ +/** + * @fileoverview Externs for the Universal Analytics API (analytics.js). + * + * @externs + */ + + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/command-queue-reference + * @param {string|function(!ga.Tracker)} commandOrReadyCallback + * @param {string|!ga.Fields=} field1 + * @param {string|?ga.Fields|function(!ga.Model)=} field2 + * @param {string|!ga.Fields=} field3 + * @param {number|string|!ga.Fields=} field4 + * @param {number|string|!ga.Fields=} field5 + * @param {!ga.Fields=} field6 + * @suppress {duplicate} Enables defining a stub for ga() until analytics.js is + * loaded. See + * https://developers.google.com/analytics/devguides/collection/analyticsjs/#alternative_async_tracking_snippet + * @const + */ +var ga = function( + commandOrReadyCallback, field1, field2, field3, field4, field5, field6) {}; + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#getAll + * @return {!Array<!ga.Tracker>} + */ +ga.getAll = function() {}; + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#getByName + * @param {string} name + * @return {!ga.Tracker|undefined} + */ +ga.getByName = function(name) {}; + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#create + * @param {string} trackingId + * @param {string|!ga.Fields=} cookieDomainOrFields + * @param {string|!ga.Fields=} nameOrFields + * @param {!ga.Fields=} fields + * @return {!ga.Tracker} + */ +ga.create = function(trackingId, cookieDomainOrFields, nameOrFields, fields) {}; + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference#remove + * @param {string} name + */ +ga.remove = function(name) {}; + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/model-object-reference + * @interface + */ +ga.Model = class { + /** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/model-object-reference#get + * @param {string} fieldName + * @return {?} + */ + get(fieldName) {} + + /** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/model-object-reference#set + * @param {string|!ga.Fields} fieldNameOrObject + * @param {?boolean|number|string|function()} fieldValue + * @param {boolean=} temporary + */ + set(fieldNameOrObject, fieldValue, temporary) {} +}; + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference + * @interface + */ +ga.Tracker = class { + /** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference#get + * @param {string} fieldName + * @return {?} + */ + get(fieldName) {} + + /** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference#set + * @param {string|!ga.Fields} fieldNameOrObject + * @param {?boolean|number|string|function()|function(!ga.Model)} fieldValue + */ + set(fieldNameOrObject, fieldValue) {} + + /** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/tracker-object-reference#send + * @param {string} hitType + * @param {string|!ga.Fields=} field1 + * @param {string|!ga.Fields=} field2 + * @param {number|string|!ga.Fields=} field3 + * @param {number|string|!ga.Fields=} field4 + * @param {!ga.Fields=} field5 + */ + send(hitType, field1, field2, field3, field4, field5) {} +}; + +/** + * https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference + * See cl/249045133's description for explanation how this class was generated. + * @record + */ +ga.Fields = class { + constructor() { + /** @type {?string|undefined} */ + this.action; + + /** @type {?string|undefined} */ + this.affiliation; + + /** @type {?boolean|undefined} */ + this.allowAdFeatures; + + /** @type {?boolean|undefined} */ + this.allowAnchor; + + /** @type {?boolean|undefined} */ + this.allowLinker; + + /** @type {?boolean|undefined} */ + this.alwaysSendReferrer; + + /** @type {?boolean|undefined} */ + this.anonymizeIp; + + /** @type {?string|undefined} */ + this.appId; + + /** @type {?string|undefined} */ + this.appInstallerId; + + /** @type {?string|undefined} */ + this.appName; + + /** @type {?string|undefined} */ + this.appVersion; + + /** @type {?string|undefined} */ + this.brand; + + /** @type {?string|undefined} */ + this.campaignContent; + + /** @type {?string|undefined} */ + this.campaignId; + + /** @type {?string|undefined} */ + this.campaignKeyword; + + /** @type {?string|undefined} */ + this.campaignMedium; + + /** @type {?string|undefined} */ + this.campaignName; + + /** @type {?string|undefined} */ + this.campaignSource; + + /** @type {?string|undefined} */ + this.category; + + /** @type {?string|undefined} */ + this.clientId; + + /** @type {?string|undefined} */ + this.contentGroup1; + + /** @type {?string|undefined} */ + this.contentGroup2; + + /** @type {?string|undefined} */ + this.contentGroup3; + + /** @type {?string|undefined} */ + this.contentGroup4; + + /** @type {?string|undefined} */ + this.contentGroup5; + + /** @type {?string|undefined} */ + this.cookieDomain; + + /** @type {?number|undefined} */ + this.cookieExpires; + + /** @type {?string|undefined} */ + this.cookieName; + + /** @type {?string|undefined} */ + this.coupon; + + /** @type {?string|undefined} */ + this.creative; + + /** @type {?string|undefined} */ + this.currencyCode; + + /** @type {?string|undefined} */ + this.dataSource; + + /** @type {?string|undefined} */ + this.dimension1; + + /** @type {?string|undefined} */ + this.dimension2; + + /** @type {?string|undefined} */ + this.dimension3; + + /** @type {?string|undefined} */ + this.dimension4; + + /** @type {?string|undefined} */ + this.dimension5; + + /** @type {?string|undefined} */ + this.dimension6; + + /** @type {?string|undefined} */ + this.dimension7; + + /** @type {?string|undefined} */ + this.dimension8; + + /** @type {?string|undefined} */ + this.dimension9; + + /** @type {?string|undefined} */ + this.dimension10; + + /** @type {?string|undefined} */ + this.dimension11; + + /** @type {?string|undefined} */ + this.dimension12; + + /** @type {?string|undefined} */ + this.dimension13; + + /** @type {?string|undefined} */ + this.dimension14; + + /** @type {?string|undefined} */ + this.dimension15; + + /** @type {?string|undefined} */ + this.dimension16; + + /** @type {?string|undefined} */ + this.dimension17; + + /** @type {?string|undefined} */ + this.dimension18; + + /** @type {?string|undefined} */ + this.dimension19; + + /** @type {?string|undefined} */ + this.dimension20; + + /** @type {?string|undefined} */ + this.encoding; + + /** @type {?string|undefined} */ + this.eventAction; + + /** @type {?string|undefined} */ + this.eventCategory; + + /** @type {?string|undefined} */ + this.eventLabel; + + /** @type {?number|undefined} */ + this.eventValue; + + /** @type {?string|undefined} */ + this.exDescription; + + /** @type {?boolean|undefined} */ + this.exFatal; + + /** @type {?string|undefined} */ + this.expId; + + /** @type {?string|undefined} */ + this.expVar; + + /** @type {?string|undefined} */ + this.flashVersion; + + /** @type {?boolean|undefined} */ + this.forceSSL; + + /** @type {?function()|undefined} */ + this.hitCallback; + + /** @type {?string|undefined} */ + this.hitType; + + /** @type {?string|undefined} */ + this.hostname; + + /** @type {?string|undefined} */ + this.id; + + /** @type {?boolean|undefined} */ + this.javaEnabled; + + /** @type {?string|undefined} */ + this.language; + + /** @type {?string|undefined} */ + this.legacyCookieDomain; + + /** @type {?boolean|undefined} */ + this.legacyHistoryImport; + + /** @type {?string|undefined} */ + this.linkerParam; + + /** @type {?string|undefined} */ + this.linkid; + + /** @type {?string|undefined} */ + this.list; + + /** @type {?string|undefined} */ + this.location; + + /** @type {?number|undefined} */ + this.metric1; + + /** @type {?number|undefined} */ + this.metric2; + + /** @type {?number|undefined} */ + this.metric3; + + /** @type {?number|undefined} */ + this.metric4; + + /** @type {?number|undefined} */ + this.metric5; + + /** @type {?number|undefined} */ + this.metric6; + + /** @type {?number|undefined} */ + this.metric7; + + /** @type {?number|undefined} */ + this.metric8; + + /** @type {?number|undefined} */ + this.metric9; + + /** @type {?number|undefined} */ + this.metric10; + + /** @type {?number|undefined} */ + this.metric11; + + /** @type {?number|undefined} */ + this.metric12; + + /** @type {?number|undefined} */ + this.metric13; + + /** @type {?number|undefined} */ + this.metric14; + + /** @type {?number|undefined} */ + this.metric15; + + /** @type {?number|undefined} */ + this.metric16; + + /** @type {?number|undefined} */ + this.metric17; + + /** @type {?number|undefined} */ + this.metric18; + + /** @type {?number|undefined} */ + this.metric19; + + /** @type {?number|undefined} */ + this.metric20; + + /** @type {?string|undefined} */ + this.name; + + /** @type {?boolean|undefined} */ + this.nonInteraction; + + /** @type {?string|undefined} */ + this.option; + + /** @type {?string|undefined} */ + this.page; + + /** @type {?number|string|undefined} */ + this.position; + + /** @type {?string|undefined} */ + this.price; + + /** @type {?number|undefined} */ + this.quantity; + + /** @type {?number|undefined} */ + this.queueTime; + + /** @type {?string|undefined} */ + this.referrer; + + /** @type {?string|undefined} */ + this.revenue; + + /** @type {?number|undefined} */ + this.sampleRate; + + /** @type {?string|undefined} */ + this.screenColors; + + /** @type {?string|undefined} */ + this.screenName; + + /** @type {?string|undefined} */ + this.screenResolution; + + /** @type {?string|undefined} */ + this.sessionControl; + + /** @type {?string|undefined} */ + this.shipping; + + /** @type {?number|undefined} */ + this.siteSpeedSampleRate; + + /** @type {?string|undefined} */ + this.socialAction; + + /** @type {?string|undefined} */ + this.socialNetwork; + + /** @type {?string|undefined} */ + this.socialTarget; + + /** @type {?number|undefined} */ + this.step; + + /** @type {?boolean|undefined} */ + this.storeGac; + + /** @type {?string|undefined} */ + this.tax; + + /** @type {?string|undefined} */ + this.timingCategory; + + /** @type {?string|undefined} */ + this.timingLabel; + + /** @type {?number|undefined} */ + this.timingValue; + + /** @type {?string|undefined} */ + this.timingVar; + + /** @type {?string|undefined} */ + this.title; + + /** @type {?string|undefined} */ + this.trackingId; + + /** @type {?string|undefined} */ + this.transport; + + /** @type {?boolean|undefined} */ + this.useBeacon; + + /** @type {?string|undefined} */ + this.userId; + + /** @type {?string|undefined} */ + this.variant; + + /** @type {?string|undefined} */ + this.viewportSize; + } +}; \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/camera/src/js/lib/.clang-format b/chrome/browser/resources/chromeos/camera/src/js/lib/.clang-format new file mode 100644 index 0000000..e384528 --- /dev/null +++ b/chrome/browser/resources/chromeos/camera/src/js/lib/.clang-format
@@ -0,0 +1 @@ +DisableFormat: true
diff --git a/chrome/browser/resources/chromeos/camera/src/js/lib/README.md b/chrome/browser/resources/chromeos/camera/src/js/lib/README.md index 39d7106..6f393616 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/lib/README.md +++ b/chrome/browser/resources/chromeos/camera/src/js/lib/README.md
@@ -1,6 +1,7 @@ -# google-analytics-bundle.js +# analytics.js -* [Project Page](https://github.com/googlearchive/chrome-platform-analytics) +* [Project Page](https://developers.google.com/analytics/devguides/collection/analyticsjs) +* The extern file [universal_analytics_api.js]((https://github.com/google/closure-compiler/blob/master/contrib/externs/universal_analytics_api.js)) is copied from the [closure compiler project](https://github.com/google/closure-compiler) # comlink.js
diff --git a/chrome/browser/resources/chromeos/camera/src/js/lib/analytics.js b/chrome/browser/resources/chromeos/camera/src/js/lib/analytics.js new file mode 100644 index 0000000..a1384a3c --- /dev/null +++ b/chrome/browser/resources/chromeos/camera/src/js/lib/analytics.js
@@ -0,0 +1,84 @@ +/* eslint-disable */ +(function(){/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 + */ + var m=this||self,n=function(a,b){a=a.split(".");var c=m;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}:c[d]=b};var p=function(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},q=function(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1};var r=window,t=document,u=function(a,b){t.addEventListener?t.addEventListener(a,b,!1):t.attachEvent&&t.attachEvent("on"+a,b)};var v=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;var w={},x=function(){w.TAGGING=w.TAGGING||[];w.TAGGING[1]=!0};var y=/:[0-9]+$/,A=function(a,b){b&&(b=String(b).toLowerCase());if("protocol"===b||"port"===b)a.protocol=z(a.protocol)||z(r.location.protocol);"port"===b?a.port=String(Number(a.hostname?a.port:r.location.port)||("http"==a.protocol?80:"https"==a.protocol?443:"")):"host"===b&&(a.hostname=(a.hostname||r.location.hostname).replace(y,"").toLowerCase());var c=z(a.protocol);b&&(b=String(b).toLowerCase());switch(b){case "url_no_fragment":b="";a&&a.href&&(b=a.href.indexOf("#"),b=0>b?a.href:a.href.substr(0, + b));a=b;break;case "protocol":a=c;break;case "host":a=a.hostname.replace(y,"").toLowerCase();break;case "port":a=String(Number(a.port)||("http"==c?80:"https"==c?443:""));break;case "path":a.pathname||a.hostname||x();a="/"==a.pathname.substr(0,1)?a.pathname:"/"+a.pathname;a=a.split("/");a:if(b=a[a.length-1],c=[],Array.prototype.indexOf)b=c.indexOf(b),b="number"==typeof b?b:-1;else{for(var d=0;d<c.length;d++)if(c[d]===b){b=d;break a}b=-1}0<=b&&(a[a.length-1]="");a=a.join("/");break;case "query":a=a.search.replace("?", + "");break;case "extension":a=a.pathname.split(".");a=1<a.length?a[a.length-1]:"";a=a.split("/")[0];break;case "fragment":a=a.hash.replace("#","");break;default:a=a&&a.href}return a},z=function(a){return a?a.replace(":","").toLowerCase():""},B=function(a){var b=t.createElement("a");a&&(b.href=a);var c=b.pathname;"/"!==c[0]&&(a||x(),c="/"+c);a=b.hostname.replace(y,"");return{href:b.href,protocol:b.protocol,host:b.host,hostname:a,pathname:c,search:b.search,hash:b.hash,port:b.port}};function C(){for(var a=D,b={},c=0;c<a.length;++c)b[a[c]]=c;return b}function E(){var a="ABCDEFGHIJKLMNOPQRSTUVWXYZ";a+=a.toLowerCase()+"0123456789-_";return a+"."}var D,F;function G(a){D=D||E();F=F||C();for(var b=[],c=0;c<a.length;c+=3){var d=c+1<a.length,f=c+2<a.length,e=a.charCodeAt(c),g=d?a.charCodeAt(c+1):0,h=f?a.charCodeAt(c+2):0,k=e>>2;e=(e&3)<<4|g>>4;g=(g&15)<<2|h>>6;h&=63;f||(h=64,d||(g=64));b.push(D[k],D[e],D[g],D[h])}return b.join("")} + function H(a){function b(k){for(;d<a.length;){var l=a.charAt(d++),M=F[l];if(null!=M)return M;if(!/^[\s\xa0]*$/.test(l))throw Error("Unknown base64 encoding at char: "+l);}return k}D=D||E();F=F||C();for(var c="",d=0;;){var f=b(-1),e=b(0),g=b(64),h=b(64);if(64===h&&-1===f)return c;c+=String.fromCharCode(f<<2|e>>4);64!=g&&(c+=String.fromCharCode(e<<4&240|g>>2),64!=h&&(c+=String.fromCharCode(g<<6&192|h)))}};var I;var N=function(){var a=J,b=K,c=L(),d=function(g){a(g.target||g.srcElement||{})},f=function(g){b(g.target||g.srcElement||{})};if(!c.init){u("mousedown",d);u("keyup",d);u("submit",f);var e=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){b(this);e.call(this)};c.init=!0}},O=function(a,b,c){for(var d=L().decorators,f={},e=0;e<d.length;++e){var g=d[e],h;if(h=!c||g.forms)a:{h=g.domains;var k=a;if(h&&(g.sameHost||k!==t.location.hostname))for(var l=0;l<h.length;l++)if(h[l]instanceof + RegExp){if(h[l].test(k)){h=!0;break a}}else if(0<=k.indexOf(h[l])){h=!0;break a}h=!1}h&&(h=g.placement,void 0==h&&(h=g.fragment?2:1),h===b&&p(f,g.callback()))}return f},L=function(){var a={};var b=r.google_tag_data;r.google_tag_data=void 0===b?a:b;a=r.google_tag_data;b=a.gl;b&&b.decorators||(b={decorators:[]},a.gl=b);return b};var P=/(.*?)\*(.*?)\*(.*)/,aa=/([^?#]+)(\?[^#]*)?(#.*)?/;function Q(a){return new RegExp("(.*?)(^|&)"+a+"=([^&]*)&?(.*)")} + var S=function(a){var b=[],c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];void 0!==d&&d===d&&null!==d&&"[object Object]"!==d.toString()&&(b.push(c),b.push(G(String(d))))}a=b.join("*");return["1",R(a),a].join("*")},R=function(a,b){a=[window.navigator.userAgent,(new Date).getTimezoneOffset(),window.navigator.userLanguage||window.navigator.language,Math.floor((new Date).getTime()/60/1E3)-(void 0===b?0:b),a].join("*");if(!(b=I)){b=Array(256);for(var c=0;256>c;c++){for(var d=c,f=0;8>f;f++)d=d&1?d>>>1^ + 3988292384:d>>>1;b[c]=d}}I=b;b=4294967295;for(c=0;c<a.length;c++)b=b>>>8^I[(b^a.charCodeAt(c))&255];return((b^-1)>>>0).toString(36)},ca=function(a){return function(b){var c=B(r.location.href),d=c.search.replace("?","");a:{var f=d.split("&");for(var e=0;e<f.length;e++){var g=f[e].split("=");if("_gl"===decodeURIComponent(g[0]).replace(/\+/g," ")){f=g.slice(1).join("=");break a}}f=void 0}b.query=T(f||"")||{};f=A(c,"fragment");e=f.match(Q("_gl"));b.fragment=T(e&&e[3]||"")||{};a&&ba(c,d,f)}}; + function U(a,b){if(a=Q(a).exec(b)){var c=a[2],d=a[4];b=a[1];d&&(b=b+c+d)}return b} + var ba=function(a,b,c){function d(e,g){e=U("_gl",e);e.length&&(e=g+e);return e}if(r.history&&r.history.replaceState){var f=Q("_gl");if(f.test(b)||f.test(c))a=A(a,"path"),b=d(b,"?"),c=d(c,"#"),r.history.replaceState({},void 0,""+a+b+c)}},T=function(a){var b=void 0===b?3:b;try{if(a){a:{for(var c=0;3>c;++c){var d=P.exec(a);if(d){var f=d;break a}a=decodeURIComponent(a)}f=void 0}if(f&&"1"===f[1]){var e=f[2],g=f[3];a:{for(f=0;f<b;++f)if(e===R(g,f)){var h=!0;break a}h=!1}if(h){b={};var k=g?g.split("*"): + [];for(g=0;g<k.length;g+=2)b[k[g]]=H(k[g+1]);return b}}}}catch(l){}};function V(a,b,c,d){function f(k){k=U(a,k);var l=k.charAt(k.length-1);k&&"&"!==l&&(k+="&");return k+h}d=void 0===d?!1:d;var e=aa.exec(c);if(!e)return"";c=e[1];var g=e[2]||"";e=e[3]||"";var h=a+"="+b;d?e="#"+f(e.substring(1)):g="?"+f(g.substring(1));return""+c+g+e} + function W(a,b){var c="FORM"===(a.tagName||"").toUpperCase(),d=O(b,1,c),f=O(b,2,c);b=O(b,3,c);q(d)&&(d=S(d),c?X("_gl",d,a):Y("_gl",d,a,!1));!c&&q(f)&&(c=S(f),Y("_gl",c,a,!0));for(var e in b)b.hasOwnProperty(e)&&Z(e,b[e],a)}function Z(a,b,c,d){if(c.tagName){if("a"===c.tagName.toLowerCase())return Y(a,b,c,d);if("form"===c.tagName.toLowerCase())return X(a,b,c)}if("string"==typeof c)return V(a,b,c,d)}function Y(a,b,c,d){c.href&&(a=V(a,b,c.href,void 0===d?!1:d),v.test(a)&&(c.href=a))} + function X(a,b,c){if(c&&c.action){var d=(c.method||"").toLowerCase();if("get"===d){d=c.childNodes||[];for(var f=!1,e=0;e<d.length;e++){var g=d[e];if(g.name===a){g.setAttribute("value",b);f=!0;break}}f||(d=t.createElement("input"),d.setAttribute("type","hidden"),d.setAttribute("name",a),d.setAttribute("value",b),c.appendChild(d))}else"post"===d&&(a=V(a,b,c.action),v.test(a)&&(c.action=a))}} + var J=function(a){try{a:{for(var b=100;a&&0<b;){if(a.href&&a.nodeName.match(/^a(?:rea)?$/i)){var c=a;break a}a=a.parentNode;b--}c=null}if(c){var d=c.protocol;"http:"!==d&&"https:"!==d||W(c,c.hostname)}}catch(f){}},K=function(a){try{if(a.action){var b=A(B(a.action),"host");W(a,b)}}catch(c){}};n("google_tag_data.glBridge.auto",function(a,b,c,d){N();c="fragment"===c?2:1;a={callback:a,domains:b,fragment:2===c,placement:c,forms:!!d,sameHost:!1};L().decorators.push(a)});n("google_tag_data.glBridge.decorate",function(a,b,c){a=S(a);return Z("_gl",a,b,!!c)});n("google_tag_data.glBridge.generate",S);n("google_tag_data.glBridge.get",function(a,b){var c=ca(!!b);b=L();b.data||(b.data={query:{},fragment:{}},c(b.data));c={};if(b=b.data)p(c,b.query),a&&p(c,b.fragment);return c});})(window); + (function(){function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.charCodeAt(c);b=(b<<6&268435455)+d+(d<<14);d=b&266338304;b=0!=d?b^d>>21:b}return b};/* + + Copyright The Closure Library Authors. + SPDX-License-Identifier: Apache-2.0 + */ + var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){for(var a=[],b=0;b<this.w.length;b++)this.w[b]&&(a[Math.floor(b/6)]^=1<<b%6);for(b=0;b<a.length;b++)a[b]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_".charAt(a[b]||0);return a.join("")+"~"};var ha=window.GoogleAnalyticsObject,wa;if(wa=void 0!=ha)wa=-1<(ha.constructor+"").indexOf("String");var Qa;if(Qa=wa){var Za=window.GoogleAnalyticsObject;Qa=Za?Za.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""}var gb=Qa||"ga",jd=/^(?:utma\.)?\d+\.\d+$/,kd=/^amp-[\w.-]{22,64}$/,Ba=!1;var vd=new $c;function J(a){vd.set(a)}var Td=function(a){a=Dd(a);a=new $c(a);for(var b=vd.w.slice(),c=0;c<a.w.length;c++)b[c]=b[c]||a.w[c];return(new $c(b)).encode()},Dd=function(a){a=a.get(Gd);ka(a)||(a=[]);return a};var ea=function(a){return"function"==typeof a},ka=function(a){return"[object Array]"==Object.prototype.toString.call(Object(a))},qa=function(a){return void 0!=a&&-1<(a.constructor+"").indexOf("String")},D=function(a,b){return 0==a.indexOf(b)},sa=function(a){return a?a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,""):""},ra=function(){for(var a=O.navigator.userAgent+(M.cookie?M.cookie:"")+(M.referrer?M.referrer:""),b=a.length,c=O.history.length;0<c;)a+=c--^b++;return[hd()^La(a)&2147483647,Math.round((new Date).getTime()/ + 1E3)].join(".")},ta=function(a){var b=M.createElement("img");b.width=1;b.height=1;b.src=a;return b},ua=function(){},K=function(a){if(encodeURIComponent instanceof Function)return encodeURIComponent(a);J(28);return a},L=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent("on"+b,c)}catch(e){J(27)}},f=/^[\w\-:/.?=&%!\[\]]+$/,Nd=/^[\w+/_-]+[=]{0,2}$/,be=function(a,b){return E(M.location[b?"href":"search"],a)},E=function(a,b){return(a=a.match("(?:&|#|\\?)"+ + K(b).replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")+"=([^&#]*)"))&&2==a.length?a[1]:""},xa=function(){var a=""+M.location.hostname;return 0==a.indexOf("www.")?a.substring(4):a},de=function(a,b){var c=a.indexOf(b);if(5==c||6==c)if(a=a.charAt(c+b.length),"/"==a||"?"==a||""==a||":"==a)return!0;return!1},ya=function(a,b){var c=M.referrer;if(/^(https?|android-app):\/\//i.test(c)){if(a)return c;a="//"+M.location.hostname;if(!de(c,a))return b&&(b=a.replace(/\./g,"-")+".cdn.ampproject.org",de(c,b))?void 0: + c}},za=function(a,b){if(1==b.length&&null!=b[0]&&"object"===typeof b[0])return b[0];for(var c={},d=Math.min(a.length+1,b.length),e=0;e<d;e++)if("object"===typeof b[e]){for(var g in b[e])b[e].hasOwnProperty(g)&&(c[g]=b[e][g]);break}else e<a.length&&(c[a[e]]=b[e]);return c};var ee=function(){this.keys=[];this.values={};this.m={}};ee.prototype.set=function(a,b,c){this.keys.push(a);c?this.m[":"+a]=b:this.values[":"+a]=b};ee.prototype.get=function(a){return this.m.hasOwnProperty(":"+a)?this.m[":"+a]:this.values[":"+a]};ee.prototype.map=function(a){for(var b=0;b<this.keys.length;b++){var c=this.keys[b],d=this.get(c);d&&a(c,d)}};var O=window,M=document,va=function(a,b){return setTimeout(a,b)};var F=window,Ea=document,G=function(a){var b=F._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===F["ga-disable-"+a])return!0;try{var c=F.external;if(c&&c._gaUserPrefs&&"oo"==c._gaUserPrefs)return!0}catch(g){}a=[];b=String(Ea.cookie||document.cookie).split(";");for(c=0;c<b.length;c++){var d=b[c].split("="),e=d[0].replace(/^\s*|\s*$/g,"");e&&"AMP_TOKEN"==e&&((d=d.slice(1).join("=").replace(/^\s*|\s*$/g,""))&&(d=decodeURIComponent(d)),a.push(d))}for(b=0;b<a.length;b++)if("$OPT_OUT"==a[b])return!0;return Ea.getElementById("__gaOptOutExtension")? + !0:!1};var Ca=function(a){var b=[],c=M.cookie.split(";");a=new RegExp("^\\s*"+a+"=\\s*(.*?)\\s*$");for(var d=0;d<c.length;d++){var e=c[d].match(a);e&&b.push(e[1])}return b},zc=function(a,b,c,d,e,g,ca){e=G(e)?!1:eb.test(M.location.hostname)||"/"==c&&vc.test(d)?!1:!0;if(!e)return!1;b&&1200<b.length&&(b=b.substring(0,1200));c=a+"="+b+"; path="+c+"; ";g&&(c+="expires="+(new Date((new Date).getTime()+g)).toGMTString()+"; ");d&&"none"!==d&&(c+="domain="+d+";");ca&&(c+=ca+";");d=M.cookie;M.cookie=c;if(!(d=d!=M.cookie))a:{a= + Ca(a);for(d=0;d<a.length;d++)if(b==a[d]){d=!0;break a}d=!1}return d},Cc=function(a){return encodeURIComponent?encodeURIComponent(a).replace(/\(/g,"%28").replace(/\)/g,"%29"):a},vc=/^(www\.)?google(\.com?)?(\.[a-z]{2})?$/,eb=/(^|\.)doubleclick\.net$/i;var oc,Id=/^.*Version\/?(\d+)[^\d].*$/i,ne=function(){if(void 0!==O.__ga4__)return O.__ga4__;if(void 0===oc){var a=O.navigator.userAgent;if(a){var b=a;try{b=decodeURIComponent(a)}catch(c){}if(a=!(0<=b.indexOf("Chrome"))&&!(0<=b.indexOf("CriOS"))&&(0<=b.indexOf("Safari/")||0<=b.indexOf("Safari,")))b=Id.exec(b),a=11<=(b?Number(b[1]):-1);oc=a}else oc=!1}return oc};var Fa,Ga,fb,Ab,ja=/^https?:\/\/[^/]*cdn\.ampproject\.org\//,Ue=/^(?:www\.|m\.|amp\.)+/,Ub=[],da=function(a){if(ye(a[Kd])){if(void 0===Ab){var b;if(b=(b=De.get())&&b._ga||void 0)Ab=b,J(81)}if(void 0!==Ab)return a[Q]||(a[Q]=Ab),!1}if(a[Kd]){J(67);if(a[ac]&&"cookie"!=a[ac])return!1;if(void 0!==Ab)a[Q]||(a[Q]=Ab);else{a:{b=String(a[W]||xa());var c=String(a[Yb]||"/"),d=Ca(String(a[U]||"_ga"));b=na(d,b,c);if(!b||jd.test(b))b=!0;else if(b=Ca("AMP_TOKEN"),0==b.length)b=!0;else{if(1==b.length&&(b=decodeURIComponent(b[0]), + "$RETRIEVING"==b||"$OPT_OUT"==b||"$ERROR"==b||"$NOT_FOUND"==b)){b=!0;break a}b=!1}}if(b&&tc(ic,String(a[Na])))return!0}}return!1},ic=function(){Z.D([ua])},tc=function(a,b){var c=Ca("AMP_TOKEN");if(1<c.length)return J(55),!1;c=decodeURIComponent(c[0]||"");if("$OPT_OUT"==c||"$ERROR"==c||G(b))return J(62),!1;if(!ja.test(M.referrer)&&"$NOT_FOUND"==c)return J(68),!1;if(void 0!==Ab)return J(56),va(function(){a(Ab)},0),!0;if(Fa)return Ub.push(a),!0;if("$RETRIEVING"==c)return J(57),va(function(){tc(a,b)}, + 1E4),!0;Fa=!0;c&&"$"!=c[0]||(xc("$RETRIEVING",3E4),setTimeout(Mc,3E4),c="");return Pc(c,b)?(Ub.push(a),!0):!1},Pc=function(a,b,c){if(!window.JSON)return J(58),!1;var d=O.XMLHttpRequest;if(!d)return J(59),!1;var e=new d;if(!("withCredentials"in e))return J(60),!1;e.open("POST",(c||"https://ampcid.google.com/v1/publisher:getClientId")+"?key=AIzaSyA65lEHUEizIsNtlbNo-l2K18dT680nsaM",!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onload=function(){Fa=!1;if(4==e.readyState){try{200!= + e.status&&(J(61),Qc("","$ERROR",3E4));var g=JSON.parse(e.responseText);g.optOut?(J(63),Qc("","$OPT_OUT",31536E6)):g.clientId?Qc(g.clientId,g.securityToken,31536E6):!c&&g.alternateUrl?(Ga&&clearTimeout(Ga),Fa=!0,Pc(a,b,g.alternateUrl)):(J(64),Qc("","$NOT_FOUND",36E5))}catch(ca){J(65),Qc("","$ERROR",3E4)}e=null}};d={originScope:"AMP_ECID_GOOGLE"};a&&(d.securityToken=a);e.send(JSON.stringify(d));Ga=va(function(){J(66);Qc("","$ERROR",3E4)},1E4);return!0},Mc=function(){Fa=!1},xc=function(a,b){if(void 0=== + fb){fb="";for(var c=id(),d=0;d<c.length;d++){var e=c[d];if(zc("AMP_TOKEN",encodeURIComponent(a),"/",e,"",b)){fb=e;return}}}zc("AMP_TOKEN",encodeURIComponent(a),"/",fb,"",b)},Qc=function(a,b,c){Ga&&clearTimeout(Ga);b&&xc(b,c);Ab=a;b=Ub;Ub=[];for(c=0;c<b.length;c++)b[c](a)},ye=function(a){a:{if(ja.test(M.referrer)){var b=M.location.hostname.replace(Ue,"");b:{var c=M.referrer;c=c.replace(/^https?:\/\//,"");var d=c.replace(/^[^/]+/,"").split("/"),e=d[2];d=(d="s"==e?d[3]:e)?decodeURIComponent(d):d;if(!d){if(0== + c.indexOf("xn--")){c="";break b}(c=c.match(/(.*)\.cdn\.ampproject\.org\/?$/))&&2==c.length&&(d=c[1].replace(/-/g,".").replace(/\.\./g,"-"))}c=d?d.replace(Ue,""):""}(d=b===c)||(c="."+c,d=b.substring(b.length-c.length,b.length)===c);if(d){b=!0;break a}else J(78)}b=!1}return b&&!1!==a};var bd=function(a){return(a?"https:":Ba||"https:"==M.location.protocol?"https:":"http:")+"//www.google-analytics.com"},Da=function(a){this.name="len";this.message=a+"-8192"},ba=function(a,b,c){c=c||ua;if(2036>=b.length)wc(a,b,c);else if(8192>=b.length)x(a,b,c)||wd(a,b,c)||wc(a,b,c);else throw ge("len",b.length),new Da(b.length);},pe=function(a,b,c,d){d=d||ua;wd(a+"?"+b,"",d,c)},wc=function(a,b,c){var d=ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},wd=function(a,b,c, + d){var e=O.XMLHttpRequest;if(!e)return!1;var g=new e;if(!("withCredentials"in g))return!1;a=a.replace(/^http:/,"https:");g.open("POST",a,!0);g.withCredentials=!0;g.setRequestHeader("Content-Type","text/plain");g.onreadystatechange=function(){if(4==g.readyState){if(d)try{var ca=g.responseText;if(1>ca.length)ge("xhr","ver","0"),c();else if("1"!=ca.charAt(0))ge("xhr","ver",String(ca.length)),c();else if(3<d.count++)ge("xhr","tmr",""+d.count),c();else if(1==ca.length)c();else{var l=ca.charAt(1);if("d"== + l)pe("https://stats.g.doubleclick.net/j/collect",d.U,d,c);else if("g"==l){wc("https://www.google.%/ads/ga-audiences".replace("%","com"),d.google,c);var k=ca.substring(2);k&&(/^[a-z.]{1,6}$/.test(k)?wc("https://www.google.%/ads/ga-audiences".replace("%",k),d.google,ua):ge("tld","bcc",k))}else ge("xhr","brc",l),c()}}catch(w){ge("xhr","rsp"),c()}else c();g=null}};g.send(b);return!0},x=function(a,b,c){return O.navigator.sendBeacon?O.navigator.sendBeacon(a,b)?(c(),!0):!1:!1},ge=function(a,b,c){1<=100* + Math.random()||G("?")||(a=["t=error","_e="+a,"_v=j81","sr=1"],b&&a.push("_f="+b),c&&a.push("_m="+K(c.substring(0,100))),a.push("aip=1"),a.push("z="+hd()),wc(bd(!0)+"/u/d",a.join("&"),ua))};var qc=function(){return O.gaData=O.gaData||{}},h=function(a){var b=qc();return b[a]=b[a]||{}};var Ha=function(){this.M=[]};Ha.prototype.add=function(a){this.M.push(a)};Ha.prototype.D=function(a){try{for(var b=0;b<this.M.length;b++){var c=a.get(this.M[b]);c&&ea(c)&&c.call(O,a)}}catch(d){}b=a.get(Ia);b!=ua&&ea(b)&&(a.set(Ia,ua,!0),setTimeout(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abort";}function Ma(a){if(G(P(a,Na)))throw"abort";}function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw"abort";} + function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest&&J(40)}catch(c){}a.set(ld,Td(a),!0);a.set(Ac,R(a,Ac)+1);var b=[];ue.map(function(c,d){d.F&&(c=a.get(c),void 0!=c&&c!=d.defaultValue&&("boolean"==typeof c&&(c*=1),b.push(d.F+"="+K(""+c))))});!1===a.get(xe)&&b.push("npa=1");b.push("z="+Bd());a.set(Ra,b.join("&"),!0)} + function Sa(a){var b=P(a,fa);!b&&a.get(Vd)&&(b="beacon");var c=P(a,gd),d=P(a,oe),e=c||(d?d+"/3":bd(!1)+"/collect");switch(P(a,ad)){case "d":e=c||(d?d+"/32":bd(!1)+"/j/collect");b=a.get(qe)||void 0;pe(e,P(a,Ra),b,a.Z(Ia));break;case "b":e=c||(d?d+"/31":bd(!1)+"/r/collect");default:b?(c=P(a,Ra),d=(d=a.Z(Ia))||ua,"image"==b?wc(e,c,d):"xhr"==b&&wd(e,c,d)||"beacon"==b&&x(e,c,d)||ba(e,c,d)):ba(e,P(a,Ra),a.Z(Ia))}e=P(a,Na);e=h(e);b=e.hitcount;e.hitcount=b?b+1:1;e=P(a,Na);delete h(e).pending_experiments; + a.set(Ia,ua,!0)}function Hc(a){qc().expId&&a.set(Nc,qc().expId);qc().expVar&&a.set(Oc,qc().expVar);var b=P(a,Na);if(b=h(b).pending_experiments){var c=[];for(d in b)b.hasOwnProperty(d)&&b[d]&&c.push(encodeURIComponent(d)+"."+encodeURIComponent(b[d]));var d=c.join("!")}else d=void 0;d&&a.set(m,d,!0)}function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"abort";}function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(","),!0)} + function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return Math.round(2147483647*Math.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){c=R(a,Wa);var d=(new Date).getTime(),e=R(a,Xa);0==e&&a.set(Xa,d);e=Math.round(2*(d-e)/1E3);0<e&&(c=Math.min(c+e,20),a.set(Xa,d));if(0>=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new ee};Ya.prototype.get=function(a){var b=$a(a),c=this.data.get(a);b&&void 0==c&&(c=ea(b.defaultValue)?b.defaultValue():b.defaultValue);return b&&b.Z?b.Z(this,a,c):c};var P=function(a,b){a=a.get(b);return void 0==a?"":""+a},R=function(a,b){a=a.get(b);return void 0==a||""===a?0:Number(a)};Ya.prototype.Z=function(a){return(a=this.get(a))&&ea(a)?a:ua}; + Ya.prototype.set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a.hasOwnProperty(d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb.test(c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a.data.set(b,c,d)};var ue=new ee,ve=[],bb=function(a,b,c,d,e){this.name=a;this.F=b;this.Z=d;this.o=e;this.defaultValue=c},$a=function(a){var b=ue.get(a);if(!b)for(var c=0;c<ve.length;c++){var d=ve[c],e=d[0].exec(a);if(e){b=d[1](e);ue.set(b.name,b);break}}return b},yc=function(a){var b;ue.map(function(c,d){d.F==a&&(b=d)});return b&&b.name},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);ue.set(a.name,a);return a.name},cb=function(a,b){ve.push([new RegExp("^"+a+"$"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var hb=T("apiVersion","v"),ib=T("clientVersion","_v");S("anonymizeIp","aip");var jb=S("adSenseId","a"),Va=S("hitType","t"),Ia=S("hitCallback"),Ra=S("hitPayload");S("nonInteraction","ni");S("currencyCode","cu");S("dataSource","ds");var Vd=S("useBeacon",void 0,!1),fa=S("transport");S("sessionControl","sc","");S("sessionGroup","sg");S("queueTime","qt");var Ac=S("_s","_s");S("screenName","cd");var kb=S("location","dl",""),lb=S("referrer","dr"),mb=S("page","dp","");S("hostname","dh"); + var nb=S("language","ul"),ob=S("encoding","de");S("title","dt",function(){return M.title||void 0});cb("contentGroup([0-9]+)",function(a){return new bb(a[0],"cg"+a[1])});var pb=S("screenColors","sd"),qb=S("screenResolution","sr"),rb=S("viewportSize","vp"),sb=S("javaEnabled","je"),tb=S("flashVersion","fl");S("campaignId","ci");S("campaignName","cn");S("campaignSource","cs");S("campaignMedium","cm");S("campaignKeyword","ck");S("campaignContent","cc"); + var ub=S("eventCategory","ec"),xb=S("eventAction","ea"),yb=S("eventLabel","el"),zb=S("eventValue","ev"),Bb=S("socialNetwork","sn"),Cb=S("socialAction","sa"),Db=S("socialTarget","st"),Eb=S("l1","plt"),Fb=S("l2","pdt"),Gb=S("l3","dns"),Hb=S("l4","rrt"),Ib=S("l5","srt"),Jb=S("l6","tcp"),Kb=S("l7","dit"),Lb=S("l8","clt"),Ve=S("l9","_gst"),We=S("l10","_gbt"),Xe=S("l11","_cst"),Ye=S("l12","_cbt"),Mb=S("timingCategory","utc"),Nb=S("timingVar","utv"),Ob=S("timingLabel","utl"),Pb=S("timingValue","utt"); + S("appName","an");S("appVersion","av","");S("appId","aid","");S("appInstallerId","aiid","");S("exDescription","exd");S("exFatal","exf");var Nc=S("expId","xid"),Oc=S("expVar","xvar"),m=S("exp","exp"),Rc=S("_utma","_utma"),Sc=S("_utmz","_utmz"),Tc=S("_utmht","_utmht"),Ua=S("_hc",void 0,0),Xa=S("_ti",void 0,0),Wa=S("_to",void 0,20);cb("dimension([0-9]+)",function(a){return new bb(a[0],"cd"+a[1])});cb("metric([0-9]+)",function(a){return new bb(a[0],"cm"+a[1])});S("linkerParam",void 0,void 0,Bc,db); + var Ze=T("_cd2l",void 0,!1),ld=S("usage","_u"),Gd=S("_um");S("forceSSL",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S("_j1","jid"),ia=S("_j2","gjid");cb("\\&(.*)",function(a){var b=new bb(a[0],a[1]),c=yc(a[0].substring(1));c&&(b.Z=function(d){return d.get(c)},b.o=function(d,e,g,ca){d.set(c,g,ca)},b.F=void 0);return b}); + var Qb=T("_oot"),dd=S("previewTask"),Rb=S("checkProtocolTask"),md=S("validationTask"),Sb=S("checkStorageTask"),Uc=S("historyImportTask"),Tb=S("samplerTask"),Vb=S("_rlt"),Wb=S("buildHitTask"),Xb=S("sendHitTask"),Vc=S("ceTask"),zd=S("devIdTask"),Cd=S("timingTask"),Ld=S("displayFeaturesTask"),oa=S("customTask"),V=T("name"),Q=T("clientId","cid"),n=T("clientIdTime"),xd=T("storedClientId"),Ad=S("userId","uid"),Na=T("trackingId","tid"),U=T("cookieName",void 0,"_ga"),W=T("cookieDomain"),Yb=T("cookiePath", + void 0,"/"),Zb=T("cookieExpires",void 0,63072E3),Hd=T("cookieUpdate",void 0,!0),Be=T("cookieFlags",void 0,""),$b=T("legacyCookieDomain"),Wc=T("legacyHistoryImport",void 0,!0),ac=T("storage",void 0,"cookie"),bc=T("allowLinker",void 0,!1),cc=T("allowAnchor",void 0,!0),Ka=T("sampleRate","sf",100),dc=T("siteSpeedSampleRate",void 0,1),ec=T("alwaysSendReferrer",void 0,!1),I=T("_gid","_gid"),la=T("_gcn"),Kd=T("useAmpClientId"),ce=T("_gclid"),fe=T("_gt"),he=T("_ge",void 0,7776E6),ie=T("_gclsrc"),je=T("storeGac", + void 0,!0),oe=S("_x_19"),gd=S("transportUrl"),Md=S("_r","_r"),qe=S("_dp"),ad=S("_jt",void 0,"n"),Ud=S("allowAdFeatures",void 0,!0),xe=S("allowAdPersonalizationSignals",void 0,!0);function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,arguments)}catch(e){throw ge("exc",a,e&&e.name),e;}}};var Od=function(){this.V=100;this.$=this.fa=!1;this.oa="detourexp";this.groups=1},Ed=function(a){var b=new Od,c;if(b.fa&&b.$)return 0;b.$=!0;if(a){if(b.oa&&void 0!==a.get(b.oa))return R(a,b.oa);if(0==a.get(dc))return 0}if(0==b.V)return 0;void 0===c&&(c=Bd());return 0==c%b.V?Math.floor(c/b.V)%b.groups+1:0};function fc(){var a,b;if((b=(b=O.navigator)?b.plugins:null)&&b.length)for(var c=0;c<b.length&&!a;c++){var d=b[c];-1<d.name.indexOf("Shockwave Flash")&&(a=d.description)}if(!a)try{var e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"),a="WIN 6,0,21,0",e.AllowScriptAccess="always",a=e.GetVariable("$version")}catch(g){}if(!a)try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash"),a=e.GetVariable("$version")}catch(g){}a&& + (e=a.match(/[\d]+/g))&&3<=e.length&&(a=e[0]+"."+e[1]+" r"+e[2]);return a||void 0};var aa=function(a){var b=Math.min(R(a,dc),100);return La(P(a,Q))%100>=b?!1:!0},gc=function(a){var b={};if(Ec(b)||Fc(b)){var c=b[Eb];void 0==c||Infinity==c||isNaN(c)||(0<c?(Y(b,Gb),Y(b,Jb),Y(b,Ib),Y(b,Fb),Y(b,Hb),Y(b,Kb),Y(b,Lb),Y(b,Ve),Y(b,We),Y(b,Xe),Y(b,Ye),va(function(){a(b)},10)):L(O,"load",function(){gc(a)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance;b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart; + a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;a[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;a[Ve]=N.L-c;a[We]=N.ya-c;O.google_tag_manager&&O.google_tag_manager._li&&(b=O.google_tag_manager._li,a[Xe]=b.cst,a[Ye]=b.cbt);return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1; + a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){if("pageview"==b.get(Va)&&!a.I){a.I=!0;var c=aa(b),d=0<E(P(b,kb),"gclid").length;(c||d)&&gc(function(e){c&&a.send("timing",e);d&&a.send("adtiming",e)})}}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){if(a.get(Hd)||P(a,xd)!=P(a,Q)){var b=1E3*R(a,Zb);ma(a,Q,U,b)}(a.get(Hd)||uc(a)!=P(a,I))&&ma(a,I,la,864E5);if(a.get(je)){var c=P(a,ce);if(c){var d=Math.min(R(a,he),1E3*R(a,Zb));d=Math.min(d,1E3*R(a,fe)+d-(new Date).getTime());a.data.set(he,d);b={};var e=P(a,fe),g=P(a,ie),ca=kc(P(a,Yb)),l=lc(P(a,W)),k=P(a,Na);a=P(a,Be);g&&"aw.ds"!=g?b&&(b.ua=!0):(c=["1",e,Cc(c)].join("."),0<d&&(b&&(b.ta=!0),zc("_gac_"+Cc(k),c,ca,l,k,d,a)));le(b)}}else J(75)}},ma=function(a, + b,c,d){var e=nd(a,b);if(e){c=P(a,c);var g=kc(P(a,Yb)),ca=lc(P(a,W)),l=P(a,Be),k=P(a,Na);if("auto"!=ca)zc(c,e,g,ca,k,d,l)&&(hc=!0);else{J(32);for(var w=id(),Ce=0;Ce<w.length;Ce++)if(ca=w[Ce],a.data.set(W,ca),e=nd(a,b),zc(c,e,g,ca,k,d,l)){hc=!0;return}a.data.set(W,"auto")}}},uc=function(a){var b=Ca(P(a,la));return Xd(a,b)},nc=function(a){if("cookie"==P(a,ac)&&!hc&&(mc(a),!hc))throw"abort";},Yc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||xa(),d=Xc("__utma",c,b);d&&(J(19),a.set(Tc,(new Date).getTime(), + !0),a.set(Rc,d.R),(b=Xc("__utmz",c,b))&&d.hash==b.hash&&a.set(Sc,b.R))}},nd=function(a,b){b=Cc(P(a,b));var c=lc(P(a,W)).split(".").length;a=jc(P(a,Yb));1<a&&(c+="-"+a);return b?["GA1",c,b].join("."):""},Xd=function(a,b){return na(b,P(a,W),P(a,Yb))},na=function(a,b,c){if(!a||1>a.length)J(12);else{for(var d=[],e=0;e<a.length;e++){var g=a[e];var ca=g.split(".");var l=ca.shift();("GA1"==l||"1"==l)&&1<ca.length?(g=ca.shift().split("-"),1==g.length&&(g[1]="1"),g[0]*=1,g[1]*=1,ca={H:g,s:ca.join(".")}):ca= + kd.test(g)?{H:[0,0],s:g}:void 0;ca&&d.push(ca)}if(1==d.length)return J(13),d[0].s;if(0==d.length)J(12);else{J(14);d=Gc(d,lc(b).split(".").length,0);if(1==d.length)return d[0].s;d=Gc(d,jc(c),1);1<d.length&&J(41);return d[0]&&d[0].s}}},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a.length;ca++){var l=a[ca];l.H[c]==b?d.push(l):void 0==g||l.H[c]<g?(e=[l],g=l.H[c]):l.H[c]==g&&e.push(l)}return 0<d.length?d:e},lc=function(a){return 0==a.indexOf(".")?a.substr(1):a},id=function(){var a=[],b=xa().split("."); + if(4==b.length){var c=b[b.length-1];if(parseInt(c,10)==c)return["none"]}for(c=b.length-2;0<=c;c--)a.push(b.slice(c).join("."));b=M.location.hostname;eb.test(b)||vc.test(b)||a.push("none");return a},kc=function(a){if(!a)return"/";1<a.length&&a.lastIndexOf("/")==a.length-1&&(a=a.substr(0,a.length-1));0!=a.indexOf("/")&&(a="/"+a);return a},jc=function(a){a=kc(a);return"/"==a?1:a.split("/").length},le=function(a){a.ta&&J(77);a.na&&J(74);a.pa&&J(73);a.ua&&J(69)};function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;for(var g=0;g<e.length;g++){var ca=(""+e[g]).split(".");ca.length>=a&&d.push({hash:ca[0],R:e[g],O:ca})}if(0!=d.length)return 1==d.length?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.substring(1):"."+a);for(var d=0;d<b.length;d++)if(b[d].hash==c||b[d].hash==a)return b[d]};var Jc=new RegExp(/^https?:\/\/([^\/:]+)/),De=O.google_tag_data.glBridge,Kc=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/,od=/(.*)([?&#])(?:_gac=[^&#]*)(?:&?)(.*)/;function Bc(a){if(a.get(Ze))return J(35),De.generate($e(a));var b=P(a,Q),c=P(a,I)||"";b="_ga=2."+K(pa(c+b,0)+"."+c+"-"+b);(a=af(a))?(J(44),a="&_gac=1."+K([pa(a.qa,0),a.timestamp,a.qa].join("."))):a="";return b+a} + function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b];for(b=0;b<e.length;++b)a.push(e[b].description);return La(a.join("."))}function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor((c.getMinutes()+b)/60);return La([a,d.userAgent,d.language||"",c.getTimezoneOffset(),c.getYear(),c.getDate()+Math.floor(e/24),(24+e)%24,(60+c.getMinutes()+b)%60].join("."))} + var Dc=function(a){J(48);this.target=a;this.T=!1};Dc.prototype.ca=function(a,b){if(a){if(this.target.get(Ze))return De.decorate($e(this.target),a,b);if(a.tagName){if("a"==a.tagName.toLowerCase()){a.href&&(a.href=qd(this,a.href,b));return}if("form"==a.tagName.toLowerCase())return rd(this,a)}if("string"==typeof a)return qd(this,a,b)}}; + var qd=function(a,b,c){var d=Kc.exec(b);d&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));(d=od.exec(b))&&3<=d.length&&(b=d[1]+(d[3]?d[2]+d[3]:""));a=a.target.get("linkerParam");var e=b.indexOf("?");d=b.indexOf("#");c?b+=(-1==d?"#":"&")+a:(c=-1==e?"?":"&",b=-1==d?b+(c+a):b.substring(0,d)+c+a+b.substring(d));b=b.replace(/&+_ga=/,"&_ga=");return b=b.replace(/&+_gac=/,"&_gac=")},rd=function(a,b){if(b&&b.action)if("get"==b.method.toLowerCase()){a=a.target.get("linkerParam").split("&");for(var c=0;c<a.length;c++){var d= + a[c].split("="),e=d[1];d=d[0];for(var g=b.childNodes||[],ca=!1,l=0;l<g.length;l++)if(g[l].name==d){g[l].setAttribute("value",e);ca=!0;break}ca||(g=M.createElement("input"),g.setAttribute("type","hidden"),g.setAttribute("name",d),g.setAttribute("value",e),b.appendChild(g))}}else"post"==b.method.toLowerCase()&&(b.action=qd(a,b.action))}; + Dc.prototype.S=function(a,b,c){function d(g){try{g=g||O.event;a:{var ca=g.target||g.srcElement;for(g=100;ca&&0<g;){if(ca.href&&ca.nodeName.match(/^a(?:rea)?$/i)){var l=ca;break a}ca=ca.parentNode;g--}l={}}("http:"==l.protocol||"https:"==l.protocol)&&sd(a,l.hostname||"")&&l.href&&(l.href=qd(e,l.href,b))}catch(k){J(26)}}var e=this;this.target.get(Ze)?De.auto(function(){return $e(e.target)},a,b?"fragment":"",c):(this.T||(this.T=!0,L(M,"mousedown",d,!1),L(M,"keyup",d,!1)),c&&L(M,"submit",function(g){g= + g||O.event;if((g=g.target||g.srcElement)&&g.action){var ca=g.action.match(Jc);ca&&sd(a,ca[1])&&rd(e,g)}}))};function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.length;c++)if(a[c]instanceof RegExp){if(a[c].test(b))return!0}else if(0<=b.indexOf(a[c]))return!0;return!1}function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)&&b!=pa(a,-1)&&b!=pa(a,-2)}function $e(a){var b=af(a);return{_ga:a.get(Q),_gid:a.get(I)||void 0,_gac:b?[b.qa,b.timestamp].join("."):void 0}} + function af(a){function b(e){return void 0==e||""===e?0:Number(e)}var c=a.get(ce);if(c&&a.get(je)){var d=b(a.get(fe));if(1E3*d+b(a.get(he))<=(new Date).getTime())J(76);else return{timestamp:d,qa:c}}};var p=/^(GTM|OPT)-[A-Z0-9]+$/,q=/;_gaexp=[^;]*/g,r=/;((__utma=)|([^;=]+=GAX?\d+\.))[^;]*/g,Aa=/^https?:\/\/[\w\-.]+\.google.com(:\d+)?\/optimize\/opt-launch\.html\?.*$/,t=function(a){function b(d,e){e&&(c+="&"+d+"="+K(e))}var c="https://www.google-analytics.com/gtm/js?id="+K(a.id);"dataLayer"!=a.B&&b("l",a.B);b("t",a.target);b("cid",a.clientId);b("cidt",a.ka);b("gac",a.la);b("aip",a.ia);a.sync&&b("m","sync");b("cycle",a.G);a.qa&&b("gclid",a.qa);Aa.test(M.referrer)&&b("cb",String(hd()));return c};var Jd=function(a,b,c){this.aa=b;(b=c)||(b=(b=P(a,V))&&"t0"!=b?Wd.test(b)?"_gat_"+Cc(P(a,Na)):"_gat_"+Cc(b):"_gat");this.Y=b;this.ra=null},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(e){Pd(a,e,ed);Pd(a,e,ia);var g=c(e);Qd(a,e);return g});var d=b.get(Xb);b.set(Xb,function(e){var g=d(e);if(se(e)){if(ne()!==H(a,e)){J(80);var ca={U:re(a,e,1),google:re(a,e,2),count:0};pe("https://stats.g.doubleclick.net/j/collect",ca.U,ca)}else ta(re(a,e,0));e.set(ed,"",!0)}return g})},Pd=function(a,b,c){!1===b.get(Ud)|| + b.get(c)||("1"==Ca(a.Y)[0]?b.set(c,"",!0):b.set(c,""+hd(),!0))},Qd=function(a,b){se(b)&&zc(a.Y,"1",P(b,Yb),P(b,W),P(b,Na),6E4,P(b,Be))},se=function(a){return!!a.get(ed)&&!1!==a.get(Ud)},re=function(a,b,c){var d=new ee,e=function(ca){$a(ca).F&&d.set($a(ca).F,b.get(ca))};e(hb);e(ib);e(Na);e(Q);e(ed);if(0==c||1==c)e(Ad),e(ia),e(I);d.set($a(ld).F,Td(b));var g="";d.map(function(ca,l){g+=K(ca)+"=";g+=K(""+l)+"&"});g+="z="+hd();0==c?g=a.aa+g:1==c?g="t=dc&aip=1&_r=3&"+g:2==c&&(g="t=sr&aip=1&_r=4&slf_rd=1&"+ + g);return g},H=function(a,b){null===a.ra&&(a.ra=1===Ed(b),a.ra&&J(33));return a.ra},Wd=/^gtm\d+$/;var fd=function(a,b){a=a.b;if(!a.get("dcLoaded")){var c=new $c(Dd(a));c.set(29);a.set(Gd,c.w);b=b||{};var d;b[U]&&(d=Cc(b[U]));b=new Jd(a,"https://stats.g.doubleclick.net/r/collect?t=dc&aip=1&_r=3&",d);Rd(b,a);a.set("dcLoaded",!0)}};var Sd=function(a){if(!a.get("dcLoaded")&&"cookie"==a.get(ac)){var b=new Jd(a);Pd(b,a,ed);Pd(b,a,ia);Qd(b,a);if(se(a)){var c=ne()!==H(b,a);a.set(Md,1,!0);c?(J(79),a.set(ad,"d",!0),a.set(qe,{U:re(b,a,1),google:re(b,a,2),count:0},!0)):a.set(ad,"b",!0)}}};var Lc=function(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||hd()};var wb=/^(UA|YT|MO|GP)-(\d+)-(\d+)$/,pc=function(a){function b(e,g){d.b.data.set(e,g)}function c(e,g){b(e,g);d.filters.add(e)}var d=this;this.b=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,sa(a[Na]));b(U,a[U]);b(W,a[W]||xa());b(Yb,a[Yb]);b(Zb,a[Zb]);b(Hd,a[Hd]);b(Be,a[Be]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(n,a[n]);b(Kd,a[Kd]);b(je,a[je]);b(Ze,a[Ze]);b(oe,a[oe]);b(hb,1);b(ib,"j81");c(Qb,Ma);c(oa,ua);c(dd,cd);c(Rb,Oa);c(md,vb); + c(Sb,nc);c(Uc,Yc);c(Tb,Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));pd(this.b);td(this.b,a[Q]);this.b.set(jb,Lc())},td=function(a,b){var c=P(a,U);a.data.set(la,"_ga"==c?"_gid":c+"_gid");if("cookie"==P(a,ac)){hc=!1;c=Ca(P(a,U));c=Xd(a,c);if(!c){c=P(a,W);var d=P(a,$b)||xa();c=Xc("__utma",d,c);void 0!=c?(J(10),c=c.O[1]+"."+c.O[2]):c=void 0}c&&(hc=!0);if(d=c&&!a.get(Hd))if(d=c.split("."),2!=d.length)d=!1;else if(d=Number(d[1])){var e=R(a,Zb);d=d+e<(new Date).getTime()/1E3}else d= + !1;d&&(c=void 0);c&&(a.data.set(xd,c),a.data.set(Q,c),(c=uc(a))&&a.data.set(I,c));if(a.get(je)&&(c=a.get(ce),d=a.get(ie),!c||d&&"aw.ds"!=d)){c={};if(M){d=[];e=M.cookie.split(";");for(var g=/^\s*_gac_(UA-\d+-\d+)=\s*(.+?)\s*$/,ca=0;ca<e.length;ca++){var l=e[ca].match(g);l&&d.push({ja:l[1],value:l[2]})}e={};if(d&&d.length)for(g=0;g<d.length;g++)(ca=d[g].value.split("."),"1"!=ca[0]||3!=ca.length)?c&&(c.na=!0):ca[1]&&(e[d[g].ja]?c&&(c.pa=!0):e[d[g].ja]=[],e[d[g].ja].push({timestamp:ca[1],qa:ca[2]})); + d=e}else d={};d=d[P(a,Na)];le(c);d&&0!=d.length&&(c=d[0],a.data.set(fe,c.timestamp),a.data.set(ce,c.qa))}}if(a.get(Hd)&&(c=be("_ga",!!a.get(cc)),g=be("_gl",!!a.get(cc)),d=De.get(a.get(cc)),e=d._ga,g&&0<g.indexOf("_ga*")&&!e&&J(30),g=d.gclid,ca=d._gac,c||e||g||ca))if(c&&e&&J(36),a.get(bc)||ye(a.get(Kd))){if(e&&(J(38),a.data.set(Q,e),d._gid&&(J(51),a.data.set(I,d._gid))),g?(J(82),a.data.set(ce,g),d.gclsrc&&a.data.set(ie,d.gclsrc)):ca&&(d=ca.split("."))&&2===d.length&&(J(37),a.data.set(ce,d[0]),a.data.set(fe, + d[1])),c)b:if(d=c.indexOf("."),-1==d)J(22);else{e=c.substring(0,d);g=c.substring(d+1);d=g.indexOf(".");c=g.substring(0,d);g=g.substring(d+1);if("1"==e){if(d=g,ke(d,c)){J(23);break b}}else if("2"==e){d=g.indexOf("-");e="";0<d?(e=g.substring(0,d),d=g.substring(d+1)):d=g.substring(1);if(ke(e+d,c)){J(53);break b}e&&(J(2),a.data.set(I,e))}else{J(22);break b}J(11);a.data.set(Q,d);if(c=be("_gac",!!a.get(cc)))c=c.split("."),"1"!=c[0]||4!=c.length?J(72):ke(c[3],c[1])?J(71):(a.data.set(ce,c[3]),a.data.set(fe, + c[2]),J(70))}}else J(21);b&&(J(9),a.data.set(Q,K(b)));a.get(Q)||((b=(b=O.gaGlobal&&O.gaGlobal.vid)&&-1!=b.search(jd)?b:void 0)?(J(17),a.data.set(Q,b)):(J(8),a.data.set(Q,ra())));a.get(I)||(J(3),a.data.set(I,ra()));mc(a)},pd=function(a){var b=O.navigator,c=O.screen,d=M.location;a.set(lb,ya(!!a.get(ec),!!a.get(Kd)));if(d){var e=d.pathname||"";"/"!=e.charAt(0)&&(J(31),e="/"+e);a.set(kb,d.protocol+"//"+d.hostname+e+d.search)}c&&a.set(qb,c.width+"x"+c.height);c&&a.set(pb,c.colorDepth+"-bit");c=M.documentElement; + var g=(e=M.body)&&e.clientWidth&&e.clientHeight,ca=[];c&&c.clientWidth&&c.clientHeight&&("CSS1Compat"===M.compatMode||!g)?ca=[c.clientWidth,c.clientHeight]:g&&(ca=[e.clientWidth,e.clientHeight]);c=0>=ca[0]||0>=ca[1]?"":ca.join("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"").toLowerCase());a.data.set(ce,be("gclid",!0));a.data.set(ie,be("gclsrc",!0));a.data.set(fe, + Math.round((new Date).getTime()/1E3));if(d&&a.get(cc)&&(b=M.location.hash)){b=b.split(/[?&#]+/);d=[];for(c=0;c<b.length;++c)(D(b[c],"utm_id")||D(b[c],"utm_campaign")||D(b[c],"utm_source")||D(b[c],"utm_medium")||D(b[c],"utm_term")||D(b[c],"utm_content")||D(b[c],"gclid")||D(b[c],"dclid")||D(b[c],"gclsrc"))&&d.push(b[c]);0<d.length&&(b="#"+d.join("&"),a.set(kb,a.get(kb)+b))}};pc.prototype.get=function(a){return this.b.get(a)};pc.prototype.set=function(a,b){this.b.set(a,b)}; + var me={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,Nb,Pb,Ob]};pc.prototype.send=function(a){if(!(1>arguments.length)){if("string"===typeof arguments[0]){var b=arguments[0];var c=[].slice.call(arguments,1)}else b=arguments[0]&&arguments[0][Va],c=arguments;b&&(c=za(me[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b.data.m={})}};pc.prototype.ma=function(a,b){var c=this;u(a,c,b)||(v(a,function(){u(a,c,b)}),y(String(c.get(V)),a,void 0,b,!0))};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0},z=function(a){if(!rc(a)){J(16);var b=!1,c=function(){if(!b&&rc(a)){b=!0;var d=c,e=M;e.removeEventListener?e.removeEventListener("visibilitychange",d,!1):e.detachEvent&&e.detachEvent("onvisibilitychange",d)}};L(M,"visibilitychange",c)}};var te=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=te.exec(a[0]);null!=b&&4==b.length&&(this.c=b[1]||"t0",this.K=b[2]||"",this.methodName=b[3],this.a=[].slice.call(a,1),this.K||(this.A="create"==this.methodName,this.i="require"==this.methodName,this.g="provide"==this.methodName,this.ba="remove"==this.methodName),this.i&&(3<=this.a.length?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.methodName)throw"abort"; + if(this.i&&(!qa(b)||""==b))throw"abort";if(this.g&&(!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.K))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")};var Yd,Zd,$d,A;Yd=new ee;$d=new ee;A=new ee;Zd={ec:45,ecommerce:46,linkid:47}; + var u=function(a,b,c){b==N||b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new ee;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},y=function(a,b,c,d,e){if(!ea(Yd.get(b))&&!$d.get(b)){Zd.hasOwnProperty(b)&&J(Zd[b]);a=N.j(a);if(p.test(b)){J(52);if(!a)return!0;c=d||{};d={id:b,B:c.dataLayer||"dataLayer",ia:!!a.get("anonymizeIp"),sync:e,G:!1};a.get(">m")==b&&(d.G=!0);var g=String(a.get("name"));"t0"!=g&&(d.target=g);G(String(a.get("trackingId")))||(d.clientId= + String(a.get(Q)),d.ka=Number(a.get(n)),c=c.palindrome?r:q,c=(c=M.cookie.replace(/^|(; +)/g,";").match(c))?c.sort().join("").substring(1):void 0,d.la=c,d.qa=E(a.b.get(kb)||"","gclid"));c=d.B;g=(new Date).getTime();O[c]=O[c]||[];g={"gtm.start":g};e||(g.event="gtm.js");O[c].push(g);c=t(d)}!c&&Zd.hasOwnProperty(b)?(J(39),c=b+".js"):J(43);if(c){if(a){var ca=a.get(oe);qa(ca)||(ca=void 0)}c&&0<=c.indexOf("/")||(c=(ca?ca+"/34":bd(!1)+"/plugins/ua/")+c);ca=ae(c);a=ca.protocol;d=M.location.protocol;if(("https:"== + a||a==d||("http:"!=a?0:"http:"==d))&&B(ca)){if(ca=ca.url)a=(a=M.querySelector&&M.querySelector("script[nonce]")||null)?a.nonce||a.getAttribute&&a.getAttribute("nonce")||"":"",e?(e="",a&&Nd.test(a)&&(e=' nonce="'+a+'"'),f.test(ca)&&M.write("<script"+e+' src="'+ca+'">\x3c/script>')):(e=M.createElement("script"),e.type="text/javascript",e.async=!0,e.src=ca,a&&e.setAttribute("nonce",a),ca=M.getElementsByTagName("script")[0],ca.parentNode.insertBefore(e,ca));$d.set(b,!0)}}}},v=function(a,b){var c=A.get(a)|| + [];c.push(b);A.set(a,c)},C=function(a,b){Yd.set(a,b);b=A.get(a)||[];for(var c=0;c<b.length;c++)b[c]();A.set(a,[])},B=function(a){var b=ae(M.location.href);if(D(a.url,"https://www.google-analytics.com/gtm/js?id="))return!0;if(a.query||0<=a.url.indexOf("?")||0<=a.path.indexOf("://"))return!1;if(a.host==b.host&&a.port==b.port)return!0;b="http:"==a.protocol?80:443;return"www.google-analytics.com"==a.host&&(a.port||b)==b&&D(a.path,"/plugins/")?!0:!1},ae=function(a){function b(l){var k=l.hostname||"",w= + 0<=k.indexOf("]");k=k.split(w?"]":":")[0].toLowerCase();w&&(k+="]");w=(l.protocol||"").toLowerCase();w=1*l.port||("http:"==w?80:"https:"==w?443:"");l=l.pathname||"";D(l,"/")||(l="/"+l);return[k,""+w,l]}var c=M.createElement("a");c.href=M.location.href;var d=(c.protocol||"").toLowerCase(),e=b(c),g=c.search||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a||D(a,"?")?a=ca+e[2]+(a||g):0>a.split("/")[0].indexOf(":")&&(a=ca+e[2].substring(0,e[2].lastIndexOf("/"))+"/"+a);c.href=a; + d=b(c);return{protocol:(c.protocol||"").toLowerCase(),host:d[0],port:d[1],path:d[2],query:c.search||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J.apply(Z,arguments);b=Z.f.concat(b);for(Z.f=[];0<b.length&&!Z.v(b[0])&&!(b.shift(),0<Z.f.length););Z.f=Z.f.concat(b)};Z.J=function(a){for(var b=[],c=0;c<arguments.length;c++)try{var d=new sc(arguments[c]);d.g?C(d.a[0],d.a[1]):(d.i&&(d.ha=y(d.c,d.a[0],d.X,d.W)),b.push(d))}catch(e){}return b}; + Z.v=function(a){try{if(a.u)a.u.call(O,N.j("t0"));else{var b=a.c==gb?N:N.j(a.c);if(a.A){if("t0"==a.c&&(b=N.create.apply(N,a.a),null===b))return!0}else if(a.ba)N.remove(a.c);else if(b)if(a.i){if(a.ha&&(a.ha=y(a.c,a.a[0],a.X,a.W)),!u(a.a[0],b,a.W))return!0}else if(a.K){var c=a.methodName,d=a.a,e=b.plugins_.get(a.K);e[c].apply(e,d)}else b[a.methodName].apply(b,a.a)}}catch(g){}};var N=function(a){J(1);Z.D.apply(Z,[arguments])};N.h={};N.P=[];N.L=0;N.ya=0;N.answer=42;var we=[Na,W,V];N.create=function(a){var b=za(we,[].slice.call(arguments));b[V]||(b[V]="t0");var c=""+b[V];if(N.h[c])return N.h[c];if(da(b))return null;b=new pc(b);N.h[c]=b;N.P.push(b);c=qc().tracker_created;if(ea(c))try{c(b)}catch(d){}return b};N.remove=function(a){for(var b=0;b<N.P.length;b++)if(N.P[b].get(V)==a){N.P.splice(b,1);N.h[a]=null;break}};N.j=function(a){return N.h[a]};N.getAll=function(){return N.P.slice(0)}; + N.N=function(){"ga"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){N.L=a&&a.l;N.ya=1*new Date;N.loaded=!0;var b=O[gb]=N;X("create",b,b.create);X("remove",b,b.remove);X("getByName",b,b.j,5);X("getAll",b,b.getAll,6);b=pc.prototype;X("get",b,b.get,7);X("set",b,b.set,4);X("send",b,b.send);X("requireSync",b,b.ma);b=Ya.prototype;X("get",b,b.get);X("set",b,b.set);if("https:"!=M.location.protocol&&!Ba){a:{b=M.getElementsByTagName("script");for(var c=0;c<b.length&&100>c;c++){var d=b[c].src;if(d&&0==d.indexOf(bd(!0)+ + "/analytics")){b=!0;break a}}b=!1}b&&(Ba=!0)}(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc.prototype;C("linker",Dc);X("decorate",b,b.ca,20);X("autoLink",b,b.S,25);C("displayfeatures",fd);C("adfeatures",fd);a=a&&a.q;ka(a)?Z.D.apply(N,a):J(50)}};N.da=function(){for(var a=N.getAll(),b=0;b<a.length;b++)a[b].get(V)};var ze=N.N,Ae=O[gb];Ae&&Ae.r?ze():z(ze);z(function(){Z.D(["provide","render",ua])});})(window); \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/camera/src/js/lib/google-analytics-bundle.js b/chrome/browser/resources/chromeos/camera/src/js/lib/google-analytics-bundle.js deleted file mode 100644 index 7efdaefc..0000000 --- a/chrome/browser/resources/chromeos/camera/src/js/lib/google-analytics-bundle.js +++ /dev/null
@@ -1,107 +0,0 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/* eslint-disable */ -(function() { 'use strict';var h,aa=aa||{},k=this,m=function(a){return void 0!==a},ba=function(){},ca=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&& -"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if("function"==b&&"undefined"==typeof a.call)return"object";return b},n=function(a){return"array"==ca(a)},da=function(a){var b=ca(a);return"array"==b||"object"==b&&"number"==typeof a.length},p=function(a){return"string"==typeof a},ea=function(a){return"number"==typeof a},q=function(a){return"function"==ca(a)},r=function(a){var b=typeof a;return"object"==b&&null!=a||"function"==b},fa= -function(a,b,c){return a.call.apply(a.bind,arguments)},ga=function(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}},t=function(a,b,c){t=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?fa:ga;return t.apply(null,arguments)},ha=function(a,b){var c=Array.prototype.slice.call(arguments, -1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}},u=Date.now||function(){return+new Date},v=function(a,b){var c=a.split("."),d=k;c[0]in d||!d.execScript||d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)!c.length&&m(b)?d[e]=b:d=d[e]?d[e]:d[e]={}},w=function(a,b){function c(){}c.prototype=b.prototype;a.W=b.prototype;a.prototype=new c;a.re=function(a,c,f){for(var g=Array(arguments.length-2),l=2;l<arguments.length;l++)g[l-2]=arguments[l];return b.prototype[c].apply(a, -g)}};var y=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,y);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};w(y,Error);y.prototype.name="CustomError";var ia=String.prototype.trim?function(a){return a.trim()}:function(a){return a.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},ja=String.prototype.repeat?function(a,b){return a.repeat(b)}:function(a,b){return Array(b+1).join(a)},ka=function(a,b){return a<b?-1:a>b?1:0};var la=Array.prototype.indexOf?function(a,b,c){return Array.prototype.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(p(a))return p(b)&&1==b.length?a.indexOf(b,c):-1;for(;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1},ma=Array.prototype.forEach?function(a,b,c){Array.prototype.forEach.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=p(a)?a.split(""):a,f=0;f<d;f++)f in e&&b.call(c,e[f],f,a)},na=Array.prototype.some?function(a,b,c){return Array.prototype.some.call(a, -b,c)}:function(a,b,c){for(var d=a.length,e=p(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&b.call(c,e[f],f,a))return!0;return!1},oa=Array.prototype.every?function(a,b,c){return Array.prototype.every.call(a,b,c)}:function(a,b,c){for(var d=a.length,e=p(a)?a.split(""):a,f=0;f<d;f++)if(f in e&&!b.call(c,e[f],f,a))return!1;return!0},qa=function(a){var b;a:{b=pa;for(var c=a.length,d=p(a)?a.split(""):a,e=0;e<c;e++)if(e in d&&b.call(void 0,d[e],e,a)){b=e;break a}b=-1}return 0>b?null:p(a)?a.charAt(b):a[b]},ra=function(a, -b){var c=la(a,b),d;(d=0<=c)&&Array.prototype.splice.call(a,c,1);return d},sa=function(a){return Array.prototype.concat.apply(Array.prototype,arguments)},ta=function(a,b,c){return 2>=arguments.length?Array.prototype.slice.call(a,b):Array.prototype.slice.call(a,b,c)};var ua="StopIteration"in k?k.StopIteration:{message:"StopIteration",stack:""},va=function(){};va.prototype.next=function(){throw ua;};va.prototype.Yb=function(){return this};var wa=function(a,b,c){for(var d in a)b.call(c,a[d],d,a)},xa=function(a){var b=[],c=0,d;for(d in a)b[c++]=a[d];return b},ya=function(a){var b=[],c=0,d;for(d in a)b[c++]=d;return b},za=function(a){return null!==a&&"withCredentials"in a},Aa=function(a,b){var c;a:{for(c in a)if(b.call(void 0,a[c],c,a))break a;c=void 0}return c&&a[c]},Ba="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),Ca=function(a,b){for(var c,d,e=1;e<arguments.length;e++){d= -arguments[e];for(c in d)a[c]=d[c];for(var f=0;f<Ba.length;f++)c=Ba[f],Object.prototype.hasOwnProperty.call(d,c)&&(a[c]=d[c])}};var z=function(a,b){this.B={};this.b=[];this.Qa=this.g=0;var c=arguments.length;if(1<c){if(c%2)throw Error("Uneven number of arguments");for(var d=0;d<c;d+=2)this.set(arguments[d],arguments[d+1])}else a&&this.addAll(a)};z.prototype.v=function(){Da(this);for(var a=[],b=0;b<this.b.length;b++)a.push(this.B[this.b[b]]);return a};z.prototype.L=function(){Da(this);return this.b.concat()};z.prototype.$=function(a){return A(this.B,a)}; -z.prototype.remove=function(a){return A(this.B,a)?(delete this.B[a],this.g--,this.Qa++,this.b.length>2*this.g&&Da(this),!0):!1};var Da=function(a){if(a.g!=a.b.length){for(var b=0,c=0;b<a.b.length;){var d=a.b[b];A(a.B,d)&&(a.b[c++]=d);b++}a.b.length=c}if(a.g!=a.b.length){for(var e={},c=b=0;b<a.b.length;)d=a.b[b],A(e,d)||(a.b[c++]=d,e[d]=1),b++;a.b.length=c}};h=z.prototype;h.get=function(a,b){return A(this.B,a)?this.B[a]:b}; -h.set=function(a,b){A(this.B,a)||(this.g++,this.b.push(a),this.Qa++);this.B[a]=b};h.addAll=function(a){var b;a instanceof z?(b=a.L(),a=a.v()):(b=ya(a),a=xa(a));for(var c=0;c<b.length;c++)this.set(b[c],a[c])};h.forEach=function(a,b){for(var c=this.L(),d=0;d<c.length;d++){var e=c[d],f=this.get(e);a.call(b,f,e,this)}};h.clone=function(){return new z(this)};h.Ub=function(){Da(this);for(var a={},b=0;b<this.b.length;b++){var c=this.b[b];a[c]=this.B[c]}return a}; -h.Yb=function(a){Da(this);var b=0,c=this.Qa,d=this,e=new va;e.next=function(){if(c!=d.Qa)throw Error("The map has changed since the iterator was created");if(b>=d.b.length)throw ua;var e=d.b[b++];return a?e:d.B[e]};return e};var A=function(a,b){return Object.prototype.hasOwnProperty.call(a,b)};var Ea,Fa,Ga={id:"hitType",name:"t",valueType:"text",maxLength:void 0,defaultValue:void 0},Ha={id:"sessionControl",name:"sc",valueType:"text",maxLength:void 0,defaultValue:void 0},Ia={id:"description",name:"cd",valueType:"text",maxLength:2048,defaultValue:void 0},Ja={id:"eventCategory",name:"ec",valueType:"text",maxLength:150,defaultValue:void 0},Ka={id:"eventAction",name:"ea",valueType:"text",maxLength:500,defaultValue:void 0},La={id:"eventLabel",name:"el",valueType:"text",maxLength:500,defaultValue:void 0}, -Ma={id:"eventValue",name:"ev",valueType:"integer",maxLength:void 0,defaultValue:void 0},Na={Id:Ga,Xb:{id:"anonymizeIp",name:"aip",valueType:"boolean",maxLength:void 0,defaultValue:void 0},Td:{id:"queueTime",name:"qt",valueType:"integer",maxLength:void 0,defaultValue:void 0},pd:{id:"cacheBuster",name:"z",valueType:"text",maxLength:void 0,defaultValue:void 0},Zd:Ha,$d:{id:"sessionGroup",name:"sg",valueType:"text",maxLength:void 0,defaultValue:void 0},pe:{id:"userId",name:"uid",valueType:"text",maxLength:void 0, -defaultValue:void 0},Qd:{id:"nonInteraction",name:"ni",valueType:"boolean",maxLength:void 0,defaultValue:void 0},zd:Ia,ie:{id:"title",name:"dt",valueType:"text",maxLength:1500,defaultValue:void 0},ld:{id:"appId",name:"aid",valueType:"text",maxLength:150,defaultValue:void 0},md:{id:"appInstallerId",name:"aiid",valueType:"text",maxLength:150,defaultValue:void 0},Cd:Ja,Bd:Ka,Dd:La,Ed:Ma,be:{id:"socialNetwork",name:"sn",valueType:"text",maxLength:50,defaultValue:void 0},ae:{id:"socialAction",name:"sa", -valueType:"text",maxLength:50,defaultValue:void 0},ce:{id:"socialTarget",name:"st",valueType:"text",maxLength:2048,defaultValue:void 0},le:{id:"transactionId",name:"ti",valueType:"text",maxLength:500,defaultValue:void 0},ke:{id:"transactionAffiliation",name:"ta",valueType:"text",maxLength:500,defaultValue:void 0},me:{id:"transactionRevenue",name:"tr",valueType:"currency",maxLength:void 0,defaultValue:void 0},ne:{id:"transactionShipping",name:"ts",valueType:"currency",maxLength:void 0,defaultValue:void 0}, -oe:{id:"transactionTax",name:"tt",valueType:"currency",maxLength:void 0,defaultValue:void 0},xd:{id:"currencyCode",name:"cu",valueType:"text",maxLength:10,defaultValue:void 0},Md:{id:"itemPrice",name:"ip",valueType:"currency",maxLength:void 0,defaultValue:void 0},Nd:{id:"itemQuantity",name:"iq",valueType:"integer",maxLength:void 0,defaultValue:void 0},Kd:{id:"itemCode",name:"ic",valueType:"text",maxLength:500,defaultValue:void 0},Ld:{id:"itemName",name:"in",valueType:"text",maxLength:500,defaultValue:void 0}, -Jd:{id:"itemCategory",name:"iv",valueType:"text",maxLength:500,defaultValue:void 0},vd:{id:"campaignSource",name:"cs",valueType:"text",maxLength:100,defaultValue:void 0},td:{id:"campaignMedium",name:"cm",valueType:"text",maxLength:50,defaultValue:void 0},ud:{id:"campaignName",name:"cn",valueType:"text",maxLength:100,defaultValue:void 0},sd:{id:"campaignKeyword",name:"ck",valueType:"text",maxLength:500,defaultValue:void 0},qd:{id:"campaignContent",name:"cc",valueType:"text",maxLength:500,defaultValue:void 0}, -rd:{id:"campaignId",name:"ci",valueType:"text",maxLength:100,defaultValue:void 0},Hd:{id:"gclid",name:"gclid",valueType:"text",maxLength:void 0,defaultValue:void 0},yd:{id:"dclid",name:"dclid",valueType:"text",maxLength:void 0,defaultValue:void 0},Sd:{id:"pageLoadTime",name:"plt",valueType:"integer",maxLength:void 0,defaultValue:void 0},Ad:{id:"dnsTime",name:"dns",valueType:"integer",maxLength:void 0,defaultValue:void 0},de:{id:"tcpConnectTime",name:"tcp",valueType:"integer",maxLength:void 0,defaultValue:void 0}, -Yd:{id:"serverResponseTime",name:"srt",valueType:"integer",maxLength:void 0,defaultValue:void 0},Rd:{id:"pageDownloadTime",name:"pdt",valueType:"integer",maxLength:void 0,defaultValue:void 0},Ud:{id:"redirectResponseTime",name:"rrt",valueType:"integer",maxLength:void 0,defaultValue:void 0},ee:{id:"timingCategory",name:"utc",valueType:"text",maxLength:150,defaultValue:void 0},he:{id:"timingVar",name:"utv",valueType:"text",maxLength:500,defaultValue:void 0},ge:{id:"timingValue",name:"utt",valueType:"integer", -maxLength:void 0,defaultValue:void 0},fe:{id:"timingLabel",name:"utl",valueType:"text",maxLength:500,defaultValue:void 0},Fd:{id:"exDescription",name:"exd",valueType:"text",maxLength:150,defaultValue:void 0},Gd:{id:"exFatal",name:"exf",valueType:"boolean",maxLength:void 0,defaultValue:"1"}},Oa=function(a){if(1>a||200<a)throw Error("Expected dimension index range 1-200, but was : "+a);return{id:"dimension"+a,name:"cd"+a,valueType:"text",maxLength:150,defaultValue:void 0}},Pa=function(a){if(1>a||200< -a)throw Error("Expected metric index range 1-200, but was : "+a);return{id:"metric"+a,name:"cm"+a,valueType:"integer",maxLength:void 0,defaultValue:void 0}};var Qa=function(a){if(1>a)return"0";if(3>a)return"1-2";a=Math.floor(Math.log(a-1)/Math.log(2));return Math.pow(2,a)+1+"-"+Math.pow(2,a+1)},Ra=function(a,b){for(var c=0,d=a.length-1,e=0;c<=d;){var f=Math.floor((c+d)/2),e=a[f];if(b<=e){d=0==f?0:a[f-1];if(b>d)return(d+1).toString()+"-"+e.toString();d=f-1}else if(b>e){if(f>=a.length-1)return(a[a.length-1]+1).toString()+"+";c=f+1}}return"<= 0"};var B=function(){this.mb=[]},Sa=function(){return new B};h=B.prototype;h.when=function(a){this.mb.push(a);return this};h.Wb=function(a){var b=arguments;this.when(function(a){return 0<=la(b,a.Ab())});return this};h.hd=function(a,b){var c=ta(arguments,1);this.when(function(b){b=b.ba().get(a);return 0<=la(c,b)});return this};h.sb=function(a,b){if(r(this.h))throw Error("Filter has already been set.");this.h=r(b)?t(a,b):a;return this}; -h.qa=function(){if(0==this.mb.length)throw Error("Must specify at least one predicate using #when or a helper method.");if(!r(this.h))throw Error("Must specify a delegate filter using #applyFilter.");return t(function(a){oa(this.mb,function(b){return b(a)})&&this.h(a)},this)};var C=function(){this.rb=!1;this.Fb="";this.Rb=!1;this.Ga=null};C.prototype.cc=function(a){this.rb=!0;this.Fb=a||" - ";return this};C.prototype.$c=function(){this.Rb=!0;return this};C.prototype.Kc=function(){return Ta(this,Qa)};C.prototype.Mc=function(a){return Ta(this,ha(Ra,a))}; -var Ta=function(a,b){if(null!=a.Ga)throw Error("LabelerBuilder: Only one labeling strategy may be used.");a.Ga=t(function(a){var d=a.ba().get(Ma),e=a.ba().get(La);ea(d)&&(d=b(d),null!=e&&this.rb&&(d=e+this.Fb+d),a.ba().set(La,d))},a);return a};C.prototype.qa=function(){if(null==this.Ga)throw Error("LabelerBuilder: a labeling strategy must be specified prior to calling build().");return Sa().Wb("event").sb(t(function(a){this.Ga(a);this.Rb&&a.ba().remove(Ma)},this)).qa()};var Ua=function(a,b){var c=Array.prototype.slice.call(arguments),d=c.shift();if("undefined"==typeof d)throw Error("[goog.string.format] Template required");return d.replace(/%([0\-\ \+]*)(\d+)?(\.(\d+))?([%sfdiu])/g,function(a,b,d,l,x,M,V,W){if("%"==M)return"%";var Pb=c.shift();if("undefined"==typeof Pb)throw Error("[goog.string.format] Not enough arguments");arguments[0]=Pb;return D[M].apply(null,arguments)})},D={s:function(a,b,c){return isNaN(c)||""==c||a.length>=Number(c)?a:a=-1<b.indexOf("-", -0)?a+ja(" ",Number(c)-a.length):ja(" ",Number(c)-a.length)+a},f:function(a,b,c,d,e){d=a.toString();isNaN(e)||""==e||(d=parseFloat(a).toFixed(e));var f;f=0>Number(a)?"-":0<=b.indexOf("+")?"+":0<=b.indexOf(" ")?" ":"";0<=Number(a)&&(d=f+d);if(isNaN(c)||d.length>=Number(c))return d;d=isNaN(e)?Math.abs(Number(a)).toString():Math.abs(Number(a)).toFixed(e);a=Number(c)-d.length-f.length;return d=0<=b.indexOf("-",0)?f+d+ja(" ",a):f+ja(0<=b.indexOf("0",0)?"0":" ",a)+d},d:function(a,b,c,d,e,f,g,l){return D.f(parseInt(a, -10),b,c,d,0,f,g,l)}};D.i=D.d;D.u=D.d;var Va=function(a){if(a.v&&"function"==typeof a.v)return a.v();if(p(a))return a.split("");if(da(a)){for(var b=[],c=a.length,d=0;d<c;d++)b.push(a[d]);return b}return xa(a)},Wa=function(a,b){if(a.forEach&&"function"==typeof a.forEach)a.forEach(b,void 0);else if(da(a)||p(a))ma(a,b,void 0);else{var c;if(a.L&&"function"==typeof a.L)c=a.L();else if(a.v&&"function"==typeof a.v)c=void 0;else if(da(a)||p(a)){c=[];for(var d=a.length,e=0;e<d;e++)c.push(e)}else c=ya(a);for(var d=Va(a),e=d.length,f=0;f<e;f++)b.call(void 0, -d[f],c&&c[f],a)}};var E=function(a){this.H=new z;if(0<arguments.length%2)throw Error("Uneven number of arguments to ParameterMap constructor.");for(var b=arguments,c=0;c<b.length;c+=2)this.set(b[c],b[c+1])};E.prototype.set=function(a,b){if(null==b)throw Error("undefined-or-null value for key: "+a.name);this.H.set(a.name,{key:a,value:b})};E.prototype.remove=function(a){this.H.remove(a.name)};E.prototype.get=function(a){a=this.H.get(a.name,null);return null===a?null:a.value};E.prototype.addAll=function(a){this.H.addAll(a.H)}; -var Xa=function(a,b){ma(a.H.v(),function(a){b(a.key,a.value)})};E.prototype.Ub=function(){var a={};Xa(this,function(b,c){a[b.id]=c});return a};E.prototype.clone=function(){var a=new E;a.H=this.H.clone();return a};E.prototype.toString=function(){var a={};Xa(this,function(b,c){a[b.id]=c});return JSON.stringify(a)};var F=function(a){this.h=a};h=F.prototype;h.ec=function(a){var b=new F(t(this.U,this));b.P=Ja;b.X=a;return b};h.action=function(a){var b=new F(t(this.U,this));b.P=Ka;b.X=a;return b};h.label=function(a){var b=new F(t(this.U,this));b.P=La;b.X=a;return b};h.value=function(a){var b=new F(t(this.U,this));b.P=Ma;b.X=a;return b};h.mc=function(a){var b=new F(t(this.U,this));b.P=Oa(a.index);b.X=a.value;return b};h.Cc=function(a){var b=new F(t(this.U,this));b.P=Pa(a.index);b.X=a.value;return b}; -h.send=function(a){var b=new E;this.U(b);return a.send("event",b)};h.U=function(a){null!=this.P&&null!=this.X&&!a.H.$(this.P.name)&&a.set(this.P,this.X);r(this.h)&&this.h(a)};var Ya=new F(ba);var G=function(){this.ia=this.ia;this.Ka=this.Ka};G.prototype.ia=!1;G.prototype.ua=function(){this.ia||(this.ia=!0,this.A())};G.prototype.A=function(){if(this.Ka)for(;this.Ka.length;)this.Ka.shift()()};var H=function(a,b){this.type=a;this.currentTarget=this.target=b;this.defaultPrevented=this.ea=!1;this.Ob=!0};H.prototype.preventDefault=function(){this.defaultPrevented=!0;this.Ob=!1};var Za=function(a){Za[" "](a);return a};Za[" "]=ba;var I;a:{var $a=k.navigator;if($a){var ab=$a.userAgent;if(ab){I=ab;break a}}I=""}var J=function(a){return-1!=I.indexOf(a)};var bb=J("Opera")||J("OPR"),K=J("Trident")||J("MSIE"),cb=J("Edge"),db=J("Gecko")&&!(-1!=I.toLowerCase().indexOf("webkit")&&!J("Edge"))&&!(J("Trident")||J("MSIE"))&&!J("Edge"),eb=-1!=I.toLowerCase().indexOf("webkit")&&!J("Edge"),fb=function(){var a=k.document;return a?a.documentMode:void 0},gb; -a:{var hb="",ib=function(){var a=I;if(db)return/rv\:([^\);]+)(\)|;)/.exec(a);if(cb)return/Edge\/([\d\.]+)/.exec(a);if(K)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(eb)return/WebKit\/(\S+)/.exec(a);if(bb)return/(?:Version)[ \/]?(\S+)/.exec(a)}();ib&&(hb=ib?ib[1]:"");if(K){var jb=fb();if(null!=jb&&jb>parseFloat(hb)){gb=String(jb);break a}}gb=hb} -var kb=gb,lb={},L=function(a){var b;if(!(b=lb[a])){b=0;for(var c=ia(String(kb)).split("."),d=ia(String(a)).split("."),e=Math.max(c.length,d.length),f=0;0==b&&f<e;f++){var g=c[f]||"",l=d[f]||"",x=/(\d*)(\D*)/g,M=/(\d*)(\D*)/g;do{var V=x.exec(g)||["","",""],W=M.exec(l)||["","",""];if(0==V[0].length&&0==W[0].length)break;b=ka(0==V[1].length?0:parseInt(V[1],10),0==W[1].length?0:parseInt(W[1],10))||ka(0==V[2].length,0==W[2].length)||ka(V[2],W[2])}while(0==b)}b=lb[a]=0<=b}return b},mb=k.document,nb=mb&& -K?fb()||("CSS1Compat"==mb.compatMode?parseInt(kb,10):5):void 0;var ob=!K||9<=Number(nb),pb=K&&!L("9"),qb=!eb||L("528"),rb=db&&L("1.9b")||K&&L("8")||bb&&L("9.5")||eb&&L("528"),sb=db&&!L("8")||K&&!L("9");var tb=function(a,b){H.call(this,a?a.type:"");this.relatedTarget=this.currentTarget=this.target=null;this.charCode=this.keyCode=this.button=this.screenY=this.screenX=this.clientY=this.clientX=this.offsetY=this.offsetX=0;this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.yb=this.state=null;if(a){var c=this.type=a.type,d=a.changedTouches?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.currentTarget=b;var e=a.relatedTarget;if(e){if(db){var f;a:{try{Za(e.nodeName);f=!0;break a}catch(g){}f= -!1}f||(e=null)}}else"mouseover"==c?e=a.fromElement:"mouseout"==c&&(e=a.toElement);this.relatedTarget=e;null===d?(this.offsetX=eb||void 0!==a.offsetX?a.offsetX:a.layerX,this.offsetY=eb||void 0!==a.offsetY?a.offsetY:a.layerY,this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0):(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX|| -0,this.screenY=d.screenY||0);this.button=a.button;this.keyCode=a.keyCode||0;this.charCode=a.charCode||("keypress"==c?a.keyCode:0);this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=a.shiftKey;this.metaKey=a.metaKey;this.state=a.state;this.yb=a;a.defaultPrevented&&this.preventDefault()}};w(tb,H); -tb.prototype.preventDefault=function(){tb.W.preventDefault.call(this);var a=this.yb;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,pb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var ub="closure_listenable_"+(1E6*Math.random()|0),vb=function(a){return!(!a||!a[ub])},wb=0;var xb=function(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.sa=!!d;this.Aa=e;this.key=++wb;this.removed=this.ra=!1},yb=function(a){a.removed=!0;a.listener=null;a.proxy=null;a.src=null;a.Aa=null};var N=function(a){this.src=a;this.m={};this.na=0};N.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.m[f];a||(a=this.m[f]=[],this.na++);var g=zb(a,b,d,e);-1<g?(b=a[g],c||(b.ra=!1)):(b=new xb(b,this.src,f,!!d,e),b.ra=c,a.push(b));return b};N.prototype.remove=function(a,b,c,d){a=a.toString();if(!(a in this.m))return!1;var e=this.m[a];b=zb(e,b,c,d);return-1<b?(yb(e[b]),Array.prototype.splice.call(e,b,1),0==e.length&&(delete this.m[a],this.na--),!0):!1}; -var Ab=function(a,b){var c=b.type;c in a.m&&ra(a.m[c],b)&&(yb(b),0==a.m[c].length&&(delete a.m[c],a.na--))};N.prototype.removeAll=function(a){a=a&&a.toString();var b=0,c;for(c in this.m)if(!a||c==a){for(var d=this.m[c],e=0;e<d.length;e++)++b,yb(d[e]);delete this.m[c];this.na--}return b};N.prototype.ja=function(a,b,c,d){a=this.m[a.toString()];var e=-1;a&&(e=zb(a,b,c,d));return-1<e?a[e]:null}; -var zb=function(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e];if(!f.removed&&f.listener==b&&f.sa==!!c&&f.Aa==d)return e}return-1};var Bb="closure_lm_"+(1E6*Math.random()|0),Cb={},Db=0,Eb=function(a,b,c,d,e){if(n(b)){for(var f=0;f<b.length;f++)Eb(a,b[f],c,d,e);return null}c=Fb(c);return vb(a)?a.listen(b,c,d,e):Gb(a,b,c,!1,d,e)},Gb=function(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=!!e,l=Hb(a);l||(a[Bb]=l=new N(a));c=l.add(b,c,d,e,f);if(c.proxy)return c;d=Ib();c.proxy=d;d.src=a;d.listener=c;if(a.addEventListener)a.addEventListener(b.toString(),d,g);else if(a.attachEvent)a.attachEvent(Jb(b.toString()),d);else throw Error("addEventListener and attachEvent are unavailable."); -Db++;return c},Ib=function(){var a=Kb,b=ob?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b},Lb=function(a,b,c,d,e){if(n(b)){for(var f=0;f<b.length;f++)Lb(a,b[f],c,d,e);return null}c=Fb(c);return vb(a)?a.jb(b,c,d,e):Gb(a,b,c,!0,d,e)},Mb=function(a,b,c,d,e){if(n(b))for(var f=0;f<b.length;f++)Mb(a,b[f],c,d,e);else c=Fb(c),vb(a)?a.pb(b,c,d,e):a&&(a=Hb(a))&&(b=a.ja(b,c,!!d,e))&&Nb(b)},Nb=function(a){if(!ea(a)&&a&&!a.removed){var b=a.src; -if(vb(b))Ab(b.J,a);else{var c=a.type,d=a.proxy;b.removeEventListener?b.removeEventListener(c,d,a.sa):b.detachEvent&&b.detachEvent(Jb(c),d);Db--;(c=Hb(b))?(Ab(c,a),0==c.na&&(c.src=null,b[Bb]=null)):yb(a)}}},Jb=function(a){return a in Cb?Cb[a]:Cb[a]="on"+a},Qb=function(a,b,c,d){var e=!0;if(a=Hb(a))if(b=a.m[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.sa==c&&!f.removed&&(f=Ob(f,d),e=e&&!1!==f)}return e},Ob=function(a,b){var c=a.listener,d=a.Aa||a.src;a.ra&&Nb(a);return c.call(d, -b)},Kb=function(a,b){if(a.removed)return!0;if(!ob){var c;if(!(c=b))a:{c=["window","event"];for(var d=k,e;e=c.shift();)if(null!=d[e])d=d[e];else{c=null;break a}c=d}e=c;c=new tb(e,this);d=!0;if(!(0>e.keyCode||void 0!=e.returnValue)){a:{var f=!1;if(0==e.keyCode)try{e.keyCode=-1;break a}catch(x){f=!0}if(f||void 0==e.returnValue)e.returnValue=!0}e=[];for(f=c.currentTarget;f;f=f.parentNode)e.push(f);for(var f=a.type,g=e.length-1;!c.ea&&0<=g;g--){c.currentTarget=e[g];var l=Qb(e[g],f,!0,c),d=d&&l}for(g=0;!c.ea&& -g<e.length;g++)c.currentTarget=e[g],l=Qb(e[g],f,!1,c),d=d&&l}return d}return Ob(a,new tb(b,this))},Hb=function(a){a=a[Bb];return a instanceof N?a:null},Rb="__closure_events_fn_"+(1E9*Math.random()>>>0),Fb=function(a){if(q(a))return a;a[Rb]||(a[Rb]=function(b){return a.handleEvent(b)});return a[Rb]};var O=function(){G.call(this);this.J=new N(this);this.Zb=this;this.lb=null};w(O,G);O.prototype[ub]=!0;h=O.prototype;h.addEventListener=function(a,b,c,d){Eb(this,a,b,c,d)};h.removeEventListener=function(a,b,c,d){Mb(this,a,b,c,d)}; -h.dispatchEvent=function(a){var b,c=this.lb;if(c){b=[];for(var d=1;c;c=c.lb)b.push(c),++d}c=this.Zb;d=a.type||a;if(p(a))a=new H(a,c);else if(a instanceof H)a.target=a.target||c;else{var e=a;a=new H(d,c);Ca(a,e)}var e=!0,f;if(b)for(var g=b.length-1;!a.ea&&0<=g;g--)f=a.currentTarget=b[g],e=Sb(f,d,!0,a)&&e;a.ea||(f=a.currentTarget=c,e=Sb(f,d,!0,a)&&e,a.ea||(e=Sb(f,d,!1,a)&&e));if(b)for(g=0;!a.ea&&g<b.length;g++)f=a.currentTarget=b[g],e=Sb(f,d,!1,a)&&e;return e}; -h.A=function(){O.W.A.call(this);this.J&&this.J.removeAll(void 0);this.lb=null};h.listen=function(a,b,c,d){return this.J.add(String(a),b,!1,c,d)};h.jb=function(a,b,c,d){return this.J.add(String(a),b,!0,c,d)};h.pb=function(a,b,c,d){return this.J.remove(String(a),b,c,d)};var Sb=function(a,b,c,d){b=a.J.m[String(b)];if(!b)return!0;b=b.concat();for(var e=!0,f=0;f<b.length;++f){var g=b[f];if(g&&!g.removed&&g.sa==c){var l=g.listener,x=g.Aa||g.src;g.ra&&Ab(a.J,g);e=!1!==l.call(x,d)&&e}}return e&&0!=d.Ob}; -O.prototype.ja=function(a,b,c,d){return this.J.ja(String(a),b,c,d)};var Tb=function(a,b,c){this.Ac=c;this.kc=a;this.Oc=b;this.Ja=0;this.Ba=null};Tb.prototype.get=function(){var a;0<this.Ja?(this.Ja--,a=this.Ba,this.Ba=a.next,a.next=null):a=this.kc();return a};Tb.prototype.put=function(a){this.Oc(a);this.Ja<this.Ac&&(this.Ja++,a.next=this.Ba,this.Ba=a)};var Ub=function(a){k.setTimeout(function(){throw a;},0)},Vb,Wb=function(){var a=k.MessageChannel;"undefined"===typeof a&&"undefined"!==typeof window&&window.postMessage&&window.addEventListener&&!J("Presto")&&(a=function(){var a=document.createElement("IFRAME");a.style.display="none";a.src="";document.documentElement.appendChild(a);var b=a.contentWindow,a=b.document;a.open();a.write("");a.close();var c="callImmediate"+Math.random(),d="file:"==b.location.protocol?"*":b.location.protocol+"//"+b.location.host, -a=t(function(a){if(("*"==d||a.origin==d)&&a.data==c)this.port1.onmessage()},this);b.addEventListener("message",a,!1);this.port1={};this.port2={postMessage:function(){b.postMessage(c,d)}}});if("undefined"!==typeof a&&!J("Trident")&&!J("MSIE")){var b=new a,c={},d=c;b.port1.onmessage=function(){if(m(c.next)){c=c.next;var a=c.ub;c.ub=null;a()}};return function(a){d.next={ub:a};d=d.next;b.port2.postMessage(0)}}return"undefined"!==typeof document&&"onreadystatechange"in document.createElement("SCRIPT")? -function(a){var b=document.createElement("SCRIPT");b.onreadystatechange=function(){b.onreadystatechange=null;b.parentNode.removeChild(b);b=null;a();a=null};document.documentElement.appendChild(b)}:function(a){k.setTimeout(a,0)}};var Xb=function(){this.Ra=this.ga=null},Zb=new Tb(function(){return new Yb},function(a){a.reset()},100);Xb.prototype.add=function(a,b){var c=Zb.get();c.set(a,b);this.Ra?this.Ra.next=c:this.ga=c;this.Ra=c};Xb.prototype.remove=function(){var a=null;this.ga&&(a=this.ga,this.ga=this.ga.next,this.ga||(this.Ra=null),a.next=null);return a};var Yb=function(){this.next=this.scope=this.bb=null};Yb.prototype.set=function(a,b){this.bb=a;this.scope=b;this.next=null}; -Yb.prototype.reset=function(){this.next=this.scope=this.bb=null};var dc=function(a,b){$b||ac();bc||($b(),bc=!0);cc.add(a,b)},$b,ac=function(){if(k.Promise&&k.Promise.resolve){var a=k.Promise.resolve(void 0);$b=function(){a.then(ec)}}else $b=function(){var a=ec;!q(k.setImmediate)||k.Window&&k.Window.prototype&&!J("Edge")&&k.Window.prototype.setImmediate==k.setImmediate?(Vb||(Vb=Wb()),Vb(a)):k.setImmediate(a)}},bc=!1,cc=new Xb,ec=function(){for(var a=null;a=cc.remove();){try{a.bb.call(a.scope)}catch(b){Ub(b)}Zb.put(a)}bc=!1};var fc=function(a){a.prototype.then=a.prototype.then;a.prototype.$goog_Thenable=!0},gc=function(a){if(!a)return!1;try{return!!a.$goog_Thenable}catch(b){return!1}};var P=function(a,b){this.C=0;this.M=void 0;this.Z=this.O=this.o=null;this.za=this.ab=!1;if(a!=ba)try{var c=this;a.call(b,function(a){hc(c,2,a)},function(a){hc(c,3,a)})}catch(d){hc(this,3,d)}},ic=function(){this.next=this.context=this.ca=this.la=this.T=null;this.pa=!1};ic.prototype.reset=function(){this.context=this.ca=this.la=this.T=null;this.pa=!1};var jc=new Tb(function(){return new ic},function(a){a.reset()},100),kc=function(a,b,c){var d=jc.get();d.la=a;d.ca=b;d.context=c;return d}; -P.prototype.then=function(a,b,c){return lc(this,q(a)?a:null,q(b)?b:null,c)};fc(P);P.prototype.cancel=function(a){0==this.C&&dc(function(){var b=new mc(a);nc(this,b)},this)}; -var nc=function(a,b){if(0==a.C)if(a.o){var c=a.o;if(c.O){for(var d=0,e=null,f=null,g=c.O;g&&(g.pa||(d++,g.T==a&&(e=g),!(e&&1<d)));g=g.next)e||(f=g);e&&(0==c.C&&1==d?nc(c,b):(f?(d=f,d.next==c.Z&&(c.Z=d),d.next=d.next.next):oc(c),pc(c,e,3,b)))}a.o=null}else hc(a,3,b)},rc=function(a,b){a.O||2!=a.C&&3!=a.C||qc(a);a.Z?a.Z.next=b:a.O=b;a.Z=b},lc=function(a,b,c,d){var e=kc(null,null,null);e.T=new P(function(a,g){e.la=b?function(c){try{var e=b.call(d,c);a(e)}catch(M){g(M)}}:a;e.ca=c?function(b){try{var e= -c.call(d,b);!m(e)&&b instanceof mc?g(b):a(e)}catch(M){g(M)}}:g});e.T.o=a;rc(a,e);return e.T};P.prototype.ed=function(a){this.C=0;hc(this,2,a)};P.prototype.fd=function(a){this.C=0;hc(this,3,a)}; -var hc=function(a,b,c){if(0==a.C){a==c&&(b=3,c=new TypeError("Promise cannot resolve to itself"));a.C=1;var d;a:{var e=c,f=a.ed,g=a.fd;if(e instanceof P)rc(e,kc(f||ba,g||null,a)),d=!0;else if(gc(e))e.then(f,g,a),d=!0;else{if(r(e))try{var l=e.then;if(q(l)){sc(e,l,f,g,a);d=!0;break a}}catch(x){g.call(a,x);d=!0;break a}d=!1}}d||(a.M=c,a.C=b,a.o=null,qc(a),3!=b||c instanceof mc||tc(a,c))}},sc=function(a,b,c,d,e){var f=!1,g=function(a){f||(f=!0,c.call(e,a))},l=function(a){f||(f=!0,d.call(e,a))};try{b.call(a, -g,l)}catch(x){l(x)}},qc=function(a){a.ab||(a.ab=!0,dc(a.nc,a))},oc=function(a){var b=null;a.O&&(b=a.O,a.O=b.next,b.next=null);a.O||(a.Z=null);return b};P.prototype.nc=function(){for(var a=null;a=oc(this);)pc(this,a,this.C,this.M);this.ab=!1}; -var pc=function(a,b,c,d){if(3==c&&b.ca&&!b.pa)for(;a&&a.za;a=a.o)a.za=!1;if(b.T)b.T.o=null,uc(b,c,d);else try{b.pa?b.la.call(b.context):uc(b,c,d)}catch(e){vc.call(null,e)}jc.put(b)},uc=function(a,b,c){2==b?a.la.call(a.context,c):a.ca&&a.ca.call(a.context,c)},tc=function(a,b){a.za=!0;dc(function(){a.za&&vc.call(null,b)})},vc=Ub,mc=function(a){y.call(this,a)};w(mc,y);mc.prototype.name="cancel";/* - Portions of this code are from MochiKit, received by - The Closure Authors under the MIT license. All other code is Copyright - 2005-2009 The Closure Authors. All Rights Reserved. -*/ -var Q=function(a,b){this.Ma=[];this.Ib=a;this.xb=b||null;this.ka=this.K=!1;this.M=void 0;this.nb=this.dc=this.Ua=!1;this.Pa=0;this.o=null;this.Wa=0};Q.prototype.cancel=function(a){if(this.K)this.M instanceof Q&&this.M.cancel();else{if(this.o){var b=this.o;delete this.o;a?b.cancel(a):(b.Wa--,0>=b.Wa&&b.cancel())}this.Ib?this.Ib.call(this.xb,this):this.nb=!0;this.K||this.I(new wc)}};Q.prototype.wb=function(a,b){this.Ua=!1;xc(this,a,b)}; -var xc=function(a,b,c){a.K=!0;a.M=c;a.ka=!b;yc(a)},Ac=function(a){if(a.K){if(!a.nb)throw new zc;a.nb=!1}};Q.prototype.G=function(a){Ac(this);xc(this,!0,a)};Q.prototype.I=function(a){Ac(this);xc(this,!1,a)};Q.prototype.w=function(a,b){return Bc(this,a,null,b)};var Bc=function(a,b,c,d){a.Ma.push([b,c,d]);a.K&&yc(a);return a};Q.prototype.then=function(a,b,c){var d,e,f=new P(function(a,b){d=a;e=b});Bc(this,d,function(a){a instanceof wc?f.cancel():e(a)});return f.then(a,b,c)};fc(Q); -var Cc=function(a){var b=new Q;Bc(a,b.G,b.I,b);return b},Dc=function(a){return na(a.Ma,function(a){return q(a[1])})},yc=function(a){if(a.Pa&&a.K&&Dc(a)){var b=a.Pa,c=Ec[b];c&&(k.clearTimeout(c.Ca),delete Ec[b]);a.Pa=0}a.o&&(a.o.Wa--,delete a.o);for(var b=a.M,d=c=!1;a.Ma.length&&!a.Ua;){var e=a.Ma.shift(),f=e[0],g=e[1],e=e[2];if(f=a.ka?g:f)try{var l=f.call(e||a.xb,b);m(l)&&(a.ka=a.ka&&(l==b||l instanceof Error),a.M=b=l);if(gc(b)||"function"===typeof k.Promise&&b instanceof k.Promise)d=!0,a.Ua=!0}catch(x){b= -x,a.ka=!0,Dc(a)||(c=!0)}}a.M=b;d&&(l=t(a.wb,a,!0),d=t(a.wb,a,!1),b instanceof Q?(Bc(b,l,d),b.dc=!0):b.then(l,d));c&&(b=new Fc(b),Ec[b.Ca]=b,a.Pa=b.Ca)},Gc=function(a){var b=new Q;b.G(a);return b},Ic=function(){var a=Hc,b=new Q;b.I(a);return b},zc=function(){y.call(this)};w(zc,y);zc.prototype.message="Deferred has already fired";zc.prototype.name="AlreadyCalledError";var wc=function(){y.call(this)};w(wc,y);wc.prototype.message="Deferred was canceled";wc.prototype.name="CanceledError"; -var Fc=function(a){this.Ca=k.setTimeout(t(this.ad,this),0);this.va=a};Fc.prototype.ad=function(){delete Ec[this.Ca];throw this.va;};var Ec={};var Jc=function(a){this.ya=[];this.h=a};Jc.prototype.Y=function(a){if(!q(a))throw Error("Invalid filter. Must be a function.");this.ya.push(a)};Jc.prototype.send=function(a,b){if(0==this.ya.length)return this.h.send(a,b);var c=new R(a,b);return Kc(this,0,c).w(function(){if(!c.Ya)return this.h.send(a,b)},this)};var Kc=function(a,b,c){return Gc().w(function(){return this.ya[b](c)},a).w(function(){if(++b<this.ya.length&&!c.Ya)return Kc(this,b,c)},a)},R=function(a,b){this.dd=a;this.Jc=b;this.Ya=!1}; -R.prototype.Ab=function(){return this.dd};R.prototype.ba=function(){return this.Jc};R.prototype.cancel=function(){this.Ya=!0};var Lc=function(a,b){this.width=a;this.height=b};Lc.prototype.clone=function(){return new Lc(this.width,this.height)};Lc.prototype.floor=function(){this.width=Math.floor(this.width);this.height=Math.floor(this.height);return this};!db&&!K||K&&9<=Number(nb)||db&&L("1.9.1");K&&L("9");var Mc={id:"anonymizeIp",name:"aip",valueType:"boolean",maxLength:void 0,defaultValue:void 0},Nc={id:"apiVersion",name:"v",valueType:"text",maxLength:void 0,defaultValue:void 0},Oc={id:"appName",name:"an",valueType:"text",maxLength:100,defaultValue:void 0},Pc={id:"appVersion",name:"av",valueType:"text",maxLength:100,defaultValue:void 0},Qc={id:"clientId",name:"cid",valueType:"text",maxLength:void 0,defaultValue:void 0},Rc={id:"language",name:"ul",valueType:"text",maxLength:20,defaultValue:void 0}, -Sc={id:"libVersion",name:"_v",valueType:"text",maxLength:void 0,defaultValue:void 0},Tc={id:"sampleRateOverride",name:"usro",valueType:"integer",maxLength:void 0,defaultValue:void 0},Uc={id:"screenColors",name:"sd",valueType:"text",maxLength:20,defaultValue:void 0},Vc={id:"screenResolution",name:"sr",valueType:"text",maxLength:20,defaultValue:void 0},Wc={id:"trackingId",name:"tid",valueType:"text",maxLength:void 0,defaultValue:void 0},Xc={id:"viewportSize",name:"vp",valueType:"text",maxLength:20, -defaultValue:void 0},Yc={Xb:Mc,kd:Nc,nd:Oc,od:Pc,wd:Qc,Od:Rc,Pd:Sc,Vd:Tc,Wd:Uc,Xd:Vc,je:Wc,qe:Xc},$c=function(a){if(!p(a))return a;var b=Zc(a,Na);if(r(b))return b;b=Zc(a,Yc);if(r(b))return b;b=/^dimension(\d+)$/.exec(a);if(null!==b)return Oa(parseInt(b[1],10));b=/^metric(\d+)$/.exec(a);if(null!==b)return Pa(parseInt(b[1],10));throw Error(a+" is not a valid parameter name.");},Zc=function(a,b){var c=Aa(b,function(b){return b.id==a&&"metric"!=a&&"dimension"!=a});return r(c)?c:null};var S=function(a,b){this.hc=b;this.D=b.cb();this.Mb=new E;this.$b=this.ob=!1};h=S.prototype;h.set=function(a,b){if(null==b)throw Error("Value must be defined and not null. Parameter="+a.id);var c=$c(a);this.Mb.set(c,b)};h.Y=function(a){this.hc.Y(a)};h.send=function(a,b){if(a instanceof F)return a.send(this);var c=this.Mb.clone();b instanceof E?c.addAll(b):r(b)&&wa(b,function(a,b){null!=a&&c.set($c(b),a)},this);this.ob&&(this.ob=!1,c.set(Ha,"start"));this.$b&&c.set(Mc,!0);return this.D.send(a,c)}; -h.Pc=function(a){var b={description:a};this.set(Ia,a);return this.send("appview",b)};h.Qc=function(a,b,c,d){return this.send("event",{eventCategory:a,eventAction:b,eventLabel:c,eventValue:d})};h.Sc=function(a,b,c){return this.send("social",{socialNetwork:a,socialAction:b,socialTarget:c})};h.Rc=function(a,b){return this.send("exception",{exDescription:a,exFatal:b})};h.Pb=function(a,b,c,d,e){return this.send("timing",{timingCategory:a,timingVar:b,timingLabel:d,timingValue:c,sampleRateOverride:e})}; -h.qc=function(){this.ob=!0};h.Zc=function(a,b,c,d){return new ad(this,a,b,c,d)};var ad=function(a,b,c,d,e){this.Vb=a;this.fc=b;this.gd=c;this.yc=d;this.La=e;this.Yc=u()};ad.prototype.send=function(){var a=this.Vb.Pb(this.fc,this.gd,u()-this.Yc,this.yc,this.La);this.Vb=null;return a};var bd=function(a,b,c,d,e){this.zc=a;this.ac=b;this.bc=c;this.j=d;this.gc=e}; -bd.prototype.tc=function(a){var b=new S(0,this.gc.create());b.set(Sc,this.zc);b.set(Nc,1);b.set(Oc,this.ac);b.set(Pc,this.bc);b.set(Wc,a);(a=navigator.language||navigator.browserLanguage)&&b.set(Rc,a);(a=screen.colorDepth+"-bit")&&b.set(Uc,a);(a=[screen.width,screen.height].join("x"))&&b.set(Vc,a);a=window.document;a="CSS1Compat"==a.compatMode?a.documentElement:a.body;a=new Lc(a.clientWidth,a.clientHeight);(a=[a.width,a.height].join("x"))&&b.set(Xc,a);return b};bd.prototype.rc=function(){return Cc(this.j.ma)};var cd=function(a,b,c,d,e,f){Q.call(this,e,f);this.ib=a;this.Za=[];this.zb=!!b;this.pc=!!c;this.jc=!!d;for(b=this.Hb=0;b<a.length;b++)Bc(a[b],t(this.Bb,this,b,!0),t(this.Bb,this,b,!1));0!=a.length||this.zb||this.G(this.Za)};w(cd,Q);cd.prototype.Bb=function(a,b,c){this.Hb++;this.Za[a]=[b,c];this.K||(this.zb&&b?this.G([a,c]):this.pc&&!b?this.I(c):this.Hb==this.ib.length&&this.G(this.Za));this.jc&&!b&&(c=null);return c};cd.prototype.I=function(a){cd.W.I.call(this,a);for(a=0;a<this.ib.length;a++)this.ib[a].cancel()}; -var dd=function(a){return(new cd(a,!1,!0)).w(function(a){for(var c=[],d=0;d<a.length;d++)c[d]=a[d][1];return c})};var ed=function(){for(var a="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split(""),b=0,c=a.length;b<c;b++)switch(a[b]){case "x":a[b]=Math.floor(16*Math.random()).toString(16);break;case "y":a[b]=(Math.floor(4*Math.random())+8).toString(16)}return a.join("")};var T=function(a){this.R=a;this.La=100;this.vb=[];this.da=this.oa=null;this.ma=fd(this);this.ma.w(function(){this.Qb=Eb(this.R,"a",t(this.uc,this))},this)},fd=function(a){return gd(a).w(function(){return this},a)},gd=function(a){return dd([hd(a),id(a)])};T.prototype.uc=function(){U(this);var a=jd(this),b=this.Fa();gd(this).w(function(){a!=jd(this)&&kd(this,"analytics.user-id");b!=this.Fa()&&kd(this,"analytics.tracking-permitted")},this)};var ld=function(a,b){U(a);a.vb.push(b)}; -T.prototype.Wc=function(a){U(this);var b=this.da!=a;this.da=a;this.R.set("analytics.tracking-permitted",a.toString());b&&kd(this,"analytics.tracking-permitted")};T.prototype.Fa=function(){U(this);var a;if(a=this.da)a=k._gaUserPrefs,a=!(a&&a.ioo&&a.ioo());return a}; -var hd=function(a){return a.R.get("analytics.tracking-permitted").w(function(a){this.da=!0;if(m(a))switch(a){case "true":this.da=!0;break;case "false":this.da=!1}},a)},jd=function(a){U(a);if(!p(a.oa))throw Error("Invalid state. UserID is not a string.");return a.oa},id=function(a){return a.R.get("analytics.user-id").w(function(a){m(a)?this.oa=a:md(this)},a)},md=function(a){a.oa=ed();return a.R.set("analytics.user-id",a.oa).w(function(){kd(this,"analytics.user-id")},a)}; -T.prototype.Vc=function(a){U(this);this.La=a};var nd=function(a){U(a);return a.La};T.prototype.Nc=function(){return md(this)};var kd=function(a,b){ma(a.vb,function(a){a(b)})};T.prototype.ua=function(){null!=this.Qb&&Nb(this.Qb)};var U=function(a){if(!Cc(a.ma).K)throw Error("Settings object accessed prior to entering ready state.");};var od=function(){O.call(this);this.kb="google-analytics";this.R=chrome.storage.local;chrome.storage.onChanged.addListener(t(this.Hc,this))};w(od,O);od.prototype.Hc=function(a,b){"local"==b&&pd(this,a)&&this.dispatchEvent("a")};var pd=function(a,b){return na(ya(b),function(a){return 0==a.lastIndexOf(this.kb,0)},a)};od.prototype.get=function(a){var b=new Q,c=this.kb+"."+a;this.R.get(c,function(a){chrome.runtime.lastError?b.I(chrome.runtime.lastError):(a=a[c],b.G(null!=a?a.toString():void 0))});return b}; -od.prototype.set=function(a,b){var c=new Q,d={};d[this.kb+"."+a]=b;this.R.set(d,function(){chrome.runtime.lastError?c.I(chrome.runtime.lastError):c.G()});return c};var X=function(){};X.sc=function(){return X.Eb?X.Eb:X.Eb=new X};X.prototype.send=function(){return Gc()};var qd=function(a){this.lc=a};qd.prototype.send=function(a,b){this.lc.push({wc:a,Ic:b});return Gc()};var rd=function(a,b,c){this.j=a;this.aa=[];this.S={enabled:new qd(this.aa),disabled:c};this.D=this.S.enabled;Bc(Cc(this.j.ma),ha(this.Gc,b),this.Fc,this)};rd.prototype.Gc=function(a){if(null===this.aa)throw Error("Channel setup already completed.");this.S.enabled=a();sd(this);ma(this.aa,function(a){this.send(a.wc,a.Ic)},this);this.aa=null;ld(this.j,t(this.Ec,this))}; -rd.prototype.Fc=function(){if(null===this.aa)throw Error("Channel setup already completed.");this.D=this.S.enabled=this.S.disabled;this.aa=null};rd.prototype.send=function(a,b){return this.D.send(a,b)};var sd=function(a){a.D=a.j.Fa()?a.S.enabled:a.S.disabled};rd.prototype.Ec=function(a){switch(a){case "analytics.tracking-permitted":sd(this)}};var td=function(a,b){this.Xa=[];var c=t(function(){this.xa=new Jc(b.cb());ma(this.Xa,function(a){this.xa.Y(a)},this);this.Xa=null;return this.xa},this);this.D=new rd(a,c,X.sc())};td.prototype.cb=function(){return this.D};td.prototype.Y=function(a){this.xa?this.xa.Y(a):this.Xa.push(a)};var ud=function(a,b){this.j=a;this.Xc=b};ud.prototype.create=function(){return new td(this.j,this.Xc)};var vd=function(a,b){O.call(this);this.Ea=a||1;this.fa=b||k;this.Va=t(this.bd,this);this.hb=u()};w(vd,O);h=vd.prototype;h.enabled=!1;h.l=null;h.bd=function(){if(this.enabled){var a=u()-this.hb;0<a&&a<.8*this.Ea?this.l=this.fa.setTimeout(this.Va,this.Ea-a):(this.l&&(this.fa.clearTimeout(this.l),this.l=null),this.dispatchEvent("tick"),this.enabled&&(this.l=this.fa.setTimeout(this.Va,this.Ea),this.hb=u()))}}; -h.start=function(){this.enabled=!0;this.l||(this.l=this.fa.setTimeout(this.Va,this.Ea),this.hb=u())};h.stop=function(){this.enabled=!1;this.l&&(this.fa.clearTimeout(this.l),this.l=null)};h.A=function(){vd.W.A.call(this);this.stop();delete this.fa};var wd=function(a,b,c){if(q(a))c&&(a=t(a,c));else if(a&&"function"==typeof a.handleEvent)a=t(a.handleEvent,a);else throw Error("Invalid listener argument");return 2147483647<Number(b)?-1:k.setTimeout(a,b||0)};var Y=function(a){G.call(this);this.eb=a;this.b={}};w(Y,G);var xd=[];Y.prototype.listen=function(a,b,c,d){n(b)||(b&&(xd[0]=b.toString()),b=xd);for(var e=0;e<b.length;e++){var f=Eb(a,b[e],c||this.handleEvent,d||!1,this.eb||this);if(!f)break;this.b[f.key]=f}return this};Y.prototype.jb=function(a,b,c,d){return yd(this,a,b,c,d)};var yd=function(a,b,c,d,e,f){if(n(c))for(var g=0;g<c.length;g++)yd(a,b,c[g],d,e,f);else{b=Lb(b,c,d||a.handleEvent,e,f||a.eb||a);if(!b)return a;a.b[b.key]=b}return a}; -Y.prototype.pb=function(a,b,c,d,e){if(n(b))for(var f=0;f<b.length;f++)this.pb(a,b[f],c,d,e);else c=c||this.handleEvent,e=e||this.eb||this,c=Fb(c),d=!!d,b=vb(a)?a.ja(b,c,d,e):a?(a=Hb(a))?a.ja(b,c,d,e):null:null,b&&(Nb(b),delete this.b[b.key]);return this};Y.prototype.removeAll=function(){wa(this.b,function(a,b){this.b.hasOwnProperty(b)&&Nb(a)},this);this.b={}};Y.prototype.A=function(){Y.W.A.call(this);this.removeAll()}; -Y.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};var zd=function(){O.call(this);this.wa=new Y(this);qb&&(rb?this.wa.listen(sb?document.body:window,["online","offline"],this.Cb):(this.Lb=qb?navigator.onLine:!0,this.l=new vd(250),this.wa.listen(this.l,"tick",this.vc),this.l.start()))};w(zd,O);zd.prototype.vc=function(){var a=qb?navigator.onLine:!0;a!=this.Lb&&(this.Lb=a,this.Cb())};zd.prototype.Cb=function(){this.dispatchEvent((qb?navigator.onLine:1)?"online":"offline")}; -zd.prototype.A=function(){zd.W.A.call(this);this.wa.ua();this.wa=null;this.l&&(this.l.ua(),this.l=null)};var Ad=function(a,b){this.j=a;this.h=b};Ad.prototype.send=function(a,b){b.set(Qc,jd(this.j));return this.h.send(a,b)};var Bd=function(a){this.h=a};Bd.prototype.send=function(a,b){Cd(b);Dd(b);return this.h.send(a,b)};var Cd=function(a){Xa(a,function(b,c){m(b.maxLength)&&"text"==b.valueType&&0<b.maxLength&&c.length>b.maxLength&&a.set(b,c.substring(0,b.maxLength))})},Dd=function(a){Xa(a,function(b,c){m(b.defaultValue)&&c==b.defaultValue&&a.remove(b)})};var Hc={status:"device-offline",ta:void 0},Ed={status:"rate-limited",ta:void 0},Fd={status:"sampled-out",ta:void 0},Gd={status:"sent",ta:void 0};var Hd=function(a,b){this.cd=a;this.h=b};Hd.prototype.send=function(a,b){var c;c=this.cd;var d=c.Sb(),e=Math.floor((d-c.Gb)*c.oc);0<e&&(c.ha=Math.min(c.ha+e,c.Bc),c.Gb=d);1>c.ha?c=!1:(--c.ha,c=!0);return c||"item"==a||"transaction"==a?this.h.send(a,b):Gc(Ed)};var Id=function(){this.ha=60;this.Bc=500;this.oc=5E-4;this.Sb=function(){return(new Date).getTime()};this.Gb=this.Sb()};var Jd=function(a,b){this.j=a;this.h=b};Jd.prototype.send=function(a,b){var c=b.get(Qc),c=parseInt(c.split("-")[1],16),d;"timing"!=a?d=nd(this.j):((d=b.get(Tc))&&b.remove(Tc),d=d||nd(this.j));return c<655.36*d?this.h.send(a,b):Gc(Fd)};var Kd=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#(.*))?$/,Ld=function(a,b){if(a)for(var c=a.split("&"),d=0;d<c.length;d++){var e=c[d].indexOf("="),f=null,g=null;0<=e?(f=c[d].substring(0,e),g=c[d].substring(e+1)):f=c[d];b(f,g?decodeURIComponent(g.replace(/\+/g," ")):"")}};var Md=function(){};Md.prototype.tb=null;var Od=function(a){var b;(b=a.tb)||(b={},Nd(a)&&(b[0]=!0,b[1]=!0),b=a.tb=b);return b};var Pd,Qd=function(){};w(Qd,Md);var Rd=function(a){return(a=Nd(a))?new ActiveXObject(a):new XMLHttpRequest},Nd=function(a){if(!a.Db&&"undefined"==typeof XMLHttpRequest&&"undefined"!=typeof ActiveXObject){for(var b=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],c=0;c<b.length;c++){var d=b[c];try{return new ActiveXObject(d),a.Db=d}catch(e){}}throw Error("Could not create ActiveXObject. ActiveX might be disabled, or MSXML might not be installed");}return a.Db};Pd=new Qd;var Z=function(a){O.call(this);this.headers=new z;this.Ta=a||null;this.N=!1;this.Sa=this.a=null;this.Ha=this.gb="";this.V=this.fb=this.Da=this.$a=!1;this.Oa=0;this.Na=null;this.Nb="";this.qb=this.Lc=this.jd=!1};w(Z,O);var Sd=/^https?$/i,Td=["POST","PUT"],Ud=[],Vd=function(a,b,c){var d=new Z;Ud.push(d);b&&d.listen("complete",b);d.jb("ready",d.ic);d.send(a,"POST",c,void 0)};Z.prototype.ic=function(){this.ua();ra(Ud,this)}; -Z.prototype.send=function(a,b,c,d){if(this.a)throw Error("[goog.net.XhrIo] Object is active with another request="+this.gb+"; newUri="+a);b=b?b.toUpperCase():"GET";this.gb=a;this.Ha="";this.$a=!1;this.N=!0;this.a=this.Ta?Rd(this.Ta):Rd(Pd);this.Sa=this.Ta?Od(this.Ta):Od(Pd);this.a.onreadystatechange=t(this.Kb,this);this.Lc&&"onprogress"in this.a&&(this.a.onprogress=t(function(a){this.Jb(a,!0)},this),this.a.upload&&(this.a.upload.onprogress=t(this.Jb,this)));try{this.fb=!0,this.a.open(b,String(a), -!0),this.fb=!1}catch(f){this.va(5,f);return}a=c||"";var e=this.headers.clone();d&&Wa(d,function(a,b){e.set(b,a)});d=qa(e.L());c=k.FormData&&a instanceof k.FormData;!(0<=la(Td,b))||d||c||e.set("Content-Type","application/x-www-form-urlencoded;charset=utf-8");e.forEach(function(a,b){this.a.setRequestHeader(b,a)},this);this.Nb&&(this.a.responseType=this.Nb);za(this.a)&&(this.a.withCredentials=this.jd);try{Wd(this),0<this.Oa&&((this.qb=Xd(this.a))?(this.a.timeout=this.Oa,this.a.ontimeout=t(this.Tb,this)): -this.Na=wd(this.Tb,this.Oa,this)),this.Da=!0,this.a.send(a),this.Da=!1}catch(f){this.va(5,f)}};var Xd=function(a){return K&&L(9)&&ea(a.timeout)&&m(a.ontimeout)},pa=function(a){return"content-type"==a.toLowerCase()};Z.prototype.Tb=function(){"undefined"!=typeof aa&&this.a&&(this.Ha="Timed out after "+this.Oa+"ms, aborting",this.dispatchEvent("timeout"),this.abort(8))};Z.prototype.va=function(a,b){this.N=!1;this.a&&(this.V=!0,this.a.abort(),this.V=!1);this.Ha=b;Yd(this);Zd(this)}; -var Yd=function(a){a.$a||(a.$a=!0,a.dispatchEvent("complete"),a.dispatchEvent("error"))};Z.prototype.abort=function(){this.a&&this.N&&(this.N=!1,this.V=!0,this.a.abort(),this.V=!1,this.dispatchEvent("complete"),this.dispatchEvent("abort"),Zd(this))};Z.prototype.A=function(){this.a&&(this.N&&(this.N=!1,this.V=!0,this.a.abort(),this.V=!1),Zd(this,!0));Z.W.A.call(this)};Z.prototype.Kb=function(){this.ia||(this.fb||this.Da||this.V?$d(this):this.Dc())};Z.prototype.Dc=function(){$d(this)}; -var $d=function(a){if(a.N&&"undefined"!=typeof aa&&(!a.Sa[1]||4!=ae(a)||2!=be(a)))if(a.Da&&4==ae(a))wd(a.Kb,0,a);else if(a.dispatchEvent("readystatechange"),4==ae(a)){a.N=!1;try{var b=be(a),c;a:switch(b){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:c=!0;break a;default:c=!1}var d;if(!(d=c)){var e;if(e=0===b){var f=String(a.gb).match(Kd)[1]||null;if(!f&&k.self&&k.self.location)var g=k.self.location.protocol,f=g.substr(0,g.length-1);e=!Sd.test(f?f.toLowerCase():"")}d=e}if(d)a.dispatchEvent("complete"), -a.dispatchEvent("success");else{var l;try{l=2<ae(a)?a.a.statusText:""}catch(x){l=""}a.Ha=l+" ["+be(a)+"]";Yd(a)}}finally{Zd(a)}}};Z.prototype.Jb=function(a,b){this.dispatchEvent(ce(a,"progress"));this.dispatchEvent(ce(a,b?"downloadprogress":"uploadprogress"))}; -var ce=function(a,b){return{type:b,lengthComputable:a.lengthComputable,loaded:a.loaded,total:a.total}},Zd=function(a,b){if(a.a){Wd(a);var c=a.a,d=a.Sa[0]?ba:null;a.a=null;a.Sa=null;b||a.dispatchEvent("ready");try{c.onreadystatechange=d}catch(e){}}},Wd=function(a){a.a&&a.qb&&(a.a.ontimeout=null);ea(a.Na)&&(k.clearTimeout(a.Na),a.Na=null)},ae=function(a){return a.a?a.a.readyState:0},be=function(a){try{return 2<ae(a)?a.a.status:-1}catch(b){return-1}};var de=function(a,b,c){this.g=this.c=null;this.F=a||null;this.xc=!!c},ee=function(a){a.c||(a.c=new z,a.g=0,a.F&&Ld(a.F,function(b,c){a.add(decodeURIComponent(b.replace(/\+/g," ")),c)}))};h=de.prototype;h.add=function(a,b){ee(this);this.F=null;a=fe(this,a);var c=this.c.get(a);c||this.c.set(a,c=[]);c.push(b);this.g+=1;return this};h.remove=function(a){ee(this);a=fe(this,a);return this.c.$(a)?(this.F=null,this.g-=this.c.get(a).length,this.c.remove(a)):!1};h.$=function(a){ee(this);a=fe(this,a);return this.c.$(a)}; -h.L=function(){ee(this);for(var a=this.c.v(),b=this.c.L(),c=[],d=0;d<b.length;d++)for(var e=a[d],f=0;f<e.length;f++)c.push(b[d]);return c};h.v=function(a){ee(this);var b=[];if(p(a))this.$(a)&&(b=sa(b,this.c.get(fe(this,a))));else{a=this.c.v();for(var c=0;c<a.length;c++)b=sa(b,a[c])}return b};h.set=function(a,b){ee(this);this.F=null;a=fe(this,a);this.$(a)&&(this.g-=this.c.get(a).length);this.c.set(a,[b]);this.g+=1;return this}; -h.get=function(a,b){var c=a?this.v(a):[];return 0<c.length?String(c[0]):b};h.toString=function(){if(this.F)return this.F;if(!this.c)return"";for(var a=[],b=this.c.L(),c=0;c<b.length;c++)for(var d=b[c],e=encodeURIComponent(String(d)),d=this.v(d),f=0;f<d.length;f++){var g=e;""!==d[f]&&(g+="="+encodeURIComponent(String(d[f])));a.push(g)}return this.F=a.join("&")};h.clone=function(){var a=new de;a.F=this.F;this.c&&(a.c=this.c.clone(),a.g=this.g);return a}; -var fe=function(a,b){var c=String(b);a.xc&&(c=c.toLowerCase());return c};var ge=function(a,b){this.Uc=a;this.Ia=b};ge.prototype.send=function(a,b){if(qb&&!navigator.onLine)return Ic();var c=new Q,d=he(a,b);d.length>this.Ia?c.I({status:"payload-too-big",ta:Ua("Encoded hit length == %s, but should be <= %s.",d.length,this.Ia)}):Vd(this.Uc,function(){c.G(Gd)},d);return c};var he=function(a,b){var c=new de;c.add(Ga.name,a);Xa(b,function(a,b){c.add(a.name,b.toString())});return c.toString()};var ie=function(a,b,c){this.j=a;this.Tc=b;this.Ia=c};ie.prototype.cb=function(){if(!this.D){if(!Cc(this.j.ma).K)throw Error("Cannot construct shared channel prior to settings being ready.");new zd;var a=new Bd(new ge(this.Tc,this.Ia)),b=new Id;this.D=new Ad(this.j,new Jd(this.j,new Hd(b,a)))}return this.D};var je=new z,ke=function(){Ea||(Ea=new T(new od));return Ea};v("goog.async.Deferred",Q);v("goog.async.Deferred.prototype.addCallback",Q.prototype.w);v("goog.async.Deferred.prototype.callback",Q.prototype.G);v("goog.async.Deferred.prototype.then",Q.prototype.then);v("goog.events.EventTarget",O);v("goog.events.EventTarget.prototype.listen",O.prototype.listen); -v("analytics.getService",function(a,b){var c=je.get(a,null),d=b||chrome.runtime.getManifest().version;if(null===c){c=ke();if(!Fa){var e=ke();Fa=new ud(e,new ie(e,"https://www.google-analytics.com/collect",8192))}c=new bd("ca1.6.0",a,d,c,Fa);je.set(a,c)}return c});v("analytics.internal.GoogleAnalyticsService",bd);v("analytics.internal.GoogleAnalyticsService.prototype.getTracker",bd.prototype.tc);v("analytics.internal.GoogleAnalyticsService.prototype.getConfig",bd.prototype.rc); -v("analytics.internal.ServiceSettings",T);v("analytics.internal.ServiceSettings.prototype.setTrackingPermitted",T.prototype.Wc);v("analytics.internal.ServiceSettings.prototype.isTrackingPermitted",T.prototype.Fa);v("analytics.internal.ServiceSettings.prototype.setSampleRate",T.prototype.Vc);v("analytics.internal.ServiceSettings.prototype.resetUserId",T.prototype.Nc);v("analytics.internal.ServiceTracker",S);v("analytics.internal.ServiceTracker.prototype.send",S.prototype.send); -v("analytics.internal.ServiceTracker.prototype.sendAppView",S.prototype.Pc);v("analytics.internal.ServiceTracker.prototype.sendEvent",S.prototype.Qc);v("analytics.internal.ServiceTracker.prototype.sendSocial",S.prototype.Sc);v("analytics.internal.ServiceTracker.prototype.sendException",S.prototype.Rc);v("analytics.internal.ServiceTracker.prototype.sendTiming",S.prototype.Pb);v("analytics.internal.ServiceTracker.prototype.startTiming",S.prototype.Zc);v("analytics.internal.ServiceTracker.Timing",ad); -v("analytics.internal.ServiceTracker.Timing.prototype.send",ad.prototype.send);v("analytics.internal.ServiceTracker.prototype.forceSessionStart",S.prototype.qc);v("analytics.internal.ServiceTracker.prototype.addFilter",S.prototype.Y);v("analytics.internal.FilterChannel.Hit",R);v("analytics.internal.FilterChannel.Hit.prototype.getHitType",R.prototype.Ab);v("analytics.internal.FilterChannel.Hit.prototype.getParameters",R.prototype.ba);v("analytics.internal.FilterChannel.Hit.prototype.cancel",R.prototype.cancel); -v("analytics.ParameterMap",E);v("analytics.ParameterMap.Entry",E.Entry);v("analytics.ParameterMap.prototype.set",E.prototype.set);v("analytics.ParameterMap.prototype.get",E.prototype.get);v("analytics.ParameterMap.prototype.remove",E.prototype.remove);v("analytics.ParameterMap.prototype.toObject",E.prototype.Ub);v("analytics.HitTypes.APPVIEW","appview");v("analytics.HitTypes.EVENT","event");v("analytics.HitTypes.SOCIAL","social");v("analytics.HitTypes.TRANSACTION","transaction"); -v("analytics.HitTypes.ITEM","item");v("analytics.HitTypes.TIMING","timing");v("analytics.HitTypes.EXCEPTION","exception");v("analytics.createDimensionParam",Oa);v("analytics.createMetricParam",Pa);wa(Na,function(a){var b=a.id.replace(/[A-Z]/,"_$&").toUpperCase();v("analytics.Parameters."+b,a)});v("analytics.filters.EventLabelerBuilder",C);v("analytics.filters.EventLabelerBuilder.prototype.appendToExistingLabel",C.prototype.cc);v("analytics.filters.EventLabelerBuilder.prototype.stripValue",C.prototype.$c); -v("analytics.filters.EventLabelerBuilder.prototype.powersOfTwo",C.prototype.Kc);v("analytics.filters.EventLabelerBuilder.prototype.rangeBounds",C.prototype.Mc);v("analytics.filters.EventLabelerBuilder.prototype.build",C.prototype.qa);v("analytics.filters.FilterBuilder",B);v("analytics.filters.FilterBuilder.builder",Sa);v("analytics.filters.FilterBuilder.prototype.when",B.prototype.when);v("analytics.filters.FilterBuilder.prototype.whenHitType",B.prototype.Wb); -v("analytics.filters.FilterBuilder.prototype.whenValue",B.prototype.hd);v("analytics.filters.FilterBuilder.prototype.applyFilter",B.prototype.sb);v("analytics.filters.FilterBuilder.prototype.build",B.prototype.qa);v("analytics.EventBuilder",F);v("analytics.EventBuilder.builder",function(){return Ya});v("analytics.EventBuilder.prototype.category",F.prototype.ec);v("analytics.EventBuilder.prototype.action",F.prototype.action);v("analytics.EventBuilder.prototype.label",F.prototype.label); -v("analytics.EventBuilder.prototype.value",F.prototype.value);v("analytics.EventBuilder.prototype.dimension",F.prototype.mc);v("analytics.EventBuilder.prototype.metric",F.prototype.Cc);v("analytics.EventBuilder.prototype.send",F.prototype.send); }).call(this);
diff --git a/chrome/browser/resources/chromeos/camera/src/js/metrics.js b/chrome/browser/resources/chromeos/camera/src/js/metrics.js index 5aeed786..d77be99 100644 --- a/chrome/browser/resources/chromeos/camera/src/js/metrics.js +++ b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
@@ -3,6 +3,7 @@ // found in the LICENSE file. import {browserProxy} from './browser_proxy/browser_proxy.js'; +import {assert} from './chrome_util.js'; // eslint-disable-next-line no-unused-vars import {Intent} from './intent.js'; // eslint-disable-next-line no-unused-vars @@ -16,74 +17,105 @@ } from './type.js'; /** - * Event builder for basic metrics. - * @type {?analytics.EventBuilder} + * @type {?Map<number, Object>} */ -let base = null; - -/* global analytics */ +let baseDimen = null; /** - * Fixes analytics.EventBuilder's dimension() method. - * @param {number} i - * @param {string} v - * @return {!analytics.EventBuilder} + * @type {?Promise} */ -analytics.EventBuilder.prototype.dimen = function(i, v) { - return this.dimension({index: i, value: v}); -}; +let ready = null; /** - * Google Analytics tracker. - * @type {?Promise<analytics.Tracker>} + * Send the event to GA backend. + * @param {!ga.Fields} event The event to send. + * @param {Map<number, Object>=} dimen Optional object contains dimension + * information. */ -let ga = null; - -/** - * Creates Google Analytics tracker object. - * @param {boolean} isTesting - * @return {!Promise<analytics.Tracker>} - * @suppress {checkTypes} - */ -function createGA(isTesting) { - const id = 'UA-134822711-1'; - const service = analytics.getService('chrome-camera-app'); - - const getConfig = () => - new Promise((resolve) => service.getConfig().addCallback(resolve)); - const initBuilder = async () => { - const board = await browserProxy.getBoard(); - const boardName = /^(x86-)?(\w*)/.exec(board)[0]; - const match = navigator.appVersion.match(/CrOS\s+\S+\s+([\d.]+)/); - const osVer = match ? match[1] : ''; - base = analytics.EventBuilder.builder().dimen(1, boardName).dimen(2, osVer); +function sendEvent(event, dimen = null) { + const assignDimension = (e, d) => { + d.forEach((value, key) => e[`dimension${key}`] = value); }; - return Promise - .all([getConfig(), browserProxy.isCrashReportingEnabled(), initBuilder()]) - .then(([config, enabled]) => { - enabled = enabled && !isTesting; - config.setTrackingPermitted(enabled); - return service.getTracker(id); - }); + assert(baseDimen !== null); + assignDimension(event, baseDimen); + if (dimen !== null) { + assignDimension(event, dimen); + } + window.ga('send', 'event', event); } /** * Initializes metrics with parameters. - * @param {boolean} isTesting Whether is collecting logs for running testing. + * @param {!boolean} isTesting Whether is collecting logs for running + * testing. */ export function initMetrics(isTesting) { - ga = createGA(isTesting); + ready = (async () => { + const GA_ID = 'UA-134822711-1'; + const canSendMetrics = + !isTesting && await browserProxy.isCrashReportingEnabled(); + window[`ga-disable-${GA_ID}`] = !canSendMetrics; + + browserProxy.addDummyHistoryIfNotAvailable(); + + // GA initialization function which is mostly copied from + // https://developers.google.com/analytics/devguides/collection/analyticsjs. + (function(i, s, o, g, r) { + i['GoogleAnalyticsObject'] = r; + i[r] = i[r] || function(...args) { + (i[r].q = i[r].q || []).push(args); + }, i[r].l = 1 * new Date(); + const a = s.createElement(o); + const m = s.getElementsByTagName(o)[0]; + a.async = 1; + a.src = g; + m.parentNode.insertBefore(a, m); + })(window, document, 'script', '../js/lib/analytics.js', 'ga'); + + const board = await browserProxy.getBoard(); + const boardName = /^(x86-)?(\w*)/.exec(board)[0]; + const match = navigator.appVersion.match(/CrOS\s+\S+\s+([\d.]+)/); + const osVer = match ? match[1] : ''; + baseDimen = new Map([ + [1, boardName], + [2, osVer], + ]); + + // By default GA stores the user ID in cookies. Change to store in local + // storage instead. + const GA_LOCAL_STORAGE_KEY = 'google-analytics.analytics.user-id'; + const gaLocalStorage = + await browserProxy.localStorageGet({[GA_LOCAL_STORAGE_KEY]: null}); + window.ga('create', GA_ID, { + 'storage': 'none', + 'clientId': gaLocalStorage[GA_LOCAL_STORAGE_KEY] || null, + }); + window.ga( + (tracker) => browserProxy.localStorageSet( + {[GA_LOCAL_STORAGE_KEY]: tracker.get('clientId')})); + + // By default GA uses a dummy image and sets its source to the target URL to + // record metrics. Since requesting remote image violates the policy of + // a platform app, use navigator.sendBeacon() instead. + window.ga('set', 'transport', 'beacon'); + + // By default GA only accepts "http://" and "https://" protocol. Bypass the + // check here since we are "chrome-extension://". + window.ga('set', 'checkProtocolTask', null); + })(); } /** - * Returns event builder for the metrics type: launch. + * Sends launch type event. * @param {boolean} ackMigrate Whether acknowledged to migrate during launch. - * @return {!analytics.EventBuilder} */ -function launchType(ackMigrate) { - return base.category('launch').action('start').label( - ackMigrate ? 'ack-migrate' : ''); +function sendLaunchEvent(ackMigrate) { + sendEvent({ + eventCategory: 'launch', + eventAction: 'start', + eventLabel: ackMigrate ? 'ack-migrate' : '', + }); } /** @@ -97,14 +129,13 @@ }; /** - * Returns event builder for the metrics type: capture. + * Sends capture type event. * @param {!Facing} facingMode Camera facing-mode of the capture. * @param {number} length Length of 1 minute buckets for captured video. * @param {!Resolution} resolution Capture resolution. * @param {!IntentResultType} intentResult - * @return {!analytics.EventBuilder} */ -function captureType(facingMode, length, resolution, intentResult) { +function sendCaptureEvent(facingMode, length, resolution, intentResult) { /** * @param {!Array<state.StateUnion>} states * @param {state.StateUnion=} cond @@ -122,80 +153,96 @@ }; const State = state.State; - return base.category('capture') - .action(condState(Object.values(Mode))) - .label(facingMode) - // Skips 3rd dimension for obsolete 'sound' state. - .dimen(4, condState([State.MIRROR])) - .dimen( + sendEvent( + { + eventCategory: 'capture', + eventAction: condState(Object.values(Mode)), + eventLabel: facingMode, + eventValue: length || 0, + }, + new Map([ + // Skips 3rd dimension for obsolete 'sound' state. + [4, condState([State.MIRROR])], + [ 5, condState( - [State.GRID_3x3, State.GRID_4x4, State.GRID_GOLDEN], State.GRID)) - .dimen(6, condState([State.TIMER_3SEC, State.TIMER_10SEC], State.TIMER)) - .dimen(7, condState([State.MIC], Mode.VIDEO, true)) - .dimen(8, condState([State.MAX_WND])) - .dimen(9, condState([State.TALL])) - .dimen(10, resolution.toString()) - .dimen(11, condState([State.FPS_30, State.FPS_60], Mode.VIDEO, true)) - .dimen(12, intentResult) - .value(length || 0); + [State.GRID_3x3, State.GRID_4x4, State.GRID_GOLDEN], State.GRID), + ], + [6, condState([State.TIMER_3SEC, State.TIMER_10SEC], State.TIMER)], + [7, condState([State.MIC], Mode.VIDEO, true)], + [8, condState([State.MAX_WND])], + [9, condState([State.TALL])], + [10, resolution.toString()], + [11, condState([State.FPS_30, State.FPS_60], Mode.VIDEO, true)], + [12, intentResult], + ])); } /** - * Returns event builder for the metrics type: perf. + * Sends perf type event. * @param {PerfEvent} event The target event type. * @param {number} duration The duration of the event in ms. * @param {Object=} extras Optional information for the event. - * @return {!analytics.EventBuilder} */ -function perfType(event, duration, extras = {}) { +function sendPerfEvent(event, duration, extras = {}) { const {resolution = '', facing = ''} = extras; - return base.category('perf') - .action(event) - .label(facing) - // Round the duration here since GA expects that the value is an integer. - // Reference: https://support.google.com/analytics/answer/1033068 - .value(Math.round(duration)) - .dimen(10, `${resolution}`); + sendEvent( + { + eventCategory: 'perf', + eventAction: event, + eventLabel: facing, + // Round the duration here since GA expects that the value is an + // integer. Reference: + // https://support.google.com/analytics/answer/1033068 + eventValue: Math.round(duration), + }, + new Map([ + [10, `${resolution}`], + ])); } /** - * Returns event builder for the metrics type: intent. + * Sends intent type event. * @param {!Intent} intent Intent to be logged. * @param {!IntentResultType} intentResult - * @return {!analytics.EventBuilder} */ -function intentType(intent, intentResult) { +function sendIntentEvent(intent, intentResult) { const getBoolValue = (b) => b ? '1' : '0'; - return base.category('intent') - .action(intent.mode) - .label(intentResult) - .dimen(12, intentResult) - .dimen(13, getBoolValue(intent.shouldHandleResult)) - .dimen(14, getBoolValue(intent.shouldDownScale)) - .dimen(15, getBoolValue(intent.isSecure)); + sendEvent( + { + eventCategory: 'intent', + eventAction: intent.mode, + eventLabel: intentResult, + }, + new Map([ + [12, intentResult], + [13, getBoolValue(intent.shouldHandleResult)], + [14, getBoolValue(intent.shouldDownScale)], + [15, getBoolValue(intent.isSecure)], + ])); } /** * Metrics types. - * @enum {function(...): !analytics.EventBuilder} + * @enum {function(...)} */ export const Type = { - LAUNCH: launchType, - CAPTURE: captureType, - PERF: perfType, - INTENT: intentType, + LAUNCH: sendLaunchEvent, + CAPTURE: sendCaptureEvent, + PERF: sendPerfEvent, + INTENT: sendIntentEvent, }; /** * Logs the given metrics. * @param {!Type} type Metrics type. * @param {...*} args Optional rest parameters for logging metrics. + * @return {!Promise} */ -export function log(type, ...args) { - if (ga === null) { - console.error('log() should not be called before metrics initialization.'); - ga = createGA(false); - } - ga.then((tracker) => tracker.send(type(...args))); +export async function log(type, ...args) { + assert(window.ga !== null); + assert(ready !== null); + + await ready; + type(...args); }
diff --git a/chrome/browser/resources/chromeos/camera/src/views/background.html b/chrome/browser/resources/chromeos/camera/src/views/background.html index 318ca65..f932251 100644 --- a/chrome/browser/resources/chromeos/camera/src/views/background.html +++ b/chrome/browser/resources/chromeos/camera/src/views/background.html
@@ -4,7 +4,6 @@ found in the LICENSE file. --> <html> <head> - <script src="../js/lib/google-analytics-bundle.js"></script> <script src="../js/mojo/mojo_bindings_lite.js"></script> <script src="../js/mojo/camera_intent.mojom-lite.js"></script> <script src="../js/mojo/camera_app_helper.mojom-lite.js"></script>
diff --git a/chrome/browser/resources/chromeos/camera/src/views/main.html b/chrome/browser/resources/chromeos/camera/src/views/main.html index 144ab48..7b62638 100644 --- a/chrome/browser/resources/chromeos/camera/src/views/main.html +++ b/chrome/browser/resources/chromeos/camera/src/views/main.html
@@ -9,7 +9,6 @@ <title></title> <meta charset="utf-8"> <link rel="stylesheet" href="../css/main.css"> - <script src="../js/lib/google-analytics-bundle.js"></script> <script src="../js/mojo/mojo_bindings_lite.js"></script> <script src="../js/mojo/time.mojom-lite.js"></script> <script src="../js/mojo/idle_manager.mojom-lite.js"></script>
diff --git a/chrome/browser/resources/chromeos/login/marketing_opt_in.html b/chrome/browser/resources/chromeos/login/marketing_opt_in.html index be620ed9..f704c9a 100644 --- a/chrome/browser/resources/chromeos/login/marketing_opt_in.html +++ b/chrome/browser/resources/chromeos/login/marketing_opt_in.html
@@ -65,13 +65,16 @@ </div> </div> <div slot="bottom-buttons" class="layout horizontal justified"> - <oobe-welcome-secondary-button - id="marketing-opt-in-accessibility-button" - on-tap="onToggleAccessibilityPage_" - icon1x="marketing-opt-in-32:accessibility" - icon2x="marketing-opt-in-64:accessibility" - text-key="marketingOptInA11yButtonLabel"> - </oobe-welcome-secondary-button> + <div> + <oobe-welcome-secondary-button + hidden="[[!isA11ySettingsButtonVisible_]]" + id="marketing-opt-in-accessibility-button" + on-tap="onToggleAccessibilityPage_" + icon1x="marketing-opt-in-32:accessibility" + icon2x="marketing-opt-in-64:accessibility" + text-key="marketingOptInA11yButtonLabel"> + </oobe-welcome-secondary-button> + </div> <oobe-text-button on-tap="onGetStarted_" class="focus-on-show" inverse text-key="marketingOptInScreenAllSet" id="marketing-opt-in-next-button">
diff --git a/chrome/browser/resources/chromeos/login/marketing_opt_in.js b/chrome/browser/resources/chromeos/login/marketing_opt_in.js index 1e5d808..8b2f784 100644 --- a/chrome/browser/resources/chromeos/login/marketing_opt_in.js +++ b/chrome/browser/resources/chromeos/login/marketing_opt_in.js
@@ -17,6 +17,15 @@ }, /** + * Whether the accessibility button is shown. This button is only shown + * if the gesture EDU screen was shown before the marketing screen. + */ + isA11ySettingsButtonVisible_: { + type: Boolean, + value: false, + }, + + /** * Whether the marketing opt in toggles should be shown, which will be the * case only if marketing opt in feature is enabled AND if the current user * is a non-managed user. @@ -33,6 +42,7 @@ /** Overridden from LoginScreenBehavior. */ EXTERNAL_API: [ + 'updateA11ySettingsButtonVisibility', 'updateA11yNavigationButtonToggle', 'setOptInVisibility', 'setEmailToggleState' @@ -70,6 +80,13 @@ }, /** + * @param {boolean} shown Whether the A11y Settings button should be shown. + */ + updateA11ySettingsButtonVisibility(shown) { + this.isA11ySettingsButtonVisible_ = shown; + }, + + /** * @param {boolean} enabled Whether the a11y setting for shownig shelf * navigation buttons is enabled. */
diff --git a/chrome/browser/resources/chromeos/login/sync_consent.css b/chrome/browser/resources/chromeos/login/sync_consent.css index 8190478..cd57f11 100644 --- a/chrome/browser/resources/chromeos/login/sync_consent.css +++ b/chrome/browser/resources/chromeos/login/sync_consent.css
@@ -42,10 +42,13 @@ } #splitSettingsSyncConsentDialog .overview-list-item-icon { - margin-top: 2px; padding-inline-end: 16px; } +#splitSettingsSyncConsentDialog .overview-list-item-title { + margin-top: 4px; +} + #splitSettingsSyncConsentDialog cr-checkbox { align-self: start; /* Prevent label from spanning the whole width. */ margin-top: 16px;
diff --git a/chrome/browser/resources/discards/discards_main.js b/chrome/browser/resources/discards/discards_main.js index 1197dea2..f0b077df 100644 --- a/chrome/browser/resources/discards/discards_main.js +++ b/chrome/browser/resources/discards/discards_main.js
@@ -45,7 +45,10 @@ */ selectedChanged_(newValue, oldValue) { if (oldValue != undefined) { - this.path = '/' + this.tabs[newValue].toLowerCase(); + // The first tab is special-cased to the empty path. + const defaultTab = this.tabs[0].toLowerCase(); + const tabName = this.tabs[newValue].toLowerCase(); + this.path = '/' + (tabName === defaultTab ? '' : tabName); } },
diff --git a/chrome/browser/resources/local_ntp/chevron.svg b/chrome/browser/resources/local_ntp/chevron.svg new file mode 100644 index 0000000..5a60ec2 --- /dev/null +++ b/chrome/browser/resources/local_ntp/chevron.svg
@@ -0,0 +1 @@ +<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.884 16.123a1.229 1.229 0 0 1-1.768 0l-6.25-6.428a1.3 1.3 0 0 1-.366-.91c0-.709.56-1.285 1.25-1.285.345 0 .657.144.884.377L12 13.397l5.366-5.52a1.23 1.23 0 0 1 .884-.377c.69 0 1.25.576 1.25 1.286a1.3 1.3 0 0 1-.366.909l-6.25 6.428z" fill="#5F6368"/></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/local_ntp/externs.js b/chrome/browser/resources/local_ntp/externs.js index 62e31b4..a23b3244 100644 --- a/chrome/browser/resources/local_ntp/externs.js +++ b/chrome/browser/resources/local_ntp/externs.js
@@ -413,6 +413,8 @@ window.chrome.embeddedSearch.searchBox; /** @param {number} line */ window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch; +/** @param {number} suggestionGroupId */ +window.chrome.embeddedSearch.searchBox.toggleSuggestionGroupIdVisibility; window.chrome.embeddedSearch.searchBox.isKeyCaptureEnabled; /** @param {number} latencyMs */ window.chrome.embeddedSearch.searchBox.logCharTypedToRepaintLatency; @@ -440,6 +442,7 @@ * descriptionClass: !Array<!ACMatchClassification>, * destinationUrl: string, * fillIntoEdit: string, + * suggestionGroupId: number, * iconUrl: string, * imageDominantColor: string, * imageUrl: string, @@ -454,7 +457,16 @@ /** * @typedef {{ + * header: string, + * hidden: boolean, + * }} + */ +let SuggestionGroup; + +/** + * @typedef {{ * input: string, + * suggestionGroupsMap: !Object<!SuggestionGroup>, * matches: !Array<!AutocompleteMatch>, * }} */
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css index c0d2450c..15cd20c 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.css +++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -246,6 +246,7 @@ display: none; left: 0; overflow: hidden; + padding-bottom: 8px; padding-top: var(--searchbox-height); position: absolute; right: 0; @@ -264,6 +265,7 @@ } #realbox-matches a { + display: block; font-size: 16px; line-height: 1; outline: none; @@ -278,6 +280,29 @@ white-space: nowrap; } +#realbox-matches .header { + color: rgb(var(--GG700-rgb)); + font-size: 13px; + font-weight: 500; + line-height: 16px; + padding-inline-start: 12px; + text-transform: uppercase; +} + +#realbox-matches .header .remove-icon { + -webkit-mask-image: url(chevron.svg); + -webkit-transform: rotate(180deg); + background-color: var(--search-box-icon, rgb(var(--GG900-rgb))); +} + +#realbox-matches .collapsed .header .remove-icon { + -webkit-transform: none; +} + +#realbox-matches .collapsed a:not(.header) { + display: none; +} + [dir=rtl] #realbox-matches a { background-position-x: calc(100% - 16px); } @@ -304,10 +329,6 @@ padding-inline-end: 48px; } -#realbox-matches a:last-of-type { - margin-bottom: 8px; /* Last result is tight with border-radius. */ -} - #realbox-matches a:-webkit-any(:focus-within, .selected) .match-icon { background-color: var(--search-box-icon-selected, rgb(117, 117, 117)); }
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js index 9ab299d..14bf04b1 100644 --- a/chrome/browser/resources/local_ntp/local_ntp.js +++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -1,4 +1,3 @@ - // 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. @@ -63,6 +62,7 @@ */ const CLASSES = { ALTERNATE_LOGO: 'alternate-logo', // Shows white logo if required by theme + COLLAPSED: 'collapsed', // Applies styles to dialogs used in customization. CUSTOMIZE_DIALOG: 'customize-dialog', DELAYED_HIDE_NOTIFICATION: 'mv-notice-delayed-hide', @@ -82,6 +82,7 @@ HAS_IMAGE: 'has-image', // A realbox match with an image. // Applies a different style to the error notification if a link is present. HAS_LINK: 'has-link', + HEADER: 'header', HIDE_FAKEBOX: 'hide-fakebox', HIDE_NOTIFICATION: 'notice-hide', // Contains the image next to a realbox match. Displays a placeholder color @@ -246,6 +247,14 @@ let autocompleteResult = null; /** + * The time of the first character insert operation that has not yet been + * painted in floating point milliseconds. Used to measure the realbox + * responsiveness with a histogram. + * @type {number} + */ +let charTypedTime = 0; + +/** * The currently visible notification element. Null if no notification is * present. * @type {?Object} @@ -274,14 +283,6 @@ const faviconOrImageUrlToDataUrlCache = {}; /** - * The time of the first character insert operation that has not yet been - * painted in floating point milliseconds. Used to measure the realbox - * responsiveness with a histogram. - * @type {number} - */ -let charTypedTime = 0; - -/** * True if dark mode is enabled. * @type {boolean} */ @@ -324,6 +325,12 @@ let lastRealboxFocusTime = null; /** + * Current realbox match elements. + * @type {!Array<!Element>} + */ +let matchEls = []; + +/** * The browser embeddedSearch.newTabPage object. * @type {Object} */ @@ -335,6 +342,12 @@ */ let pastedInRealbox = false; +/** + * A map from a suggestion Group ID to the group element for that group ID. + * @type {!Object<!Element>} + */ +let suggestionGroupElsMap = {}; + // Helper methods. /** @return {boolean} */ @@ -349,7 +362,7 @@ return; // Stale result; ignore. } - renderAutocompleteMatches(result.matches); + renderAutocompleteMatches(result.matches, result.suggestionGroupsMap); autocompleteResult = result; @@ -360,9 +373,10 @@ text: lastQueriedInput || '', }); + assert(autocompleteResult.matches.length === matchEls.length); const first = result.matches[0]; if (first && first.allowedToBeDefaultMatch) { - selectMatchEl(assert($(IDS.REALBOX_MATCHES).firstElementChild)); + selectMatchEl(matchEls[0]); updateRealboxOutput({inline: first.inlineAutocompletion}); if (enterWasPressed) { @@ -395,7 +409,6 @@ } faviconOrImageUrlToDataUrlCache[url] = dataUrl; - const matchEls = Array.from($(IDS.REALBOX_MATCHES).children); assert(autocompleteResult.matches.length === matchEls.length); // Update the match image/favicon. @@ -1326,7 +1339,6 @@ return; } - const matchEls = Array.from($(IDS.REALBOX_MATCHES).children); const selected = matchEls.findIndex(matchEl => { return matchEl.classList.contains(CLASSES.SELECTED); }); @@ -1380,16 +1392,21 @@ /** @param {!Event} e */ function onRealboxMatchesFocusIn(e) { const target = /** @type {Element} */ (e.target); - const link = findAncestor(target, el => el.nodeName === 'A'); - if (!link) { + const matchEl = findAncestor(target, el => el.nodeName === 'A'); + if (!matchEl) { return; } - const selectedIndex = selectMatchEl(link); + const selectedIndex = selectMatchEl(matchEl); + const selectedMatch = autocompleteResult.matches[selectedIndex]; + if (!selectedMatch) { + return; + } + // It doesn't really make sense to use fillFromMatch() here as the focus // change drops the selection (and is probably just noisy to // screenreaders). - const newFill = autocompleteResult.matches[selectedIndex].fillIntoEdit; - updateRealboxOutput({moveCursorToEnd: true, inline: '', text: newFill}); + updateRealboxOutput( + {moveCursorToEnd: true, inline: '', text: selectedMatch.fillIntoEdit}); } /** @param {Event} e */ @@ -1467,15 +1484,11 @@ return; } - const realboxMatchesEl = $(IDS.REALBOX_MATCHES); - const matchEls = Array.from(realboxMatchesEl.children); - assert(matchEls.length > 0); + assert(autocompleteResult.matches.length === matchEls.length); const selected = matchEls.findIndex(matchEl => { return matchEl.classList.contains(CLASSES.SELECTED); }); - assert(autocompleteResult.matches.length === matchEls.length); - if (key === 'Enter') { if (matchEls.concat(realboxEl).includes(e.target)) { if (lastQueriedInput === autocompleteResult.input) { @@ -1518,19 +1531,23 @@ return; } + const visibleMatchEls = matchEls.filter((matchEl) => { + return window.getComputedStyle(matchEl).display !== 'none'; + }); /** @type {number} */ let newSelected; if (key === 'ArrowDown') { - newSelected = selected + 1 < matchEls.length ? selected + 1 : 0; + newSelected = selected + 1 < visibleMatchEls.length ? selected + 1 : 0; } else if (key === 'ArrowUp') { - newSelected = selected - 1 >= 0 ? selected - 1 : matchEls.length - 1; + newSelected = selected - 1 >= 0 ? selected - 1 : visibleMatchEls.length - 1; } else if (key === 'Escape' || key === 'PageUp') { newSelected = 0; } else if (key === 'PageDown') { - newSelected = matchEls.length - 1; + newSelected = visibleMatchEls.length - 1; } - assert(selectMatchEl(assert(matchEls[newSelected])) >= 0); + assert(selectMatchEl(assert(visibleMatchEls[newSelected])) >= 0); e.preventDefault(); + const realboxMatchesEl = $(IDS.REALBOX_MATCHES); if (realboxMatchesEl.contains(document.activeElement)) { // Selection should match focus if focus is currently in the matches. matchEls[newSelected].focus(); @@ -1673,11 +1690,75 @@ /** * @param {!Array<!AutocompleteMatch>} matches + * @param {!Object<!SuggestionGroup>} suggestionGroupsMap */ -function renderAutocompleteMatches(matches) { +function renderAutocompleteMatches(matches, suggestionGroupsMap) { const realboxMatchesEl = document.createElement('div'); realboxMatchesEl.setAttribute('role', 'listbox'); + const newMatchEls = []; + suggestionGroupElsMap = {}; + + /** + * Creates and returns a remove button that once clicked invokes |callback|. + * @param {!function()} callback + */ + function createRemoveButton(callback) { + const icon = document.createElement('button'); + icon.title = configData.translatedStrings.removeSuggestion; + icon.classList.add(CLASSES.REMOVE_ICON); + icon.onmousedown = e => { + e.preventDefault(); // Stops default browser action (focus) + }; + icon.onauxclick = e => { + if (e.button == 1) { + // Middle click on delete should just noop for now (matches omnibox). + e.preventDefault(); + } + }; + icon.onclick = e => { + callback(); + e.preventDefault(); // Stops default browser action (navigation) + }; + + const remove = document.createElement('div'); + remove.classList.add(CLASSES.REMOVE_MATCH); + remove.appendChild(icon); + return remove; + } + + /** + * Creates and returns an element to contain the header as well as the matches + * belonging to |suggestionGroupId|. + * @param {number} suggestionGroupId + */ + function createSuggestionGroupEl(suggestionGroupId) { + if (suggestionGroupElsMap[suggestionGroupId]) { + return suggestionGroupElsMap[suggestionGroupId]; + } + + const suggestionGroup = assert(suggestionGroupsMap[suggestionGroupId]); + + const groupEl = document.createElement('div'); + groupEl.classList.toggle(CLASSES.COLLAPSED, suggestionGroup.hidden); + const headerEl = document.createElement('a'); + headerEl.classList.add(CLASSES.HEADER); + headerEl.append(document.createTextNode(suggestionGroup.header)); + if (configData.suggestionTransparencyEnabled) { + const remove = createRemoveButton(() => { + groupEl.classList.toggle(CLASSES.COLLAPSED); + window.chrome.embeddedSearch.searchBox + .toggleSuggestionGroupIdVisibility(suggestionGroupId); + }); + headerEl.appendChild(remove); + realboxMatchesEl.classList.add(CLASSES.REMOVABLE); + } + groupEl.appendChild(headerEl); + realboxMatchesEl.appendChild(groupEl); + suggestionGroupElsMap[suggestionGroupId] = groupEl; + return groupEl; + } + for (let i = 0; i < matches.length; ++i) { const match = matches[i]; const matchEl = document.createElement('a'); @@ -1766,32 +1847,20 @@ } if (match.supportsDeletion && configData.suggestionTransparencyEnabled) { - const icon = document.createElement('button'); - icon.title = configData.translatedStrings.removeSuggestion; - icon.classList.add(CLASSES.REMOVE_ICON); - icon.onmousedown = e => { - e.preventDefault(); // Stops default browser action (focus) - }; - icon.onauxclick = e => { - if (e.button == 1) { - // Middle click on delete should just noop for now (matches omnibox). - e.preventDefault(); - } - }; - icon.onclick = e => { + const remove = createRemoveButton(() => { window.chrome.embeddedSearch.searchBox.deleteAutocompleteMatch(i); - e.preventDefault(); // Stops default browser action (navigation) - }; - - const remove = document.createElement('div'); - remove.classList.add(CLASSES.REMOVE_MATCH); - - remove.appendChild(icon); + }); matchEl.appendChild(remove); realboxMatchesEl.classList.add(CLASSES.REMOVABLE); } - realboxMatchesEl.append(matchEl); + if (match.suggestionGroupId) { + const groupEl = createSuggestionGroupEl(match.suggestionGroupId); + groupEl.append(matchEl); + } else { + realboxMatchesEl.append(matchEl); + } + newMatchEls.push(matchEl); } if (charTypedTime) { @@ -1812,6 +1881,7 @@ realboxMatchesEl.addEventListener('focusin', onRealboxMatchesFocusIn); realboxWrapper.appendChild(realboxMatchesEl); + matchEls = newMatchEls; realboxWrapper.addEventListener('focusout', onRealboxWrapperFocusOut); @@ -1834,8 +1904,8 @@ return classes.length ? spanWithClasses(classifiedText, classes) : document.createTextNode(classifiedText); }) - .reduce((container, currentElement) => { - container.appendChild(currentElement); + .reduce((container, currentEl) => { + container.appendChild(currentEl); return container; }, document.createElement('span')); } @@ -2037,13 +2107,13 @@ } /** - * @param {!EventTarget} elToSelect + * @param {!EventTarget} matchElToSelect * @return {number} The selected index (if found); else -1. */ -function selectMatchEl(elToSelect) { +function selectMatchEl(matchElToSelect) { let selectedIndex = -1; - Array.from($(IDS.REALBOX_MATCHES).children).forEach((matchEl, i) => { - const found = matchEl === elToSelect; + Array.from(matchEls).forEach((matchEl, i) => { + const found = matchEl === matchElToSelect; matchEl.classList.toggle(CLASSES.SELECTED, found); matchEl.setAttribute('aria-selected', found); if (found) {
diff --git a/chrome/browser/resources/memory_internals/BUILD.gn b/chrome/browser/resources/memory_internals/BUILD.gn new file mode 100644 index 0000000..59c5fc88 --- /dev/null +++ b/chrome/browser/resources/memory_internals/BUILD.gn
@@ -0,0 +1,17 @@ +# 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("//third_party/closure_compiler/compile_js.gni") + +js_type_check("closure_compile") { + uses_js_modules = true + deps = [ ":memory_internals" ] +} + +js_library("memory_internals") { + deps = [ + "//ui/webui/resources/js:cr.m", + "//ui/webui/resources/js:util.m", + ] +}
diff --git a/chrome/browser/resources/memory_internals/memory_internals.html b/chrome/browser/resources/memory_internals/memory_internals.html index 2c3a17b5..28757e75 100644 --- a/chrome/browser/resources/memory_internals/memory_internals.html +++ b/chrome/browser/resources/memory_internals/memory_internals.html
@@ -1,38 +1,42 @@ <!doctype html> -<html><head> -<title>Memory Internals</title> -<style type="text/css"> - body { - font-family: sans-serif; - } - th { - border-bottom: 1px solid black; - padding: 5px; - text-align: start; - } - td { - padding: 5px; - } - .message { - font-style: italic; - margin-bottom: 1em; - padding: 5px; - } - .commands { - padding: 5px; - } -</style> -</head><body> +<html> + <head> + <meta charset="utf-8"> + <title>Memory Internals</title> + <style type="text/css"> + body { + font-family: sans-serif; + } + th { + border-bottom: 1px solid black; + padding: 5px; + text-align: start; + } + td { + padding: 5px; + } + #message { + font-style: italic; + margin-bottom: 1em; + padding: 5px; + } + .commands { + padding: 5px; + } + </style> + </head> + <body> + <h3>Experimental memory internals</h3> + <div id="message"></div> -<script src="chrome://resources/js/util.js"></script> -<script src="chrome://resources/js/cr.js"></script> -<script src="chrome://memory-internals/memory_internals.js"></script> + <div class="commands"> + <button id="refresh">↺ Refresh process list</button> + <button id="save">⇩ Save dump</button> + <div id="save-dump-text"></div> + </div> -<h3>Experimental memory internals</h3> - -<div class="message" id="message"></div> - -<div id="proclist">loading...</div> - -</body></html> + <div id="proclist">loading...</div> + <script type="module" src="memory_internals.js"></script> + </body> +</html>
diff --git a/chrome/browser/resources/memory_internals/memory_internals.js b/chrome/browser/resources/memory_internals/memory_internals.js index d0e58553..903ce4c2 100644 --- a/chrome/browser/resources/memory_internals/memory_internals.js +++ b/chrome/browser/resources/memory_internals/memory_internals.js
@@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -'use strict'; +import {addWebUIListener, sendWithPromise} from 'chrome://resources/js/cr.m.js'; +import {$} from 'chrome://resources/js/util.m.js'; function requestProcessList() { - chrome.send('requestProcessList'); + sendWithPromise('requestProcessList').then(onProcessListReceived); } function saveDump() { @@ -34,11 +35,7 @@ table.appendChild(tr); } -function setSaveDumpMessage(data) { - $('save_dump_text').innerText = data; -} - -function returnProcessList(data) { +function onProcessListReceived(data) { $('message').innerText = data['message']; const proclist = $('proclist'); @@ -47,25 +44,7 @@ const processes = data['processes']; if (processes.length == 0) { return; - } // No processes to dump, don't make the table and refresh button. - - // Add the refresh and save-dump buttons. - const commandsDiv = document.createElement('div'); - commandsDiv.className = 'commands'; - - const refreshButton = document.createElement('button'); - refreshButton.innerText = '\u21ba Refresh process list'; - refreshButton.onclick = () => requestProcessList(); - commandsDiv.appendChild(refreshButton); - const saveDumpButton = document.createElement('button'); - saveDumpButton.innerText = '\u21e9 Save dump'; - saveDumpButton.onclick = () => saveDump(); - commandsDiv.appendChild(saveDumpButton); - const saveDumpText = document.createElement('div'); - saveDumpText.id = 'save_dump_text'; - commandsDiv.appendChild(saveDumpText); - - proclist.appendChild(commandsDiv); + } // No processes to dump, don't make the table. const table = document.createElement('table'); @@ -81,13 +60,11 @@ const description = document.createTextNode(proc[1]); const profiled = proc[2]; - let button = null; + const button = document.createElement('button'); if (profiled) { - button = document.createElement('button'); button.innerText = '\uD83D\uDC1E Report'; button.onclick = () => reportProcess(procId); } else { - button = document.createElement('button'); button.innerText = '\u2600 Start profiling'; button.onclick = () => startProfiling(procId); } @@ -99,11 +76,20 @@ } // Get data and have it displayed upon loading. -document.addEventListener('DOMContentLoaded', requestProcessList); +document.addEventListener('DOMContentLoaded', () => { + $('refresh').onclick = requestProcessList; + $('save').onclick = saveDump; + + addWebUIListener('save-dump-progress', progress => { + $('save-dump-text').innerText = progress; + }); + + requestProcessList(); +}); /* For manual testing. function fakeResults() { - returnProcessList([ + onProcessListReceived([ [ 11234, "Process 11234 [Browser]" ], [ 11235, "Process 11235 [Renderer]" ], [ 11236, "Process 11236 [Renderer]" ]]);
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn index fe2c841..66a214723 100644 --- a/chrome/browser/resources/settings/BUILD.gn +++ b/chrome/browser/resources/settings/BUILD.gn
@@ -15,27 +15,6 @@ settings_pak_file = "settings_resources.pak" unpak_folder = "settings_resources.unpak" - optimize_webui("build") { - host = "settings" - html_in_files = [ - "settings.html", - "lazy_load.html", - ] - html_out_files = [ - "vulcanized.html", - "lazy_load.vulcanized.html", - ] - insert_in_head = "<base href=\"chrome://settings\">" - input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir) - js_out_files = [ - "crisper.js", - "lazy_load.crisper.js", - ] - excludes = [ "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom.html" ] - - deps = [ ":unpak" ] - } - optimize_webui("build_polymer3") { host = "settings" input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir) @@ -100,7 +79,6 @@ "prefs:closure_compile", "printing_page:closure_compile", "privacy_page:closure_compile", - "reset_page:closure_compile", "safety_check_page:closure_compile", "search_engines_page:closure_compile", "search_page:closure_compile",
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.html b/chrome/browser/resources/settings/autofill_page/passwords_section.html index de4651c..8a4a818 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_section.html +++ b/chrome/browser/resources/settings/autofill_page/passwords_section.html
@@ -6,6 +6,7 @@ <link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toast/cr_toast_manager.html"> <link rel="import" href="chrome://resources/cr_elements/icons.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> @@ -14,6 +15,7 @@ <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-announcer/iron-a11y-announcer.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html"> <link rel="import" href="../controls/extension_controlled_indicator.html"> <link rel="import" href="../controls/settings_toggle_button.html"> @@ -40,7 +42,7 @@ <dom-module id="passwords-section"> <template> - <style include="settings-shared passwords-shared"> + <style include="cr-shared-style settings-shared iron-flex passwords-shared"> #savedPasswordsHeaders { /* This adds enough padding so that the labels are aligned with the * columns. It is necessary due to the absence of the "more actions" @@ -102,8 +104,8 @@ </settings-toggle-button> <template is="dom-if" if="[[prefs.credentials_enable_service.extensionId]]"> - <div class="settings-box continuation"> - <extension-controlled-indicator class="start" + <div class="cr-row continuation"> + <extension-controlled-indicator class="flex" id="passwordsExtensionIndicator" extension-id="[[prefs.credentials_enable_service.extensionId]]" extension-name="[[ @@ -119,7 +121,7 @@ sub-label="$i18n{passwordsAutosigninDescription}"> </settings-toggle-button> <template is="dom-if" if="[[enablePasswordCheck_]]"> - <div id="checkPasswordsBannerContainer" class="settings-box" + <div id="checkPasswordsBannerContainer" class="cr-row" hidden$="[[!shouldShowBanner_]]"> <picture> <source @@ -129,9 +131,9 @@ src="chrome://settings/images/password_check_neutral.svg"> </picture> </div> - <div id="checkPasswordsButtonRow" class="settings-box continuation" + <div id="checkPasswordsButtonRow" class="cr-row continuation" hidden$="[[!shouldShowBanner_]]"> - <div class="start settings-box-text"> + <div class="flex cr-padded-text"> <div>$i18n{checkPasswords}</div> <div class="secondary">$i18n{checkPasswordsDescription}</div> </div> @@ -140,12 +142,12 @@ $i18n{checkPasswords} </cr-button> </div> - <div class="settings-box two-line" id="checkPasswordsLinkRow" + <div class="cr-row" id="checkPasswordsLinkRow" on-click="onCheckPasswordsClick_" actionable hidden$="[[shouldShowBanner_]]"> <iron-icon icon="cr:warning" id="checkPasswordWarningIcon" hidden$="[[!hasLeakedCredentials_]]"></iron-icon> - <div class="start settings-box-text"> + <div class="flex cr-padded-text"> <div> $i18n{checkPasswords} </div> @@ -162,10 +164,10 @@ </cr-icon-button> </div> </template> - <div id="manageLink" class="settings-box two-line" + <div id="manageLink" class="cr-row two-line" hidden$="[[hidePasswordsLink_]]"> - <!-- This span lays out the url correctly, relative to the label. --> - <span>$i18nRaw{managePasswordsLabel}</span> + <!-- This div lays out the link correctly, relative to the text. --> + <div class="cr-padded-text">$i18nRaw{managePasswordsLabel}</div> </div> <template is="dom-if" if="[[enableAccountStorage_]]"> <cr-button on-click="onOptIn_" @@ -177,14 +179,15 @@ $i18n{optOutAccountStorageLabel} </cr-button> </template> - <div class="settings-box first"> - <h2 id="savedPasswordsHeading" class="start"> + <div class="cr-row first"> + <h2 id="savedPasswordsHeading" class="flex"> $i18n{savedPasswordsHeading} </h2> <template is="dom-if" if="[[showImportOrExportPasswords_( showExportPasswords_, showImportPasswords_)]]"> - <cr-icon-button class="icon-more-vert" id="exportImportMenuButton" + <cr-icon-button class="icon-more-vert header-aligned-button" + id="exportImportMenuButton" on-click="onImportExportMenuTap_" title="$i18n{moreActions}" focus-type="exportImportMenuButton" aria-describedby="savedPasswordsHeading"></cr-icon-button> @@ -275,8 +278,8 @@ on-click="onUndoButtonClick_">$i18n{undoRemovePassword}</cr-button> </cr-toast-manager> - <div class="settings-box block first"> - <h2>$i18n{passwordExceptionsHeading}</h2> + <div class="cr-row first"> + <h2 class="flex">$i18n{passwordExceptionsHeading}</h2> </div> <div class="list-frame vertical-list" id="passwordExceptionsList"> <template is="dom-repeat" items="[[passwordExceptions]]"
diff --git a/chrome/browser/resources/settings/autofill_page/payments_section.html b/chrome/browser/resources/settings/autofill_page/payments_section.html index 71b5f2d..5048966f 100644 --- a/chrome/browser/resources/settings/autofill_page/payments_section.html +++ b/chrome/browser/resources/settings/autofill_page/payments_section.html
@@ -3,12 +3,14 @@ <link rel="import" href="chrome://resources/cr_elements/cr_action_menu/cr_action_menu.html"> <link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/cr_link_row/cr_link_row.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/assert.html"> <link rel="import" href="chrome://resources/html/cr.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html"> <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="../i18n_setup.html"> <link rel="import" href="../metrics_browser_proxy.html"> <link rel="import" href="../settings_shared_css.html"> @@ -23,7 +25,7 @@ <dom-module id="settings-payments-section"> <template> - <style include="settings-shared passwords-shared"> + <style include="cr-shared-style settings-shared iron-flex passwords-shared"> .expiration-column { align-items: center; display: flex; @@ -68,8 +70,8 @@ </template> <template is="dom-if" if="[[prefs.autofill.credit_card_enabled.extensionId]]"> - <div class="settings-box continuation"> - <extension-controlled-indicator class="start" + <div class="cr-row continuation"> + <extension-controlled-indicator class="flex" id="autofillExtensionIndicator" extension-id="[[prefs.autofill.credit_card_enabled.extensionId]]" extension-name="[[ @@ -80,13 +82,13 @@ </div> </template> - <div id="manageLink" class="settings-box first"> - <!-- This span lays out the URL correctly, relative to the label. --> - <span>$i18nRaw{manageCreditCardsLabel}</span> + <div id="manageLink" class="cr-row first"> + <!-- This span lays out the link correctly, relative to the text. --> + <div class="cr-padded-text">$i18nRaw{manageCreditCardsLabel}</div> </div> - <div class="settings-box continuation"> - <h2 class="start">$i18n{creditCards}</h2> + <div class="cr-row continuation"> + <h2 class="flex">$i18n{creditCards}</h2> <cr-button id="addCreditCard" class="header-aligned-button" on-click="onAddCreditCardTap_" hidden$="[[!prefs.autofill.credit_card_enabled.value]]">
diff --git a/chrome/browser/resources/settings/basic_page/BUILD.gn b/chrome/browser/resources/settings/basic_page/BUILD.gn index 7d71448..175ee6bd 100644 --- a/chrome/browser/resources/settings/basic_page/BUILD.gn +++ b/chrome/browser/resources/settings/basic_page/BUILD.gn
@@ -52,6 +52,7 @@ js_file = "basic_page.js" html_file = "basic_page.html" html_type = "dom-module" + migrated_imports = settings_migrated_imports auto_imports = settings_auto_imports + [ "chrome/browser/resources/settings/page_visibility.html|PageVisibility", "chrome/browser/resources/settings/route.html|routes",
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html index a1f7ad7..a4707126 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.html +++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -2,8 +2,10 @@ <link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> <link rel="import" href="chrome://resources/cr_elements/hidden_style_css.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/cr_elements/shared_vars_css.html"> <link rel="import" href="chrome://resources/html/assert.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="../appearance_page/appearance_page.html"> <link rel="import" href="../privacy_page/privacy_page.html"> <link rel="import" href="../safety_check_page/safety_check_page.html"> @@ -35,7 +37,7 @@ includes both the basic and advanced settings. --> <dom-module id="settings-basic-page"> <template> - <style include="settings-page-styles cr-hidden-style settings-shared"> + <style include="cr-shared-style settings-page-styles cr-hidden-style iron-flex settings-shared"> :host([is-subpage-animating]) { /* Prevent an unwanted horizontal scrollbar when transitioning back from * a sub-page. */ @@ -62,11 +64,9 @@ } #osSettingsBanner { - align-items: center; - background-color: white; - border-radius: 2px; + background-color: var(--cr-card-background-color); + border-radius: var(--cr-card-border-radius); box-shadow: var(--cr-card-shadow); - display: flex; margin-top: 21px; } @@ -99,8 +99,9 @@ </template> <if expr="chromeos"> <template is="dom-if" if="[[showOSSettingsBanner_]]"> - <div id="osSettingsBanner" class="settings-box"> - <div class="start" on-click="onOSSettingsBannerClick_"> + <div id="osSettingsBanner" class="cr-row"> + <div class="flex cr-padded-text" + on-click="onOSSettingsBannerClick_"> $i18nRaw{osSettingsBannerText} </div> <cr-icon-button class="icon-clear"
diff --git a/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.html b/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.html index 2d2b5786..38c8cf8 100644 --- a/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.html +++ b/chrome/browser/resources/settings/chromeos/ambient_mode_page/ambient_mode_page.html
@@ -2,6 +2,7 @@ <link rel="import" href="ambient_mode_browser_proxy.html"> <link rel="import" href="chrome://resources/cr_elements/cr_radio_button/cr_radio_button.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> <link rel="import" href="../../controls/settings_radio_group.html"> @@ -10,7 +11,7 @@ <dom-module id="settings-ambient-mode-page"> <template> - <style include="settings-shared"> + <style include="cr-shared-style settings-shared"> #ambientModeEnable { border-bottom: var(--cr-separator-line); } @@ -29,7 +30,7 @@ </settings-toggle-button> <template is="dom-if" if="[[prefs.settings.ambient_mode.enabled.value]]"> - <label id="topicSourceDescription" class="settings-box-text"> + <label id="topicSourceDescription" class="cr-padded-text"> $i18n{ambientModeTopicSourceTitle} </label> <div class="list-frame">
diff --git a/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.html b/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.html index e8092e6..2bec004 100644 --- a/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.html +++ b/chrome/browser/resources/settings/chromeos/bluetooth_page/bluetooth_subpage.html
@@ -3,8 +3,10 @@ <link rel="import" href="chrome://resources/cr_components/chromeos/bluetooth_dialog.html"> <link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html"> <link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html"> +<link rel="import" href="chrome://resources/cr_elements/shared_style_css.html"> <link rel="import" href="chrome://resources/html/i18n_behavior.html"> <link rel="import" href="chrome://resources/html/list_property_update_behavior.html"> +<link rel="import" href="chrome://resources/polymer/v1_0/iron-flex-layout/iron-flex-layout-classes.html"> <link rel="import" href="chrome://resources/polymer/v1_0/iron-list/iron-list.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html"> <link rel="import" href="../../i18n_setup.html"> @@ -16,7 +18,7 @@ <dom-module id="settings-bluetooth-subpage"> <template> - <style include="settings-shared iron-flex"> + <style include="cr-shared settings-shared iron-flex"> .container { @apply --settings-list-frame-padding; display: flex; @@ -25,12 +27,9 @@ overflow-y: auto; } - .header { - margin-top: 10px; - } - paper-spinner-lite { height: var(--cr-icon-size); + margin-block-start: 18px; /* Align with h2. */ width: var(--cr-icon-size); } @@ -43,8 +42,8 @@ } </style> - <div class="settings-box first" actionable on-click="onEnableTap_"> - <div id="onOff" class="start settings-box-text" + <div class="cr-row first" actionable on-click="onEnableTap_"> + <div id="onOff" class="flex cr-padded-text" on$="[[bluetoothToggleState]]" aria-hidden="true"> [[getOnOffString_(bluetoothToggleState, '$i18nPolymer{deviceOn}', '$i18nPolymer{deviceOff}')]] @@ -58,12 +57,10 @@ </div> <!-- Paired device list --> - <div class="settings-box first header" hidden="[[!bluetoothToggleState]]"> - <div class="start settings-box-text"> - $i18n{bluetoothDeviceListPaired} - </div> + <div class="cr-row first" hidden="[[!bluetoothToggleState]]"> + <h2 class="flex">$i18n{bluetoothDeviceListPaired}</h2> </div> - <div id="noPairedDevices" class="list-frame settings-box-text" + <div id="noPairedDevices" class="list-frame cr-padded-text" hidden="[[!showNoDevices_(bluetoothToggleState, pairedDeviceList_, pairedDeviceList_.splices)]]"> $i18n{bluetoothNoDevices} @@ -85,14 +82,12 @@ </div> <!-- Unpaired device list --> - <div class="settings-box first header" hidden="[[!bluetoothToggleState]]"> - <div class="start settings-box-text"> - $i18n{bluetoothDeviceListUnpaired} - </div> + <div class="cr-row first" hidden="[[!bluetoothToggleState]]"> + <h2 class="flex">$i18n{bluetoothDeviceListUnpaired}</h2> <paper-spinner-lite active="[[showSpinner_]]"> </paper-spinner-lite> </div> - <div id="noUnpairedDevices" class="list-frame settings-box-text" + <div id="noUnpairedDevices" class="list-frame cr-padded-text" hidden="[[!showNoDevices_(bluetoothToggleState, unpairedDeviceList_, unpairedDeviceList_.splices)]]"> $i18n{bluetoothNoDevicesFound}
diff --git a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html index 0c464dc..07762324 100644 --- a/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html +++ b/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.html
@@ -18,15 +18,9 @@ <dom-module id="settings-date-time-page"> <template> <style include="settings-shared"> - #timeZoneAutoDetect { - padding: 0; - width: 100%; - } - #timeZoneButton { - display: flex; - flex-direction: column; - justify-content: center; - width: 100%; + #timezoneSelectorContainer { + padding-block-end: var(--cr-section-vertical-padding); + padding-inline-start: var(--cr-section-indent-padding); } </style> <settings-animated-pages id="pages" section="dateTime" @@ -35,13 +29,10 @@ <template is="dom-if" if="[[!prefs.cros.flags.fine_grained_time_zone_detection_enabled.value]]" restamp> - <div class="settings-box first"> - <settings-toggle-button id="timeZoneAutoDetect" - class="hr" - label="$i18n{timeZoneGeolocation}" - pref="{{prefs.generated.resolve_timezone_by_geolocation_on_off}}"> - </settings-toggle-button> - </div> + <settings-toggle-button id="timeZoneAutoDetect" + label="$i18n{timeZoneGeolocation}" + pref="{{prefs.generated.resolve_timezone_by_geolocation_on_off}}"> + </settings-toggle-button> </template> <template is="dom-if" if="[[prefs.cros.flags.fine_grained_time_zone_detection_enabled.value]]" @@ -56,7 +47,7 @@ </cr-policy-pref-indicator> </cr-link-row> </template> - <div class="settings-box continuation embedded" + <div id="timezoneSelectorContainer" hidden="[[prefs.cros.flags.fine_grained_time_zone_detection_enabled.value]]"> <timezone-selector prefs="{{prefs}}" active-time-zone-display-name="{{activeTimeZoneDisplayName}}">
diff --git a/chrome/browser/resources/settings/lazy_load.js b/chrome/browser/resources/settings/lazy_load.js index a032170..f0586484 100644 --- a/chrome/browser/resources/settings/lazy_load.js +++ b/chrome/browser/resources/settings/lazy_load.js
@@ -40,7 +40,7 @@ import './downloads_page/downloads_page.m.js'; import './languages_page/languages_page.m.js'; import './printing_page/printing_page.m.js'; -import './reset_page/reset_page.m.js'; +import './reset_page/reset_page.js'; // <if expr="not chromeos"> import './system_page/system_page.m.js'; // </if>
diff --git a/chrome/browser/resources/settings/reset_page/BUILD.gn b/chrome/browser/resources/settings/reset_page/BUILD.gn index 31c4ec67..1e0e522 100644 --- a/chrome/browser/resources/settings/reset_page/BUILD.gn +++ b/chrome/browser/resources/settings/reset_page/BUILD.gn
@@ -4,10 +4,11 @@ import("//third_party/closure_compiler/compile_js.gni") import("//tools/polymer/polymer.gni") -import("//ui/webui/resources/tools/js_modulizer.gni") import("../settings.gni") -js_type_check("closure_compile") { +js_type_check("closure_compile_module") { + is_polymer3 = true + closure_flags = settings_closure_flags deps = [ ":reset_browser_proxy", ":reset_page", @@ -16,64 +17,13 @@ ] } +js_library("reset_browser_proxy") { + deps = [ "//ui/webui/resources/js:cr.m" ] +} + js_library("reset_page") { deps = [ ":reset_profile_dialog", - "..:route", - "..:router", - "//ui/webui/resources/cr_elements/cr_lazy_render:cr_lazy_render", - "//ui/webui/resources/js:assert", - "//ui/webui/resources/js:cr", - "//ui/webui/resources/js:load_time_data", - "//ui/webui/resources/js/cr/ui:focus_without_ink", - ] -} - -js_library("reset_browser_proxy") { - deps = [ "//ui/webui/resources/js:cr" ] - externs_list = [ "$externs_path/chrome_send.js" ] -} - -js_library("reset_profile_dialog") { - deps = [ - ":reset_browser_proxy", - "..:route", - "//ui/webui/resources/js:load_time_data", - "//ui/webui/resources/js:web_ui_listener_behavior", - ] -} - -js_library("reset_profile_banner") { - deps = [ - ":reset_browser_proxy", - "..:route", - "..:router", - "//ui/webui/resources/cr_elements/cr_dialog", - "//ui/webui/resources/js:load_time_data", - "//ui/webui/resources/js:web_ui_listener_behavior", - ] -} - -js_type_check("closure_compile_module") { - is_polymer3 = true - deps = [ - ":reset_browser_proxy.m", - ":reset_page.m", - ":reset_profile_banner.m", - ":reset_profile_dialog.m", - ] -} - -js_library("reset_browser_proxy.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_browser_proxy.m.js" ] - deps = [ "//ui/webui/resources/js:cr.m" ] - extra_deps = [ ":modulize" ] -} - -js_library("reset_page.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_page.m.js" ] - deps = [ - ":reset_profile_dialog.m", "..:route.m", "..:router.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", @@ -84,10 +34,9 @@ extra_deps = [ ":reset_page_module" ] } -js_library("reset_profile_banner.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_profile_banner.m.js" ] +js_library("reset_profile_banner") { deps = [ - ":reset_browser_proxy.m", + ":reset_browser_proxy", "..:route.m", "..:router.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", @@ -96,10 +45,9 @@ extra_deps = [ ":reset_profile_banner_module" ] } -js_library("reset_profile_dialog.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/settings/reset_page/reset_profile_dialog.m.js" ] +js_library("reset_profile_dialog") { deps = [ - ":reset_browser_proxy.m", + ":reset_browser_proxy", "..:route.m", "..:router.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", @@ -111,7 +59,6 @@ group("polymer3_elements") { public_deps = [ - ":modulize", ":reset_page_module", ":reset_profile_banner_module", ":reset_profile_dialog_module", @@ -121,41 +68,17 @@ polymer_modulizer("reset_page") { js_file = "reset_page.js" html_file = "reset_page.html" - html_type = "dom-module" - namespace_rewrites = settings_namespace_rewrites - auto_imports = settings_auto_imports + [ - "ui/webui/resources/html/assert.html|assert", - "chrome/browser/resources/settings/reset_page/reset_browser_proxy.html|ResetBrowserProxyImpl", - "chrome/browser/resources/settings/router.html|Router,Route,RouteObserverBehavior", - "chrome/browser/resources/settings/route.html|routes", - ] + html_type = "v3-ready" } polymer_modulizer("reset_profile_banner") { js_file = "reset_profile_banner.js" html_file = "reset_profile_banner.html" - html_type = "dom-module" - namespace_rewrites = settings_namespace_rewrites - auto_imports = settings_auto_imports + [ - "chrome/browser/resources/settings/reset_page/reset_browser_proxy.html|ResetBrowserProxyImpl", - "chrome/browser/resources/settings/router.html|Router", - "chrome/browser/resources/settings/route.html|routes", - ] + html_type = "v3-ready" } polymer_modulizer("reset_profile_dialog") { js_file = "reset_profile_dialog.js" html_file = "reset_profile_dialog.html" - html_type = "dom-module" - namespace_rewrites = settings_namespace_rewrites - auto_imports = settings_auto_imports + [ - "chrome/browser/resources/settings/reset_page/reset_browser_proxy.html|ResetBrowserProxyImpl,ResetBrowserProxy", - "chrome/browser/resources/settings/router.html|Router", - "chrome/browser/resources/settings/route.html|routes", - ] -} - -js_modulizer("modulize") { - input_files = [ "reset_browser_proxy.js" ] - namespace_rewrites = settings_namespace_rewrites + html_type = "v3-ready" }
diff --git a/chrome/browser/resources/settings/reset_page/reset_browser_proxy.js b/chrome/browser/resources/settings/reset_page/reset_browser_proxy.js index 49d09ca..c6f2a0ab 100644 --- a/chrome/browser/resources/settings/reset_page/reset_browser_proxy.js +++ b/chrome/browser/resources/settings/reset_page/reset_browser_proxy.js
@@ -3,12 +3,11 @@ // found in the LICENSE file. // clang-format off -// #import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js'; +import {addSingletonGetter, sendWithPromise} from 'chrome://resources/js/cr.m.js'; // clang-format on -cr.define('settings', function() { /** @interface */ - /* #export */ class ResetBrowserProxy { + export class ResetBrowserProxy { /** * @param {boolean} sendSettings Whether the user gave consent to upload * broken settings to Google for analysis. @@ -16,7 +15,6 @@ * @return {!Promise} A promise firing once resetting has completed. */ performResetProfileSettings(sendSettings, requestOrigin) {} - /** * A method to be called when the reset profile dialog is hidden. */ @@ -59,12 +57,12 @@ } /** - * @implements {settings.ResetBrowserProxy} + * @implements {ResetBrowserProxy} */ - /* #export */ class ResetBrowserProxyImpl { + export class ResetBrowserProxyImpl { /** @override */ performResetProfileSettings(sendSettings, requestOrigin) { - return cr.sendWithPromise( + return sendWithPromise( 'performResetProfileSettings', sendSettings, requestOrigin); } @@ -85,7 +83,7 @@ /** @override */ showReportedSettings() { - cr.sendWithPromise('getReportedSettings').then(function(settings) { + sendWithPromise('getReportedSettings').then(function(settings) { const output = settings.map(function(entry) { return entry.key + ': ' + entry.value.replace(/\n/g, ', '); }); @@ -99,7 +97,7 @@ /** @override */ getTriggeredResetToolName() { - return cr.sendWithPromise('getTriggeredResetToolName'); + return sendWithPromise('getTriggeredResetToolName'); } // <if expr="chromeos"> @@ -115,11 +113,4 @@ // </if> } - cr.addSingletonGetter(ResetBrowserProxyImpl); - - // #cr_define_end - return { - ResetBrowserProxy: ResetBrowserProxy, - ResetBrowserProxyImpl: ResetBrowserProxyImpl, - }; -}); + addSingletonGetter(ResetBrowserProxyImpl);
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.html b/chrome/browser/resources/settings/reset_page/reset_page.html index 72f19a1..898dfc5 100644 --- a/chrome/browser/resources/settings/reset_page/reset_page.html +++ b/chrome/browser/resources/settings/reset_page/reset_page.html
@@ -1,22 +1,3 @@ -<link rel="import" href="chrome://resources/html/polymer.html"> - -<link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html"> -<link rel="import" href="chrome://resources/html/assert.html"> -<link rel="import" href="chrome://resources/html/cr/ui/focus_without_ink.html"> -<link rel="import" href="../i18n_setup.html"> -<link rel="import" href="reset_profile_dialog.html"> -<link rel="import" href="../route.html"> -<link rel="import" href="../router.html"> -<link rel="import" href="../settings_page/settings_animated_pages.html"> -<link rel="import" href="../settings_shared_css.html"> - -<if expr="_google_chrome and is_win"> -<link rel="import" href="../chrome_cleanup_page/chrome_cleanup_page.html"> -<link rel="import" href="../incompatible_applications_page/incompatible_applications_page.html"> -</if> - -<dom-module id="settings-reset-page"> - <template> <style include="settings-shared"></style> <settings-animated-pages id="reset-pages" section="reset"> <div route-path="default"> @@ -67,6 +48,3 @@ </template> </if> </settings-animated-pages> - </template> - <script src="reset_page.js"></script> -</dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/reset_page.js b/chrome/browser/resources/settings/reset_page/reset_page.js index 0df1c09c..fd0fecc 100644 --- a/chrome/browser/resources/settings/reset_page/reset_page.js +++ b/chrome/browser/resources/settings/reset_page/reset_page.js
@@ -7,10 +7,31 @@ * 'settings-reset-page' is the settings page containing reset * settings. */ +import 'chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.m.js'; +import './reset_profile_dialog.js'; +import '../settings_page/settings_animated_pages.m.js'; +import '../settings_shared_css.m.js'; + +// <if expr="_google_chrome and is_win"> +import '../chrome_cleanup_page/chrome_cleanup_page.m.js'; +import '../incompatible_applications_page/incompatible_applications_page.m.js'; +// </if> + +import {assert} from 'chrome://resources/js/assert.m.js'; +import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js'; +import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {loadTimeData} from '../i18n_setup.m.js'; +import {routes} from '../route.m.js'; +import {Route, RouteObserverBehavior, Router} from '../router.m.js'; + + Polymer({ is: 'settings-reset-page', - behaviors: [settings.RouteObserverBehavior], + _template: html`{__html_template__}`, + + behaviors: [RouteObserverBehavior], properties: { /** Preferences state. */ @@ -28,16 +49,16 @@ }, /** - * settings.RouteObserverBehavior - * @param {!settings.Route} route + * RouteObserverBehavior + * @param {!Route} route * @protected */ currentRouteChanged(route) { const lazyRender = /** @type {!CrLazyRenderElement} */ (this.$.resetProfileDialog); - if (route == settings.routes.TRIGGERED_RESET_DIALOG || - route == settings.routes.RESET_DIALOG) { + if (route == routes.TRIGGERED_RESET_DIALOG || + route == routes.RESET_DIALOG) { /** @type {!SettingsResetProfileDialogElement} */ (lazyRender.get()) .show(); } else { @@ -51,26 +72,25 @@ /** @private */ onShowResetProfileDialog_() { - settings.Router.getInstance().navigateTo( - settings.routes.RESET_DIALOG, new URLSearchParams('origin=userclick')); + Router.getInstance().navigateTo( + routes.RESET_DIALOG, new URLSearchParams('origin=userclick')); }, /** @private */ onResetProfileDialogClose_() { - settings.Router.getInstance().navigateToPreviousRoute(); - cr.ui.focusWithoutInk(assert(this.$.resetProfile)); + Router.getInstance().navigateToPreviousRoute(); + focusWithoutInk(assert(this.$.resetProfile)); }, // <if expr="_google_chrome and is_win"> /** @private */ onChromeCleanupTap_() { - settings.Router.getInstance().navigateTo(settings.routes.CHROME_CLEANUP); + Router.getInstance().navigateTo(routes.CHROME_CLEANUP); }, /** @private */ onIncompatibleApplicationsTap_() { - settings.Router.getInstance().navigateTo( - settings.routes.INCOMPATIBLE_APPLICATIONS); + Router.getInstance().navigateTo(routes.INCOMPATIBLE_APPLICATIONS); }, // </if> });
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_banner.html b/chrome/browser/resources/settings/reset_page/reset_profile_banner.html index 969e73f6..eb63d31b 100644 --- a/chrome/browser/resources/settings/reset_page/reset_profile_banner.html +++ b/chrome/browser/resources/settings/reset_page/reset_profile_banner.html
@@ -1,13 +1,3 @@ -<link rel="import" href="chrome://resources/html/polymer.html"> - -<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> -<link rel="import" href="reset_browser_proxy.html"> -<link rel="import" href="../route.html"> -<link rel="import" href="../router.html"> - -<dom-module id="settings-reset-profile-banner"> - <template> <style include="settings-shared"></style> <cr-dialog id="dialog" close-text="$i18n{close}" ignore-popstate> <div slot="title">$i18n{resetAutomatedDialogTitle}</div> @@ -28,6 +18,3 @@ </cr-button> </div> </cr-dialog> - </template> - <script src="reset_profile_banner.js"></script> -</dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_banner.js b/chrome/browser/resources/settings/reset_page/reset_profile_banner.js index c3c4f39..8bcd43b 100644 --- a/chrome/browser/resources/settings/reset_page/reset_profile_banner.js +++ b/chrome/browser/resources/settings/reset_page/reset_profile_banner.js
@@ -7,10 +7,22 @@ * 'settings-reset-profile-banner' is the banner shown for prompting the user to * clear profile settings. */ +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; +import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; + +import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {routes} from '../route.m.js'; +import {Router} from '../router.m.js'; + +import {ResetBrowserProxyImpl} from './reset_browser_proxy.js'; + Polymer({ // TODO(dpapad): Rename to settings-reset-warning-dialog. is: 'settings-reset-profile-banner', + _template: html`{__html_template__}`, + listeners: { 'cancel': 'onCancel_', }, @@ -27,12 +39,12 @@ /** @private */ onCancel_() { - settings.ResetBrowserProxyImpl.getInstance().onHideResetProfileBanner(); + ResetBrowserProxyImpl.getInstance().onHideResetProfileBanner(); }, /** @private */ onResetTap_() { this.$.dialog.close(); - settings.Router.getInstance().navigateTo(settings.routes.RESET_DIALOG); + Router.getInstance().navigateTo(routes.RESET_DIALOG); }, });
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html index e022dc0..2f4ec75 100644 --- a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html +++ b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.html
@@ -1,20 +1,3 @@ -<link rel="import" href="chrome://resources/html/polymer.html"> - -<link rel="import" href="chrome://resources/cr_elements/cr_button/cr_button.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_dialog/cr_dialog.html"> -<link rel="import" href="chrome://resources/html/action_link.html"> -<link rel="import" href="chrome://resources/cr_elements/action_link_css.html"> -<link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html"> -<link rel="import" href="reset_browser_proxy.html"> -<link rel="import" href="../i18n_setup.html"> -<link rel="import" href="../route.html"> -<link rel="import" href="../router.html"> -<link rel="import" href="../settings_shared_css.html"> - -<dom-module id="settings-reset-profile-dialog"> - <template> <style include="settings-shared action-link"> paper-spinner-lite { margin: 0 8px; @@ -55,6 +38,3 @@ $i18nRaw{resetPageFeedback}</cr-checkbox> </div> </cr-dialog> - </template> - <script src="reset_profile_dialog.js"></script> -</dom-module>
diff --git a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js index 520a96c..91fcd118 100644 --- a/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js +++ b/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js
@@ -10,9 +10,28 @@ * circumstances. See triggered_profile_resetter.h for when the triggered * variant will be used. */ +import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; +import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; +import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; +import 'chrome://resources/js/action_link.js'; +import 'chrome://resources/cr_elements/action_link_css.m.js'; +import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; +import '../settings_shared_css.m.js'; + +import {WebUIListenerBehavior} from 'chrome://resources/js/web_ui_listener_behavior.m.js'; +import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {loadTimeData} from '../i18n_setup.m.js'; +import {routes} from '../route.m.js'; +import {Router} from '../router.m.js'; + +import {ResetBrowserProxy, ResetBrowserProxyImpl} from './reset_browser_proxy.js'; + Polymer({ is: 'settings-reset-profile-dialog', + _template: html`{__html_template__}`, + behaviors: [WebUIListenerBehavior], properties: { @@ -41,7 +60,7 @@ }, }, - /** @private {?settings.ResetBrowserProxy} */ + /** @private {?ResetBrowserProxy} */ browserProxy_: null, /** @@ -70,7 +89,7 @@ /** @override */ ready() { - this.browserProxy_ = settings.ResetBrowserProxyImpl.getInstance(); + this.browserProxy_ = ResetBrowserProxyImpl.getInstance(); this.addEventListener('cancel', () => { this.browserProxy_.onHideResetProfileDialog(); @@ -89,8 +108,8 @@ }, show() { - this.isTriggered_ = settings.Router.getInstance().getCurrentRoute() == - settings.routes.TRIGGERED_RESET_DIALOG; + this.isTriggered_ = + Router.getInstance().getCurrentRoute() == routes.TRIGGERED_RESET_DIALOG; if (this.isTriggered_) { this.browserProxy_.getTriggeredResetToolName().then(name => { this.resetRequestOrigin_ = 'triggeredreset'; @@ -103,7 +122,7 @@ // with the startup URL chrome://settings/resetProfileSettings#cct. const origin = window.location.hash.slice(1).toLowerCase() == 'cct' ? 'cct' : - settings.Router.getInstance().getQueryParameters().get('origin'); + Router.getInstance().getQueryParameters().get('origin'); this.resetRequestOrigin_ = origin || ''; this.showDialog_(); }
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 85ea803..a00ca55 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
@@ -76,7 +76,7 @@ <cr-icon-button id="safetyCheckParentIconButton" iron-icon="settings:refresh" on-click="onRunSafetyCheckClick_" - aria-label="$i18n{safetyCheckParentButtonAriaLabel}"> + aria-label="$i18n{safetyCheckParentButtonAriaLabelReload}"> </cr-icon-button> </template> </div>
diff --git a/chrome/browser/resources/settings/settings.gni b/chrome/browser/resources/settings/settings.gni index e3ba931f..ca8133cb2 100644 --- a/chrome/browser/resources/settings/settings.gni +++ b/chrome/browser/resources/settings/settings.gni
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//third_party/closure_compiler/compile_js.gni") + # Common namespace rewrites for all polymer_modulizer() or js_modulizer() # targets in Settings. settings_namespace_rewrites = [ @@ -134,3 +136,12 @@ "chrome/browser/resources/settings/printing_page/printing_browser_proxy.html|PrintingBrowserProxyImpl", "chrome/browser/resources/settings/site_settings/site_settings_behavior.html|SiteSettingsBehavior", ] + +settings_closure_flags = + default_closure_args + [ + "js_module_root=../../chrome/browser/resources/settings/", + "js_module_root=./gen/chrome/browser/resources/settings/", + ] + +settings_migrated_imports = + [ "chrome/browser/resources/settings/reset_page/reset_profile_banner.html" ]
diff --git a/chrome/browser/resources/settings/settings.js b/chrome/browser/resources/settings/settings.js index b881c69..fe42306 100644 --- a/chrome/browser/resources/settings/settings.js +++ b/chrome/browser/resources/settings/settings.js
@@ -32,7 +32,7 @@ export {prefToString, stringToPrefValue} from './prefs/pref_util.m.js'; export {CrSettingsPrefs} from './prefs/prefs_types.m.js'; export {PrivacyPageBrowserProxyImpl, SecureDnsMode, SecureDnsUiManagementMode} from './privacy_page/privacy_page_browser_proxy.m.js'; -export {ResetBrowserProxyImpl} from './reset_page/reset_browser_proxy.m.js'; +export {ResetBrowserProxyImpl} from './reset_page/reset_browser_proxy.js'; export {buildRouter, routes} from './route.m.js'; export {Route, Router} from './router.m.js'; export {SafetyCheckBrowserProxy, SafetyCheckBrowserProxyImpl, SafetyCheckCallbackConstants, SafetyCheckExtensionsStatus, SafetyCheckPasswordsStatus, SafetyCheckSafeBrowsingStatus, SafetyCheckUpdatesStatus} from './safety_check_page/safety_check_browser_proxy.m.js';
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index fa85779..f0e956c8 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -15,497 +15,24 @@ <part file="settings_resources_v3.grdp" /> </includes> <structures> - <structure name="IDR_SETTINGS_A11Y_PAGE_JS" - file="a11y_page/a11y_page.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_A11Y_PAGE_HTML" - file="a11y_page/a11y_page.html" - type="chrome_html" - preprocess="true" /> - - <if expr="not is_macosx and not chromeos"> - <structure name="IDR_SETTINGS_CAPTIONS_SUBPAGE_HTML" - file="a11y_page/captions_subpage.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CAPTIONS_SUBPAGE_JS" - file="a11y_page/captions_subpage.js" - type="chrome_html" /> - </if> - <if expr="is_win or is_macosx"> - <structure name="IDR_SETTINGS_CAPTIONS_BROWSER_PROXY_HTML" - file="a11y_page/captions_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CAPTIONS_BROWSER_PROXY_JS" - file="a11y_page/captions_browser_proxy.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_HTML" - file="about_page/about_page_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ABOUT_PAGE_BROWSER_PROXY_JS" - file="about_page/about_page_browser_proxy.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_ABOUT_PAGE_JS" - file="about_page/about_page.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_ABOUT_PAGE_HTML" - file="about_page/about_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_ADD_SITE_DIALOG_HTML" - file="site_settings/add_site_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ADD_SITE_DIALOG_JS" - file="site_settings/add_site_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ALL_SITES_HTML" - file="site_settings/all_sites.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ALL_SITES_JS" - file="site_settings/all_sites.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_ALL_SITES_ICONS_HTML" - file="site_settings/all_sites_icons.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_ENTRY_HTML" - file="site_settings/site_entry.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_ENTRY_JS" - file="site_settings/site_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CLEAR_STORAGE_DIALOG_CSS" - file="site_settings/clear_storage_dialog_css.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CATEGORY_DEFAULT_SETTING_HTML" - file="site_settings/category_default_setting.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CATEGORY_DEFAULT_SETTING_JS" - file="site_settings/category_default_setting.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CATEGORY_SETTING_EXCEPTIONS_HTML" - file="site_settings/category_setting_exceptions.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CATEGORY_SETTING_EXCEPTIONS_JS" - file="site_settings/category_setting_exceptions.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_HTML" - file="site_settings/chooser_exception_list.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_JS" - file="site_settings/chooser_exception_list.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_ENTRY_HTML" - file="site_settings/chooser_exception_list_entry.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHOOSER_EXCEPTION_LIST_ENTRY_JS" - file="site_settings/chooser_exception_list_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_ANIMATED_PAGES_HTML" - file="settings_page/settings_animated_pages.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_ANIMATED_PAGES_JS" - file="settings_page/settings_animated_pages.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_APPEARANCE_BROWSER_PROXY_HTML" - file="appearance_page/appearance_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_APPEARANCE_BROWSER_PROXY_JS" - file="appearance_page/appearance_browser_proxy.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_APPEARANCE_FONTS_PAGE_HTML" - file="appearance_page/appearance_fonts_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_APPEARANCE_FONTS_PAGE_JS" - file="appearance_page/appearance_fonts_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_APPEARANCE_PAGE_HTML" - file="appearance_page/appearance_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_APPEARANCE_PAGE_JS" - file="appearance_page/appearance_page.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_APPEARANCE_HOME_URL_INPUT_HTML" - file="appearance_page/home_url_input.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_APPEARANCE_HOME_URL_INPUT_JS" - file="appearance_page/home_url_input.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_BASIC_PAGE_JS" - file="basic_page/basic_page.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_BASIC_PAGE_HTML" - file="basic_page/basic_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_EDIT_EXCEPTION_DIALOG_HTML" - file="site_settings/edit_exception_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_EDIT_EXCEPTION_DIALOG_JS" - file="site_settings/edit_exception_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_JS" - file="extension_control_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_EXTENSION_CONTROL_BROWSER_PROXY_HTML" - file="extension_control_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_FONTS_BROWSER_PROXY_HTML" - file="appearance_page/fonts_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_FONTS_BROWSER_PROXY_JS" - file="appearance_page/fonts_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LIFETIME_BROWSER_PROXY_HTML" - file="lifetime_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LIFETIME_BROWSER_PROXY_JS" - file="lifetime_browser_proxy.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_ON_STARTUP_BROWSER_PROXY_HTML" - file="on_startup_page/on_startup_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ON_STARTUP_BROWSER_PROXY_JS" - file="on_startup_page/on_startup_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ON_STARTUP_PAGE_HTML" - file="on_startup_page/on_startup_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ON_STARTUP_PAGE_JS" - file="on_startup_page/on_startup_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_SETTINGS_HTML" - file="search_settings.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_SETTINGS_JS" - file="search_settings.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_HTML" - file="on_startup_page/startup_urls_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_JS" - file="on_startup_page/startup_urls_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_BROWSER_PROXY_JS" - file="on_startup_page/startup_urls_page_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URLS_PAGE_BROWSER_PROXY_HTML" - file="on_startup_page/startup_urls_page_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URL_DIALOG_JS" - file="on_startup_page/startup_url_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URL_DIALOG_HTML" - file="on_startup_page/startup_url_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URL_ENTRY_JS" - file="on_startup_page/startup_url_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_STARTUP_URL_ENTRY_HTML" - file="on_startup_page/startup_url_entry.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_MAIN_HTML" - file="settings_main/settings_main.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_MAIN_JS" - file="settings_main/settings_main.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_MENU_HTML" - file="settings_menu/settings_menu.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_MENU_JS" - file="settings_menu/settings_menu.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_SECTION_HTML" - file="settings_page/settings_section.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_SECTION_JS" - file="settings_page/settings_section.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_SUBPAGE_HTML" - file="settings_page/settings_subpage.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_SUBPAGE_JS" - file="settings_page/settings_subpage.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_PAGE_CSS_HTML" - file="settings_page_css.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_MAIN_PAGE_BEHAVIOR_HTML" - file="settings_page/main_page_behavior.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_MAIN_PAGE_BEHAVIOR_JS" - file="settings_page/main_page_behavior.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SETTINGS_VARS_CSS_HTML" - file="settings_vars_css.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SETTINGS_SHARED_CSS_HTML" - file="settings_shared_css.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_UI_HTML" - file="settings_ui/settings_ui.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CR_SETTINGS_UI_JS" - file="settings_ui/settings_ui.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_HTML" - file="global_scroll_target_behavior.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_GLOBAL_SCROLL_TARGET_BEHAVIOR_JS" - file="global_scroll_target_behavior.js" - type="chrome_html" /> - <if expr="is_win"> - <structure name="IDR_SETTINGS_CHROME_CLEANUP_PROXY_HTML" - file="chrome_cleanup_page/chrome_cleanup_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHROME_CLEANUP_PROXY_JS" - file="chrome_cleanup_page/chrome_cleanup_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHROME_CLEANUP_PAGE_HTML" - file="chrome_cleanup_page/chrome_cleanup_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CHROME_CLEANUP_PAGE_JS" - file="chrome_cleanup_page/chrome_cleanup_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CHROME_CLEANUP_ITEMS_TO_REMOVE_LIST_HTML" - file="chrome_cleanup_page/items_to_remove_list.html" - type="chrome_html"/> - <structure name="IDR_SETTINGS_CHROME_CLEANUP_ITEMS_TO_REMOVE_LIST_JS" - file="chrome_cleanup_page/items_to_remove_list.js" - type="chrome_html"/> - </if> - <if expr="is_win and _google_chrome"> - <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_PAGE_HTML" - file="incompatible_applications_page/incompatible_applications_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_PAGE_JS" - file="incompatible_applications_page/incompatible_applications_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_BROWSER_PROXY_HTML" - file="incompatible_applications_page/incompatible_applications_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_BROWSER_PROXY_JS" - file="incompatible_applications_page/incompatible_applications_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_INCOMPATIBLE_APPLICATION_ITEM_HTML" - file="incompatible_applications_page/incompatible_application_item.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_INCOMPATIBLE_APPLICATIONS_INCOMPATIBLE_APPLICATION_ITEM_JS" - file="incompatible_applications_page/incompatible_application_item.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_BROWSER_PROXY_HTML" - file="clear_browsing_data_dialog/clear_browsing_data_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_BROWSER_PROXY_JS" - file="clear_browsing_data_dialog/clear_browsing_data_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_HTML" - file="clear_browsing_data_dialog/clear_browsing_data_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_DIALOG_JS" - file="clear_browsing_data_dialog/clear_browsing_data_dialog.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_INSTALLED_APP_CHECKBOX_HTML" - file="clear_browsing_data_dialog/installed_app_checkbox.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CLEAR_BROWSING_DATA_INSTALLED_APP_CHECKBOX_JS" - file="clear_browsing_data_dialog/installed_app_checkbox.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_HISTORY_DELETION_DIALOG_HTML" - file="clear_browsing_data_dialog/history_deletion_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_HISTORY_DELETION_DIALOG_JS" - file="clear_browsing_data_dialog/history_deletion_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_SUBPAGE_HTML" - file="privacy_page/security_keys_subpage.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_SUBPAGE_JS" - file="privacy_page/security_keys_subpage.js" - type="chrome_html"/> - <structure name="IDR_SETTINGS_SECURITY_KEYS_SET_PIN_DIALOG_HTML" - file="privacy_page/security_keys_set_pin_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_SET_PIN_DIALOG_JS" - file="privacy_page/security_keys_set_pin_dialog.js" - type="chrome_html"/> - <structure name="IDR_SETTINGS_SECURITY_KEYS_PIN_FIELD_HTML" - file="privacy_page/security_keys_pin_field.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_PIN_FIELD_JS" - file="privacy_page/security_keys_pin_field.js" - type="chrome_html"/> - <structure name="IDR_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_HTML" - file="privacy_page/security_keys_credential_management_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_CREDENTIAL_MANAGEMENT_DIALOG_JS" - file="privacy_page/security_keys_credential_management_dialog.js" - type="chrome_html"/> - <structure name="IDR_SETTINGS_SECURITY_KEYS_RESET_DIALOG_HTML" - file="privacy_page/security_keys_reset_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_RESET_DIALOG_JS" - file="privacy_page/security_keys_reset_dialog.js" - type="chrome_html"/> - <structure name="IDR_SETTINGS_SECURITY_KEYS_BIO_ENROLL_DIALOG_HTML" - file="privacy_page/security_keys_bio_enroll_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_BIO_ENROLL_DIALOG_JS" - file="privacy_page/security_keys_bio_enroll_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_BROWSER_PROXY_HTML" - file="privacy_page/security_keys_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_KEYS_BROWSER_PROXY_JS" - file="privacy_page/security_keys_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_BOOLEAN_CONTROL_BEHAVIOR_HTML" - file="controls/settings_boolean_control_behavior.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_BOOLEAN_CONTROL_BEHAVIOR_JS" - file="controls/settings_boolean_control_behavior.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_BUTTON_JS" - file="controls/controlled_button.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_BUTTON_HTML" - file="controls/controlled_button.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_JS" - file="controls/controlled_radio_button.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_CONTROLLED_RADIO_BUTTON_HTML" - file="controls/controlled_radio_button.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_JS" - file="controls/extension_controlled_indicator.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_EXTENSION_CONTROLLED_INDICATOR_HTML" - file="controls/extension_controlled_indicator.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_CHECKBOX_HTML" - file="controls/settings_checkbox.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_CHECKBOX_JS" - file="controls/settings_checkbox.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_DROPDOWN_MENU_HTML" - file="controls/settings_dropdown_menu.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_DROPDOWN_MENU_JS" - file="controls/settings_dropdown_menu.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_JS" - file="controls/password_prompt_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_PASSWORD_PROMPT_DIALOG_HTML" - file="controls/password_prompt_dialog.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_HTML" - file="controls/pref_control_behavior.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_PREF_CONTROL_BEHAVIOR_JS" - file="controls/pref_control_behavior.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_RADIO_GROUP_HTML" - file="controls/settings_radio_group.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_RADIO_GROUP_JS" - file="controls/settings_radio_group.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_HTML" - file="controls/settings_idle_load.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_SETTINGS_IDLE_LOAD_JS" - file="controls/settings_idle_load.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_SLIDER_HTML" - file="controls/settings_slider.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_SLIDER_JS" - file="controls/settings_slider.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_TEXTAREA_HTML" - file="controls/settings_textarea.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_TEXTAREA_JS" - file="controls/settings_textarea.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_TOGGLE_BUTTON_HTML" - file="controls/settings_toggle_button.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONTROLS_TOGGLE_BUTTON_JS" - file="controls/settings_toggle_button.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_COOKIE_INFO_HTML" - file="site_settings/cookie_info.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_COOKIE_INFO_JS" - file="site_settings/cookie_info.js" - type="chrome_html" /> - <if expr="not chromeos"> - <structure name="IDR_SETTINGS_DEFAULT_BROWSER_BROWSER_PROXY_HTML" - file="default_browser_page/default_browser_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DEFAULT_BROWSER_BROWSER_PROXY_JS" - file="default_browser_page/default_browser_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DEFAULT_BROWSER_PAGE_HTML" - file="default_browser_page/default_browser_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_DEFAULT_BROWSER_PAGE_JS" - file="default_browser_page/default_browser_page.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_DOWNLOADS_BROWSER_PROXY_HTML" - file="downloads_page/downloads_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DOWNLOADS_BROWSER_PROXY_JS" - file="downloads_page/downloads_browser_proxy.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_HTML" - file="downloads_page/downloads_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_JS" - file="downloads_page/downloads_page.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_I18n_SETUP_HTML" - file="i18n_setup.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ICONS" - file="icons.html" - type="chrome_html" - preprocess="true" /> <structure name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_SVG" file="images/cookies_banner.svg" type="chrome_html" /> <structure name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_DARK_SVG" file="images/cookies_banner_dark.svg" type="chrome_html" /> + <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_SVG" + file="images/password_check_neutral.svg" + type="chrome_html" /> + <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_DARK_SVG" + file="images/password_check_neutral_dark.svg" + type="chrome_html" /> + <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_SVG" + file="images/password_check_positive.svg" + type="chrome_html" /> + <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_DARK_SVG" + file="images/password_check_positive_dark.svg" + type="chrome_html" /> <structure name="IDR_SETTINGS_IMAGES_PERMISSIONS_BANNER_SVG" file="images/permissions_banner.svg" type="chrome_html" /> @@ -524,707 +51,6 @@ <structure name="IDR_SETTINGS_IMAGES_SYNC_BANNER_DARK_SVG" file="images/sync_banner_dark.svg" type="chrome_html" /> - <structure name="IDR_SETTINGS_RESET_PAGE_HTML" - file="reset_page/reset_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_RESET_PAGE_JS" - file="reset_page/reset_page.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_HTML" - file="reset_page/reset_profile_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_RESET_PROFILE_DIALOG_JS" - file="reset_page/reset_profile_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_RESET_PROFILE_BANNER_HTML" - file="reset_page/reset_profile_banner.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_RESET_PROFILE_BANNER_JS" - file="reset_page/reset_profile_banner.js" - type="chrome_html"/> - <structure name="IDR_SETTINGS_RESET_BROWSER_PROXY_JS" - file="reset_page/reset_browser_proxy.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_RESET_BROWSER_PROXY_HTML" - file="reset_page/reset_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_HTML" - file="languages_page/languages.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_JS" - file="languages_page/languages.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_LANGUAGES_BROWSER_PROXY_HTML" - file="languages_page/languages_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_BROWSER_PROXY_JS" - file="languages_page/languages_browser_proxy.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_HTML" - file="languages_page/add_languages_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_ADD_LANGUAGES_DIALOG_JS" - file="languages_page/add_languages_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_PAGE_HTML" - file="languages_page/languages_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_LANGUAGES_PAGE_JS" - file="languages_page/languages_page.js" - type="chrome_html" - preprocess="true" /> - <if expr="not is_macosx"> - <structure name="IDR_SETTINGS_LANGUAGES_EDIT_DICTIONARY_PAGE_HTML" - file="languages_page/edit_dictionary_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LANGUAGES_EDIT_DICTIONARY_PAGE_JS" - file="languages_page/edit_dictionary_page.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_MEDIA_PICKER_HTML" - file="site_settings/media_picker.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_MEDIA_PICKER_JS" - file="site_settings/media_picker.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_AUTOFILL_PAGE_HTML" - file="autofill_page/autofill_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_AUTOFILL_PAGE_JS" - file="autofill_page/autofill_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PAYMENTS_LIST_HTML" - file="autofill_page/payments_list.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PAYMENTS_LIST_JS" - file="autofill_page/payments_list.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CREDIT_CARD_LIST_ENTRY_HTML" - file="autofill_page/credit_card_list_entry.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CREDIT_CARD_LIST_ENTRY_JS" - file="autofill_page/credit_card_list_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_UPI_ID_LIST_ENTRY_HTML" - file="autofill_page/upi_id_list_entry.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_UPI_ID_LIST_ENTRY_JS" - file="autofill_page/upi_id_list_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORDS_SHARED_CSS_HTML" - file="autofill_page/passwords_shared_css.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CREDIT_CARD_EDIT_DIALOG_HTML" - file="autofill_page/credit_card_edit_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CREDIT_CARD_EDIT_DIALOG_JS" - file="autofill_page/credit_card_edit_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_AUTOFILL_SECTION_HTML" - file="autofill_page/autofill_section.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_AUTOFILL_SECTION_JS" - file="autofill_page/autofill_section.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ADDRESS_EDIT_DIALOG_HTML" - file="autofill_page/address_edit_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ADDRESS_EDIT_DIALOG_JS" - file="autofill_page/address_edit_dialog.js" - type="chrome_html" /> - <if expr="chromeos"> - <structure name="IDR_SETTINGS_BLOCKING_REQUEST_MANAGER_HTML" - file="autofill_page/blocking_request_manager.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_BLOCKING_REQUEST_MANAGER_JS" - file="autofill_page/blocking_request_manager.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_SHOW_PASSWORD_BEHAVIOR_HTML" - file="autofill_page/show_password_behavior.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SHOW_PASSWORD_BEHAVIOR_JS" - file="autofill_page/show_password_behavior.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_HTML" - file="autofill_page/password_check.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_JS" - file="autofill_page/password_check.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_BEHAVIOR_HTML" - file="autofill_page/password_check_behavior.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_BEHAVIOR_JS" - file="autofill_page/password_check_behavior.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_EDIT_DIALOG_HTML" - file="autofill_page/password_check_edit_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_EDIT_DIALOG_JS" - file="autofill_page/password_check_edit_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_LIST_ITEM_HTML" - file="autofill_page/password_check_list_item.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_CHECK_LIST_ITEM_JS" - file="autofill_page/password_check_list_item.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_LIST_ITEM_HTML" - file="autofill_page/password_list_item.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PASSWORD_LIST_ITEM_JS" - file="autofill_page/password_list_item.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_MANAGER_PROXY_HTML" - file="autofill_page/password_manager_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_MANAGER_PROXY_JS" - file="autofill_page/password_manager_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_SVG" - file="images/password_check_neutral.svg" - type="chrome_html" /> - <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_NEUTRAL_DARK_SVG" - file="images/password_check_neutral_dark.svg" - type="chrome_html" /> - <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_SVG" - file="images/password_check_positive.svg" - type="chrome_html" /> - <structure name="IDR_SETTINGS_IMAGES_PASSWORD_CHECK_POSITIVE_DARK_SVG" - file="images/password_check_positive_dark.svg" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORDS_SECTION_HTML" - file="autofill_page/passwords_section.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PASSWORDS_SECTION_JS" - file="autofill_page/passwords_section.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PASSWORD_EDIT_DIALOG_HTML" - file="autofill_page/password_edit_dialog.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PASSWORD_EDIT_DIALOG_JS" - file="autofill_page/password_edit_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORDS_EXPORT_DIALOG_HTML" - file="autofill_page/passwords_export_dialog.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PASSWORDS_EXPORT_DIALOG_JS" - file="autofill_page/passwords_export_dialog.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PASSWORD_REMOVE_CONFIRMATION_DIALOG_HTML" - file="autofill_page/password_remove_confirmation_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORD_REMOVE_CONFIRMATION_DIALOG_JS" - file="autofill_page/password_remove_confirmation_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PAYMENTS_SECTION_HTML" - file="autofill_page/payments_section.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PAYMENTS_SECTION_JS" - file="autofill_page/payments_section.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_HTML" - file="people_page/people_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_JS" - file="people_page/people_page.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_HTML" - file="people_page/sync_account_control.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_ACCOUNT_CONTROL_JS" - file="people_page/sync_account_control.js" - type="chrome_html" - preprocess="true" /> - <if expr="not chromeos"> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_DIALOG_HTML" - file="people_page/import_data_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_DIALOG_JS" - file="people_page/import_data_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_BROWSER_PROXY_HTML" - file="people_page/import_data_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_IMPORT_DATA_BROWSER_PROXY_JS" - file="people_page/import_data_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_HTML" - file="people_page/manage_profile.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_JS" - file="people_page/manage_profile.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_HTML" - file="people_page/manage_profile_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_MANAGE_PROFILE_BROWSER_PROXY_JS" - file="people_page/manage_profile_browser_proxy.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_HTML" - file="people_page/signout_dialog.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_SIGNOUT_DIALOG_JS" - file="people_page/signout_dialog.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_HTML" - file="people_page/profile_info_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_PROFILE_INFO_BROWSER_PROXY_JS" - file="people_page/profile_info_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_HTML" - file="people_page/sync_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_SYNC_BROWSER_PROXY_JS" - file="people_page/sync_browser_proxy.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PREF_UTIL_HTML" - file="prefs/pref_util.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PREF_UTIL_JS" - file="prefs/pref_util.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PREFS_HTML" - file="prefs/prefs.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PREFS_JS" - file="prefs/prefs.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PREFS_BEHAVIOR_HTML" - file="prefs/prefs_behavior.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PREFS_BEHAVIOR_JS" - file="prefs/prefs_behavior.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PREFS_TYPES_HTML" - file="prefs/prefs_types.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PREFS_TYPES_JS" - file="prefs/prefs_types.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PRINTING_PAGE_HTML" - file="printing_page/printing_page.html" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PRINTING_PAGE_JS" - file="printing_page/printing_page.js" - preprocess="true" - type="chrome_html" /> - <if expr="not chromeos"> - <structure name="IDR_SETTINGS_PRINTING_BROWSER_PROXY_HTML" - file="printing_page/printing_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PRINTING_BROWSER_PROXY_JS" - file="printing_page/printing_browser_proxy.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_CLOUD_PRINTING_PAGE_HTML" - file="printing_page/cloud_printers.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CLOUD_PRINTING_PAGE_JS" - file="printing_page/cloud_printers.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LOCAL_DATA_BROWSER_PROXY_HTML" - file="site_settings/local_data_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LOCAL_DATA_BROWSER_PROXY_JS" - file="site_settings/local_data_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_OPEN_WINDOW_PROXY_HTML" - file="open_window_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_OPEN_WINDOW_PROXY_JS" - file="open_window_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PLURAL_STRING_PROXY_HTML" - file="plural_string_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PLURAL_STRING_PROXY_JS" - file="plural_string_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PAGE_VISIBILITY_HTML" - file="page_visibility.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PAGE_VISIBILITY_JS" - file="page_visibility.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PDF_DOCUMENTS_HTML" - file="site_settings/pdf_documents.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PDF_DOCUMENTS_JS" - file="site_settings/pdf_documents.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_COOKIES_PAGE_HTML" - file="privacy_page/cookies_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_COOKIES_PAGE_JS" - file="privacy_page/cookies_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DO_NOT_TRACK_TOGGLE_HTML" - file="privacy_page/do_not_track_toggle.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DO_NOT_TRACK_TOGGLE_JS" - file="privacy_page/do_not_track_toggle.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PERSONALIZATION_OPTIONS_HTML" - file="privacy_page/personalization_options.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_PERSONALIZATION_OPTIONS_JS" - file="privacy_page/personalization_options.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORDS_LEAK_DETECTION_TOGGLE_HTML" - file="privacy_page/passwords_leak_detection_toggle.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PASSWORDS_LEAK_DETECTION_TOGGLE_JS" - file="privacy_page/passwords_leak_detection_toggle.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_COLLAPSE_RADIO_BUTTON_HTML" - file="privacy_page/collapse_radio_button.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_COLLAPSE_RADIO_BUTTON_JS" - file="privacy_page/collapse_radio_button.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURE_DNS_HTML" - file="privacy_page/secure_dns.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURE_DNS_JS" - file="privacy_page/secure_dns.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURE_DNS_INPUT_HTML" - file="privacy_page/secure_dns_input.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURE_DNS_INPUT_JS" - file="privacy_page/secure_dns_input.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_PAGE_HTML" - file="privacy_page/security_page.html" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SECURITY_PAGE_JS" - file="privacy_page/security_page.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_DISABLE_SAFEBROWSING_DIALOG_HTML" - file="privacy_page/disable_safebrowsing_dialog.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_DISABLE_SAFEBROWSING_DIALOG_JS" - file="privacy_page/disable_safebrowsing_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PRIVACY_PAGE_HTML" - file="privacy_page/privacy_page.html" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PRIVACY_PAGE_JS" - file="privacy_page/privacy_page.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_HTML" - file="privacy_page/privacy_page_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PRIVACY_PAGE_BROWSER_PROXY_JS" - file="privacy_page/privacy_page_browser_proxy.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SAFE_BROWSING_BROWSER_PROXY_HTML" - file="privacy_page/safe_browsing_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SAFE_BROWSING_BROWSER_PROXY_JS" - file="privacy_page/safe_browsing_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SAFETY_CHECK_PAGE_HTML" - file="safety_check_page/safety_check_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SAFETY_CHECK_PAGE_JS" - file="safety_check_page/safety_check_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SAFETY_CHECK_BROWSER_PROXY_HTML" - file="safety_check_page/safety_check_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SAFETY_CHECK_BROWSER_PROXY_JS" - file="safety_check_page/safety_check_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PROTOCOL_HANDLERS_HTML" - file="site_settings/protocol_handlers.html" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_PROTOCOL_HANDLERS_JS" - file="site_settings/protocol_handlers.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_HATS_BROWSER_PROXY_HTML" - file="hats_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_HATS_BROWSER_PROXY_JS" - file="hats_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_METRICS_BROWSER_PROXY_HTML" - file="metrics_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_METRICS_BROWSER_PROXY_JS" - file="metrics_browser_proxy.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_RECENT_SITE_PERMISSIONS_HTML" - file="site_settings_page/recent_site_permissions.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_RECENT_SITE_PERMISSIONS_JS" - file="site_settings_page/recent_site_permissions.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ROUTE_HTML" - file="route.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ROUTE_JS" - file="route.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_ROUTER_HTML" - file="router.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ROUTER_JS" - file="router.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_FAVICON_HTML" - file="site_favicon.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_FAVICON_JS" - file="site_favicon.js" - type="chrome_html" /> - <if expr="chromeos"> - <structure name="IDR_SETTINGS_ANDROID_INFO_BROWSER_PROXY_HTML" - file="site_settings/android_info_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ANDROID_INFO_BROWSER_PROXY_JS" - file="site_settings/android_info_browser_proxy.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_SITE_DATA_HTML" - file="site_settings/site_data.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_DATA_JS" - file="site_settings/site_data.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_DATA_DETAILS_SUBPAGE_HTML" - file="site_settings/site_data_details_subpage.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_DATA_DETAILS_SUBPAGE_JS" - file="site_settings/site_data_details_subpage.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_DATA_ENTRY_HTML" - file="site_settings/site_data_entry.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_DATA_ENTRY_JS" - file="site_settings/site_data_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_LIST_HTML" - file="site_settings/site_list.html" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_LIST_JS" - file="site_settings/site_list.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_LIST_ENTRY_HTML" - file="site_settings/site_list_entry.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_LIST_ENTRY_JS" - file="site_settings/site_list_entry.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_BEHAVIOR_HTML" - file="site_settings/site_settings_behavior.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_BEHAVIOR_JS" - file="site_settings/site_settings_behavior.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_CONSTANTS_JS" - file="site_settings/constants.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_CONSTANTS_HTML" - file="site_settings/constants.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_PAGE_HTML" - file="site_settings_page/site_settings_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_PAGE_JS" - file="site_settings_page/site_settings_page.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_LIST_HTML" - file="site_settings_page/site_settings_list.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_LIST_JS" - file="site_settings_page/site_settings_list.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_PREFS_BROWSER_PROXY_HTML" - file="site_settings/site_settings_prefs_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_PREFS_BROWSER_PROXY_JS" - file="site_settings/site_settings_prefs_browser_proxy.js" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_DETAILS_HTML" - file="site_settings/site_details.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SITE_DETAILS_JS" - file="site_settings/site_details.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SITE_DETAILS_PERMISSION_HTML" - file="site_settings/site_details_permission.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_DETAILS_PERMISSION_JS" - file="site_settings/site_details_permission.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_DIALOG_JS" - file="search_engines_page/search_engine_dialog.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_DIALOG_HTML" - file="search_engines_page/search_engine_dialog.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_JS" - file="search_engines_page/search_engine_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_HTML" - file="search_engines_page/search_engine_entry.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ENTRY_CSS_HTML" - file="search_engines_page/search_engine_entry_css.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_OMNIBOX_EXTENSION_ENTRY_JS" - file="search_engines_page/omnibox_extension_entry.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_OMNIBOX_EXTENSION_ENTRY_HTML" - file="search_engines_page/omnibox_extension_entry.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_LIST_JS" - file="search_engines_page/search_engines_list.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_LIST_HTML" - file="search_engines_page/search_engines_list.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_PAGE_JS" - file="search_engines_page/search_engines_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINES_PAGE_HTML" - file="search_engines_page/search_engines_page.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_JS" - file="search_engines_page/search_engines_browser_proxy.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_ENGINES_BROWSER_PROXY_HTML" - file="search_engines_page/search_engines_browser_proxy.html" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SEARCH_PAGE_JS" - file="search_page/search_page.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SEARCH_PAGE_HTML" - file="search_page/search_page.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYNC_CONTROLS_JS" - file="people_page/sync_controls.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYNC_CONTROLS_HTML" - file="people_page/sync_controls.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYNC_ENCRYPTION_OPTIONS_JS" - file="people_page/sync_encryption_options.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYNC_ENCRYPTION_OPTIONS_HTML" - file="people_page/sync_encryption_options.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYNC_PAGE_JS" - file="people_page/sync_page.js" - type="chrome_html" - preprocess="true" /> - <structure name="IDR_SETTINGS_SYNC_PAGE_HTML" - file="people_page/sync_page.html" - type="chrome_html" - preprocess="true" /> - <if expr="not chromeos"> - <structure name="IDR_SETTINGS_SYSTEM_PAGE_BROWSER_PROXY_HTML" - file="system_page/system_page_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYSTEM_PAGE_BROWSER_PROXY" - file="system_page/system_page_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYSTEM_PAGE_HTML" - file="system_page/system_page.html" - preprocess="true" - type="chrome_html" /> - <structure name="IDR_SETTINGS_SYSTEM_PAGE_JS" - file="system_page/system_page.js" - type="chrome_html" /> - </if> - <structure name="IDR_SETTINGS_SETTINGS_HTML" - preprocess="true" - file="settings.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_LAZY_LOAD_HTML" - preprocess="true" - file="lazy_load.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ENSURE_LAZY_LOADED_HTML" - file="ensure_lazy_loaded.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_WEBSITE_USAGE_BROWSER_PROXY_HTML" - file="site_settings/website_usage_browser_proxy.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_WEBSITE_USAGE_BROWSER_PROXY_JS" - file="site_settings/website_usage_browser_proxy.js" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ZOOM_LEVELS_HTML" - file="site_settings/zoom_levels.html" - type="chrome_html" /> - <structure name="IDR_SETTINGS_ZOOM_LEVELS_JS" - file="site_settings/zoom_levels.js" - type="chrome_html" /> - <if expr="chromeos"> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_HTML" - file="people_page/account_manager_browser_proxy.html" - type="chrome_html"/> - <structure name="IDR_SETTINGS_PEOPLE_PAGE_ACCOUNT_MANAGER_BROWSER_PROXY_JS" - file="people_page/account_manager_browser_proxy.js" - type="chrome_html"/> - </if> </structures> </release> </grit>
diff --git a/chrome/browser/resources/settings/settings_resources_v3.grdp b/chrome/browser/resources/settings/settings_resources_v3.grdp index fa770a2..ca15ece1 100644 --- a/chrome/browser/resources/settings/settings_resources_v3.grdp +++ b/chrome/browser/resources/settings/settings_resources_v3.grdp
@@ -536,22 +536,21 @@ file="${root_gen_dir}/chrome/browser/resources/settings/privacy_page/security_keys_subpage.m.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_SETTINGS_RESET_PAGE_M_JS" - file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_page.m.js" + <include name="IDR_SETTINGS_RESET_PAGE_RESET_PAGE_JS" + file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_page.js" use_base_dir="false" preprocess="true" type="BINDATA" /> - <include name="IDR_SETTINGS_RESET_PROFILE_DIALOG_M_JS" - file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_dialog.m.js" + <include name="IDR_SETTINGS_RESET_PAGE_RESET_PROFILE_DIALOG_JS" + file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_dialog.js" use_base_dir="false" type="BINDATA" /> - <include name="IDR_SETTINGS_RESET_PROFILE_BANNER_M_JS" - file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_banner.m.js" + <include name="IDR_SETTINGS_RESET_PAGE_RESET_PROFILE_BANNER_JS" + file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_profile_banner.js" use_base_dir="false" type="BINDATA"/> - <include name="IDR_SETTINGS_RESET_BROWSER_PROXY_M_JS" - file="${root_gen_dir}/chrome/browser/resources/settings/reset_page/reset_browser_proxy.m.js" - use_base_dir="false" + <include name="IDR_SETTINGS_RESET_PAGE_RESET_BROWSER_PROXY_JS" + file="reset_page/reset_browser_proxy.js" preprocess="true" type="BINDATA" /> <include name="IDR_SETTINGS_ROUTE_M_JS"
diff --git a/chrome/browser/resources/settings/settings_resources_vulcanized.grd b/chrome/browser/resources/settings/settings_resources_vulcanized.grd index 5c4b44a..51e2335 100644 --- a/chrome/browser/resources/settings/settings_resources_vulcanized.grd +++ b/chrome/browser/resources/settings/settings_resources_vulcanized.grd
@@ -12,30 +12,6 @@ </outputs> <release seq="1"> <includes> - <include name="IDR_SETTINGS_VULCANIZED_HTML" - file="${root_gen_dir}\chrome\browser\resources\settings\vulcanized.html" - use_base_dir="false" - preprocess="true" - type="BINDATA" - compress="gzip" /> - <include name="IDR_SETTINGS_CRISPER_JS" - file="${root_gen_dir}\chrome\browser\resources\settings\crisper.js" - use_base_dir="false" - preprocess="true" - type="BINDATA" - compress="gzip" /> - <include name="IDR_SETTINGS_LAZY_LOAD_VULCANIZED_HTML" - file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.vulcanized.html" - use_base_dir="false" - preprocess="true" - type="BINDATA" - compress="gzip" /> - <include name="IDR_SETTINGS_LAZY_LOAD_CRISPER_JS" - file="${root_gen_dir}\chrome\browser\resources\settings\lazy_load.crisper.js" - use_base_dir="false" - preprocess="true" - type="BINDATA" - compress="gzip" /> <include name="IDR_SETTINGS_IMAGES_COOKIES_BANNER_SVG" file="images/cookies_banner.svg" type="BINDATA"
diff --git a/chrome/browser/sessions/session_restore_browsertest.cc b/chrome/browser/sessions/session_restore_browsertest.cc index 279ee815..24651c7a 100644 --- a/chrome/browser/sessions/session_restore_browsertest.cc +++ b/chrome/browser/sessions/session_restore_browsertest.cc
@@ -1353,6 +1353,99 @@ new_browser->tab_strip_model()->GetActiveWebContents()->GetURL()); } +// Closes the one and only tab and verifies it is not restored. +IN_PROC_BROWSER_TEST_F(SessionRestoreTest, CloseSingleTabRestoresNothing) { + ui_test_utils::NavigateToURL(browser(), url1_); + + Profile* profile = browser()->profile(); + std::unique_ptr<ScopedKeepAlive> keep_alive(new ScopedKeepAlive( + KeepAliveOrigin::SESSION_RESTORE, KeepAliveRestartOption::DISABLED)); + + chrome::CloseTab(browser()); + ui_test_utils::WaitForBrowserToClose(browser()); + + ui_test_utils::AllBrowserTabAddedWaiter tab_waiter; + SessionRestoreTestHelper restore_observer; + + // Ensure the session service factory is started, even if it was explicitly + // shut down. + SessionServiceTestHelper helper( + SessionServiceFactory::GetForProfileForSessionRestore(profile)); + helper.SetForceBrowserNotAliveWithNoWindows(true); + helper.ReleaseService(); + + chrome::NewEmptyWindow(profile); + + Browser* new_browser = chrome::FindBrowserWithWebContents(tab_waiter.Wait()); + + restore_observer.Wait(); + WaitForTabsToLoad(new_browser); + + keep_alive.reset(); + + AssertOneWindowWithOneTab(new_browser); + EXPECT_EQ(chrome::kChromeUINewTabURL, + new_browser->tab_strip_model()->GetActiveWebContents()->GetURL()); +} + +// Verifies that launching with no previous session to a url which closes itself +// results in no session being restored on the next launch. +// Regression test for http://crbug.com/1052096 +IN_PROC_BROWSER_TEST_F(SessionRestoreTest, + AutoClosedSingleTabDoesNotGetRestored) { + Profile* profile = browser()->profile(); + std::unique_ptr<ScopedKeepAlive> keep_alive(new ScopedKeepAlive( + KeepAliveOrigin::SESSION_RESTORE, KeepAliveRestartOption::DISABLED)); + + // First close the original browser to clear the session information (as + // verified by CloseSingleTabRestoresNothing). + chrome::CloseTab(browser()); + ui_test_utils::WaitForBrowserToClose(browser()); + + SessionRestoreTestHelper restore_observer; + + // Ensure the session service factory is started, even if it was explicitly + // shut down. + SessionServiceTestHelper helper( + SessionServiceFactory::GetForProfileForSessionRestore(profile)); + helper.SetForceBrowserNotAliveWithNoWindows(true); + helper.ReleaseService(); + + // Create a new browser by navigating to the test page. + GURL url = ui_test_utils::GetTestUrl( + base::FilePath().AppendASCII("session_restore"), + base::FilePath().AppendASCII("close_onload.html")); + NavigateParams params(profile, url, ui::PAGE_TRANSITION_LINK); + Navigate(¶ms); + + ui_test_utils::BrowserChangeObserver browser_removed_observer( + params.browser, + ui_test_utils::BrowserChangeObserver::ChangeType::kRemoved); + + restore_observer.Wait(); + + // Wait for the browser to close as a result of the single tab closing + // itself. + browser_removed_observer.Wait(); + + ui_test_utils::AllBrowserTabAddedWaiter tab_waiter; + SessionRestoreTestHelper restore_observer2; + + // Create a new browser from scratch and verify the tab is not restored. + chrome::NewEmptyWindow(profile); + + Browser* new_browser = chrome::FindBrowserWithWebContents(tab_waiter.Wait()); + + restore_observer2.Wait(); + WaitForTabsToLoad(new_browser); + + keep_alive.reset(); + + AssertOneWindowWithOneTab(new_browser); + EXPECT_EQ(chrome::kChromeUINewTabURL, + new_browser->tab_strip_model()->GetActiveWebContents()->GetURL()); +} + // Ensures active tab properly restored when tabs before it closed. IN_PROC_BROWSER_TEST_F(SessionRestoreTest, ActiveIndexUpdatedAtClose) { ui_test_utils::NavigateToURL(browser(), url1_);
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc index 769f62b0..06b57bee 100644 --- a/chrome/browser/sessions/session_service.cc +++ b/chrome/browser/sessions/session_service.cc
@@ -233,8 +233,7 @@ } void SessionService::TabClosed(const SessionID& window_id, - const SessionID& tab_id, - bool closed_by_user_gesture) { + const SessionID& tab_id) { if (!tab_id.id()) return; // Hapens when the tab is replaced. @@ -247,24 +246,22 @@ if (find(pending_window_close_ids_.begin(), pending_window_close_ids_.end(), window_id) != pending_window_close_ids_.end()) { - // Tab is in last window. Don't commit it immediately, instead add it to the - // list of tabs to close. If the user creates another window, the close is - // committed. + // Tab is in last window and the window is being closed. Don't commit it + // immediately, instead add it to the list of tabs to close. If the user + // creates another window, the close is committed. + // This is necessary to ensure the session is properly stored when closing + // the final window. pending_tab_close_ids_.insert(tab_id); - } else if (find(window_closing_ids_.begin(), window_closing_ids_.end(), - window_id) != window_closing_ids_.end() || - !IsOnlyOneTabLeft() || closed_by_user_gesture) { - // Close is the result of one of the following: - // . window close (and it isn't the last window). - // . closing a tab and there are other windows/tabs open. - // . closed by a user gesture. - // In all cases we need to mark the tab as explicitly closed. - ScheduleCommand(sessions::CreateTabClosedCommand(tab_id)); } else { - // User closed the last tab in the last tabbed browser. Don't mark the - // tab closed. - pending_tab_close_ids_.insert(tab_id); - has_open_trackable_browsers_ = false; + // If an individual tab is being closed or a secondary window is being + // closed, just mark the tab as closed now. + ScheduleCommand(sessions::CreateTabClosedCommand(tab_id)); + if ((find(window_closing_ids_.begin(), window_closing_ids_.end(), + window_id) == window_closing_ids_.end()) && + IsOnlyOneTabLeft()) { + // This is the last tab in the last tabbed browser. + has_open_trackable_browsers_ = false; + } } } @@ -382,9 +379,7 @@ session_storage_namespace->SetShouldPersist(false); sessions::SessionTabHelper* session_tab_helper = sessions::SessionTabHelper::FromWebContents(contents); - TabClosed(session_tab_helper->window_id(), - session_tab_helper->session_id(), - contents->GetClosedByUserGesture()); + TabClosed(session_tab_helper->window_id(), session_tab_helper->session_id()); } void SessionService::SetWindowType(const SessionID& window_id, @@ -866,8 +861,7 @@ bool SessionService::IsOnlyOneTabLeft() const { if (!profile() || profile()->AsTestingProfile()) { - // We're testing, always return false. - return false; + return is_only_one_tab_left_for_test_; } int window_count = 0; @@ -889,8 +883,7 @@ bool SessionService::HasOpenTrackableBrowsers( const SessionID& window_id) const { if (!profile() || profile()->AsTestingProfile()) { - // We're testing, always return true. - return true; + return has_open_trackable_browser_for_test_; } for (auto* browser : *BrowserList::GetInstance()) {
diff --git a/chrome/browser/sessions/session_service.h b/chrome/browser/sessions/session_service.h index df24dcf9..365d433 100644 --- a/chrome/browser/sessions/session_service.h +++ b/chrome/browser/sessions/session_service.h
@@ -144,14 +144,9 @@ const SessionID& tab_id, bool is_pinned); - // Notification that a tab has been closed. |closed_by_user_gesture| comes - // from |WebContents::closed_by_user_gesture|; see it for details. - // // Note: this is invoked from the NavigationController's destructor, which is // after the actual tab has been removed. - void TabClosed(const SessionID& window_id, - const SessionID& tab_id, - bool closed_by_user_gesture); + void TabClosed(const SessionID& window_id, const SessionID& tab_id); // Notification a window has opened. void WindowOpened(Browser* browser); @@ -376,6 +371,12 @@ // Are there any open trackable browsers? bool has_open_trackable_browsers_; + // Used to override HasOpenTrackableBrowsers() + bool has_open_trackable_browser_for_test_ = true; + + // Use to override IsOnlyOneTableft() + bool is_only_one_tab_left_for_test_ = false; + // If true and a new tabbed browser is created and there are no opened tabbed // browser (has_open_trackable_browsers_ is false), then the current session // is made the last session. See description above class for details on
diff --git a/chrome/browser/sessions/session_service_test_helper.cc b/chrome/browser/sessions/session_service_test_helper.cc index d09dab2..2f7db69 100644 --- a/chrome/browser/sessions/session_service_test_helper.cc +++ b/chrome/browser/sessions/session_service_test_helper.cc
@@ -132,3 +132,16 @@ std::pair<int, int>* range) { return service_->GetAvailableRangeForTest(tab_id, range); } + +void SessionServiceTestHelper::SetHasOpenTrackableBrowsers( + bool has_open_trackable_browsers) { + service_->has_open_trackable_browser_for_test_ = has_open_trackable_browsers; +} + +bool SessionServiceTestHelper::GetHasOpenTrackableBrowsers() { + return service_->has_open_trackable_browsers_; +} + +void SessionServiceTestHelper::SetIsOnlyOneTabLeft(bool is_only_one_tab_left) { + service_->is_only_one_tab_left_for_test_ = is_only_one_tab_left; +}
diff --git a/chrome/browser/sessions/session_service_test_helper.h b/chrome/browser/sessions/session_service_test_helper.h index a5211ad..af166b8 100644 --- a/chrome/browser/sessions/session_service_test_helper.h +++ b/chrome/browser/sessions/session_service_test_helper.h
@@ -90,6 +90,11 @@ const std::pair<int, int>& range); bool GetAvailableRange(const SessionID& tab_id, std::pair<int, int>* range); + void SetHasOpenTrackableBrowsers(bool has_open_trackable_browsers); + bool GetHasOpenTrackableBrowsers(); + + void SetIsOnlyOneTabLeft(bool is_only_one_tab_left); + private: std::unique_ptr<SessionService> service_;
diff --git a/chrome/browser/sessions/session_service_unittest.cc b/chrome/browser/sessions/session_service_unittest.cc index cb362005..0ac2ab6e 100644 --- a/chrome/browser/sessions/session_service_unittest.cc +++ b/chrome/browser/sessions/session_service_unittest.cc
@@ -78,7 +78,7 @@ } void TearDown() override { - helper_.SetService(NULL); + helper_.SetService(nullptr); BrowserWithTestWindowTest::TearDown(); } @@ -108,7 +108,7 @@ std::vector<std::unique_ptr<sessions::SessionWindow>>* windows, SessionID* active_window_id) { // Forces closing the file. - helper_.SetService(NULL); + helper_.SetService(nullptr); SessionService* session_service = new SessionService(path_); helper_.SetService(session_service); @@ -136,7 +136,7 @@ helper_.service()->SetPinnedState(window_id, tab_id, pinned_state); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); EXPECT_EQ(1U, windows.size()); if (HasFatalFailure()) @@ -200,7 +200,7 @@ UpdateNavigation(window_id, tab_id, nav1, true); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); ASSERT_TRUE(window_bounds == windows[0]->bounds); @@ -229,7 +229,7 @@ UpdateNavigation(window_id, tab_id, nav1, true); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); helper_.AssertSingleWindowWithSingleTab(windows, 1); } @@ -249,13 +249,15 @@ helper_.PrepareTabInWindow(window_id, tab2_id, 1, false); UpdateNavigation(window_id, tab2_id, nav2, true); - service()->TabClosed(window_id, tab2_id, false); + service()->TabClosed(window_id, tab2_id); + + EXPECT_TRUE(helper_.GetHasOpenTrackableBrowsers()); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); - ASSERT_EQ(0, windows[0]->selected_tab_index); + EXPECT_EQ(0, windows[0]->selected_tab_index); ASSERT_EQ(window_id, windows[0]->window_id); ASSERT_EQ(1U, windows[0]->tabs.size()); @@ -265,6 +267,28 @@ helper_.AssertNavigationEquals(nav1, tab->navigations[0]); } +TEST_F(SessionServiceTest, CloseSingleTabClosesWindowAndTab) { + SessionID tab_id = SessionID::NewUnique(); + ASSERT_NE(window_id, tab_id); + + SerializedNavigationEntry nav1 = + ContentTestHelper::CreateNavigation("http://google.com", "abc"); + + helper_.PrepareTabInWindow(window_id, tab_id, 0, true); + UpdateNavigation(window_id, tab_id, nav1, true); + + helper_.SetIsOnlyOneTabLeft(true); + + service()->TabClosed(window_id, tab_id); + + EXPECT_FALSE(helper_.GetHasOpenTrackableBrowsers()); + + std::vector<std::unique_ptr<sessions::SessionWindow>> windows; + ReadWindows(&windows, nullptr); + + EXPECT_TRUE(windows.empty()); +} + TEST_F(SessionServiceTest, Pruning) { SessionID tab_id = SessionID::NewUnique(); @@ -292,7 +316,7 @@ EXPECT_EQ(2, available_range.second); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); ASSERT_EQ(0, windows[0]->selected_tab_index); @@ -320,7 +344,7 @@ window2_id, tab1_id, tab2_id, &nav1, &nav2); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(2U, windows.size()); ASSERT_EQ(0, windows[0]->selected_tab_index); @@ -372,7 +396,7 @@ helper_.PrepareTabInWindow(window2_id, tab2_id, 0, true); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); ASSERT_EQ(0, windows[0]->selected_tab_index); @@ -384,7 +408,7 @@ helper_.AssertNavigationEquals(nav1, tab->navigations[0]); } -TEST_F(SessionServiceTest, ClosingWindowDoesntCloseTabs) { +TEST_F(SessionServiceTest, ClosingLastWindowDoesntCloseTabs) { SessionID tab_id = SessionID::NewUnique(); SessionID tab2_id = SessionID::NewUnique(); ASSERT_NE(tab_id, tab2_id); @@ -400,13 +424,16 @@ helper_.PrepareTabInWindow(window_id, tab2_id, 1, false); UpdateNavigation(window_id, tab2_id, nav2, true); + helper_.SetHasOpenTrackableBrowsers(false); + service()->WindowClosing(window_id); + service()->WindowClosed(window_id); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); - ASSERT_EQ(0, windows[0]->selected_tab_index); + EXPECT_EQ(0, windows[0]->selected_tab_index); ASSERT_EQ(window_id, windows[0]->window_id); ASSERT_EQ(2U, windows[0]->tabs.size()); @@ -419,6 +446,32 @@ helper_.AssertNavigationEquals(nav2, tab->navigations[0]); } +TEST_F(SessionServiceTest, ClosingSecondWindowClosesTabs) { + SessionID window2_id = SessionID::NewUnique(); + SessionID tab1_id = SessionID::NewUnique(); + SessionID tab2_id = SessionID::NewUnique(); + ASSERT_NE(tab1_id, tab2_id); + + SerializedNavigationEntry nav1 = + ContentTestHelper::CreateNavigation("http://google.com", "abc"); + SerializedNavigationEntry nav2 = + ContentTestHelper::CreateNavigation("http://google2.com", "abcd"); + + CreateAndWriteSessionWithTwoWindows(window2_id, tab1_id, tab2_id, &nav1, + &nav2); + + service()->WindowClosing(window2_id); + service()->WindowClosed(window2_id); + + std::vector<std::unique_ptr<sessions::SessionWindow>> windows; + ReadWindows(&windows, nullptr); + + ASSERT_EQ(1U, windows.size()); + EXPECT_EQ(0, windows[0]->selected_tab_index); + EXPECT_EQ(window_id, windows[0]->window_id); + EXPECT_EQ(1U, windows[0]->tabs.size()); +} + TEST_F(SessionServiceTest, LockingWindowRemembersAll) { SessionID window2_id = SessionID::NewUnique(); SessionID tab1_id = SessionID::NewUnique(); @@ -443,7 +496,7 @@ service()->WindowClosed(window2_id); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(2U, windows.size()); ASSERT_EQ(1U, windows[0]->tabs.size()); @@ -473,11 +526,11 @@ UpdateNavigation(window2_id, tab2_id, nav2, true); service()->WindowClosing(window2_id); - service()->TabClosed(window2_id, tab2_id, false); + service()->TabClosed(window2_id, tab2_id); service()->WindowClosed(window2_id); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); ASSERT_EQ(0, windows[0]->selected_tab_index); @@ -527,7 +580,7 @@ UpdateNavigation(window2_id, tab2_id, nav2, true); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(2U, windows.size()); int tabbed_index = @@ -599,7 +652,7 @@ // Read back in. std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); ASSERT_EQ(0, windows[0]->selected_tab_index); @@ -771,7 +824,7 @@ // Read back in. std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(0U, windows.size()); } @@ -805,7 +858,7 @@ helper_.SetTabExtensionAppID(window_id, tab_id, app_id); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); helper_.AssertSingleWindowWithSingleTab(windows, 1); EXPECT_TRUE(app_id == windows[0]->tabs[0]->extension_app_id); @@ -838,7 +891,7 @@ helper_.SetTabUserAgentOverride(window_id, tab_id, serialized_override); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); helper_.AssertSingleWindowWithSingleTab(windows, 1); sessions::SessionTab* tab = windows[0]->tabs[0].get(); @@ -850,24 +903,6 @@ tab->user_agent_override.opaque_ua_metadata_override); } -// Makes sure a tab closed by a user gesture is not restored. -TEST_F(SessionServiceTest, CloseTabUserGesture) { - SessionID tab_id = SessionID::NewUnique(); - ASSERT_NE(window_id, tab_id); - - SerializedNavigationEntry nav1 = - ContentTestHelper::CreateNavigation("http://google.com", "abc"); - - helper_.PrepareTabInWindow(window_id, tab_id, 0, true); - UpdateNavigation(window_id, tab_id, nav1, true); - service()->TabClosed(window_id, tab_id, true); - - std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); - - ASSERT_TRUE(windows.empty()); -} - // Verifies SetWindowBounds maps SHOW_STATE_DEFAULT to SHOW_STATE_NORMAL. TEST_F(SessionServiceTest, DontPersistDefault) { SessionID tab_id = SessionID::NewUnique(); @@ -881,7 +916,7 @@ ui::SHOW_STATE_DEFAULT); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); EXPECT_EQ(ui::SHOW_STATE_NORMAL, windows[0]->show_state); } @@ -920,7 +955,7 @@ UpdateNavigation(window_id, tab_id, nav2, true); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); helper_.AssertSingleWindowWithSingleTab(windows, 2); @@ -942,7 +977,7 @@ // Create a page state representing a HTTP body with posted passwords. content::PageState page_state = - content::PageState::CreateForTesting(GURL(), true, "data", NULL); + content::PageState::CreateForTesting(GURL(), true, "data", nullptr); // Create a TabNavigation containing page_state and representing a POST // request with passwords. @@ -955,7 +990,7 @@ UpdateNavigation(window_id, tab_id, nav1, true); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); helper_.AssertSingleWindowWithSingleTab(windows, 1); @@ -981,7 +1016,7 @@ // Read back in. std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); // The ones with index 0, and 2 should have been replaced by 1 and 3. ASSERT_EQ(1U, windows.size()); @@ -1028,7 +1063,7 @@ // Read back in. std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); // We should still have that last navigation at the end, // even though it replaced one that was set before the prune. @@ -1100,7 +1135,7 @@ UpdateNavigation(window_id, tab_id, nav3, true); std::vector<std::unique_ptr<sessions::SessionWindow>> windows; - ReadWindows(&windows, NULL); + ReadWindows(&windows, nullptr); ASSERT_EQ(1U, windows.size()); ASSERT_EQ(0, windows[0]->selected_tab_index);
diff --git a/chrome/browser/sessions/tab_restore_browsertest.cc b/chrome/browser/sessions/tab_restore_browsertest.cc index cb6dcab0..7515213e 100644 --- a/chrome/browser/sessions/tab_restore_browsertest.cc +++ b/chrome/browser/sessions/tab_restore_browsertest.cc
@@ -52,6 +52,7 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_utils.h" #include "net/test/embedded_test_server/embedded_test_server.h" +#include "ui/gfx/animation/animation_test_api.h" #include "url/gurl.h" #if BUILDFLAG(ENABLE_SESSION_SERVICE) @@ -60,7 +61,10 @@ class TabRestoreTest : public InProcessBrowserTest { public: - TabRestoreTest() : active_browser_list_(NULL) { + TabRestoreTest() + : active_browser_list_(nullptr), + animation_mode_reset_(gfx::AnimationTestApi::SetRichAnimationRenderMode( + gfx::Animation::RichAnimationRenderMode::FORCE_DISABLED)) { url1_ = ui_test_utils::GetTestUrl( base::FilePath().AppendASCII("session_history"), base::FilePath().AppendASCII("bot1.html")); @@ -188,6 +192,9 @@ const BrowserList* active_browser_list_; private: + std::unique_ptr<base::AutoReset<gfx::Animation::RichAnimationRenderMode>> + animation_mode_reset_; + DISALLOW_COPY_AND_ASSIGN(TabRestoreTest); }; @@ -414,12 +421,12 @@ // Deliberately change the bounds of the first window to something different. gfx::Rect bounds = browser()->window()->GetBounds(); - bounds.set_width(640); + bounds.set_width(700); bounds.set_height(480); bounds.Offset(20, 20); browser()->window()->SetBounds(bounds); gfx::Rect bounds2 = browser()->window()->GetBounds(); - EXPECT_EQ(bounds, bounds2); + ASSERT_EQ(bounds, bounds2); // Close the first window. CloseBrowserSynchronously(browser());
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc index 0ce0832f..83d11fc0 100644 --- a/chrome/browser/supervised_user/supervised_user_service.cc +++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -89,6 +89,15 @@ // The filename under which we'll store the blacklist (in the user data dir). const char kBlacklistFilename[] = "su-blacklist.bin"; +#if BUILDFLAG(ENABLE_EXTENSIONS) +// These extensions are allowed for supervised users for internal development +// purposes. +constexpr char const* kAllowlistExtensionIds[] = { + "behllobkkfkfnphdnhnkndlbkcpglgmj" // Tast extension. +}; + +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + const char* const kCustodianInfoPrefs[] = { prefs::kSupervisedUserCustodianName, prefs::kSupervisedUserCustodianEmail, @@ -763,6 +772,10 @@ return ExtensionState::ALLOWED; } + if (base::Contains(kAllowlistExtensionIds, extension.id())) { + return ExtensionState::ALLOWED; + } + if (base::FeatureList::IsEnabled( supervised_users::kSupervisedUserAllowlistExtensionInstall)) { extensions::ExtensionManagement* management =
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 2ee89169..35079b5 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1989,6 +1989,8 @@ "webui/settings/chromeos/android_apps_handler.h", "webui/settings/chromeos/app_management/app_management_page_handler_factory.cc", "webui/settings/chromeos/app_management/app_management_page_handler_factory.h", + "webui/settings/chromeos/bluetooth_strings_provider.cc", + "webui/settings/chromeos/bluetooth_strings_provider.h", "webui/settings/chromeos/calculator/size_calculator.cc", "webui/settings/chromeos/calculator/size_calculator.h", "webui/settings/chromeos/change_picture_handler.cc", @@ -3451,6 +3453,8 @@ "views/web_apps/web_app_origin_text.h", "views/web_apps/web_app_uninstall_dialog_view.cc", "views/web_apps/web_app_uninstall_dialog_view.h", + "views/webauthn/authenticator_bio_enrollment_sheet_view.cc", + "views/webauthn/authenticator_bio_enrollment_sheet_view.h", "views/webauthn/authenticator_ble_pin_entry_sheet_view.cc", "views/webauthn/authenticator_ble_pin_entry_sheet_view.h", "views/webauthn/authenticator_client_pin_entry_sheet_view.cc", @@ -3473,6 +3477,8 @@ "views/webauthn/ble_pin_entry_view.h", "views/webauthn/hover_list_view.cc", "views/webauthn/hover_list_view.h", + "views/webauthn/ring_progress_bar.cc", + "views/webauthn/ring_progress_bar.h", "views/webauthn/sheet_view_factory.cc", "views/webauthn/sheet_view_factory.h", "webauthn/account_hover_list_model.cc", @@ -3584,7 +3590,7 @@ if (use_x11) { deps += [ "//ui/gfx/x", - "//ui/gtk:x", + "//ui/gtk/x", ] } if (use_ozone) { @@ -3823,6 +3829,8 @@ "app_list/search/arc/arc_playstore_search_provider.h", "app_list/search/arc/arc_playstore_search_result.cc", "app_list/search/arc/arc_playstore_search_result.h", + "app_list/search/assistant_search_provider.cc", + "app_list/search/assistant_search_provider.h", "app_list/search/chrome_search_result.cc", "app_list/search/chrome_search_result.h", "app_list/search/common/file_icon_util.cc", @@ -4006,12 +4014,11 @@ "views/plugin_vm/plugin_vm_installer_view.h", ] deps += [ - # TODO(wutao): Put new icons resources to ash/public/cpp/vector_icons/ - # when UX provides them. "//ash/app_list", + "//ash/assistant/model", "//ash/public/cpp", "//ash/public/cpp/app_list/vector_icons", - "//ash/resources/vector_icons", + "//ash/public/cpp/vector_icons", "//chrome/browser/chromeos/crostini:crostini_installer_types_mojom", "//chrome/browser/ui/app_list/search/cros_action_history:cros_action_proto", "//chrome/browser/ui/app_list/search/search_result_ranker:app_launch_event_logger_proto",
diff --git a/chrome/browser/ui/android/favicon/BUILD.gn b/chrome/browser/ui/android/favicon/BUILD.gn index 91827497..b58869d 100644 --- a/chrome/browser/ui/android/favicon/BUILD.gn +++ b/chrome/browser/ui/android/favicon/BUILD.gn
@@ -17,8 +17,8 @@ "//chrome/browser/profiles/android:java", "//chrome/browser/util:java", "//components/browser_ui/util/android:java", + "//components/browser_ui/widget/android:java", "//components/embedder_support/android:util_java", - "//components/favicon/android:java", "//components/url_formatter/android:url_formatter_java", "//content/public/android:content_java", "//ui/android:ui_java",
diff --git a/chrome/browser/ui/android/favicon/DEPS b/chrome/browser/ui/android/favicon/DEPS index d2c793f..207fdcf4 100644 --- a/chrome/browser/ui/android/favicon/DEPS +++ b/chrome/browser/ui/android/favicon/DEPS
@@ -6,8 +6,8 @@ "+chrome/browser/util", "+chrome/test/android", "+components/browser_ui/util/android", + "+components/browser_ui/widget/android", "+components/embedder_support/android", - "+components/favicon/android", "+components/url_formatter/android", "+content/public/android", "+ui/android",
diff --git a/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java b/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java index 1c29045..54dedad 100644 --- a/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java +++ b/chrome/browser/ui/android/favicon/java/src/org/chromium/chrome/browser/ui/favicon/FaviconUtils.java
@@ -13,7 +13,7 @@ import androidx.core.graphics.drawable.RoundedBitmapDrawable; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.components.favicon.FaviconFallbackGenerator; +import org.chromium.components.browser_ui.widget.RoundedIconGenerator; import org.chromium.ui.base.ViewUtils; /** @@ -21,33 +21,32 @@ */ public class FaviconUtils { /** - * Creates a {@link FaviconFallbackGenerator} to generate circular {@link Bitmap}s of favicons. + * Creates a {@link RoundedIconGenerator} to generate circular {@link Bitmap}s of favicons. * @param resources The {@link Resources} for accessing color and dimen resources. - * @return A {@link FaviconFallbackGenerator} that uses the default circle icon style. Intended + * @return A {@link RoundedIconGenerator} that uses the default circle icon style. Intended * for monograms, e.g. a circle with character(s) in the center. */ - public static FaviconFallbackGenerator createCircularIconGenerator(Resources resources) { + public static RoundedIconGenerator createCircularIconGenerator(Resources resources) { int displayedIconSize = resources.getDimensionPixelSize(R.dimen.circular_monogram_size); int cornerRadius = displayedIconSize / 2; int textSize = resources.getDimensionPixelSize(R.dimen.circular_monogram_text_size); - return new FaviconFallbackGenerator(displayedIconSize, displayedIconSize, cornerRadius, + return new RoundedIconGenerator(displayedIconSize, displayedIconSize, cornerRadius, getIconColor(resources), textSize); } /** - * Creates a {@link FaviconFallbackGenerator} to generate rounded rectangular {@link Bitmap}s of + * Creates a {@link RoundedIconGenerator} to generate rounded rectangular {@link Bitmap}s of * favicons. * @param resources The {@link Resources} for accessing color and dimen resources. - * @return A {@link FaviconFallbackGenerator} that uses the default rounded rectangle icon + * @return A {@link RoundedIconGenerator} that uses the default rounded rectangle icon * style. Intended for monograms, e.g. a rounded rectangle with character(s) in the * center. */ - public static FaviconFallbackGenerator createRoundedRectangleIconGenerator( - Resources resources) { + public static RoundedIconGenerator createRoundedRectangleIconGenerator(Resources resources) { int displayedIconSize = resources.getDimensionPixelSize(R.dimen.default_favicon_size); int cornerRadius = resources.getDimensionPixelSize(R.dimen.default_favicon_corner_radius); int textSize = resources.getDimensionPixelSize(R.dimen.default_favicon_icon_text_size); - return new FaviconFallbackGenerator(displayedIconSize, displayedIconSize, cornerRadius, + return new RoundedIconGenerator(displayedIconSize, displayedIconSize, cornerRadius, getIconColor(resources), textSize); } @@ -72,15 +71,15 @@ * generated. * @param url Url to generate a monogram. Used only if {@code icon} is null. * @param fallbackColor Color to generate a monogram. Used only if {@code icon} is null. - * @param iconGenerator FaviconFallbackGenerator to generate a monogram. Used only if {@code - * icon} is null. Side effect: {@link FaviconFallbackGenerator#setBackgroundColor(int)} + * @param iconGenerator RoundedIconGenerator to generate a monogram. Used only if {@code + * icon} is null. Side effect: {@link RoundedIconGenerator#setBackgroundColor(int)} * will be called. * @param resources {@link Resources} to create a {@link BitmapDrawable}. * @param iconSize Width and height of the returned icon in px. * @return A {@link Drawable} to be displayed as the favicon. */ public static Drawable getIconDrawableWithoutFilter(@Nullable Bitmap icon, String url, - int fallbackColor, FaviconFallbackGenerator iconGenerator, Resources resources, + int fallbackColor, RoundedIconGenerator iconGenerator, Resources resources, int iconSize) { if (icon == null) { iconGenerator.setBackgroundColor(fallbackColor); @@ -98,7 +97,7 @@ * @param icon {@link Bitmap} with the icon to display. If null, a fallback monogram will be * generated. * @param url Url to generate a monogram. Used only if {@code icon} is null. - * @param iconGenerator FaviconFallbackGenerator to generate a monogram. Used only if {@code + * @param iconGenerator RoundedIconGenerator to generate a monogram. Used only if {@code * icon} is null. * @param defaultFaviconHelper Helper to generate default favicons. * @param resources {@link Resources} to create a {@link BitmapDrawable}. @@ -106,7 +105,7 @@ * @return A {@link Drawable} to be displayed as the favicon. */ public static Drawable getIconDrawableWithFilter(@Nullable Bitmap icon, @Nullable String url, - FaviconFallbackGenerator iconGenerator, + RoundedIconGenerator iconGenerator, FaviconHelper.DefaultFaviconHelper defaultFaviconHelper, Resources resources, int iconSize) { if (url == null) {
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 2427d30a..a0e8b8c0 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -3255,14 +3255,6 @@ Unsupported number of Chrome instances. </message> - <!-- Override URL --> - <message name="IDS_BLOCKED_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is blocked."> - Navigation is blocked: <ph name="URL">%1$s<ex>intent://abcd</ex></ph> - </message> - <message name="IDS_UNREACHABLE_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is unreachable."> - Navigation is unreachable: <ph name="URL">%1$s<ex>intent://abcd</ex></ph> - </message> - <message name="IDS_CLOSE_TAB" desc="Context menu option that allows the user to close the selected tab."> Close tab </message>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index a731e9e9..6d04282 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">የእርስዎን ዕልባቶች በሁሉም መሣሪያዎችዎ ላይ ስምረትን ማብራት ለማግኘት</translation> <translation id="8110087112193408731">በዲጂታል ብቁ መሆን ውስጥ የChrome እንቅስቃሴዎ ይታይ?</translation> +<translation id="8115259494083109761">አንድ QR ኮድ ለመቃኘት Chrome ካሜራዎን ይጠቀም።</translation> <translation id="8116925261070264013">ድምፀ ከል ተደርጓል</translation> <translation id="8127542551745560481">መነሻ ገጽን ያርትዑ</translation> <translation id="813082847718468539">የጣቢያ መረጃን ይመልከቱ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index ebd8d3c..1c1f256 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -963,6 +963,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">আপোনাৰ বুকমাৰ্কসমূহ নিজৰ সকলো ডিভাইচতে পাবলৈ ছিংক অন কৰক</translation> <translation id="8110087112193408731">আপুনি Chromeত কৰা কাৰ্যকলাপ ডিজিটেল ৱেলবিইঙ-ত দেখুৱাবনে?</translation> +<translation id="8115259494083109761">কোনো কিউআৰ ক’ড স্কেন কৰিবলৈ, Chromeক আপোনাৰ কেমেৰা ব্যৱহাৰ কৰিবলৈ দিয়ক</translation> <translation id="8116925261070264013">মিউট আছে</translation> <translation id="8127542551745560481">গৃহপৃষ্ঠা সম্পাদনা কৰক</translation> <translation id="813082847718468539">ছাইটৰ তথ্য চাওক</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 0fa20bfa..2030b9b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -963,6 +963,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Bütün cihazlarınızda əlfəcinləri əldə etmək üçün sinxronizasiyanı aktiv edin</translation> <translation id="8110087112193408731">Digital Sağlamlıqda Chrome fəaliyyəti göstərilsin?</translation> +<translation id="8115259494083109761">QR kodunu skanlamaq üçün Chrome'a kameranızdan istifadə imkanı verin</translation> <translation id="8116925261070264013">Səssiz</translation> <translation id="8127542551745560481">Əsas səhifəni redaktə edin</translation> <translation id="813082847718468539">Sayt məlumatına baxın</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index ec8a98b97..24aa4edc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Каб мець свае закладкі на ўсіх прыладах, уключыце сінхранізацыю</translation> <translation id="8110087112193408731">Паказваць у службе лічбавага камфорту вашы дзеянні ў Chrome?</translation> +<translation id="8115259494083109761">Каб сканіраваць QR-код, дазвольце браўзеру Chrome выкарыстоўваць камеру</translation> <translation id="8116925261070264013">Без гуку</translation> <translation id="8127542551745560481">Змяніць галоўную старонку</translation> <translation id="813082847718468539">Прагляд звестак пра сайт</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index e5c0035..4dc91a0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Включете синхронизирането, за да получите отметките си на всичките си устройства</translation> <translation id="8110087112193408731">Искате ли активността ви в Chrome да се показва в „Дигитално благополучие“?</translation> +<translation id="8115259494083109761">За да сканирате QR код, разрешете на Chrome да използва камерата ви</translation> <translation id="8116925261070264013">Заглушени</translation> <translation id="8127542551745560481">Редактиране на началната страница</translation> <translation id="813082847718468539">Преглед на информацията за сайта</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 73fd468c..89aa911e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Για να εμφανίζονται οι σελιδοδείκτες σας σε όλες τις συσκευές σας, ενεργοποιήστε τον συγχρονισμό</translation> <translation id="8110087112193408731">Να εμφανίζεται στο Digital Wellbeing η δραστηριότητά σας στο Chrome;</translation> +<translation id="8115259494083109761">Για να σαρώσετε έναν κωδικό QR, επιτρέψτε στο Chrome να χρησιμοποιεί την κάμερά σας.</translation> <translation id="8116925261070264013">Σε σίγαση</translation> <translation id="8127542551745560481">Επεξεργασία αρχικής σελίδας</translation> <translation id="813082847718468539">Προβολή πληροφοριών τοποθεσίας</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 d3ef2d5..b90fdf4 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
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Para que tus favoritos estén en todos tus dispositivos, activa la sincronización</translation> <translation id="8110087112193408731">¿Quieres que se muestre tu actividad de Chrome en Bienestar digital?</translation> +<translation id="8115259494083109761">Si quieres escanear un código QR, permite que Chrome use la cámara</translation> <translation id="8116925261070264013">Silenciados</translation> <translation id="8127542551745560481">Editar la página principal</translation> <translation id="813082847718468539">Consulta la información del sitio</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index a9d7ade..45cff6e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Activa la sincronización para ver tus marcadores en todos tus dispositivos</translation> <translation id="8110087112193408731">¿Mostrar tu actividad de Chrome en Bienestar digital?</translation> +<translation id="8115259494083109761">Para escanear un código QR, permite que Chrome use la cámara</translation> <translation id="8116925261070264013">Silenciados</translation> <translation id="8127542551745560481">Editar página principal</translation> <translation id="813082847718468539">Ver información del sitio</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 7887891be..0e9bef24 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Järjehoidjate kõigisse oma seadmetesse hankimiseks lülitage sünkroonimine sisse</translation> <translation id="8110087112193408731">Kas kuvada teie Chrome'i tegevused teenuses Digitaalne heaolu?</translation> +<translation id="8115259494083109761">QR-koodi skannimiseks lubage Chrome'il oma kaamerat kasutada</translation> <translation id="8116925261070264013">Vaigistatud</translation> <translation id="8127542551745560481">Avalehe muutmine</translation> <translation id="813082847718468539">Kuvab saidi teabe</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 3b715095..ebe8571c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">برای اینکه به نشانکها در همه دستگاههایتان دسترسی داشته باشید، همگامسازی را روشن کنید</translation> <translation id="8110087112193408731">فعالیت Chrome شما در «آسایش دیجیتالی» نشان داده شود؟</translation> +<translation id="8115259494083109761">برای اسکن کردن کد QR، به Chrome اجازه دهید از دوربین استفاده کند</translation> <translation id="8116925261070264013">صامتشده</translation> <translation id="8127542551745560481">ویرایش صفحه اصلی</translation> <translation id="813082847718468539">مشاهدهٔ اطلاعات سایت</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 977f2f41..e631c9d1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Para makuha ang iyong mga bookmark sa lahat ng device mo, i-on ang pag-sync</translation> <translation id="8110087112193408731">Ipakita sa Digital Wellness ang aktibidad mo sa Chrome?</translation> +<translation id="8115259494083109761">Para mag-scan ng QR code, hayaang gamitin ng Chrome ang iyong camera</translation> <translation id="8116925261070264013">Naka-mute</translation> <translation id="8127542551745560481">I-edit ang homepage</translation> <translation id="813082847718468539">Tingnan ang impormasyon ng site</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index f4a05136..4e14293 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Activez la synchronisation pour accéder à vos favoris sur tous vos appareils</translation> <translation id="8110087112193408731">Afficher votre activité Chrome dans Bien-être numérique ?</translation> +<translation id="8115259494083109761">Pour scanner un code QR, autorisez Chrome à utiliser votre appareil photo</translation> <translation id="8116925261070264013">Son coupé</translation> <translation id="8127542551745560481">Modifier la page d'accueil</translation> <translation id="813082847718468539">Afficher des informations à propos du site</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 15c9267..2de1ad5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">તમારા બધા ઉપકરણો પર તમારા બુકમાર્ક મેળવવા માટે, સિંક કરવાનું ચાલુ કરો</translation> <translation id="8110087112193408731">શું તમારી Chromeની પ્રવૃત્તિ ડિજિટલ લાઇફસ્ટાઇલમાં બતાવીએ?</translation> +<translation id="8115259494083109761">કોઈ QR કોડને સ્કૅન કરવા માટે, Chromeને તમારા કૅમેરાનો ઉપયોગ કરવા દો</translation> <translation id="8116925261070264013">મ્યૂટ કરેલ</translation> <translation id="8127542551745560481">હોમપેજમાં ફેરફાર કરો</translation> <translation id="813082847718468539">સ્થાન માહિતી જુઓ</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 0db4c162..f814281 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
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">अपने सभी डिवाइस पर अपने बुकमार्क पाने के लिए, 'सिंक करें' को चालू करें</translation> <translation id="8110087112193408731">'डिजिटल वेलबीइंग' में अपनी Chrome गतिविधि दिखाना चाहते हैं?</translation> +<translation id="8115259494083109761">क्यूआर कोड स्कैन करने के लिए, Chrome को अपना कैमरा इस्तेमाल करने दें</translation> <translation id="8116925261070264013">आवाज़ बंद की गई</translation> <translation id="8127542551745560481">होम पेज में बदलाव करें</translation> <translation id="813082847718468539">साइट जानकारी देखें</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 7d84440..6cf3f4c 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
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Da bi se vaše oznake prikazale na svim vašim uređajima, uključite sinkronizaciju</translation> <translation id="8110087112193408731">Želite li da se vaša aktivnost u Chromeu prikazuje u Digitalnoj ravnoteži?</translation> +<translation id="8115259494083109761">Da biste skenirali QR kôd, omogućite Chromeu da koristi vašu kameru</translation> <translation id="8116925261070264013">Bez zvuka</translation> <translation id="8127542551745560481">Uređivanje početne stranice</translation> <translation id="813082847718468539">Prikaz informacija o web-mjestu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index aadeab34..8888075 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Untuk dapat mengakses bookmark Anda di semua perangkat, aktifkan sinkronisasi</translation> <translation id="8110087112193408731">Tampilkan aktivitas Chrome Anda di Kesehatan Digital?</translation> +<translation id="8115259494083109761">Untuk memindai kode QR, izinkan Chrome menggunakan kamera Anda</translation> <translation id="8116925261070264013">Dinonaktifkan</translation> <translation id="8127542551745560481">Edit halaman beranda</translation> <translation id="813082847718468539">Lihat informasi situs</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 1fa778f..9646abd 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
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Attiva la sincronizzazione per trovare i tuoi preferiti su tutti i dispositivi</translation> <translation id="8110087112193408731">Vuoi mostrare la tua attività di Chrome in Benessere digitale?</translation> +<translation id="8115259494083109761">Per scansionare i codici QR, consenti a Chrome di usare la tua fotocamera</translation> <translation id="8116925261070264013">Con audio disattivato</translation> <translation id="8127542551745560481">Modifica home page</translation> <translation id="813082847718468539">Visualizza informazioni sul sito</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 1b168333..bc20ba9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">お使いのどのデバイスでも同じブックマークを使用するには、同期を有効にします</translation> <translation id="8110087112193408731">Chrome のアクティビティを Digital Wellbeing で表示しますか?</translation> +<translation id="8115259494083109761">QR コードをスキャンするには、Chrome にカメラの使用を許可してください</translation> <translation id="8116925261070264013">ミュート中</translation> <translation id="8127542551745560481">ホームページを編集</translation> <translation id="813082847718468539">サイト情報を表示</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 5bc51bfc..92f89716 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">თქვენს ყველა მოწყობილობაზე არსებულ სანიშნეებზე წვდომისთვის ჩართეთ სინქრონიზაცია</translation> <translation id="8110087112193408731">გსურთ, ციფრულ კომფორტში გამოჩნდეს თქვენი აქტივობა Chrome-იდან?</translation> +<translation id="8115259494083109761">QR კოდის სკანირებისთვის მიანიჭეთ Chrome-ს კამერაზე წვდომის ნებართვა.</translation> <translation id="8116925261070264013">დადუმებული</translation> <translation id="8127542551745560481">მთავარი გვერდის რედაქტირება</translation> <translation id="813082847718468539">საიტის ინფორმაციის ნახვა</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 79873dd1..45ed99a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Бетбелгілерді барлық құрылғылардан пайдалану үшін синхрондау функциясын қосыңыз</translation> <translation id="8110087112193408731">Digital Wellbeing қызметінде Chrome браузерін пайдалану деректері көрсетілсін бе?</translation> +<translation id="8115259494083109761">QR кодын сканерлеу үшін Chrome-ға камера пайдалану рұқсатын беріңіз.</translation> <translation id="8116925261070264013">Дыбысы өшірулі</translation> <translation id="8127542551745560481">Негізгі бетті өзгерту</translation> <translation id="813082847718468539">Сайт ақпаратын көру</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index daf9a1c..da7ddc29 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">ដើម្បីទទួលបានចំណាំរបស់អ្នកនៅលើឧបករណ៍ទាំងអស់របស់អ្នក សូមបើកសមកាលកម្ម</translation> <translation id="8110087112193408731">បង្ហាញសកម្មភាព Chrome របស់អ្នកនៅក្នុងសុខុមាលភាពឌីជីថល?</translation> +<translation id="8115259494083109761">ដើម្បីស្កេនកូដ QR សូមអនុញ្ញាតឱ្យ Chrome ប្រើកាមេរ៉ារបស់អ្នក</translation> <translation id="8116925261070264013">បានបិទសំឡេង</translation> <translation id="8127542551745560481">កែទំព័រដើម</translation> <translation id="813082847718468539">មើលព័ត៌មានគេហទំព័រ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index 57438c4..065fd1d5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -966,6 +966,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">ನಿಮ್ಮ ಎಲ್ಲ ಸಾಧನಗಳಲ್ಲಿ ನಿಮ್ಮ ಬುಕ್ಮಾರ್ಕ್ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, ಸಿಂಕ್ ಆನ್ ಮಾಡಿ</translation> <translation id="8110087112193408731">ಡಿಜಿಟಲ್ ಯೋಗಕ್ಷೇಮದಲ್ಲಿ ನಿಮ್ಮ Chrome ಚಟುವಟಿಕೆಯನ್ನು ತೋರಿಸಲು ಬಯಸುವಿರಾ?</translation> +<translation id="8115259494083109761">QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಲು, Chrome ಗೆ ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಬಳಸಲು ಅನುಮತಿಸಿ</translation> <translation id="8116925261070264013">ಮ್ಯೂಟ್ ಆಗಿರುವುದು</translation> <translation id="8127542551745560481">ಮುಖಪುಟವನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="813082847718468539">ಸೈಟ್ ಮಾಹಿತಿಯನ್ನು ವೀಕ್ಷಿಸಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 507520d..3116401 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">어느 기기에서나 내 북마크를 사용하려면 동기화를 사용 설정하세요.</translation> <translation id="8110087112193408731">디지털 웰빙에서 Chrome 활동을 표시할까요?</translation> +<translation id="8115259494083109761">QR 코드를 스캔하려면 Chrome에서 카메라를 사용할 수 있도록 허용하세요.</translation> <translation id="8116925261070264013">음소거됨</translation> <translation id="8127542551745560481">홈페이지 수정</translation> <translation id="813082847718468539">사이트 정보 보기</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index c9f3e4f..099a36f3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -588,7 +588,7 @@ <translation id="5342314432463739672">Уруксат сурамдары</translation> <translation id="534295439873310000">NFC түзмөктөрү</translation> <translation id="5357811892247919462">Өтмөк алынды</translation> -<translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> ачык өтмөк, өтмөктөрдү которуштуруу үчүн таптап коюңуз}other{<ph name="OPEN_TABS_MANY" /> ачык өтмөк, өтмөктөрдү которуштуруу үчүн таптап коюңуз}}</translation> +<translation id="5368958499335451666">{OPEN_TABS,plural, =1{<ph name="OPEN_TABS_ONE" /> ачык өтмөк, өтмөктөрдү которуштуруу үчүн, таптап коюңуз}other{<ph name="OPEN_TABS_MANY" /> ачык өтмөк, өтмөктөрдү которуштуруу үчүн, таптап коюңуз}}</translation> <translation id="5394307150471348411">{DETAIL_COUNT,plural, =1{(+ дагы 1)}other{(+ дагы #)}}</translation> <translation id="5403592356182871684">Ысымдар</translation> <translation id="5403644198645076998">Белгилүү сайттарга гана кирүүгө уруксат</translation> @@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Кыстармаларды бардык түзмөктөрүңүздө колдонуу үчүн шайкештирүүнү күйгүзүңүз</translation> <translation id="8110087112193408731">Chrome'ду колдонуу дайын-даректериңиз Санариптик бакубаттык кызматында көрсөтүлсүнбү?</translation> +<translation id="8115259494083109761">QR кодун скандоо үчүн Chrome'го камераңызды колдонууга уруксат бериңиз</translation> <translation id="8116925261070264013">Үнсүз кылынган</translation> <translation id="8127542551745560481">Башкы бетти түзөтүү</translation> <translation id="813082847718468539">Сайттын маалыматын карап көрүү</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index c045a71..992fe0a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Jei norite pasiekti žymes visuose įrenginiuose, įjunkite sinchronizavimą</translation> <translation id="8110087112193408731">Rodyti „Chrome“ veiklą Skaitmeninės gerovės programoje?</translation> +<translation id="8115259494083109761">Jei norite nuskaityti QR kodą, leiskite „Chrome“ naudoti jūsų kamerą</translation> <translation id="8116925261070264013">Išjungta</translation> <translation id="8127542551745560481">Redaguoti pagrindinį puslapį</translation> <translation id="813082847718468539">Žiūrėti svetainės informaciją</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index b8e5f129..86c458cc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">За да ги добиете обележувачите на сите ваши уреди, вклучете ја синхронизацијата</translation> <translation id="8110087112193408731">Да се прикажува вашата активност на Chrome во „Дигитална благосостојба“?</translation> +<translation id="8115259494083109761">За да скенирате QR-код, дозволете Chrome да ја користи камерата</translation> <translation id="8116925261070264013">Со исклучен звук</translation> <translation id="8127542551745560481">Изменете ја почетната страница</translation> <translation id="813082847718468539">Прикажи информации за локација</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 42109195..ebd459f 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
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ബുക്ക്മാർക്കുകൾ ലഭിക്കാൻ, സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation> <translation id="8110087112193408731">ഡിജിറ്റൽ ആരോഗ്യത്തിൽ നിങ്ങളുടെ Chrome ആക്റ്റിവിറ്റി കാണിക്കണോ?</translation> +<translation id="8115259494083109761">QR കോഡ് സ്കാൻ ചെയ്യാൻ, Chrome-നെ നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാൻ അനുവദിക്കുക</translation> <translation id="8116925261070264013">മ്യൂട്ടുചെയ്തു</translation> <translation id="8127542551745560481">ഹോംപേജ് എഡിറ്റ് ചെയ്യുക</translation> <translation id="813082847718468539">സൈറ്റ് വിവരങ്ങള് കാണുക</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 1fd2b867..c9e8d88 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -964,6 +964,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Хавчуургаа бүх төхөөрөмждөө авахын тулд синкийг асаана уу</translation> <translation id="8110087112193408731">Chrome-н үйл ажиллагаагаа Дижитал хэрэглээнд харуулах уу?</translation> +<translation id="8115259494083109761">Хурдан хариу үйлдлийн кодыг скан хийхийн тулд Chrome-д таны камерыг ашиглахыг зөвшөөрнө үү</translation> <translation id="8116925261070264013">Дууг хаасан</translation> <translation id="8127542551745560481">Нүүр хуудсыг засах</translation> <translation id="813082847718468539">Сайтын мэдээллийг үзэх</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 402f2da..8ad2dac 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
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">ਆਪਣੇ ਸਾਰੇ ਡੀਵਾਈਸਾਂ 'ਤੇ ਆਪਣੇ ਬੁੱਕਮਾਰਕ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ</translation> <translation id="8110087112193408731">ਕੀ ਤੁਸੀਂ ਡਿਜੀਟਲ ਜੀਵਨਸ਼ੈਲੀ ਵਿੱਚ ਆਪਣੀ Chrome ਸਰਗਰਮੀ ਦਿਖਾਉਣੀ ਹੈ?</translation> +<translation id="8115259494083109761">ਕਿਸੇ QR ਕੋਡ ਨੂੰ ਸਕੈਨ ਕਰਨ ਲਈ, Chrome ਨੂੰ ਤੁਹਾਡਾ ਕੈਮਰਾ ਵਰਤਣ ਦਿਓ</translation> <translation id="8116925261070264013">ਮਿਊਟ ਕੀਤਾ ਗਿਆ</translation> <translation id="8127542551745560481">ਹੋਮਪੇਜ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="813082847718468539">ਸਾਈਟ ਜਾਣਕਾਰੀ ਦੇਖੋ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index e69505d7d..fd0f5d9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Ak chcete získať záložky vo všetkých zariadeniach, zapnite synchronizáciu</translation> <translation id="8110087112193408731">Chcete v digitálnej rovnováhe zobrazovať svoju aktivitu v Chrome?</translation> +<translation id="8115259494083109761">Ak chcete nasnímať QR kód, povoľte Chromu prístup ku kamere</translation> <translation id="8116925261070264013">Zvuk bol vypnutý</translation> <translation id="8127542551745560481">Upraviť domovskú stránku</translation> <translation id="813082847718468539">Zobraziť informácie o stránkach</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 1dacbcab..1a3c1494a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Për të marrë faqeshënuesit e tu në të gjitha pajisjet e tua, aktivizo sinkronizimin</translation> <translation id="8110087112193408731">Dëshiron të shfaqësh aktivitetin tënd të Chrome te "Mirëqenia dixhitale"?</translation> +<translation id="8115259494083109761">Për të skanuar një kod QR, lejo që Chrome të përdorë kamerën tënde</translation> <translation id="8116925261070264013">Zëri i çaktivizuar</translation> <translation id="8127542551745560481">Modifiko faqen bazë</translation> <translation id="813082847718468539">Shiko informacionin rreth faqes</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 139d0e3..588286c0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Da bi vam obeleživači bili dostupni na svim uređajima, uključite sinhronizaciju</translation> <translation id="8110087112193408731">Želite li da se Chrome aktivnosti prikazuju u Digitalnom blagostanju?</translation> +<translation id="8115259494083109761">Da biste skenirali QR kôd, dozvolite da Chrome koristi kameru</translation> <translation id="8116925261070264013">Zvuk je isključen</translation> <translation id="8127542551745560481">Izmenite početnu stranicu</translation> <translation id="813082847718468539">Pogledajte informacije o sajtu</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index 836b7c8f..48dd59f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Да би вам обележивачи били доступни на свим уређајима, укључите синхронизацију</translation> <translation id="8110087112193408731">Желите ли да се Chrome активности приказују у Дигиталном благостању?</translation> +<translation id="8115259494083109761">Да бисте скенирали QR кôд, дозволите да Chrome користи камеру</translation> <translation id="8116925261070264013">Звук је искључен</translation> <translation id="8127542551745560481">Измените почетну страницу</translation> <translation id="813082847718468539">Погледајте информације о сајту</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index c02863d..e32efac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -959,6 +959,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">உங்கள் அனைத்துச் சாதனங்களிலும் புத்தகக்குறிகளைப் பெற, ஒத்திசைவை இயக்கவும்</translation> <translation id="8110087112193408731">உங்கள் Chrome செயல்பாட்டை டிஜிட்டல் வெல்பீயிங்கில் காட்டவா?</translation> +<translation id="8115259494083109761">QR குறியீட்டை ஸ்கேன் செய்ய, Chrome உலாவி உங்கள் கேமராவைப் பயன்படுத்த அனுமதிக்கவும்</translation> <translation id="8116925261070264013">ஒலியடக்கியவை</translation> <translation id="8127542551745560481">முகப்புப்பக்கத்தைத் திருத்து</translation> <translation id="813082847718468539">தள விவரங்களைக் காண்க</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index ac62e99..c0756217 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">ఇక ఎప్పుడు ఎక్కడ బుక్మార్క్లను సెట్ చేసినా ఆటోమాటిక్గా మీ అన్ని పరికరాలలో పొందాలనుకుంటే, సమకాలీకరణ ఎంపికని ఆన్ చేయండి</translation> <translation id="8110087112193408731">డిజిటల్ సంక్షేమంలో మీ Chrome కార్యకలాపాన్ని చూపించాలా?</translation> +<translation id="8115259494083109761">ఒక QR కోడ్ను స్కాన్ చేయడానికి, మీ కెమెరాను ఉపయోగించడానికి Chromeను అనుమతించండి</translation> <translation id="8116925261070264013">మ్యూట్ చేసినవి</translation> <translation id="8127542551745560481">హోమ్ పేజీని ఎడిట్ చేయండి</translation> <translation id="813082847718468539">సైట్ సమాచారాన్ని చూడండి</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 e61f8e8..05138a7 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
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Để sử dụng dấu trang trên tất cả các thiết bị, hãy bật tính năng đồng bộ hóa</translation> <translation id="8110087112193408731">Bạn có muốn hiển thị hoạt động của mình trên Chrome trong Digital Wellbeing không?</translation> +<translation id="8115259494083109761">Để quét mã QR, hãy cho phép Chrome dùng máy ảnh của bạn</translation> <translation id="8116925261070264013">Đã ẩn</translation> <translation id="8127542551745560481">Chỉnh sửa trang chủ</translation> <translation id="813082847718468539">Xem thông tin trang web</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 736ad59..1272787 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">要将您的书签同步到您的所有设备上,请开启同步功能</translation> <translation id="8110087112193408731">在“数字健康”应用中显示您的 Chrome 活动记录?</translation> +<translation id="8115259494083109761">要扫描二维码,请允许 Chrome 使用您的摄像头</translation> <translation id="8116925261070264013">已静音的网站</translation> <translation id="8127542551745560481">修改主页</translation> <translation id="813082847718468539">查看网站信息</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index d9ff4564..5a31fd6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -965,6 +965,7 @@ <translation id="8105893657415066307"><ph name="DESCRIPTION" /> <ph name="SEPARATOR" /> <ph name="FILE_SIZE" /></translation> <translation id="8109613176066109935">Ukuze uthole amabhukhimakhi akho kuwo onke amadivayisi akho, vula ukuvumelanisa</translation> <translation id="8110087112193408731">Bonisa umsebenzi wakho we-Chrome ku-Digital Wellbeing?</translation> +<translation id="8115259494083109761">Ukuskena ikhodi ye-QR, vumela i-Chrome ukusebenzisa ikhamera yakho</translation> <translation id="8116925261070264013">Kuthulisiwe</translation> <translation id="8127542551745560481">Hlela ikhasi lasekhaya</translation> <translation id="813082847718468539">Buka ulwazi lwesayithi</translation>
diff --git a/chrome/browser/ui/app_list/search/DEPS b/chrome/browser/ui/app_list/search/DEPS new file mode 100644 index 0000000..00dcbbac --- /dev/null +++ b/chrome/browser/ui/app_list/search/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+ash/assistant/model", + "+ash/public/cpp/vector_icons", +]
diff --git a/chrome/browser/ui/app_list/search/assistant_search_provider.cc b/chrome/browser/ui/app_list/search/assistant_search_provider.cc new file mode 100644 index 0000000..9281cdd --- /dev/null +++ b/chrome/browser/ui/app_list/search/assistant_search_provider.cc
@@ -0,0 +1,90 @@ +// 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/app_list/search/assistant_search_provider.h" + +#include "ash/assistant/model/assistant_suggestions_model.h" +#include "ash/public/cpp/app_list/app_list_config.h" +#include "ash/public/cpp/app_list/app_list_metrics.h" +#include "ash/public/cpp/app_list/app_list_types.h" +#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" +#include "ash/public/cpp/vector_icons/vector_icons.h" +#include "base/strings/utf_string_conversions.h" +#include "base/unguessable_token.h" +#include "chrome/browser/ui/app_list/search/chrome_search_result.h" +#include "chromeos/services/assistant/public/mojom/assistant.mojom.h" +#include "ui/gfx/color_palette.h" +#include "ui/gfx/paint_vector_icon.h" + +namespace app_list { + +namespace { + +// Aliases. +using AssistantSuggestion = chromeos::assistant::mojom::AssistantSuggestion; + +// Constants. +constexpr char kIdPrefix[] = "googleassistant://"; + +// AssistantSearchResult ------------------------------------------------------- + +class AssistantSearchResult : public ChromeSearchResult { + public: + explicit AssistantSearchResult( + const AssistantSuggestion* conversation_starter) { + set_id(kIdPrefix + conversation_starter->id.ToString()); + SetDisplayIndex(ash::SearchResultDisplayIndex::kFirstIndex); + SetDisplayType(ash::SearchResultDisplayType::kChip); + SetResultType(ash::AppListSearchResultType::kAssistantChip); + SetTitle(base::UTF8ToUTF16(conversation_starter->text)); + SetChipIcon(gfx::CreateVectorIcon( + ash::kAssistantIcon, + ash::AppListConfig::instance().suggestion_chip_icon_dimension(), + gfx::kPlaceholderColor)); + } + + AssistantSearchResult(const AssistantSearchResult&) = delete; + AssistantSearchResult& operator=(const AssistantSearchResult&) = delete; + ~AssistantSearchResult() override = default; + + private: + // ChromeSearchResult: + ash::SearchResultType GetSearchResultType() const override { + return ash::SearchResultType::ASSISTANT; + } + + // TODO(b:153166883): Handle opening Assistant result. + void Open(int event_flags) override { NOTIMPLEMENTED(); } +}; + +} // namespace + +// AssistantSearchProvider ----------------------------------------------------- + +AssistantSearchProvider::AssistantSearchProvider() { + // Synchronize our initial state w/ that of the Assistant suggestions model. + OnConversationStartersChanged(ash::AssistantSuggestionsController::Get() + ->GetModel() + ->GetConversationStarters()); + + // Observe the Assistant suggestions model to receive updates. + ash::AssistantSuggestionsController::Get()->AddModelObserver(this); +} + +AssistantSearchProvider::~AssistantSearchProvider() { + ash::AssistantSuggestionsController::Get()->RemoveModelObserver(this); +} + +// TODO(b:153466226): Only create a result if confidence score threshold is met. +void AssistantSearchProvider::OnConversationStartersChanged( + const std::vector<const AssistantSuggestion*>& conversation_starters) { + SearchProvider::Results results; + if (!conversation_starters.empty()) { + const AssistantSuggestion* starter = conversation_starters.front(); + results.push_back(std::make_unique<AssistantSearchResult>(starter)); + } + SwapResults(&results); +} + +} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/assistant_search_provider.h b/chrome/browser/ui/app_list/search/assistant_search_provider.h new file mode 100644 index 0000000..7790b45 --- /dev/null +++ b/chrome/browser/ui/app_list/search/assistant_search_provider.h
@@ -0,0 +1,37 @@ +// 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_APP_LIST_SEARCH_ASSISTANT_SEARCH_PROVIDER_H_ +#define CHROME_BROWSER_UI_APP_LIST_SEARCH_ASSISTANT_SEARCH_PROVIDER_H_ + +#include "ash/assistant/model/assistant_suggestions_model_observer.h" +#include "chrome/browser/ui/app_list/search/search_provider.h" + +namespace app_list { + +// A search provider implementation serving results from Assistant. +// NOTE: This is currently only used to provide a single search result when +// launcher chip integration is enabled from Assistant's internal cache of +// conversation starters. +class AssistantSearchProvider : public SearchProvider, + public ash::AssistantSuggestionsModelObserver { + public: + AssistantSearchProvider(); + AssistantSearchProvider(const AssistantSearchProvider&) = delete; + AssistantSearchProvider& operator=(const AssistantSearchProvider&) = delete; + ~AssistantSearchProvider() override; + + private: + // SearchProvider: + void Start(const base::string16& query) override {} + + // ash::AssistantSuggestionsModelObserver: + void OnConversationStartersChanged( + const std::vector<const AssistantSuggestion*>& conversation_starters) + override; +}; + +} // namespace app_list + +#endif // CHROME_BROWSER_UI_APP_LIST_SEARCH_ASSISTANT_SEARCH_PROVIDER_H_
diff --git a/chrome/browser/ui/app_list/search/assistant_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/assistant_search_provider_unittest.cc new file mode 100644 index 0000000..9a05270 --- /dev/null +++ b/chrome/browser/ui/app_list/search/assistant_search_provider_unittest.cc
@@ -0,0 +1,197 @@ +// 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 <vector> + +#include "ash/assistant/model/assistant_suggestions_model.h" +#include "ash/public/cpp/app_list/app_list_config.h" +#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h" +#include "ash/public/cpp/vector_icons/vector_icons.h" +#include "base/strings/utf_string_conversions.h" +#include "base/unguessable_token.h" +#include "chrome/browser/ui/app_list/app_list_test_util.h" +#include "chrome/browser/ui/app_list/search/assistant_search_provider.h" +#include "chrome/browser/ui/app_list/search/chrome_search_result.h" +#include "chromeos/services/assistant/public/mojom/assistant.mojom.h" +#include "ui/gfx/color_palette.h" +#include "ui/gfx/paint_vector_icon.h" + +namespace app_list { +namespace test { + +// Aliases. +using AssistantSuggestion = chromeos::assistant::mojom::AssistantSuggestion; +using AssistantSuggestionPtr = + chromeos::assistant::mojom::AssistantSuggestionPtr; + +// Expectations ---------------------------------------------------------------- + +class Expect { + public: + explicit Expect(const ChromeSearchResult& result) : r_(result) { + EXPECT_EQ(r_.display_index(), ash::SearchResultDisplayIndex::kFirstIndex); + EXPECT_EQ(r_.display_type(), ash::SearchResultDisplayType::kChip); + EXPECT_EQ(r_.result_type(), ash::AppListSearchResultType::kAssistantChip); + EXPECT_EQ(r_.GetSearchResultType(), ash::SearchResultType::ASSISTANT); + EXPECT_TRUE(r_.chip_icon().BackedBySameObjectAs(gfx::CreateVectorIcon( + ash::kAssistantIcon, + ash::AppListConfig::instance().suggestion_chip_icon_dimension(), + gfx::kPlaceholderColor))); + } + + Expect(const Expect&) = delete; + Expect& operator=(const Expect&) = delete; + ~Expect() = default; + + Expect& Matches(const AssistantSuggestion& starter) { + EXPECT_EQ(r_.id(), "googleassistant://" + starter.id.ToString()); + EXPECT_EQ(r_.title(), base::UTF8ToUTF16(starter.text)); + return *this; + } + + private: + const ChromeSearchResult& r_; +}; + +// ConversationStarterBuilder -------------------------------------------------- + +class ConversationStarterBuilder { + public: + ConversationStarterBuilder() = default; + ConversationStarterBuilder(const ConversationStarterBuilder&) = delete; + ConversationStarterBuilder& operator=(const ConversationStarterBuilder&) = + delete; + ~ConversationStarterBuilder() = default; + + AssistantSuggestionPtr Build() { + DCHECK(!id_.is_empty()); + DCHECK(!text_.empty()); + + AssistantSuggestionPtr conversation_starter = AssistantSuggestion::New(); + conversation_starter->id = id_; + conversation_starter->text = text_; + return conversation_starter; + } + + ConversationStarterBuilder& WithId(const base::UnguessableToken& id) { + id_ = id; + return *this; + } + + ConversationStarterBuilder& WithText(const std::string& text) { + text_ = text; + return *this; + } + + private: + base::UnguessableToken id_; + std::string text_; +}; + +// TestAssistantSuggestionsController ------------------------------------------ + +class TestAssistantSuggestionsController + : public ash::AssistantSuggestionsController { + public: + TestAssistantSuggestionsController() { + SetConversationStarter(ConversationStarterBuilder() + .WithId(base::UnguessableToken::Create()) + .WithText("Initial result") + .Build()); + } + + TestAssistantSuggestionsController( + const TestAssistantSuggestionsController&) = delete; + TestAssistantSuggestionsController& operator=( + const TestAssistantSuggestionsController&) = delete; + ~TestAssistantSuggestionsController() override = default; + + // ash::AssistantSuggestionsController: + const ash::AssistantSuggestionsModel* GetModel() const override { + return &model_; + } + + void AddModelObserver( + ash::AssistantSuggestionsModelObserver* observer) override { + model_.AddObserver(observer); + } + + void RemoveModelObserver( + ash::AssistantSuggestionsModelObserver* observer) override { + model_.RemoveObserver(observer); + } + + void ClearConversationStarters() { SetConversationStarters({}); } + + void SetConversationStarter(AssistantSuggestionPtr conversation_starter) { + std::vector<AssistantSuggestionPtr> conversation_starters; + conversation_starters.push_back(std::move(conversation_starter)); + SetConversationStarters(std::move(conversation_starters)); + } + + void SetConversationStarters( + std::vector<AssistantSuggestionPtr> conversation_starters) { + model_.SetConversationStarters(std::move(conversation_starters)); + } + + private: + ash::AssistantSuggestionsModel model_; +}; + +// AssistantSearchProviderTest ------------------------------------------------- + +class AssistantSearchProviderTest : public AppListTestBase { + public: + AssistantSearchProviderTest() = default; + AssistantSearchProviderTest(const AssistantSearchProviderTest&) = delete; + AssistantSearchProviderTest& operator=(const AssistantSearchProviderTest&) = + delete; + ~AssistantSearchProviderTest() override = default; + + AssistantSearchProvider& search_provider() { return search_provider_; } + + TestAssistantSuggestionsController& suggestions_controller() { + return suggestions_controller_; + } + + private: + TestAssistantSuggestionsController suggestions_controller_; + AssistantSearchProvider search_provider_; +}; + +// Tests ----------------------------------------------------------------------- + +TEST_F(AssistantSearchProviderTest, ShouldHaveAnInitialResult) { + std::vector<const AssistantSuggestion*> conversation_starters = + suggestions_controller().GetModel()->GetConversationStarters(); + + ASSERT_EQ(1u, conversation_starters.size()); + ASSERT_EQ(1u, search_provider().results().size()); + + const ChromeSearchResult& result = *search_provider().results().at(0); + Expect(result).Matches(*conversation_starters.front()); +} + +TEST_F(AssistantSearchProviderTest, ShouldClearResultsDynamically) { + EXPECT_EQ(1u, search_provider().results().size()); + + suggestions_controller().ClearConversationStarters(); + EXPECT_TRUE(search_provider().results().empty()); +} + +TEST_F(AssistantSearchProviderTest, ShouldUpdateResultsDynamically) { + AssistantSuggestionPtr update = ConversationStarterBuilder() + .WithId(base::UnguessableToken::Create()) + .WithText("Updated result") + .Build(); + + suggestions_controller().SetConversationStarter(update->Clone()); + ASSERT_EQ(1u, search_provider().results().size()); + + const ChromeSearchResult& result = *search_provider().results().at(0); + Expect(result).Matches(*update); +} + +} // namespace test +} // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/search_controller_factory.cc b/chrome/browser/ui/app_list/search/search_controller_factory.cc index 820f0e4..70cb24a 100644 --- a/chrome/browser/ui/app_list/search/search_controller_factory.cc +++ b/chrome/browser/ui/app_list/search/search_controller_factory.cc
@@ -22,6 +22,7 @@ #include "chrome/browser/ui/app_list/search/arc/arc_app_reinstall_search_provider.h" #include "chrome/browser/ui/app_list/search/arc/arc_app_shortcuts_search_provider.h" #include "chrome/browser/ui/app_list/search/arc/arc_playstore_search_provider.h" +#include "chrome/browser/ui/app_list/search/assistant_search_provider.h" #include "chrome/browser/ui/app_list/search/drive_quick_access_provider.h" #include "chrome/browser/ui/app_list/search/launcher_search/launcher_search_provider.h" #include "chrome/browser/ui/app_list/search/mixer.h" @@ -31,6 +32,7 @@ #include "chrome/browser/ui/app_list/search/zero_state_file_provider.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" +#include "chromeos/services/assistant/public/features.h" #include "components/arc/arc_util.h" namespace app_list { @@ -61,6 +63,10 @@ constexpr size_t kMaxAppDataResults = 4; constexpr size_t kMaxAppShortcutResults = 4; +// Assistant provides a single search result when launcher chip integration is +// enabled from its internal cache of conversation starters. +constexpr size_t kMaxAssistantResults = 1; + // TODO(wutao): Need UX spec. constexpr size_t kMaxSettingsShortcutResults = 6; @@ -108,6 +114,15 @@ profile, model_updater, list_controller)); } + // The Assistant search provider currently only contributes search results + // when launcher chip integration is enabled. + if (chromeos::assistant::features::IsLauncherChipIntegrationEnabled()) { + size_t assistant_group_id = controller->AddGroup( + kMaxAssistantResults, /*multiplier=*/1.0, kBoostOfApps); + controller->AddProvider(assistant_group_id, + std::make_unique<AssistantSearchProvider>()); + } + // LauncherSearchProvider is added only when not in guest // session and running on Chrome OS. if (!profile->IsGuestSession()) {
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc b/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc index 487dbc27..4418cc8 100644 --- a/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc +++ b/chrome/browser/ui/app_list/search/search_result_ranker/ranking_item_util.cc
@@ -30,6 +30,9 @@ case ash::AppListSearchResultType::kInstantApp: case ash::AppListSearchResultType::kAnswerCard: case ash::AppListSearchResultType::kPlayStoreReinstallApp: + case ash::AppListSearchResultType::kAssistantChip: + // NOTE: We don't rank results of type kAssistantChip as the Assistant + // chip result, if present, is always shown in a dedicated slot. return RankingItemType::kIgnored; case ash::AppListSearchResultType::kArcAppShortcut: return RankingItemType::kArcAppShortcut;
diff --git a/chrome/browser/ui/ash/DEPS b/chrome/browser/ui/ash/DEPS index d2632bf8..fc18807 100644 --- a/chrome/browser/ui/ash/DEPS +++ b/chrome/browser/ui/ash/DEPS
@@ -26,6 +26,12 @@ "ash_util\.cc": [ "+ash/shell.h", ], + "assistant_timers_browsertest\.cc": [ + "+ash/shelf", + "+ash/shell.h", + "+ash/system", + "+ui/message_center", + ], # https://crbug.com/756054 "chrome_accessibility_delegate.*": [ "+ash/accessibility/accessibility_delegate.h",
diff --git a/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc b/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc new file mode 100644 index 0000000..710c421 --- /dev/null +++ b/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc
@@ -0,0 +1,219 @@ +// 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 <string> +#include <vector> + +#include "ash/shelf/shelf.h" +#include "ash/shelf/shelf_widget.h" +#include "ash/shell.h" +#include "ash/system/message_center/unified_message_center_bubble.h" +#include "ash/system/message_center/unified_message_center_view.h" +#include "ash/system/status_area_widget.h" +#include "ash/system/unified/unified_system_tray.h" +#include "base/strings/string_util.h" +#include "base/test/icu_test_util.h" +#include "chrome/browser/ui/ash/assistant/assistant_test_mixin.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" +#include "chromeos/services/assistant/public/features.h" +#include "ui/aura/window.h" +#include "ui/events/test/event_generator.h" +#include "ui/message_center/message_center.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/views/notification_view_md.h" + +namespace chromeos { +namespace assistant { + +namespace { + +// TODO(b:153496343): Move generic helpers to a more generic location for reuse. +// Helpers --------------------------------------------------------------------- + +// Finds any descendents of |parent| with the desired |class_name| and pushes +// them onto the strongly typed |result| vector. +// NOTE: Callers are expected to ensure that casting to <T> makes sense. +template <typename T> +void FindDescendentsOfClass(views::View* parent, + std::string class_name, + std::vector<T*>* result) { + for (auto* child : parent->children()) { + if (child->GetClassName() == class_name) + result->push_back(static_cast<T*>(child)); + FindDescendentsOfClass(child, class_name, result); + } +} + +// Finds any descendents of |parent| with class name equal to the static class +// variable |kViewClassName| and pushes them onto the strongly typed |result| +// vector. +// NOTE: This variant of FindDescendentsOfClass is safer than the three argument +// variant and its usage should be preferred where possible. +template <typename T> +void FindDescendentsOfClass(views::View* parent, std::vector<T*>* result) { + FindDescendentsOfClass(parent, T::kViewClassName, result); +} + +// Returns the status area widget. +ash::StatusAreaWidget* FindStatusAreaWidget() { + return ash::Shelf::ForWindow(ash::Shell::GetRootWindowForNewWindows()) + ->shelf_widget() + ->status_area_widget(); +} + +// Returns the set of Assistant notifications (as indicated by application id). +message_center::NotificationList::Notifications FindAssistantNotifications() { + return message_center::MessageCenter::Get()->FindNotificationsByAppId( + "assistant"); +} + +// Returns visible notifications having id starting with |prefix|. +std::vector<message_center::Notification*> FindVisibleNotificationsByPrefixedId( + const std::string& prefix) { + std::vector<message_center::Notification*> notifications; + for (auto* notification : + message_center::MessageCenter::Get()->GetVisibleNotifications()) { + if (base::StartsWith(notification->id(), prefix, + base::CompareCase::SENSITIVE)) { + notifications.push_back(notification); + } + } + return notifications; +} + +// Returns the view for the specified |notification|. +message_center::MessageView* FindViewForNotification( + const message_center::Notification* notification) { + ash::UnifiedMessageCenterView* unified_message_center_view = + FindStatusAreaWidget() + ->unified_system_tray() + ->message_center_bubble() + ->message_center_view(); + + std::vector<message_center::MessageView*> message_views; + FindDescendentsOfClass(unified_message_center_view, &message_views); + + for (message_center::MessageView* message_view : message_views) { + if (message_view->notification_id() == notification->id()) + return message_view; + } + + return nullptr; +} + +// Returns the action buttons for the specified |notification|. +std::vector<message_center::NotificationButtonMD*> +FindActionButtonsForNotification( + const message_center::Notification* notification) { + auto* notification_view = FindViewForNotification(notification); + + std::vector<message_center::NotificationButtonMD*> action_buttons; + FindDescendentsOfClass(notification_view, "NotificationButtonMD", + &action_buttons); + + return action_buttons; +} + +// Performs a tap of the specified |view| and waits until the RunLoop idles. +void TapOnAndWait(const views::View* view) { + auto* root_window = view->GetWidget()->GetNativeWindow()->GetRootWindow(); + ui::test::EventGenerator event_generator(root_window); + event_generator.MoveTouch(view->GetBoundsInScreen().CenterPoint()); + event_generator.PressTouch(); + event_generator.ReleaseTouch(); + base::RunLoop().RunUntilIdle(); +} + +// Performs a tap of the specified |widget| and waits until the RunLoop idles. +void TapOnAndWait(const views::Widget* widget) { + aura::Window* root_window = widget->GetNativeWindow()->GetRootWindow(); + ui::test::EventGenerator event_generator(root_window); + event_generator.MoveTouch(widget->GetWindowBoundsInScreen().CenterPoint()); + event_generator.PressTouch(); + event_generator.ReleaseTouch(); + base::RunLoop().RunUntilIdle(); +} + +} // namespace + +// AssistantTimersBrowserTest -------------------------------------------------- + +class AssistantTimersBrowserTest : public MixinBasedInProcessBrowserTest { + public: + AssistantTimersBrowserTest() { + feature_list_.InitAndEnableFeature(features::kAssistantTimersV2); + } + + AssistantTimersBrowserTest(const AssistantTimersBrowserTest&) = delete; + AssistantTimersBrowserTest& operator=(const AssistantTimersBrowserTest&) = + delete; + + ~AssistantTimersBrowserTest() override = default; + + void ShowAssistantUi() { + if (!tester()->IsVisible()) + tester()->PressAssistantKey(); + } + + AssistantTestMixin* tester() { return &tester_; } + + private: + base::test::ScopedFeatureList feature_list_; + base::test::ScopedRestoreICUDefaultLocale locale_{"en_US"}; + AssistantTestMixin tester_{&mixin_host_, this, embedded_test_server(), + FakeS3Mode::kReplay}; +}; + +// Tests ----------------------------------------------------------------------- + +// Pressing the "STOP" action button in a timer notification should result in +// the timer being removed. +IN_PROC_BROWSER_TEST_F(AssistantTimersBrowserTest, + ShouldRemoveTimerWhenStoppingViaNotification) { + tester()->StartAssistantAndWaitForReady(); + + ShowAssistantUi(); + EXPECT_TRUE(tester()->IsVisible()); + + // Confirm no Assistant notifications are currently being shown. + EXPECT_TRUE(FindAssistantNotifications().empty()); + + // Start a timer for five minutes. + tester()->SendTextQuery("Set a timer for 5 minutes"); + tester()->ExpectAnyOfTheseTextResponses({ + "Alright, 5 min. Starting… now.", + "OK, 5 min. And we're starting… now.", + "OK, 5 min. Starting… now.", + "Sure, 5 min. And that's starting… now.", + "Sure, 5 min. Starting now.", + }); + + // Tap status area widget (to show notifications in the Message Center). + TapOnAndWait(FindStatusAreaWidget()); + + // Confirm that an Assistant timer notification is now showing. + auto notifications = FindVisibleNotificationsByPrefixedId("assistant/timer"); + ASSERT_EQ(1u, notifications.size()); + + // Find the action buttons for our notification. + // NOTE: We expect action buttons for "STOP" and "ADD 1 MIN". + auto action_buttons = FindActionButtonsForNotification(notifications.at(0)); + EXPECT_EQ(2u, action_buttons.size()); + + // Tap the "STOP" action button in the notification. + EXPECT_EQ(base::UTF8ToUTF16("STOP"), action_buttons.at(0)->GetText()); + TapOnAndWait(action_buttons.at(0)); + + ShowAssistantUi(); + EXPECT_TRUE(tester()->IsVisible()); + + // Confirm that no timers exist anymore. + tester()->SendTextQuery("Show my timers"); + tester()->ExpectAnyOfTheseTextResponses({ + "It looks like you don't have any timers set at the moment.", + }); +} + +} // namespace assistant +} // namespace chromeos
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.cc b/chrome/browser/ui/ash/chrome_new_window_client.cc index 36d5d94..bedf735 100644 --- a/chrome/browser/ui/ash/chrome_new_window_client.cc +++ b/chrome/browser/ui/ash/chrome_new_window_client.cc
@@ -548,7 +548,8 @@ NOTREACHED(); } -void ChromeNewWindowClient::LaunchCameraApp(const std::string& queries) { +void ChromeNewWindowClient::LaunchCameraApp(const std::string& queries, + int32_t task_id) { Profile* const profile = ProfileManager::GetActiveUserProfile(); const extensions::ExtensionRegistry* registry = extensions::ExtensionRegistry::Get(profile);
diff --git a/chrome/browser/ui/ash/chrome_new_window_client.h b/chrome/browser/ui/ash/chrome_new_window_client.h index d1756a9..3c9f8a1 100644 --- a/chrome/browser/ui/ash/chrome_new_window_client.h +++ b/chrome/browser/ui/ash/chrome_new_window_client.h
@@ -60,7 +60,7 @@ void OpenChromePageFromArc(arc::mojom::ChromePage page) override; // arc::ControlCameraAppDelegate: - void LaunchCameraApp(const std::string& queries) override; + void LaunchCameraApp(const std::string& queries, int32_t task_id) override; void CloseCameraApp() override; bool IsCameraAppEnabled() override;
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc index c82a61a..cdf6b47 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.cc +++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "ash/public/cpp/ash_features.h" #include "ash/screenshot_delegate.h" #include "base/bind.h" #include "chrome/browser/browser_process.h" @@ -26,6 +27,7 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h" #include "chromeos/services/multidevice_setup/multidevice_setup_service.h" #include "content/public/browser/device_service.h" #include "content/public/browser/media_session_service.h" @@ -71,6 +73,36 @@ return contents->GetController().CanGoBack(); } +bool ChromeShellDelegate::CreateBrowserForTabDrop( + gfx::NativeWindow source_window, + const ui::OSExchangeData& drop_data) { + CHECK(ash::features::IsWebUITabStripTabDragIntegrationEnabled()); + + BrowserView* source_view = BrowserView::GetBrowserViewForNativeWindow( + source_window->GetToplevelWindow()); + if (!source_view) + return false; + + Browser::CreateParams params = source_view->browser()->create_params(); + params.user_gesture = true; + params.initial_show_state = ui::SHOW_STATE_DEFAULT; + Browser* browser = Browser::Create(params); + if (!browser) + return false; + + if (!tab_strip_ui::DropTabsInNewBrowser(browser, drop_data)) { + browser->window()->Close(); + return false; + } + + // TODO(https://crbug.com/1069869): evaluate whether the above + // failures can happen in valid states, and if so whether we need to + // reflect failure in UX. + + browser->window()->Show(); + return true; +} + void ChromeShellDelegate::BindBluetoothSystemFactory( mojo::PendingReceiver<device::mojom::BluetoothSystemFactory> receiver) { content::GetDeviceService().BindBluetoothSystemFactory(std::move(receiver));
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.h b/chrome/browser/ui/ash/chrome_shell_delegate.h index 2676fb8e..2326bbc 100644 --- a/chrome/browser/ui/ash/chrome_shell_delegate.h +++ b/chrome/browser/ui/ash/chrome_shell_delegate.h
@@ -22,6 +22,8 @@ ash::BackGestureContextualNudgeController* controller) override; void OpenKeyboardShortcutHelpPage() const override; bool CanGoBack(gfx::NativeWindow window) const override; + bool CreateBrowserForTabDrop(gfx::NativeWindow source_window, + const ui::OSExchangeData& drop_data) override; void BindBluetoothSystemFactory( mojo::PendingReceiver<device::mojom::BluetoothSystemFactory> receiver) override;
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc index 0ae86ae7..bfe72ddf 100644 --- a/chrome/browser/ui/chrome_pages.cc +++ b/chrome/browser/ui/chrome_pages.cc
@@ -23,11 +23,11 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/app_service/browser_app_launcher.h" +#include "chrome/browser/apps/app_service/launch_utils.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chromeos/extensions/default_web_app_ids.h" #include "chrome/browser/download/download_shelf.h" -#include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" @@ -36,13 +36,15 @@ #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator_params.h" #include "chrome/browser/ui/browser_window.h" -#include "chrome/browser/ui/extensions/app_launch_params.h" #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h" #include "chrome/browser/ui/singleton_tabs.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/webui/bookmarks/bookmarks_ui.h" #include "chrome/browser/ui/webui/settings/site_settings_helper.h" +#include "chrome/browser/web_applications/components/app_registrar.h" +#include "chrome/browser/web_applications/components/web_app_constants.h" #include "chrome/browser/web_applications/components/web_app_id.h" +#include "chrome/browser/web_applications/components/web_app_provider_base.h" #include "chrome/common/channel_info.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" @@ -53,7 +55,6 @@ #include "components/bookmarks/browser/bookmark_node.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/extension_prefs.h" -#include "extensions/browser/extension_registry.h" #include "extensions/common/constants.h" #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/gaia_urls.h" @@ -69,7 +70,6 @@ #include "chrome/common/webui_url_constants.h" #include "chromeos/constants/chromeos_features.h" #include "components/version_info/version_info.h" -#include "extensions/browser/extension_registry.h" #else #include "chrome/browser/ui/signin_view_controller.h" #endif @@ -148,14 +148,18 @@ void LaunchReleaseNotesImpl(Profile* profile) { base::RecordAction(UserMetricsAction("ReleaseNotes.ShowReleaseNotes")); - const extensions::Extension* extension = - extensions::ExtensionRegistry::Get(profile)->GetExtensionById( - chromeos::default_web_apps::kReleaseNotesAppId, - extensions::ExtensionRegistry::EVERYTHING); - if (extension) { - apps::AppLaunchParams params = CreateAppLaunchParamsWithEventFlags( - profile, extension, 0, apps::mojom::AppLaunchSource::kSourceUntracked, - -1); + auto* provider = web_app::WebAppProviderBase::GetProviderBase(profile); + if (provider && provider->registrar().IsInstalled( + chromeos::default_web_apps::kReleaseNotesAppId)) { + web_app::DisplayMode display_mode = + provider->registrar().GetAppEffectiveDisplayMode( + chromeos::default_web_apps::kReleaseNotesAppId); + apps::AppLaunchParams params = apps::CreateAppIdLaunchParamsWithEventFlags( + chromeos::default_web_apps::kReleaseNotesAppId, + /*event_flags=*/0, apps::mojom::AppLaunchSource::kSourceUntracked, + /*display_id=*/-1, + web_app::ConvertDisplayModeToAppLaunchContainer(display_mode)); + params.override_url = GURL(BuildQueryString(profile)); apps::AppServiceProxyFactory::GetForProfile(profile) ->BrowserAppLauncher()
diff --git a/chrome/browser/ui/find_bar/find_bar_controller.cc b/chrome/browser/ui/find_bar/find_bar_controller.cc index 3c0b2aa..532a44fe 100644 --- a/chrome/browser/ui/find_bar/find_bar_controller.cc +++ b/chrome/browser/ui/find_bar/find_bar_controller.cc
@@ -51,27 +51,37 @@ find_bar_->SetFocusAndSelection(); base::string16 find_text; - if (!find_next && !has_user_modified_text_) { - base::string16 selected_text = GetSelectedText(); - if (selected_text.length() <= 250) - find_text = selected_text; - } #if defined(OS_MACOSX) - // We always want to search for the current contents of the find bar on - // OS X. For regular profile it's always the current find pboard. For - // Incognito window it's the newest value of the find pboard content and - // user-typed text. - find_text = find_bar_->GetFindText(); + if (find_next) { + // For macOS, we always want to search for the current contents of the find + // bar on OS X, rather than the behavior we'd get with empty find_text + // (see FindBarState::GetSearchPrepopulateText). + find_text = find_bar_->GetFindText(); + } #endif - if (!find_text.empty() || find_next) { - // Don't update the local input if we're using the global pasteboard. - if (!find_bar_->HasGlobalFindPasteboard()) + if (!find_next && !has_user_modified_text_) { + base::string16 selected_text = GetSelectedText(); + auto selected_length = selected_text.length(); + if (selected_length > 0 && selected_length <= 250) { + find_text = selected_text; find_bar_->SetFindTextAndSelectedRange(find_text, gfx::Range(0, find_text.length())); - find_tab_helper->StartFinding(find_text, forward_direction, false); + if (web_contents_) { + // Collapse the selection to its start, so we can run a find_next and + // make it find the selection. This is a no-op in terms of what ends + // up selected, but initializes the rest of the find machinery (like + // showing how many matches there are in the document). + web_contents_->AdjustSelectionByCharacterOffset(0, -selected_length, + false); + find_next = true; + } + } } + + if (find_next) + find_tab_helper->StartFinding(find_text, forward_direction, false); } void FindBarController::EndFindSession(
diff --git a/chrome/browser/ui/hats/hats_survey_status_checker.cc b/chrome/browser/ui/hats/hats_survey_status_checker.cc index 62fc5c5..3981ec2 100644 --- a/chrome/browser/ui/hats/hats_survey_status_checker.cc +++ b/chrome/browser/ui/hats/hats_survey_status_checker.cc
@@ -6,6 +6,7 @@ #include "base/strings/string_util.h" #include "base/timer/timer.h" +#include "chrome/browser/profiles/profile_destroyer.h" #include "content/public/browser/storage_partition.h" #include "net/base/load_flags.h" #include "net/cookies/canonical_cookie.h" @@ -21,16 +22,11 @@ constexpr char HatsSurveyStatusChecker::kReasonHeader[]; constexpr char HatsSurveyStatusChecker::kReasonOverCapacity[]; -HatsSurveyStatusChecker::HatsSurveyStatusChecker(Profile* profile) - : otr_profile_registration_( - IndependentOTRProfileManager::GetInstance() - ->CreateFromOriginalProfile( - profile, - base::BindOnce( - &HatsSurveyStatusChecker::OnOriginalProfileDestroyed, - base::Unretained(this)))) { - DCHECK( - otr_profile_registration_->profile()->IsIndependentOffTheRecordProfile()); +HatsSurveyStatusChecker::HatsSurveyStatusChecker(Profile* profile) { + Profile::OTRProfileID otr_profile_id = + Profile::OTRProfileID::CreateUnique("HaTS::SurveyStatusChecker"); + otr_profile_ = profile->GetOffTheRecordProfile(otr_profile_id); + otr_profile_->AddObserver(this); // HaTS client first downloads a javascript library from // https://www.google.com/insights/consumersurveys/async_survey?site=<site_id>. @@ -44,17 +40,26 @@ auto survey_cookie = net::CanonicalCookie::Create( GURL("https://www.google.com"), "PAIDCONTENT=0", base::Time::Now(), base::nullopt); - content::StoragePartition* partition = - content::BrowserContext::GetDefaultStoragePartition( - otr_profile_registration_->profile()); network::mojom::CookieManager* cookie_manager = - partition->GetCookieManagerForBrowserProcess(); + GetStoragePartition()->GetCookieManagerForBrowserProcess(); cookie_manager->SetCanonicalCookie(*survey_cookie, "https", net::CookieOptions::MakeAllInclusive(), base::DoNothing()); } -HatsSurveyStatusChecker::~HatsSurveyStatusChecker() = default; +HatsSurveyStatusChecker::~HatsSurveyStatusChecker() { + if (otr_profile_) { + otr_profile_->RemoveObserver(this); + ProfileDestroyer::DestroyProfileWhenAppropriate(otr_profile_); + otr_profile_ = nullptr; + } +} + +content::StoragePartition* HatsSurveyStatusChecker::GetStoragePartition() + const { + DCHECK(otr_profile_); + return content::BrowserContext::GetDefaultStoragePartition(otr_profile_); +} void HatsSurveyStatusChecker::CheckSurveyStatus( const std::string& site_id, @@ -101,11 +106,8 @@ policy_exception_justification: "Not implemented." })")); - content::StoragePartition* partition = - content::BrowserContext::GetDefaultStoragePartition( - otr_profile_registration_->profile()); url_loader_->DownloadHeadersOnly( - partition->GetURLLoaderFactoryForBrowserProcess().get(), + GetStoragePartition()->GetURLLoaderFactoryForBrowserProcess().get(), base::BindOnce(&HatsSurveyStatusChecker::OnURLLoadComplete, base::Unretained(this))); request_timer_.Start(FROM_HERE, @@ -130,11 +132,8 @@ return kTimeoutSecs; } -void HatsSurveyStatusChecker::OnOriginalProfileDestroyed(Profile* profile) { - if (otr_profile_registration_ && - profile == otr_profile_registration_->profile()) { - otr_profile_registration_.reset(); - } +void HatsSurveyStatusChecker::OnProfileWillBeDestroyed(Profile* profile) { + otr_profile_ = nullptr; } void HatsSurveyStatusChecker::OnURLLoadComplete(
diff --git a/chrome/browser/ui/hats/hats_survey_status_checker.h b/chrome/browser/ui/hats/hats_survey_status_checker.h index 4578cc2..5f402f7 100644 --- a/chrome/browser/ui/hats/hats_survey_status_checker.h +++ b/chrome/browser/ui/hats/hats_survey_status_checker.h
@@ -10,13 +10,12 @@ #include "base/callback.h" #include "base/callback_forward.h" #include "base/memory/scoped_refptr.h" -#include "chrome/browser/profiles/independent_otr_profile_manager.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_observer.h" #include "net/http/http_response_headers.h" #include "services/network/public/cpp/simple_url_loader.h" -class Profile; - -class HatsSurveyStatusChecker { +class HatsSurveyStatusChecker : public ProfileObserver { public: enum class Status { kSuccess, @@ -35,7 +34,7 @@ explicit HatsSurveyStatusChecker(Profile* profile); HatsSurveyStatusChecker(const HatsSurveyStatusChecker&) = delete; - virtual ~HatsSurveyStatusChecker(); + ~HatsSurveyStatusChecker() override; HatsSurveyStatusChecker& operator=(const HatsSurveyStatusChecker&) = delete; @@ -58,15 +57,17 @@ virtual int SurveyCheckTimeoutSecs(); private: - void OnOriginalProfileDestroyed(Profile* profile); + // ProfileObserver: + void OnProfileWillBeDestroyed(Profile* profile) override; // Callbacks for survey capacity checking. void OnURLLoadComplete(scoped_refptr<net::HttpResponseHeaders> headers); void OnTimeout(); + content::StoragePartition* GetStoragePartition() const; + // The off the record profile used for fetching survey status. - std::unique_ptr<IndependentOTRProfileManager::OTRProfileRegistration> - otr_profile_registration_; + Profile* otr_profile_ = nullptr; std::unique_ptr<network::SimpleURLLoader> url_loader_; base::OnceClosure on_success_;
diff --git a/chrome/browser/ui/search/search_ipc_router.cc b/chrome/browser/ui/search/search_ipc_router.cc index 56801a4..e6971e4f 100644 --- a/chrome/browser/ui/search/search_ipc_router.cc +++ b/chrome/browser/ui/search/search_ipc_router.cc
@@ -547,6 +547,15 @@ delegate_->DeleteAutocompleteMatch(line); } +void SearchIPCRouter::ToggleSuggestionGroupIdVisibility( + int32_t suggestion_group_id) { + if (!policy_->ShouldProcessToggleSuggestionGroupIdVisibility()) { + return; + } + + delegate_->ToggleSuggestionGroupIdVisibility(suggestion_group_id); +} + void SearchIPCRouter::set_delegate_for_testing(Delegate* delegate) { DCHECK(delegate); delegate_ = delegate;
diff --git a/chrome/browser/ui/search/search_ipc_router.h b/chrome/browser/ui/search/search_ipc_router.h index 6ebd77f..1daf18b 100644 --- a/chrome/browser/ui/search/search_ipc_router.h +++ b/chrome/browser/ui/search/search_ipc_router.h
@@ -182,6 +182,9 @@ bool shift_key) = 0; virtual void DeleteAutocompleteMatch(uint8_t line) = 0; + + virtual void ToggleSuggestionGroupIdVisibility( + int32_t suggestion_group_id) = 0; }; // An interface to be implemented by consumers of SearchIPCRouter objects to @@ -230,6 +233,7 @@ virtual bool ShouldProcessOpenExtensionsPage() = 0; virtual bool ShouldProcessOpenAutocompleteMatch(bool is_active_tab) = 0; virtual bool ShouldProcessDeleteAutocompleteMatch() = 0; + virtual bool ShouldProcessToggleSuggestionGroupIdVisibility() = 0; }; // Creates chrome::mojom::EmbeddedSearchClient connections on request. @@ -363,6 +367,7 @@ bool meta_key, bool shift_key) override; void DeleteAutocompleteMatch(uint8_t line) override; + void ToggleSuggestionGroupIdVisibility(int32_t suggestion_group_id) override; void set_embedded_search_client_factory_for_testing( std::unique_ptr<EmbeddedSearchClientFactory> factory) { embedded_search_client_factory_ = std::move(factory);
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc index 7ca3526..45efc35 100644 --- a/chrome/browser/ui/search/search_ipc_router_policy_impl.cc +++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.cc
@@ -171,3 +171,8 @@ bool SearchIPCRouterPolicyImpl::ShouldProcessDeleteAutocompleteMatch() { return !is_incognito_ && search::IsInstantNTP(web_contents_); } + +bool SearchIPCRouterPolicyImpl:: + ShouldProcessToggleSuggestionGroupIdVisibility() { + return !is_incognito_ && search::IsInstantNTP(web_contents_); +}
diff --git a/chrome/browser/ui/search/search_ipc_router_policy_impl.h b/chrome/browser/ui/search/search_ipc_router_policy_impl.h index ab3647d..b7a89d08 100644 --- a/chrome/browser/ui/search/search_ipc_router_policy_impl.h +++ b/chrome/browser/ui/search/search_ipc_router_policy_impl.h
@@ -64,6 +64,7 @@ bool ShouldProcessOpenExtensionsPage() override; bool ShouldProcessOpenAutocompleteMatch(bool is_active_tab) override; bool ShouldProcessDeleteAutocompleteMatch() override; + bool ShouldProcessToggleSuggestionGroupIdVisibility() override; // Used by unit tests. void set_is_incognito(bool is_incognito) {
diff --git a/chrome/browser/ui/search/search_ipc_router_unittest.cc b/chrome/browser/ui/search/search_ipc_router_unittest.cc index 92c90c8d..8e6f0d2 100644 --- a/chrome/browser/ui/search/search_ipc_router_unittest.cc +++ b/chrome/browser/ui/search/search_ipc_router_unittest.cc
@@ -126,6 +126,8 @@ bool ctrl_key, bool meta_key, bool shift_key)); + MOCK_METHOD1(ToggleSuggestionGroupIdVisibility, + void(int32_t suggestion_group_id)); }; class MockSearchIPCRouterPolicy : public SearchIPCRouter::Policy { @@ -169,6 +171,7 @@ MOCK_METHOD0(ShouldProcessOpenExtensionsPage, bool()); MOCK_METHOD1(ShouldProcessOpenAutocompleteMatch, bool(bool)); MOCK_METHOD0(ShouldProcessDeleteAutocompleteMatch, bool()); + MOCK_METHOD0(ShouldProcessToggleSuggestionGroupIdVisibility, bool()); }; class MockEmbeddedSearchClientFactory @@ -1104,6 +1107,7 @@ GetSearchIPCRouter().AutocompleteResultChanged( chrome::mojom::AutocompleteResult::New( base::string16(), + base::flat_map<int32_t, chrome::mojom::SuggestionGroupPtr>(), std::vector<chrome::mojom::AutocompleteMatchPtr>())); } @@ -1120,6 +1124,7 @@ GetSearchIPCRouter().AutocompleteResultChanged( chrome::mojom::AutocompleteResult::New( base::string16(), + base::flat_map<int32_t, chrome::mojom::SuggestionGroupPtr>(), std::vector<chrome::mojom::AutocompleteMatchPtr>())); } @@ -1204,6 +1209,30 @@ GetSearchIPCRouter().DeleteAutocompleteMatch(0u); } +TEST_F(SearchIPCRouterTest, SendToggleSuggestionGroupIdVisibility) { + NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); + SetupMockDelegateAndPolicy(); + MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); + EXPECT_CALL(*mock_delegate(), ToggleSuggestionGroupIdVisibility(_)).Times(1); + EXPECT_CALL(*policy, ShouldProcessToggleSuggestionGroupIdVisibility()) + .Times(1) + .WillOnce(Return(true)); + + GetSearchIPCRouter().ToggleSuggestionGroupIdVisibility(1u); +} + +TEST_F(SearchIPCRouterTest, IgnoreToggleSuggestionGroupIdVisibility) { + NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); + SetupMockDelegateAndPolicy(); + MockSearchIPCRouterPolicy* policy = GetSearchIPCRouterPolicy(); + EXPECT_CALL(*mock_delegate(), ToggleSuggestionGroupIdVisibility(_)).Times(0); + EXPECT_CALL(*policy, ShouldProcessToggleSuggestionGroupIdVisibility()) + .Times(1) + .WillOnce(Return(false)); + + GetSearchIPCRouter().ToggleSuggestionGroupIdVisibility(1u); +} + TEST_F(SearchIPCRouterTest, IgnoreStopAutoComplete) { NavigateAndCommitActiveTab(GURL("chrome-search://foo/bar")); SetupMockDelegateAndPolicy();
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc index ed10e1d..88eb12b 100644 --- a/chrome/browser/ui/search/search_tab_helper.cc +++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/base64.h" +#include "base/containers/flat_map.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" @@ -68,7 +69,9 @@ #include "components/omnibox/browser/omnibox_event_global_tracker.h" #include "components/omnibox/browser/omnibox_log.h" #include "components/omnibox/browser/omnibox_popup_model.h" +#include "components/omnibox/browser/omnibox_prefs.h" #include "components/omnibox/browser/omnibox_view.h" +#include "components/omnibox/browser/search_suggestion_parser.h" #include "components/omnibox/browser/suggestion_answer.h" #include "components/omnibox/browser/vector_icons.h" #include "components/omnibox/common/omnibox_features.h" @@ -97,6 +100,22 @@ namespace { +base::flat_map<int32_t, chrome::mojom::SuggestionGroupPtr> +CreateSuggestionGroupsMap( + PrefService* prefs, + const SearchSuggestionParser::HeadersMap& headers_map) { + base::flat_map<int32_t, chrome::mojom::SuggestionGroupPtr> result_map; + for (const auto& pair : headers_map) { + chrome::mojom::SuggestionGroupPtr suggestion_group = + chrome::mojom::SuggestionGroup::New(); + suggestion_group->header = pair.second; + suggestion_group->hidden = + omnibox::IsSuggestionGroupIdHidden(prefs, pair.first); + result_map.emplace(pair.first, std::move(suggestion_group)); + } + return result_map; +} + std::vector<chrome::mojom::AutocompleteMatchPtr> CreateAutocompleteMatches( const AutocompleteResult& result) { std::vector<chrome::mojom::AutocompleteMatchPtr> matches; @@ -118,6 +137,7 @@ description_class.style)); } mojom_match->destination_url = match.destination_url.spec(); + mojom_match->suggestion_group_id = match.suggestion_group_id.value_or(0); mojom_match->icon_url = SearchTabHelper::AutocompleteMatchVectorIconToResourceName( match.GetVectorIcon(false)); @@ -533,6 +553,9 @@ ipc_router_.AutocompleteResultChanged(chrome::mojom::AutocompleteResult::New( autocomplete_controller_->input().text(), + CreateSuggestionGroupsMap( + profile()->GetPrefs(), + autocomplete_controller_->result().headers_map()), CreateAutocompleteMatches(autocomplete_controller_->result()))); BitmapFetcherService* bitmap_fetcher_service = @@ -825,6 +848,15 @@ time_of_first_autocomplete_query_ = base::TimeTicks(); } +void SearchTabHelper::ToggleSuggestionGroupIdVisibility( + int32_t suggestion_group_id) { + if (!autocomplete_controller_) + return; + + omnibox::ToggleSuggestionGroupIdVisibility(profile()->GetPrefs(), + suggestion_group_id); +} + void SearchTabHelper::LogCharTypedToRepaintLatency(uint32_t latency_ms) { UMA_HISTOGRAM_TIMES("NewTabPage.Realbox.CharTypedToRepaintLatency.ToPaint", base::TimeDelta::FromMillisecondsD(latency_ms));
diff --git a/chrome/browser/ui/search/search_tab_helper.h b/chrome/browser/ui/search/search_tab_helper.h index 84d5310..9583419 100644 --- a/chrome/browser/ui/search/search_tab_helper.h +++ b/chrome/browser/ui/search/search_tab_helper.h
@@ -147,6 +147,7 @@ bool prevent_inline_autocomplete) override; void DeleteAutocompleteMatch(uint8_t line) override; void StopAutocomplete(bool clear_result) override; + void ToggleSuggestionGroupIdVisibility(int32_t suggestion_group_id) override; void LogCharTypedToRepaintLatency(uint32_t latency_ms) override; void BlocklistPromo(const std::string& promo_id) override; void OpenExtensionsPage(double button,
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.cc index 47555a9..04c3a8ad 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.cc +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.cc
@@ -4,13 +4,15 @@ #include "chrome/browser/ui/views/apps/app_info_dialog/app_info_label.h" -#include "ui/gfx/canvas.h" +#include "ui/views/controls/focus_ring.h" AppInfoLabel::AppInfoLabel(const base::string16& text) : AppInfoLabel(text, views::style::CONTEXT_LABEL, views::style::STYLE_PRIMARY) {} +AppInfoLabel::~AppInfoLabel() = default; + AppInfoLabel::AppInfoLabel(const base::string16& text, int text_context, int text_style, @@ -21,20 +23,5 @@ // still needs to be able to tab-navigate them and get screen reader feedback. SetFocusBehavior(views::View::FocusBehavior::ALWAYS); SetHorizontalAlignment(gfx::ALIGN_LEFT); -} - -void AppInfoLabel::PaintFocusRing(gfx::Canvas* canvas) const { - gfx::Rect focus_ring_bounds = GetTextBounds(); - focus_ring_bounds.Intersect(GetLocalBounds()); - canvas->DrawFocusRect(focus_ring_bounds); -} - -void AppInfoLabel::OnFocus() { - Label::OnFocus(); - SchedulePaint(); -} - -void AppInfoLabel::OnBlur() { - Label::OnBlur(); - SchedulePaint(); + focus_ring_ = views::FocusRing::Install(this); }
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.h b/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.h index 6500577..13509998 100644 --- a/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.h +++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_label.h
@@ -5,14 +5,21 @@ #ifndef CHROME_BROWSER_UI_VIEWS_APPS_APP_INFO_DIALOG_APP_INFO_LABEL_H_ #define CHROME_BROWSER_UI_VIEWS_APPS_APP_INFO_DIALOG_APP_INFO_LABEL_H_ +#include <memory> + #include "ui/views/controls/label.h" +namespace views { +class FocusRing; +} + // Label styled for use in AppInfo dialog so accessible users can step through // and have each line read. // TODO(dfried): merge functionality into views::Label. class AppInfoLabel : public views::Label { public: explicit AppInfoLabel(const base::string16& text); + ~AppInfoLabel() override; // See documentation on views::Label::Label(). AppInfoLabel(const base::string16& text, @@ -22,10 +29,7 @@ gfx::DirectionalityMode::DIRECTIONALITY_FROM_TEXT); private: - // views::Label: - void PaintFocusRing(gfx::Canvas* canvas) const override; - void OnFocus() override; - void OnBlur() override; + std::unique_ptr<views::FocusRing> focus_ring_; }; #endif // CHROME_BROWSER_UI_VIEWS_APPS_APP_INFO_DIALOG_APP_INFO_LABEL_H_
diff --git a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc index 55026be5..db79786 100644 --- a/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc +++ b/chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.cc
@@ -17,9 +17,9 @@ #endif #if defined(USE_X11) -#include "ui/gfx/x/x11_types.h" // nogncheck -#include "ui/gtk/gtk_ui_delegate.h" // nogncheck -#include "ui/gtk/gtk_ui_delegate_x11.h" // nogncheck +#include "ui/gfx/x/x11_types.h" // nogncheck +#include "ui/gtk/gtk_ui_delegate.h" // nogncheck +#include "ui/gtk/x/gtk_ui_delegate_x11.h" // nogncheck #endif namespace {
diff --git a/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc b/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc index 93fe3d9..f64adc2 100644 --- a/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc +++ b/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc
@@ -89,12 +89,7 @@ CrostiniDialogBrowserTest::CrostiniDialogBrowserTest(bool register_termina) : register_termina_(register_termina) { scoped_feature_list_.InitAndEnableFeature(features::kCrostini); - fake_crostini_features_.set_allowed(true); - fake_crostini_features_.set_ui_allowed(true); - fake_crostini_features_.set_enabled(true); - fake_crostini_features_.set_export_import_ui_allowed(true); - fake_crostini_features_.set_root_access_allowed(true); - fake_crostini_features_.set_container_upgrade_ui_allowed(true); + fake_crostini_features_.SetAll(true); } CrostiniDialogBrowserTest::~CrostiniDialogBrowserTest() = default;
diff --git a/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc b/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc index dd9a8aa1..108eaad 100644 --- a/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc +++ b/chrome/browser/ui/views/find_bar_views_interactive_uitest.cc
@@ -619,8 +619,6 @@ observer.Wait(); } -// FindInPage on Mac doesn't use prepopulated values. Search there is global. -#if !defined(OS_MACOSX) IN_PROC_BROWSER_TEST_F(FindInPageTest, SelectionDuringFind) { ASSERT_TRUE(embedded_test_server()->Start()); // Make sure Chrome is in the foreground, otherwise sending input @@ -645,12 +643,14 @@ browser()->GetFindBarController()->Show(); EXPECT_TRUE(IsViewFocused(browser(), VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); - // verify the text matches the selection + // Verify the text matches the selection EXPECT_EQ(ASCIIToUTF16("text"), GetFindBarText()); find_in_page::FindNotificationDetails details = WaitForFindResult(); - EXPECT_TRUE(details.number_of_matches() > 0); + // Verify the correct match is highlighted (the one corresponding to the + // text that was selected). See http://crbug.com/1043550 + EXPECT_EQ(2, details.active_match_ordinal()); + EXPECT_EQ(5, details.number_of_matches()); } -#endif IN_PROC_BROWSER_TEST_F(FindInPageTest, GlobalEscapeClosesFind) { ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.h b/chrome/browser/ui/views/frame/tab_strip_region_view.h index 169966ea..11285706 100644 --- a/chrome/browser/ui/views/frame/tab_strip_region_view.h +++ b/chrome/browser/ui/views/frame/tab_strip_region_view.h
@@ -18,6 +18,8 @@ const char* GetClassName() const override; void ChildPreferredSizeChanged(views::View* child) override; + // TODO(958173): Override OnBoundsChanged to cancel tabstrip animations. + private: DISALLOW_COPY_AND_ASSIGN(TabStripRegionView); };
diff --git a/chrome/browser/ui/views/hats/hats_web_dialog.cc b/chrome/browser/ui/views/hats/hats_web_dialog.cc index 6598a3cd..102b1e6 100644 --- a/chrome/browser/ui/views/hats/hats_web_dialog.cc +++ b/chrome/browser/ui/views/hats/hats_web_dialog.cc
@@ -54,8 +54,8 @@ // survey feedback to the HaTS server. std::string LoadLocalHtmlAsString(const std::string& site_id, const std::string& site_context) { - base::StringPiece raw_html = - ui::ResourceBundle::GetSharedInstance().GetRawDataResource( + std::string raw_html = + ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( IDR_DESKTOP_HATS_HTML); ui::TemplateReplacements replacements; replacements[kScriptSrcReplacementToken] = base::StringPrintf(
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 1773b6a..cbc9b47 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ui/views/omnibox/webui_omnibox_popup_view.h" #include "chrome/browser/ui/views/theme_copying_widget.h" #include "chrome/browser/ui/webui/omnibox/omnibox_popup_handler.h" +#include "components/omnibox/browser/omnibox_prefs.h" #include "components/omnibox/common/omnibox_features.h" #include "ui/accessibility/ax_node_data.h" #include "ui/compositor/closure_animation_observer.h" @@ -148,6 +149,17 @@ SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); + + if (PrefService* const pref_service = GetPrefService()) { + // We are observing the preference here rather than in OmniboxResultView, + // because showing and hiding matches also requires resizing the popup. + pref_change_registrar_.Init(pref_service); + // Unretained is appropriate here. 'this' will outlive the registrar. + pref_change_registrar_.Add( + omnibox::kOmniboxHiddenGroupIds, + base::BindRepeating(&OmniboxPopupContentsView::OnHiddenGroupIdsUpdate, + base::Unretained(this))); + } } OmniboxPopupContentsView::~OmniboxPopupContentsView() { @@ -301,13 +313,14 @@ } } else { base::Optional<int> previous_row_group_id = base::nullopt; + PrefService* const pref_service = GetPrefService(); 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. https://crbug.com/1021323 if (children().size() == i) { AddChildView(std::make_unique<OmniboxRowView>( - std::make_unique<OmniboxResultView>(this, i))); + std::make_unique<OmniboxResultView>(this, i), pref_service)); } OmniboxRowView* const row_view = @@ -329,6 +342,13 @@ OmniboxResultView* const result_view = row_view->result_view(); result_view->SetMatch(match); + // Set visibility of the result view based on whether the group is hidden. + bool match_hidden = pref_service && + match.suggestion_group_id.has_value() && + omnibox::IsSuggestionGroupIdHidden( + pref_service, match.suggestion_group_id.value()); + result_view->SetVisible(!match_hidden); + const SkBitmap* bitmap = model_->RichSuggestionBitmapAt(i); if (bitmap) { result_view->SetRichSuggestionImage( @@ -452,7 +472,7 @@ -RoundedOmniboxResultsFrame::GetLocationBarAlignmentInsets()); content_rect.set_height(popup_height); - // Finally, expand the widget to accomodate the custom-drawn shadows. + // Finally, expand the widget to accommodate the custom-drawn shadows. content_rect.Inset(-RoundedOmniboxResultsFrame::GetShadowInsets()); return content_rect; } @@ -482,6 +502,32 @@ return OmniboxPopupModel::kNoMatch; } +void OmniboxPopupContentsView::OnHiddenGroupIdsUpdate() { + for (size_t i = 0; i < model_->result().size(); ++i) { + const AutocompleteMatch& match = model_->result().match_at(i); + bool match_hidden = + match.suggestion_group_id.has_value() && + omnibox::IsSuggestionGroupIdHidden(GetPrefService(), + match.suggestion_group_id.value()); + if (OmniboxResultView* result_view = result_view_at(i)) + result_view->SetVisible(!match_hidden); + } + + // This is necssary for the popup to actually resize to accommodate newly + // shown or hidden matches. + if (popup_) + popup_->SetTargetBounds(GetTargetBounds()); + + InvalidateLayout(); +} + +PrefService* OmniboxPopupContentsView::GetPrefService() const { + if (!location_bar_view_ || !location_bar_view_->profile()) + return nullptr; + + return location_bar_view_->profile()->GetPrefs(); +} + void OmniboxPopupContentsView::GetAccessibleNodeData( ui::AXNodeData* node_data) { node_data->role = ax::mojom::Role::kListBox;
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h index 0d824e4..7d3fcda 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.h
@@ -11,6 +11,7 @@ #include "base/memory/weak_ptr.h" #include "components/omnibox/browser/omnibox_popup_model.h" #include "components/omnibox/browser/omnibox_popup_view.h" +#include "components/prefs/pref_change_registrar.h" #include "ui/base/window_open_disposition.h" #include "ui/gfx/font_list.h" #include "ui/gfx/image/image.h" @@ -108,6 +109,12 @@ // the specified point. size_t GetIndexForPoint(const gfx::Point& point); + // Update which result views are visible when the hidden group IDs change. + void OnHiddenGroupIdsUpdate(); + + // Gets the pref service for this view. May return nullptr in tests. + PrefService* GetPrefService() const; + // views::View: const char* GetClassName() const override; @@ -123,13 +130,16 @@ // The edit view that invokes us. OmniboxViewViews* omnibox_view_; - // The location bar view that owns |omnibox_view_|. + // The location bar view that owns |omnibox_view_|. May be nullptr in tests. LocationBarView* location_bar_view_; // The child WebView for the suggestions. This only exists if the // omnibox::kWebUIOmniboxPopup flag is on. WebUIOmniboxPopupView* webui_view_ = nullptr; + // A pref change registrar for toggling result view visibility. + PrefChangeRegistrar pref_change_registrar_; + DISALLOW_COPY_AND_ASSIGN(OmniboxPopupContentsView); };
diff --git a/chrome/browser/ui/views/omnibox/omnibox_row_view.cc b/chrome/browser/ui/views/omnibox/omnibox_row_view.cc index 082ea92..fece620e 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_row_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_row_view.cc
@@ -7,7 +7,9 @@ #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/omnibox/omnibox_theme.h" #include "chrome/browser/ui/views/omnibox/omnibox_result_view.h" +#include "components/omnibox/browser/omnibox_prefs.h" #include "components/omnibox/browser/vector_icons.h" +#include "components/prefs/pref_service.h" #include "ui/gfx/image/image_skia_operations.h" #include "ui/gfx/paint_vector_icon.h" #include "ui/views/controls/button/button.h" @@ -20,7 +22,7 @@ class OmniboxRowView::HeaderView : public views::View, public views::ButtonListener { public: - HeaderView() { + explicit HeaderView(PrefService* pref_service) : pref_service_(pref_service) { views::BoxLayout* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kHorizontal)); @@ -37,6 +39,11 @@ void SetHeader(int suggestion_group_id, const base::string16& header_text) { suggestion_group_id_ = suggestion_group_id; header_text_->SetText(header_text); + + if (pref_service_) { + hide_button_->SetToggled(omnibox::IsSuggestionGroupIdHidden( + pref_service_, suggestion_group_id_)); + } } // views::View: @@ -59,7 +66,13 @@ void ButtonPressed(views::Button* sender, const ui::Event& event) override { DCHECK_EQ(sender, hide_button_); - // TODO(tommycli): Implement toggling the pref here. + if (!pref_service_) + return; + + omnibox::ToggleSuggestionGroupIdVisibility(pref_service_, + suggestion_group_id_); + hide_button_->SetToggled(omnibox::IsSuggestionGroupIdHidden( + pref_service_, suggestion_group_id_)); } private: @@ -89,6 +102,10 @@ SetBackground(OmniboxResultView::GetPopupCellBackground(this, part_state)); } + // Non-owning pointer to the preference service used for toggling headers. + // May be nullptr in tests. + PrefService* const pref_service_; + // The Label containing the header text. This is never nullptr. views::Label* header_text_; @@ -99,8 +116,11 @@ int suggestion_group_id_ = 0; }; -OmniboxRowView::OmniboxRowView(std::unique_ptr<OmniboxResultView> result_view) { +OmniboxRowView::OmniboxRowView(std::unique_ptr<OmniboxResultView> result_view, + PrefService* pref_service) + : pref_service_(pref_service) { DCHECK(result_view); + DCHECK(pref_service); SetLayoutManager(std::make_unique<views::BoxLayout>( views::BoxLayout::Orientation::kVertical)); @@ -111,8 +131,10 @@ void OmniboxRowView::ShowHeader(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); + if (header_view_ == nullptr) { + header_view_ = + AddChildViewAt(std::make_unique<HeaderView>(pref_service_), 0); + } header_view_->SetHeader(suggestion_group_id, header_text); header_view_->SetVisible(true);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_row_view.h b/chrome/browser/ui/views/omnibox/omnibox_row_view.h index 27fc6d7a..98d11107 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_row_view.h +++ b/chrome/browser/ui/views/omnibox/omnibox_row_view.h
@@ -10,6 +10,7 @@ #include "ui/views/view.h" class OmniboxResultView; +class PrefService; // 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 @@ -20,7 +21,8 @@ // - 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); + OmniboxRowView(std::unique_ptr<OmniboxResultView> result_view, + PrefService* pref_service); // Sets the header that appears above this row. Also shows the header. void ShowHeader(int suggestion_group_id, const base::string16& header_text); @@ -41,6 +43,10 @@ // Non-owning pointer to the result view for this row. This is never nullptr. OmniboxResultView* result_view_; + + // Non-owning pointer to the preference service used for toggling headers. + // May be nullptr in tests. + PrefService* const pref_service_; }; #endif // CHROME_BROWSER_UI_VIEWS_OMNIBOX_OMNIBOX_ROW_VIEW_H_
diff --git a/chrome/browser/ui/views/tabs/tab_animation.cc b/chrome/browser/ui/views/tabs/tab_animation.cc index 1a916e6..eee48c8 100644 --- a/chrome/browser/ui/views/tabs/tab_animation.cc +++ b/chrome/browser/ui/views/tabs/tab_animation.cc
@@ -19,13 +19,11 @@ constexpr base::TimeDelta TabAnimation::kAnimationDuration; -TabAnimation::TabAnimation(TabAnimationState static_state, - base::OnceClosure tab_removed_callback) +TabAnimation::TabAnimation(TabAnimationState static_state) : initial_state_(static_state), target_state_(static_state), start_time_(base::TimeTicks::Now()), - duration_(kZeroDuration), - tab_removed_callback_(std::move(tab_removed_callback)) {} + duration_(kZeroDuration) {} TabAnimation::~TabAnimation() = default; @@ -59,10 +57,6 @@ duration_ = kZeroDuration; } -void TabAnimation::NotifyCloseCompleted() { - std::move(tab_removed_callback_).Run(); -} - base::TimeDelta TabAnimation::GetTimeRemaining() const { return std::max(start_time_ + duration_ - base::TimeTicks::Now(), kZeroDuration);
diff --git a/chrome/browser/ui/views/tabs/tab_animation.h b/chrome/browser/ui/views/tabs/tab_animation.h index 45c159d..aa9496d 100644 --- a/chrome/browser/ui/views/tabs/tab_animation.h +++ b/chrome/browser/ui/views/tabs/tab_animation.h
@@ -20,8 +20,7 @@ base::TimeDelta::FromMilliseconds(200); // Creates a TabAnimation for a tab with no active animations. - TabAnimation(TabAnimationState static_state, - base::OnceClosure tab_removed_callback); + explicit TabAnimation(TabAnimationState static_state); ~TabAnimation(); @@ -41,10 +40,6 @@ void CompleteAnimation(); - // Notifies the owner of the animated tab that the close animation - // has completed and the tab can be cleaned up. - void NotifyCloseCompleted(); - TabAnimationState target_state() const { return target_state_; } base::TimeDelta GetTimeRemaining() const; @@ -63,7 +58,6 @@ TabAnimationState target_state_; base::TimeTicks start_time_; base::TimeDelta duration_; - base::OnceClosure tab_removed_callback_; DISALLOW_COPY_AND_ASSIGN(TabAnimation); };
diff --git a/chrome/browser/ui/views/tabs/tab_animation_unittest.cc b/chrome/browser/ui/views/tabs/tab_animation_unittest.cc deleted file mode 100644 index 77992dd..0000000 --- a/chrome/browser/ui/views/tabs/tab_animation_unittest.cc +++ /dev/null
@@ -1,136 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/tabs/tab_animation.h" - -#include <utility> - -#include "base/bind.h" -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "chrome/browser/ui/tabs/tab_types.h" -#include "chrome/browser/ui/views/tabs/tab_animation_state.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { - -constexpr base::TimeDelta kZeroDuration = base::TimeDelta::FromMilliseconds(0); - -} // namespace - -class TabAnimationTest : public testing::Test { - public: - TabAnimationTest() - : env_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} - - float CurrentPinnedness(const TabAnimation& animation) { - return animation.GetCurrentState().pinnedness(); - } - - base::test::TaskEnvironment env_; -}; - -TEST_F(TabAnimationTest, StaticAnimationDoesNotChange) { - TabAnimationState static_state = TabAnimationState::ForIdealTabState( - TabOpen::kOpen, TabPinned::kUnpinned, TabActive::kInactive, 0); - TabAnimation static_animation(static_state, base::BindOnce([]() {})); - - EXPECT_EQ(kZeroDuration, static_animation.GetTimeRemaining()); - EXPECT_EQ(base::TimeDelta::FromMilliseconds(0), - static_animation.GetTimeRemaining()); - EXPECT_EQ(static_state.pinnedness(), CurrentPinnedness(static_animation)); - - env_.FastForwardBy(TabAnimation::kAnimationDuration); - EXPECT_EQ(static_state.pinnedness(), CurrentPinnedness(static_animation)); -} - -TEST_F(TabAnimationTest, AnimationAnimates) { - TabAnimationState initial_state = TabAnimationState::ForIdealTabState( - TabOpen::kOpen, TabPinned::kUnpinned, TabActive::kInactive, 0); - TabAnimationState target_state = initial_state.WithPinned(TabPinned::kPinned); - TabAnimation animation(initial_state, base::BindOnce([]() {})); - animation.AnimateTo(target_state); - - EXPECT_LT(kZeroDuration, animation.GetTimeRemaining()); - EXPECT_EQ(initial_state.pinnedness(), CurrentPinnedness(animation)); - - env_.FastForwardBy(TabAnimation::kAnimationDuration / 2.0); - - EXPECT_LT(kZeroDuration, animation.GetTimeRemaining()); - EXPECT_LT(initial_state.pinnedness(), CurrentPinnedness(animation)); - EXPECT_LT(CurrentPinnedness(animation), target_state.pinnedness()); - - env_.FastForwardBy(TabAnimation::kAnimationDuration / 2.0); - - EXPECT_EQ(target_state.pinnedness(), CurrentPinnedness(animation)); -} - -TEST_F(TabAnimationTest, CompletedAnimationSnapsToTarget) { - TabAnimationState initial_state = TabAnimationState::ForIdealTabState( - TabOpen::kOpen, TabPinned::kUnpinned, TabActive::kInactive, 0); - TabAnimationState target_state = initial_state.WithPinned(TabPinned::kPinned); - TabAnimation animation(initial_state, base::BindOnce([]() {})); - animation.AnimateTo(target_state); - - animation.CompleteAnimation(); - - EXPECT_EQ(kZeroDuration, animation.GetTimeRemaining()); - EXPECT_EQ(base::TimeDelta::FromMilliseconds(0), animation.GetTimeRemaining()); - EXPECT_EQ(target_state.pinnedness(), CurrentPinnedness(animation)); -} - -TEST_F(TabAnimationTest, ReplacedAnimationRestartsDuration) { - TabAnimationState initial_state = TabAnimationState::ForIdealTabState( - TabOpen::kOpen, TabPinned::kUnpinned, TabActive::kInactive, 0); - TabAnimationState target_state = initial_state.WithPinned(TabPinned::kPinned); - TabAnimation animation(initial_state, base::BindOnce([]() {})); - animation.AnimateTo(target_state); - - env_.FastForwardBy(TabAnimation::kAnimationDuration / 2.0); - TabAnimationState reversal_state = animation.GetCurrentState(); - animation.AnimateTo(initial_state); - - EXPECT_EQ(reversal_state.pinnedness(), CurrentPinnedness(animation)); - - EXPECT_EQ(TabAnimation::kAnimationDuration, animation.GetTimeRemaining()); -} - -TEST_F(TabAnimationTest, RetargetedAnimationKeepsDuration) { - TabAnimationState initial_state = TabAnimationState::ForIdealTabState( - TabOpen::kOpen, TabPinned::kUnpinned, TabActive::kInactive, 0); - TabAnimationState target_state = initial_state.WithPinned(TabPinned::kPinned); - TabAnimation animation(initial_state, base::BindOnce([]() {})); - animation.AnimateTo(target_state); - - env_.FastForwardBy(TabAnimation::kAnimationDuration / 2.0); - EXPECT_EQ(TabAnimation::kAnimationDuration / 2.0, - animation.GetTimeRemaining()); - animation.RetargetTo(initial_state); - - EXPECT_EQ(TabAnimation::kAnimationDuration / 2.0, - animation.GetTimeRemaining()); - - env_.FastForwardBy(TabAnimation::kAnimationDuration); - EXPECT_EQ(initial_state.pinnedness(), CurrentPinnedness(animation)); -} - -TEST_F(TabAnimationTest, TestNotifyCloseCompleted) { - class TabClosedDetector { - public: - void NotifyTabClosed() { was_closed_ = true; } - - bool was_closed_ = false; - }; - TabAnimationState static_state = TabAnimationState::ForIdealTabState( - TabOpen::kOpen, TabPinned::kUnpinned, TabActive::kInactive, 0); - TabClosedDetector tab_closed_detector; - TabAnimation animation( - static_state, base::BindOnce(&TabClosedDetector::NotifyTabClosed, - base::Unretained(&tab_closed_detector))); - EXPECT_FALSE(tab_closed_detector.was_closed_); - - animation.NotifyCloseCompleted(); - - EXPECT_TRUE(tab_closed_detector.was_closed_); -}
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index 21e62f0..c7a76f6 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -13,6 +13,7 @@ #include <vector> #include "base/bind.h" +#include "base/callback.h" #include "base/compiler_specific.h" #include "base/containers/adapters.h" #include "base/containers/flat_map.h" @@ -179,7 +180,9 @@ // is not fully visible within the tabstrip area, to prevent overflow clipping. class TabAnimationDelegate : public gfx::AnimationDelegate { public: - TabAnimationDelegate(TabStrip* tab_strip, Tab* tab); + TabAnimationDelegate(TabStrip* tab_strip, + Tab* tab, + base::RepeatingClosure on_animation_progressed); ~TabAnimationDelegate() override; void AnimationProgressed(const gfx::Animation* animation) override; @@ -191,25 +194,33 @@ private: TabStrip* const tab_strip_; Tab* const tab_; + base::RepeatingClosure on_animation_progressed_; DISALLOW_COPY_AND_ASSIGN(TabAnimationDelegate); }; -TabAnimationDelegate::TabAnimationDelegate(TabStrip* tab_strip, Tab* tab) - : tab_strip_(tab_strip), tab_(tab) {} +TabAnimationDelegate::TabAnimationDelegate( + TabStrip* tab_strip, + Tab* tab, + base::RepeatingClosure on_animation_progressed) + : tab_strip_(tab_strip), + tab_(tab), + on_animation_progressed_(on_animation_progressed) {} -TabAnimationDelegate::~TabAnimationDelegate() {} +TabAnimationDelegate::~TabAnimationDelegate() = default; void TabAnimationDelegate::AnimationProgressed( const gfx::Animation* animation) { - tab_->SetVisible(tab_strip_->ShouldTabBeVisible(tab_)); + on_animation_progressed_.Run(); } // Animation delegate used when a dragged tab is released. When done sets the // dragging state to false. class ResetDraggingStateDelegate : public TabAnimationDelegate { public: - ResetDraggingStateDelegate(TabStrip* tab_strip, Tab* tab); + ResetDraggingStateDelegate(TabStrip* tab_strip, + Tab* tab, + base::RepeatingClosure on_animation_progressed); ~ResetDraggingStateDelegate() override; void AnimationEnded(const gfx::Animation* animation) override; @@ -219,16 +230,18 @@ DISALLOW_COPY_AND_ASSIGN(ResetDraggingStateDelegate); }; -ResetDraggingStateDelegate::ResetDraggingStateDelegate(TabStrip* tab_strip, - Tab* tab) - : TabAnimationDelegate(tab_strip, tab) {} +ResetDraggingStateDelegate::ResetDraggingStateDelegate( + TabStrip* tab_strip, + Tab* tab, + base::RepeatingClosure on_animation_progressed) + : TabAnimationDelegate(tab_strip, tab, on_animation_progressed) {} -ResetDraggingStateDelegate::~ResetDraggingStateDelegate() {} +ResetDraggingStateDelegate::~ResetDraggingStateDelegate() = default; void ResetDraggingStateDelegate::AnimationEnded( const gfx::Animation* animation) { tab()->set_dragging(false); - AnimationProgressed(animation); // Forces tab visibility to update. + AnimationProgressed(animation); } void ResetDraggingStateDelegate::AnimationCanceled( @@ -280,7 +293,9 @@ // done. class TabStrip::RemoveTabDelegate : public TabAnimationDelegate { public: - RemoveTabDelegate(TabStrip* tab_strip, Tab* tab); + RemoveTabDelegate(TabStrip* tab_strip, + Tab* tab, + base::RepeatingClosure on_animation_progressed); void AnimationEnded(const gfx::Animation* animation) override; void AnimationCanceled(const gfx::Animation* animation) override; @@ -289,8 +304,11 @@ DISALLOW_COPY_AND_ASSIGN(RemoveTabDelegate); }; -TabStrip::RemoveTabDelegate::RemoveTabDelegate(TabStrip* tab_strip, Tab* tab) - : TabAnimationDelegate(tab_strip, tab) {} +TabStrip::RemoveTabDelegate::RemoveTabDelegate( + TabStrip* tab_strip, + Tab* tab, + base::RepeatingClosure on_animation_progressed) + : TabAnimationDelegate(tab_strip, tab, on_animation_progressed) {} void TabStrip::RemoveTabDelegate::AnimationEnded( const gfx::Animation* animation) { @@ -931,8 +949,6 @@ base::BindRepeating(&TabStrip::tabs_view_model, base::Unretained(this)), base::BindRepeating(&TabStrip::GetGroupHeaders, - base::Unretained(this)), - base::BindRepeating(&TabStrip::LayoutToCurrentBounds, base::Unretained(this)))), drag_context_(std::make_unique<TabDragContextImpl>(this)) { Init(); @@ -1120,11 +1136,8 @@ StartInsertTabAnimation(model_index, pinned ? TabPinned::kPinned : TabPinned::kUnpinned); } else { - layout_helper_->InsertTabAtNoAnimation( - model_index, tab, - base::BindOnce(&TabStrip::OnTabCloseAnimationCompleted, - base::Unretained(this), base::Unretained(tab)), - pinned ? TabPinned::kPinned : TabPinned::kUnpinned); + layout_helper_->InsertTabAt( + model_index, tab, pinned ? TabPinned::kPinned : TabPinned::kUnpinned); CompleteAnimationAndLayout(); } @@ -1263,10 +1276,7 @@ AddChildView(group_view->header()); AddChildView(group_view->highlight()); AddChildView(group_view->underline()); - layout_helper_->InsertGroupHeader( - group, group_view->header(), - base::BindOnce(&TabStrip::OnGroupCloseAnimationCompleted, - base::Unretained(this), group)); + layout_helper_->InsertGroupHeader(group, group_view->header()); group_views_[group] = std::move(group_view); } @@ -1313,9 +1323,10 @@ void TabStrip::OnGroupClosed(const tab_groups::TabGroupId& group) { bounds_animator_.StopAnimatingView(group_header(group)); layout_helper_->RemoveGroupHeader(group); + group_views_.erase(group); + UpdateIdealBounds(); AnimateToIdealBounds(); - // The group_views_ mapping is erased in OnGroupCloseAnimationCompleted(). } void TabStrip::ShiftGroupLeft(const tab_groups::TabGroupId& group) { @@ -1435,7 +1446,7 @@ // When tabs are wide enough, selecting a new tab cannot change the // ideal bounds, so only a repaint is necessary. SchedulePaint(); - } else if (bounds_animator_.IsAnimating()) { + } else if (IsAnimating()) { // The selection change will have modified the ideal bounds of the tabs // in |selected_tabs_| and |new_selection|. We need to recompute. // Note: This is safe even if we're in the midst of mouse-based tab @@ -1444,7 +1455,7 @@ // |override_available_width_for_tabs_| already. UpdateIdealBounds(); AnimateToIdealBounds(); - } else if (!layout_helper_->IsAnimating()) { + } else { // As in the animating case above, the selection change will have // affected the desired bounds of the tabs, but since we're not animating // we can just snap to the new bounds. @@ -1515,7 +1526,7 @@ } bool TabStrip::IsAnimating() const { - return bounds_animator_.IsAnimating() || layout_helper_->IsAnimating(); + return bounds_animator_.IsAnimating(); } void TabStrip::StopAnimating(bool layout) { @@ -1523,7 +1534,6 @@ return; bounds_animator_.Cancel(); - layout_helper_->CompleteAnimations(); if (layout) CompleteAnimationAndLayout(); @@ -1832,8 +1842,7 @@ if (!base::FeatureList::IsEnabled(features::kTabHoverCards)) return; // We don't want to show a hover card for a tab while it is animating. - if (tab && - (bounds_animator_.IsAnimating(tab) || layout_helper_->IsAnimating())) { + if (tab && bounds_animator_.IsAnimating(tab)) { return; } @@ -2035,6 +2044,12 @@ // TabStrip, views::AccessiblePaneView overrides: void TabStrip::Layout() { + if (IsAnimating()) { + // Hide tabs that have animated at least partially out of the clip region. + SetTabVisibility(); + return; + } + // Only do a layout if our size changed. if (last_layout_size_ == size()) return; @@ -2179,38 +2194,25 @@ return kViewClassName; } +gfx::Size TabStrip::GetMinimumSize() const { + // If tabs can be stacked, our minimum width is the smallest width of the + // stacked tabstrip. + const int minimum_tab_area_width = + (touch_layout_ || adjust_layout_) + ? GetStackableTabWidth() + (2 * kStackedPadding * kMaxStackedCount) + : layout_helper_->CalculateMinimumWidth(); + + return gfx::Size(minimum_tab_area_width + GetRightSideReservedWidth(), + GetLayoutConstant(TAB_HEIGHT)); +} + gfx::Size TabStrip::CalculatePreferredSize() const { - int needed_tab_width; - if (touch_layout_ || adjust_layout_) { - // For stacked tabs the minimum size is calculated as the size needed to - // handle showing any number of tabs. - needed_tab_width = - GetStackableTabWidth() + (2 * kStackedPadding * kMaxStackedCount); - } else { - // Otherwise the minimum width is based on the actual number of tabs. - const int pinned_tab_count = GetPinnedTabCount(); - needed_tab_width = pinned_tab_count * TabStyle::GetPinnedWidth(); - const int remaining_tab_count = tab_count() - pinned_tab_count; - const int min_selected_width = TabStyleViews::GetMinimumActiveWidth(); - const int min_unselected_width = TabStyleViews::GetMinimumInactiveWidth(); - if (remaining_tab_count > 0) { - needed_tab_width += min_selected_width + - ((remaining_tab_count - 1) * min_unselected_width); - } - - const int overlap = TabStyle::GetTabOverlap(); - if (tab_count() > 1) - needed_tab_width -= (tab_count() - 1) * overlap; - - // Don't let the tabstrip shrink smaller than is necessary to show one tab, - // and don't force it to be larger than is necessary to show 20 tabs. - const int largest_min_tab_width = - min_selected_width + 19 * (min_unselected_width - overlap); - needed_tab_width = std::min(std::max(needed_tab_width, min_selected_width), - largest_min_tab_width); + if (tab_count() == 0) { + return gfx::Size(GetRightSideReservedWidth(), + GetLayoutConstant(TAB_HEIGHT)); } - return gfx::Size(needed_tab_width + TabToNewTabButtonSpacing() + - new_tab_button_ideal_bounds_.width() + FrameGrabWidth(), + return gfx::Size(layout_helper_->GetTabs().back()->bounds().right() + + GetRightSideReservedWidth(), GetLayoutConstant(TAB_HEIGHT)); } @@ -2344,87 +2346,39 @@ } void TabStrip::StartInsertTabAnimation(int model_index, TabPinned pinned) { - if (!bounds_animator_.IsAnimating() && !in_tab_close_) { - layout_helper_->InsertTabAt( - model_index, tab_at(model_index), - base::BindOnce(&TabStrip::OnTabCloseAnimationCompleted, - base::Unretained(this), - base::Unretained(tab_at(model_index))), - pinned); + layout_helper_->InsertTabAt(model_index, tab_at(model_index), pinned); + + PrepareForAnimation(); + + ExitTabClosingMode(); + + gfx::Rect bounds = tab_at(model_index)->bounds(); + bounds.set_height(GetLayoutConstant(TAB_HEIGHT)); + + // Adjust the starting bounds of the new tab. + const int tab_overlap = TabStyle::GetTabOverlap(); + if (model_index > 0) { + // If we have a tab to our left, start at its right edge. + bounds.set_x(tab_at(model_index - 1)->bounds().right() - tab_overlap); + } else if (model_index + 1 < tab_count()) { + // Otherwise, if we have a tab to our right, start at its left edge. + bounds.set_x(tab_at(model_index + 1)->bounds().x()); } else { - // TODO(958173): Delete this branch once |TabStripLayoutHelper::animator_| - // has taken over all animation responsibilities. - layout_helper_->InsertTabAtNoAnimation( - model_index, tab_at(model_index), - base::BindOnce(&TabStrip::OnTabCloseAnimationCompleted, - base::Unretained(this), - base::Unretained(tab_at(model_index))), - pinned); - - PrepareForAnimation(); - - ExitTabClosingMode(); - - UpdateIdealBounds(); - - // Insert the tab just after the current right edge of the previous tab, if - // any. - gfx::Rect bounds = ideal_bounds(model_index); - const int tab_overlap = TabStyle::GetTabOverlap(); - if (model_index > 0) - bounds.set_x(tab_at(model_index - 1)->bounds().right() - tab_overlap); - - // Start at the width of the overlap in order to animate at the same speed - // the surrounding tabs are moving, since at this width the subsequent tab - // is naturally positioned at the same X coordinate. - bounds.set_width(tab_overlap); - - // Animate in to the full width. - tab_at(model_index)->SetBoundsRect(bounds); - AnimateToIdealBounds(); + NOTREACHED() << "First tab inserted into the tabstrip should not animate."; } + + // Start at the width of the overlap in order to animate at the same speed + // the surrounding tabs are moving, since at this width the subsequent tab + // is naturally positioned at the same X coordinate. + bounds.set_width(tab_overlap); + tab_at(model_index)->SetBoundsRect(bounds); + + // Animate in to the full width. + UpdateIdealBounds(); + AnimateToIdealBounds(); } void TabStrip::StartRemoveTabAnimation(int model_index, bool was_active) { - if (bounds_animator_.IsAnimating() || touch_layout_ || - !base::FeatureList::IsEnabled(features::kNewTabstripAnimation)) { - StartFallbackRemoveTabAnimation(model_index, was_active); - return; - } - - // The tab formerly at |model_index| has already been removed from the model, - // so |model_count| won't include it. - const int model_count = GetModelCount(); - - // If |in_tab_close_| is true then we want to animate the remaining tabs - // (if there are any) differently in order to ensure that a useful tab will - // end up under the cursor. - if (in_tab_close_ && model_count > 0) { - const int available_width = - override_available_width_for_tabs_.value_or(GetTabAreaWidth()); - layout_helper_->EnterTabClosingMode(available_width); - } else { - layout_helper_->ExitTabClosingMode(); - } - - Tab* tab = tab_at(model_index); - tab->SetClosing(true); - - const int old_x = ideal_bounds(model_index).x(); - RemoveTabFromViewModel(model_index); - - if (touch_layout_) { - touch_layout_->RemoveTab(model_index, - UpdateIdealBoundsForPinnedTabs(nullptr), old_x); - } - - layout_helper_->RemoveTab(model_index, tab); -} - -void TabStrip::StartFallbackRemoveTabAnimation(int model_index, - bool was_active) { - // TODO(958173): Delete this once all animations have been migrated to the - // new style. const int model_count = GetModelCount(); const int tab_overlap = TabStyle::GetTabOverlap(); if (in_tab_close_ && model_count > 0 && model_index != model_count) { @@ -2472,14 +2426,9 @@ UpdateIdealBoundsForPinnedTabs(nullptr), old_x); } - // Destroy any tabs that |layout_helper_| is animating closed. - if (layout_helper_->IsAnimating()) - layout_helper_->CompleteAnimations(); - - layout_helper_->RemoveTabNoAnimation(model_index, tab); + layout_helper_->RemoveTabAt(model_index, tab); UpdateIdealBounds(); - // Don't destroy the tab that we just started animating closed. - AnimateToIdealBounds(ClosingTabsBehavior::kTransferOwnership); + AnimateToIdealBounds(); // TODO(pkasting): When closing multiple tabs, we get repeated RemoveTabAt() // calls, each of which closes a new tab and thus generates different ideal @@ -2501,7 +2450,11 @@ // Animate the tab closed. bounds_animator_.AnimateViewTo( - tab, tab_bounds, std::make_unique<RemoveTabDelegate>(this, tab)); + tab, tab_bounds, + std::make_unique<RemoveTabDelegate>( + this, tab, + base::BindRepeating(&TabStrip::OnTabAnimationProgressed, + base::Unretained(this)))); // TODO(pkasting): The first part of this conditional doesn't really make // sense to me. Why is each condition justified? @@ -2521,26 +2474,8 @@ AnimateToIdealBounds(); } -void TabStrip::AnimateToIdealBounds(ClosingTabsBehavior closing_tabs_behavior) { +void TabStrip::AnimateToIdealBounds() { UpdateHoverCard(nullptr); - // |bounds_animator_| and |layout_helper_| should not run - // concurrently. |bounds_animator_| takes precedence, and can finish what the - // other started. - if (layout_helper_->IsAnimating()) { - // Complete animations so |layout_helper_| will be in sync with - // ideal bounds instead of the current bounds. - switch (closing_tabs_behavior) { - case ClosingTabsBehavior::kTransferOwnership: - layout_helper_->CompleteAnimationsWithoutDestroyingTabs(); - break; - case ClosingTabsBehavior::kDestroy: - layout_helper_->CompleteAnimations(); - break; - } - // Take over tab closing mode now so that |bounds_animator| can use - // |layout_helper_| to calculate ideal bounds without interference. - override_available_width_for_tabs_ = layout_helper_->ExitTabClosingMode(); - } for (int i = 0; i < tab_count(); ++i) { // If the tab is being dragged manually, skip it. @@ -2564,8 +2499,12 @@ // and that could allow the new tab button to be drawn atop this tab. bounds_animator_.AnimateViewTo( tab, target_bounds, - tab->dragging() ? nullptr - : std::make_unique<TabAnimationDelegate>(this, tab)); + tab->dragging() + ? nullptr + : std::make_unique<TabAnimationDelegate>( + this, tab, + base::BindRepeating(&TabStrip::OnTabAnimationProgressed, + base::Unretained(this)))); } for (const auto& header_pair : group_views_) { @@ -2615,15 +2554,6 @@ } void TabStrip::CompleteAnimationAndLayout() { - ExitTabClosingMode(); - - // If |bounds_animator_| is running, it owns destroying tabs when close - // animations complete. Otherwise, |layout_helper_| does. - if (bounds_animator_.IsAnimating()) { - layout_helper_->CompleteAnimationsWithoutDestroyingTabs(); - } else { - layout_helper_->CompleteAnimations(); - } LayoutToCurrentBounds(); UpdateIdealBounds(); @@ -2643,9 +2573,9 @@ bounds_animator_.StopAnimatingView(new_tab_button_); new_tab_button_->SetBoundsRect(new_tab_button_ideal_bounds_); } else { - const int available_width = - override_available_width_for_tabs_.value_or(GetTabAreaWidth()); - int trailing_x = layout_helper_->LayoutTabs(available_width); + const int available_width = GetTabAreaWidth(); + const int trailing_x = layout_helper_->LayoutTabs( + override_available_width_for_tabs_.value_or(available_width)); gfx::Rect new_tab_button_current_bounds = new_tab_button_ideal_bounds_; new_tab_button_current_bounds.set_origin(gfx::Point( @@ -2683,16 +2613,12 @@ } int TabStrip::GetTabAreaWidth() const { - return drag_context_->GetTabDragAreaWidth() - - new_tab_button_ideal_bounds_.width() - TabToNewTabButtonSpacing(); + return width() - GetRightSideReservedWidth(); } -int TabStrip::GetNewTabButtonIdealX() const { - const int trailing_x = tabs_.ideal_bounds(tab_count() - 1).right(); - // For non-stacked tabs the ideal bounds may go outside the bounds of the - // tabstrip. Constrain the x-coordinate of the new tab button so that it is - // always visible. - return std::min(GetTabAreaWidth(), trailing_x) + TabToNewTabButtonSpacing(); +int TabStrip::GetRightSideReservedWidth() const { + return new_tab_button_ideal_bounds_.width() + TabToNewTabButtonSpacing() + + FrameGrabWidth(); } const Tab* TabStrip::GetLastVisibleTab() const { @@ -2786,13 +2712,6 @@ } } -void TabStrip::OnGroupCloseAnimationCompleted( - const tab_groups::TabGroupId& group) { - group_views_.erase(group); - // TODO(crbug.com/905491): We might want to simulate a mouse move here, like - // we do in OnTabCloseAnimationCompleted. -} - void TabStrip::StoppedDraggingView(TabSlotView* view, bool* is_first_view) { if (view && view->GetTabSlotViewType() == TabSlotView::ViewType::kTabGroupHeader) { @@ -2819,9 +2738,12 @@ // Install a delegate to reset the dragging state when done. We have to leave // dragging true for the tab otherwise it'll draw beneath the new tab button. - bounds_animator_.AnimateViewTo(view, ideal_bounds(tab_data_index), - std::make_unique<ResetDraggingStateDelegate>( - this, static_cast<Tab*>(view))); + bounds_animator_.AnimateViewTo( + view, ideal_bounds(tab_data_index), + std::make_unique<ResetDraggingStateDelegate>( + this, static_cast<Tab*>(view), + base::BindRepeating(&TabStrip::OnTabAnimationProgressed, + base::Unretained(this)))); } void TabStrip::UpdateStackedLayoutFromMouseEvent(views::View* source, @@ -3222,14 +3144,20 @@ if (tab_count() == 0) return; // Should only happen during creation/destruction, ignore. - if (!touch_layout_) { - const int available_width = - override_available_width_for_tabs_.value_or(GetTabAreaWidth()); - layout_helper_->UpdateIdealBounds(available_width); - } + if (touch_layout_) { + const int trailing_x = tabs_.ideal_bounds(tab_count() - 1).right(); + new_tab_button_ideal_bounds_.set_origin( + gfx::Point(trailing_x + TabToNewTabButtonSpacing(), 0)); + } else { + const int available_width_for_tabs = CalculateAvailableWidthForTabs(); + const int trailing_x = + layout_helper_->UpdateIdealBounds(available_width_for_tabs); - new_tab_button_ideal_bounds_.set_origin( - gfx::Point(GetNewTabButtonIdealX(), 0)); + new_tab_button_ideal_bounds_.set_origin( + gfx::Point(std::min(available_width_for_tabs, trailing_x) + + TabToNewTabButtonSpacing(), + 0)); + } } int TabStrip::UpdateIdealBoundsForPinnedTabs(int* first_non_pinned_index) { @@ -3239,6 +3167,16 @@ return layout_helper_->first_non_pinned_tab_x(); } +int TabStrip::CalculateAvailableWidthForTabs() { + // Layout the parent so that GetAvailableSize is well-defined. + parent()->Layout(); + base::Optional<int> available_width = + parent()->GetAvailableSize(this).width(); + DCHECK(available_width.has_value()); + return override_available_width_for_tabs_.value_or( + available_width.value() - GetRightSideReservedWidth()); +} + void TabStrip::StartResizeLayoutAnimation() { PrepareForAnimation(); UpdateIdealBounds(); @@ -3348,8 +3286,8 @@ } PrepareForAnimation(); UpdateIdealBounds(); - SetTabVisibility(); AnimateToIdealBounds(); + SetTabVisibility(); } bool TabStrip::NeedsTouchLayout() const { @@ -3397,6 +3335,11 @@ extra_vertical_space / 2, kHorizontalInset, 0, kHorizontalInset))); } +void TabStrip::OnTabAnimationProgressed() { + // The rightmost tab moving might have changed the tabstrip's preferred width. + PreferredSizeChanged(); +} + void TabStrip::ButtonPressed(views::Button* sender, const ui::Event& event) { if (sender == new_tab_button_) { base::RecordAction(base::UserMetricsAction("NewTab_Button"));
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h index d54b24e4..1b52fcfe 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.h +++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -184,8 +184,7 @@ // Needed to ensure display and focus order of the group header view. void OnGroupMoved(const tab_groups::TabGroupId& group); - // Destroys the views associated with a recently deleted tab group. The - // associated view mappings are erased in OnGroupCloseAnimationCompleted(). + // Destroys the views associated with a recently deleted tab group. void OnGroupClosed(const tab_groups::TabGroupId& group); // Attempts to move the specified group to the left. @@ -211,7 +210,6 @@ void SetTabNeedsAttention(int model_index, bool attention); // Retrieves the ideal bounds for the Tab at the specified index. - // TODO(958173): The notion of ideal bounds is going away. Delete this. const gfx::Rect& ideal_bounds(int tab_data_index) const { return tabs_.ideal_bounds(tab_data_index); } @@ -326,6 +324,7 @@ void Layout() override; void PaintChildren(const views::PaintInfo& paint_info) override; const char* GetClassName() const override; + gfx::Size GetMinimumSize() const override; gfx::Size CalculatePreferredSize() const override; void GetAccessibleNodeData(ui::AXNodeData* node_data) override; views::View* GetTooltipHandlerForPoint(const gfx::Point& point) override; @@ -402,17 +401,6 @@ DISALLOW_COPY_AND_ASSIGN(DropArrow); }; - // Specifies how to handle tabs that are midway through closing when falling - // back from |layout_helper_| to |bounds_animator_|. - enum class ClosingTabsBehavior { - // Keep the tabs alive, because responsibilities for destroying them lie - // with |bounds_animator_|. - kTransferOwnership, - // Destroy the tabs, because responsibilities for destroying them lie with - // |layout_helper_|. - kDestroy - }; - void Init(); views::ViewModelT<Tab>* tabs_view_model() { return &tabs_; } @@ -428,8 +416,6 @@ // Animates the removal of the tab at |model_index| using the old animation // style. - // TODO(958173): Delete this once all animations have been migrated to the - // new animation style. void StartFallbackRemoveTabAnimation(int model_index, bool was_active); // Invoked from |MoveTab| after |tab_data_| has been updated to animate the @@ -439,9 +425,7 @@ // Animates all the views to their ideal bounds. // NOTE: this does *not* invoke UpdateIdealBounds, it uses the bounds // currently set in ideal_bounds. - // TODO(958173): The notion of ideal bounds is going away. Delete this. - void AnimateToIdealBounds(ClosingTabsBehavior closing_tabs_behavior = - ClosingTabsBehavior::kDestroy); + void AnimateToIdealBounds(); void ExitTabClosingMode(); @@ -483,6 +467,10 @@ // button. int GetTabAreaWidth() const; + // Returns the width of the area right of the tabs reserved for the new tab + // button and the frame grab area. + int GetRightSideReservedWidth() const; + // Returns the X coordinate the new tab button should be placed at. Requires // |tabs_| to have correct ideal bounds. int GetNewTabButtonIdealX() const; @@ -505,10 +493,6 @@ // code and is not a general-purpose method. void OnTabCloseAnimationCompleted(Tab* tab); - // Cleans up the TabGroupHeader for |group| from the TabStrip. This is called - // from the tab animation code and is not a general-purpose method. - void OnGroupCloseAnimationCompleted(const tab_groups::TabGroupId& group); - // Invoked from StoppedDraggingTabs to cleanup |view|. If |view| is known // |is_first_view| is set to true. void StoppedDraggingView(TabSlotView* view, bool* is_first_view); @@ -567,16 +551,18 @@ void PrepareForAnimation(); // Generates and sets the ideal bounds for each of the tabs as well as the new - // tab button. - // TODO(958173): The notion of ideal bounds is going away. Delete this. + // tab button. Note: Does not animate the tabs to those bounds so callers can + // use this information for other purposes - see AnimateToIdealBounds. void UpdateIdealBounds(); // Generates and sets the ideal bounds for the pinned tabs. Returns the index // to position the first non-pinned tab and sets |first_non_pinned_index| to // the index of the first non-pinned tab. - // TODO(958173): The notion of ideal bounds is going away. Delete this. int UpdateIdealBoundsForPinnedTabs(int* first_non_pinned_index); + // Calculates the width that can be occupied by the tabs in the strip. + int CalculateAvailableWidthForTabs(); + // Starts various types of TabStrip animations. void StartResizeLayoutAnimation(); void StartPinnedTabAnimation(); @@ -619,6 +605,9 @@ // whenever any input of the computation of the border's sizing changes. void UpdateNewTabButtonBorder(); + // Called whenever a tab animation has progressed. + void OnTabAnimationProgressed(); + // views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override; @@ -674,8 +663,6 @@ std::unique_ptr<TabStripLayoutHelper> layout_helper_; // Responsible for animating tabs in response to model changes. - // Deprecated; https://crbug.com/958173 tracks migrating animations from - // |bounds_animator_| to |TabStripLayoutHelper::animator_|. views::BoundsAnimator bounds_animator_{this}; // The "New Tab" button.
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc index ca022b5..b8a138b9 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc
@@ -25,10 +25,6 @@ namespace { -// TODO(965227): Align animation ticks to compositor events. -constexpr base::TimeDelta kTickInterval = - base::TimeDelta::FromMilliseconds(1000 / 60.0); - // The types of TabSlotView that can be referenced by TabSlot. enum class ViewType { kTab, @@ -42,33 +38,28 @@ } // namespace struct TabStripLayoutHelper::TabSlot { - static TabStripLayoutHelper::TabSlot CreateForTab( - Tab* tab, - TabOpen open, - TabPinned pinned, - base::OnceClosure removed_callback) { + static TabStripLayoutHelper::TabSlot CreateForTab(Tab* tab, + TabOpen open, + TabPinned pinned) { TabStripLayoutHelper::TabSlot slot; slot.type = ViewType::kTab; slot.view = tab; TabAnimationState initial_state = TabAnimationState::ForIdealTabState( open, pinned, TabActive::kInactive, 0); - slot.animation = std::make_unique<TabAnimation>( - initial_state, std::move(removed_callback)); + slot.animation = std::make_unique<TabAnimation>(initial_state); return slot; } static TabStripLayoutHelper::TabSlot CreateForGroupHeader( tab_groups::TabGroupId group, TabGroupHeader* header, - TabPinned pinned, - base::OnceClosure removed_callback) { + TabPinned pinned) { TabStripLayoutHelper::TabSlot slot; slot.type = ViewType::kGroupHeader; slot.view = header; TabAnimationState initial_state = TabAnimationState::ForIdealTabState( TabOpen::kOpen, pinned, TabActive::kInactive, 0); - slot.animation = std::make_unique<TabAnimation>( - initial_state, std::move(removed_callback)); + slot.animation = std::make_unique<TabAnimation>(initial_state); return slot; } @@ -80,12 +71,10 @@ TabStripLayoutHelper::TabStripLayoutHelper( const TabStripController* controller, GetTabsCallback get_tabs_callback, - GetGroupHeadersCallback get_group_headers_callback, - base::RepeatingClosure on_animation_progressed) + GetGroupHeadersCallback get_group_headers_callback) : controller_(controller), get_tabs_callback_(get_tabs_callback), get_group_headers_callback_(get_group_headers_callback), - on_animation_progressed_(on_animation_progressed), active_tab_width_(TabStyle::GetStandardWidth()), inactive_tab_width_(TabStyle::GetStandardWidth()), first_non_pinned_tab_index_(0), @@ -103,10 +92,6 @@ return tabs; } -bool TabStripLayoutHelper::IsAnimating() const { - return animation_timer_.IsRunning(); -} - int TabStripLayoutHelper::GetPinnedTabCount() const { views::ViewModelT<Tab>* tabs = get_tabs_callback_.Run(); int pinned_count = 0; @@ -117,32 +102,16 @@ return pinned_count; } -void TabStripLayoutHelper::InsertTabAtNoAnimation( - int model_index, - Tab* tab, - base::OnceClosure tab_removed_callback, - TabPinned pinned) { - const int slot_index = - GetSlotIndexForTabModelIndex(model_index, tab->group()); - slots_.insert(slots_.begin() + slot_index, - TabSlot::CreateForTab(tab, TabOpen::kOpen, pinned, - std::move(tab_removed_callback))); -} - void TabStripLayoutHelper::InsertTabAt(int model_index, Tab* tab, - base::OnceClosure tab_removed_callback, TabPinned pinned) { const int slot_index = GetSlotIndexForTabModelIndex(model_index, tab->group()); slots_.insert(slots_.begin() + slot_index, - TabSlot::CreateForTab(tab, TabOpen::kClosed, pinned, - std::move(tab_removed_callback))); - AnimateSlot(slot_index, slots_[slot_index].animation->target_state().WithOpen( - TabOpen::kOpen)); + TabSlot::CreateForTab(tab, TabOpen::kOpen, pinned)); } -void TabStripLayoutHelper::RemoveTabNoAnimation(int model_index, Tab* tab) { +void TabStripLayoutHelper::RemoveTabAt(int model_index, Tab* tab) { TabAnimation* animation = slots_[GetSlotIndexForTabModelIndex(model_index, tab->group())] .animation.get(); @@ -150,35 +119,6 @@ animation->CompleteAnimation(); } -void TabStripLayoutHelper::RemoveTab(int model_index, Tab* tab) { - int slot_index = GetSlotIndexForTabModelIndex(model_index, tab->group()); - if (WidthsConstrainedForClosingMode()) { - if (slot_index == int{slots_.size()} - 1) { - // Removing the last tab. Constrain available width to place the next - // tab to the left under the cursor. - if (!tabstrip_width_override_.has_value()) { - // We are currently constrained by tab_width_override_. Express the - // equivalent constraint with tabstrip_width_override_. - tabstrip_width_override_ = LayoutTabs(base::nullopt); - } - tab_width_override_.reset(); - } else { - // Removing a tab other than the last tab. Constrain the width of each - // tab to place the next tab to the right under the cursor. - if (!tab_width_override_.has_value()) { - // We are currently constrained by tabstrip_width_override_. Express - // the equivalent constraint with tab_width_override_. - tab_width_override_ = CalculateTabWidthOverride( - GetTabLayoutConstants(), GetCurrentTabWidthConstraints(), - tabstrip_width_override_.value()); - } - tabstrip_width_override_.reset(); - } - } - AnimateSlot(slot_index, slots_[slot_index].animation->target_state().WithOpen( - TabOpen::kClosed)); -} - void TabStripLayoutHelper::EnterTabClosingMode(int available_width) { if (!WidthsConstrainedForClosingMode()) { tab_width_override_ = CalculateTabWidthOverride( @@ -204,8 +144,6 @@ std::find_if(slots_.begin(), slots_.end(), [tab](const TabSlot& slot) { return slot.type == ViewType::kTab && slot.view == tab; }); - // Remove the tab from |slots_| if it is still there. It will have already - // been removed if the tab was destroyed by |RemoveClosedTabs|. if (it != slots_.end()) slots_.erase(it); } @@ -228,7 +166,6 @@ } void TabStripLayoutHelper::SetTabPinned(int model_index, TabPinned pinned) { - // TODO(958173): Animate state change. views::ViewModelT<Tab>* tabs = get_tabs_callback_.Run(); TabAnimation* animation = slots_[GetSlotIndexForTabModelIndex(model_index, @@ -238,17 +175,14 @@ animation->CompleteAnimation(); } -void TabStripLayoutHelper::InsertGroupHeader( - tab_groups::TabGroupId group, - TabGroupHeader* header, - base::OnceClosure header_removed_callback) { +void TabStripLayoutHelper::InsertGroupHeader(tab_groups::TabGroupId group, + TabGroupHeader* header) { std::vector<int> tabs_in_group = controller_->ListTabsInGroup(group); const int header_slot_index = GetSlotIndexForTabModelIndex(tabs_in_group[0], group); slots_.insert( slots_.begin() + header_slot_index, - TabSlot::CreateForGroupHeader(group, header, TabPinned::kUnpinned, - std::move(header_removed_callback))); + TabSlot::CreateForGroupHeader(group, header, TabPinned::kUnpinned)); // Set the starting location of the header to something reasonable for the // animation. @@ -257,9 +191,7 @@ } void TabStripLayoutHelper::RemoveGroupHeader(tab_groups::TabGroupId group) { - // TODO(958173): Animate closed. const int slot_index = GetSlotIndexForGroupHeader(group); - slots_[slot_index].animation->NotifyCloseCompleted(); slots_.erase(slots_.begin() + slot_index); } @@ -295,25 +227,23 @@ } } -void TabStripLayoutHelper::CompleteAnimations() { - CompleteAnimationsWithoutDestroyingTabs(); - RemoveClosedTabs(); +int TabStripLayoutHelper::CalculateMinimumWidth() { + const std::vector<gfx::Rect> bounds = CalculateIdealBounds(0); + + return bounds.empty() ? 0 : bounds.back().right(); } -void TabStripLayoutHelper::CompleteAnimationsWithoutDestroyingTabs() { - for (TabSlot& slot : slots_) - slot.animation->CompleteAnimation(); - animation_timer_.Stop(); +int TabStripLayoutHelper::CalculatePreferredWidth() { + const std::vector<gfx::Rect> bounds = CalculateIdealBounds(base::nullopt); + + return bounds.empty() ? 0 : bounds.back().right(); } -void TabStripLayoutHelper::UpdateIdealBounds(int available_width) { - int tabstrip_width = tabstrip_width_override_.value_or(available_width); - DCHECK_LE(tabstrip_width, available_width); +int TabStripLayoutHelper::UpdateIdealBounds(int available_width) { + const std::vector<gfx::Rect> bounds = CalculateIdealBounds(available_width); + DCHECK_EQ(slots_.size(), bounds.size()); views::ViewModelT<Tab>* tabs = get_tabs_callback_.Run(); - std::map<tab_groups::TabGroupId, TabGroupHeader*> group_headers = - get_group_headers_callback_.Run(); - const int active_tab_model_index = controller_->GetActiveIndex(); const int active_tab_slot_index = controller_->IsValidIndex(active_tab_model_index) @@ -321,33 +251,6 @@ active_tab_model_index, tabs->view_at(active_tab_model_index)->group()) : TabStripModel::kNoTab; - const int pinned_tab_count = GetPinnedTabCount(); - const int last_pinned_tab_index = pinned_tab_count - 1; - const int last_pinned_tab_slot_index = - pinned_tab_count > 0 ? GetSlotIndexForTabModelIndex( - last_pinned_tab_index, - tabs->view_at(last_pinned_tab_index)->group()) - : TabStripModel::kNoTab; - - TabLayoutConstants layout_constants = GetTabLayoutConstants(); - std::vector<TabWidthConstraints> tab_widths; - for (int i = 0; i < int{slots_.size()}; i++) { - auto active = - i == active_tab_slot_index ? TabActive::kActive : TabActive::kInactive; - auto pinned = i <= last_pinned_tab_slot_index ? TabPinned::kPinned - : TabPinned::kUnpinned; - auto open = - slots_[i].animation->IsClosing() ? TabOpen::kClosed : TabOpen::kOpen; - TabAnimationState ideal_animation_state = - TabAnimationState::ForIdealTabState(open, pinned, active, 0); - TabSizeInfo size_info = slots_[i].view->GetTabSizeInfo(); - tab_widths.push_back(TabWidthConstraints(ideal_animation_state, - layout_constants, size_info)); - } - - const std::vector<gfx::Rect> bounds = CalculateTabBounds( - layout_constants, tab_widths, tabstrip_width, tab_width_override_); - DCHECK_EQ(slots_.size(), bounds.size()); int current_tab_model_index = 0; for (int i = 0; i < int{bounds.size()}; ++i) { @@ -370,6 +273,8 @@ break; } } + + return bounds.back().right(); } void TabStripLayoutHelper::UpdateIdealBoundsForPinnedTabs() { @@ -460,6 +365,51 @@ return trailing_x; } +std::vector<gfx::Rect> TabStripLayoutHelper::CalculateIdealBounds( + base::Optional<int> available_width) { + base::Optional<int> tabstrip_width = tabstrip_width_override_.has_value() + ? tabstrip_width_override_ + : available_width; + + views::ViewModelT<Tab>* tabs = get_tabs_callback_.Run(); + std::map<tab_groups::TabGroupId, TabGroupHeader*> group_headers = + get_group_headers_callback_.Run(); + + const int active_tab_model_index = controller_->GetActiveIndex(); + const int active_tab_slot_index = + controller_->IsValidIndex(active_tab_model_index) + ? GetSlotIndexForTabModelIndex( + active_tab_model_index, + tabs->view_at(active_tab_model_index)->group()) + : TabStripModel::kNoTab; + const int pinned_tab_count = GetPinnedTabCount(); + const int last_pinned_tab_index = pinned_tab_count - 1; + const int last_pinned_tab_slot_index = + pinned_tab_count > 0 ? GetSlotIndexForTabModelIndex( + last_pinned_tab_index, + tabs->view_at(last_pinned_tab_index)->group()) + : TabStripModel::kNoTab; + + TabLayoutConstants layout_constants = GetTabLayoutConstants(); + std::vector<TabWidthConstraints> tab_widths; + for (int i = 0; i < int{slots_.size()}; i++) { + auto active = + i == active_tab_slot_index ? TabActive::kActive : TabActive::kInactive; + auto pinned = i <= last_pinned_tab_slot_index ? TabPinned::kPinned + : TabPinned::kUnpinned; + auto open = + slots_[i].animation->IsClosing() ? TabOpen::kClosed : TabOpen::kOpen; + TabAnimationState ideal_animation_state = + TabAnimationState::ForIdealTabState(open, pinned, active, 0); + TabSizeInfo size_info = slots_[i].view->GetTabSizeInfo(); + tab_widths.push_back(TabWidthConstraints(ideal_animation_state, + layout_constants, size_info)); + } + + return CalculateTabBounds(layout_constants, tab_widths, tabstrip_width, + tab_width_override_); +} + int TabStripLayoutHelper::GetSlotIndexForTabModelIndex( int model_index, base::Optional<tab_groups::TabGroupId> group) const { @@ -508,49 +458,6 @@ return result; } -void TabStripLayoutHelper::AnimateSlot(int slots_index, - TabAnimationState target_state) { - slots_[slots_index].animation->AnimateTo(target_state); - if (!gfx::Animation::ShouldRenderRichAnimation()) { - slots_[slots_index].animation->CompleteAnimation(); - on_animation_progressed_.Run(); - return; - } - if (!animation_timer_.IsRunning()) { - animation_timer_.Start(FROM_HERE, kTickInterval, this, - &TabStripLayoutHelper::TickAnimations); - // Tick animations immediately so that the animation starts from the - // beginning instead of kTickInterval ms into the animation. - TickAnimations(); - } -} - -void TabStripLayoutHelper::TickAnimations() { - bool all_animations_completed = true; - for (const TabSlot& slot : slots_) - all_animations_completed &= slot.animation->GetTimeRemaining().is_zero(); - RemoveClosedTabs(); - - if (all_animations_completed) - animation_timer_.Stop(); - - on_animation_progressed_.Run(); -} - -void TabStripLayoutHelper::RemoveClosedTabs() { - for (auto it = slots_.begin(); it != slots_.end();) { - if (it->animation->IsClosed()) { - // Remove the closed tab from |slots_| before invoking the callback so - // that this is in a consistent state and can be reentered. - TabSlot removed_slot = std::move(*it); - it = slots_.erase(it); - removed_slot.animation->NotifyCloseCompleted(); - } else { - it++; - } - } -} - void TabStripLayoutHelper::UpdateCachedTabWidth(int tab_index, int tab_width, bool active) {
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h index a1ce879..22abaa4 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h +++ b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.h
@@ -38,17 +38,13 @@ TabStripLayoutHelper(const TabStripController* controller, GetTabsCallback get_tabs_callback, - GetGroupHeadersCallback get_group_headers_callback, - base::RepeatingClosure on_animation_progressed); + GetGroupHeadersCallback get_group_headers_callback); ~TabStripLayoutHelper(); // Returns a vector of all tabs in the strip, including both closing tabs // and tabs still in the model. std::vector<Tab*> GetTabs(); - // Returns whether any animations for tabs or group headers are in progress. - bool IsAnimating() const; - int active_tab_width() { return active_tab_width_; } int inactive_tab_width() { return inactive_tab_width_; } int first_non_pinned_tab_index() { return first_non_pinned_tab_index_; } @@ -63,28 +59,12 @@ return group_header_ideal_bounds_; } - // Inserts a new tab at |index|, without animation. |tab_removed_callback| - // will be invoked if the tab is removed at the end of a remove animation. - void InsertTabAtNoAnimation(int model_index, - Tab* tab, - base::OnceClosure tab_removed_callback, - TabPinned pinned); + // Inserts a new tab at |index|. + void InsertTabAt(int model_index, Tab* tab, TabPinned pinned); - // Inserts a new tab at |index|, with animation. |tab_removed_callback| will - // be invoked if the tab is removed at the end of a remove animation. - void InsertTabAt(int model_index, - Tab* tab, - base::OnceClosure tab_removed_callback, - TabPinned pinned); - - // Marks the tab at |model_index| as closed without animating it. Use when - // the tab has been removed from the model but the old animation style owns - // animating it. - // TODO(958173): Remove this when the old animation style is removed. - void RemoveTabNoAnimation(int model_index, Tab* tab); - - // Marks the tab at |model_index| as closing and animates it closed. - void RemoveTab(int model_index, Tab* tab); + // Marks the tab at |model_index| as closing, but does not remove it from + // |slots_|. + void RemoveTabAt(int model_index, Tab* tab); // Called when the tabstrip enters tab closing mode, wherein tabs should // resize differently to control which tab ends up under the cursor. @@ -111,11 +91,8 @@ // Sets the tab at |index|'s pinned state to |pinned|. void SetTabPinned(int model_index, TabPinned pinned); - // Inserts a new group header for |group|. |header_removed_callback| will be - // invoked if the group is removed at the end of a remove animation. - void InsertGroupHeader(tab_groups::TabGroupId group, - TabGroupHeader* header, - base::OnceClosure header_removed_callback); + // Inserts a new group header for |group|. + void InsertGroupHeader(tab_groups::TabGroupId group, TabGroupHeader* header); // Removes the group header for |group|. void RemoveGroupHeader(tab_groups::TabGroupId group); @@ -128,26 +105,21 @@ // Changes the active tab from |prev_active_index| to |new_active_index|. void SetActiveTab(int prev_active_index, int new_active_index); - // Finishes all in-progress animations. - void CompleteAnimations(); + // Calculates the smallest width the tabs can occupy. + int CalculateMinimumWidth(); - // TODO(958173): Temporary method that completes running animations - // without invoking the callback to destroy removed tabs. Use to hand - // off animation (and removed tab destruction) responsibilities from - // this animator to elsewhere without teleporting tabs or destroying - // the same tab more than once. - void CompleteAnimationsWithoutDestroyingTabs(); + // Calculates the width the tabs would occupy if they have enough space. + int CalculatePreferredWidth(); // Generates and sets the ideal bounds for the views in |tabs| and // |group_headers|. Updates the cached widths in |active_tab_width_| and - // |inactive_tab_width_|. - // TODO(958173): The notion of ideal bounds is going away. Delete this. - void UpdateIdealBounds(int available_width); + // |inactive_tab_width_|. Returns the total width occupied by the new ideal + // bounds. + int UpdateIdealBounds(int available_width); // Generates and sets the ideal bounds for |tabs|. Updates // the cached values in |first_non_pinned_tab_index_| and // |first_non_pinned_tab_x_|. - // TODO(958173): The notion of ideal bounds is going away. Delete this. void UpdateIdealBoundsForPinnedTabs(); // Lays out tabs and group headers to their current bounds. Returns the @@ -157,6 +129,11 @@ private: struct TabSlot; + // Calculates the bounds each tab should occupy, subject to the provided + // width constraint. + std::vector<gfx::Rect> CalculateIdealBounds( + base::Optional<int> available_width); + // Given a tab's |model_index| and |group|, returns the index of its // corresponding TabSlot in |slots_|. int GetSlotIndexForTabModelIndex( @@ -170,15 +147,6 @@ // Returns the current width constraints for each View. std::vector<TabWidthConstraints> GetCurrentTabWidthConstraints() const; - // Runs an animation for the View at |slot_index| towards |target_state|. - void AnimateSlot(int slot_index, TabAnimationState target_state); - - // Called when animations progress. - void TickAnimations(); - - // Deletes the data in |slots_| corresponding to fully closed tabs. - void RemoveClosedTabs(); - // Recalculate |cached_slots_|, called whenever state changes. void UpdateCachedTabSlots(); @@ -205,12 +173,6 @@ GetTabsCallback get_tabs_callback_; GetGroupHeadersCallback get_group_headers_callback_; - // Timer used to run animations on Views.. - base::RepeatingTimer animation_timer_; - - // Called when animations progress. - base::RepeatingClosure on_animation_progressed_; - // Current collation of tabs and group headers, along with necessary data to // run layout and animations for those Views. std::vector<TabSlot> slots_;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc index 2f620b63..1c5d109 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
@@ -39,7 +39,9 @@ #include "ui/views/accessibility/ax_event_observer.h" #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/controls/label.h" +#include "ui/views/layout/flex_layout.h" #include "ui/views/view.h" +#include "ui/views/view_class_properties.h" #include "ui/views/view_targeter.h" #include "ui/views/widget/widget.h" @@ -140,11 +142,18 @@ tab_strip_ = new TabStrip(std::unique_ptr<TabStripController>(controller_)); controller_->set_tab_strip(tab_strip_); // Do this to force TabStrip to create the buttons. - auto* parent = new views::View; - parent->AddChildView(tab_strip_); + tab_strip_parent_ = new views::View; + views::FlexLayout* layout_manager = tab_strip_parent_->SetLayoutManager( + std::make_unique<views::FlexLayout>()); + layout_manager->SetOrientation(views::LayoutOrientation::kHorizontal) + .SetDefault( + views::kFlexBehaviorKey, + views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero, + views::MaximumFlexSizeRule::kUnbounded)); + tab_strip_parent_->AddChildView(tab_strip_); widget_ = CreateTestWidget(); - widget_->SetContentsView(parent); + widget_->SetContentsView(tab_strip_parent_); } void TearDown() override { @@ -257,6 +266,7 @@ // Owned by TabStrip. FakeBaseTabStripController* controller_ = nullptr; TabStrip* tab_strip_ = nullptr; + views::View* tab_strip_parent_ = nullptr; std::unique_ptr<views::Widget> widget_; ui::MouseEvent dummy_event_ = ui::MouseEvent(ui::ET_MOUSE_PRESSED, @@ -368,10 +378,9 @@ EXPECT_EQ(1, tab_strip_->tab_count()); // But the number of views should remain the same (it's animatining closed). EXPECT_EQ(num_children, tab_strip_->children().size()); - tab_strip_->SetBounds(0, 0, 200, 20); - // Layout at a different size should force the animation to end and delete - // the tab that was removed. - tab_strip_->Layout(); + + CompleteAnimationAndLayout(); + EXPECT_EQ(num_children - 1, tab_strip_->children().size()); // Remove the last tab to make sure things are cleaned up correctly when @@ -433,7 +442,7 @@ TEST_P(TabStripTest, VisibilityInOverflow) { constexpr int kInitialWidth = 250; - tab_strip_->SetBounds(0, 0, kInitialWidth, 20); + tab_strip_parent_->SetBounds(0, 0, kInitialWidth, 20); // The first tab added to a reasonable-width strip should be visible. If we // add enough additional tabs, eventually one should be invisible due to @@ -452,16 +461,16 @@ EXPECT_TRUE(tab_strip_->tab_at(i)->GetVisible()); // Enlarging the strip should result in the last tab becoming visible. - tab_strip_->SetBounds(0, 0, kInitialWidth * 2, 20); + tab_strip_parent_->SetBounds(0, 0, kInitialWidth * 2, 20); EXPECT_TRUE(tab_strip_->tab_at(invisible_tab_index)->GetVisible()); // Shrinking it again should re-hide the last tab. - tab_strip_->SetBounds(0, 0, kInitialWidth, 20); + tab_strip_parent_->SetBounds(0, 0, kInitialWidth, 20); EXPECT_FALSE(tab_strip_->tab_at(invisible_tab_index)->GetVisible()); // Shrinking it still more should make more tabs invisible, though not all. // All the invisible tabs should be at the end of the strip. - tab_strip_->SetBounds(0, 0, kInitialWidth / 2, 20); + tab_strip_parent_->SetBounds(0, 0, kInitialWidth / 2, 20); int i = 0; for (; i < invisible_tab_index; ++i) { if (!tab_strip_->tab_at(i)->GetVisible()) @@ -492,7 +501,7 @@ // across the strip at the top, middle, and bottom, events will target each tab // in order. TEST_P(TabStripTest, TabForEventWhenStacked) { - tab_strip_->SetBounds(0, 0, 250, GetLayoutConstant(TAB_HEIGHT)); + tab_strip_parent_->SetBounds(0, 0, 250, GetLayoutConstant(TAB_HEIGHT)); controller_->AddTab(0, false); controller_->AddTab(1, true); @@ -525,7 +534,8 @@ TEST_P(TabStripTest, TabCloseButtonVisibilityWhenStacked) { // Touch-optimized UI requires a larger width for tabs to show close buttons. const bool touch_ui = ui::TouchUiController::Get()->touch_ui(); - tab_strip_->SetBounds(0, 0, touch_ui ? 442 : 346, 20); + tab_strip_parent_->SetBounds(0, 0, touch_ui ? 442 : 346, 20); + controller_->AddTab(0, false); controller_->AddTab(1, true); controller_->AddTab(2, false); @@ -597,7 +607,8 @@ // three icons, but not enough for five tabs to show all three icons. // Touch-optimized UI requires a larger width for tabs to show close buttons. const bool touch_ui = ui::TouchUiController::Get()->touch_ui(); - tab_strip_->SetBounds(0, 0, touch_ui ? 442 : 346, 20); + tab_strip_parent_->SetBounds(0, 0, touch_ui ? 442 : 346, 20); + controller_->AddTab(0, false); controller_->AddTab(1, true); controller_->AddTab(2, false); @@ -671,7 +682,7 @@ } TEST_P(TabStripTest, GetEventHandlerForOverlappingArea) { - tab_strip_->SetBounds(0, 0, 1000, 20); + tab_strip_parent_->SetBounds(0, 0, 1000, 20); controller_->AddTab(0, false); controller_->AddTab(1, true); @@ -734,7 +745,7 @@ } TEST_P(TabStripTest, GetTooltipHandler) { - tab_strip_->SetBounds(0, 0, 1000, 20); + tab_strip_parent_->SetBounds(0, 0, 1000, 20); controller_->AddTab(0, false); controller_->AddTab(1, true); @@ -803,7 +814,7 @@ TEST_P(TabStripTest, NewTabButtonStaysVisible) { const int kTabStripWidth = 500; - tab_strip_->SetBounds(0, 0, kTabStripWidth, 20); + tab_strip_parent_->SetBounds(0, 0, kTabStripWidth, 20); for (int i = 0; i < 100; ++i) controller_->AddTab(i, (i == 0)); @@ -815,7 +826,7 @@ TEST_P(TabStripTest, NewTabButtonRightOfTabs) { const int kTabStripWidth = 500; - tab_strip_->SetBounds(0, 0, kTabStripWidth, 20); + tab_strip_parent_->SetBounds(0, 0, kTabStripWidth, 20); controller_->AddTab(0, true); @@ -834,17 +845,17 @@ const int standard_width = TabStyle::GetStandardWidth(); - tab_strip_->SetBounds(0, 0, 1000, 100); + tab_strip_parent_->SetBounds(0, 0, 1000, 100); EXPECT_EQ(standard_width, GetActiveTabWidth()); EXPECT_EQ(standard_width, GetInactiveTabWidth()); - tab_strip_->SetBounds(0, 0, 240, 100); + tab_strip_parent_->SetBounds(0, 0, 240, 100); EXPECT_LT(GetActiveTabWidth(), standard_width); EXPECT_EQ(GetInactiveTabWidth(), GetActiveTabWidth()); - tab_strip_->SetBounds(0, 0, 50, 100); + tab_strip_parent_->SetBounds(0, 0, 50, 100); EXPECT_EQ(TabStyleViews::GetMinimumActiveWidth(), GetActiveTabWidth()); EXPECT_EQ(TabStyleViews::GetMinimumInactiveWidth(), GetInactiveTabWidth()); @@ -856,7 +867,7 @@ // The bug was caused when it's animating. Therefore we should make widget // visible so that animation can be triggered. tab_strip_->GetWidget()->Show(); - tab_strip_->SetBounds(0, 0, 200, 20); + tab_strip_parent_->SetBounds(0, 0, 200, 20); // Create a lot of tabs in order to make inactive tabs tiny. const int min_inactive_width = TabStyleViews::GetMinimumInactiveWidth(); @@ -888,7 +899,7 @@ // Inactive tabs shouldn't shrink during mouse-based tab closure. // http://crbug.com/850190 TEST_P(TabStripTest, InactiveTabWidthWhenTabsAreTiny) { - tab_strip_->SetBounds(0, 0, 200, 20); + tab_strip_parent_->SetBounds(0, 0, 200, 20); // Create a lot of tabs in order to make inactive tabs smaller than active // tab but not the minimum. @@ -917,7 +928,7 @@ // When dragged tabs are moving back to their position, changes to ideal bounds // should be respected. http://crbug.com/848016 TEST_P(TabStripTest, ResetBoundsForDraggedTabs) { - tab_strip_->SetBounds(0, 0, 200, 20); + tab_strip_parent_->SetBounds(0, 0, 200, 20); // Create a lot of tabs in order to make inactive tabs tiny. const int min_inactive_width = TabStyleViews::GetMinimumInactiveWidth(); @@ -992,7 +1003,8 @@ TEST_P(TabStripTest, NewTabButtonInkDrop) { constexpr int kTabStripWidth = 500; - tab_strip_->SetBounds(0, 0, kTabStripWidth, GetLayoutConstant(TAB_HEIGHT)); + tab_strip_parent_->SetBounds(0, 0, kTabStripWidth, + GetLayoutConstant(TAB_HEIGHT)); // Add a few tabs and simulate the new tab button's ink drop animation. This // should not cause any crashes since the ink drop layer size as well as the @@ -1010,7 +1022,7 @@ // Closing tab should be targeted during event dispatching. TEST_P(TabStripTest, EventsOnClosingTab) { - tab_strip_->SetBounds(0, 0, 200, 20); + tab_strip_parent_->SetBounds(0, 0, 200, 20); controller_->AddTab(0, false); controller_->AddTab(1, true); @@ -1023,31 +1035,8 @@ EXPECT_EQ(first_tab, tab_strip_->GetEventHandlerForPoint(tab_center)); } -TEST_P(TabStripTest, AnimationOnTabAdd) { - tab_strip_->SetBounds(0, 0, 1000, 100); - // Show widget to enable animations. - widget_->Show(); - - // First tab does not animate. - controller_->AddTab(0, true); - controller_->AddTab(1, false); - - const int initial_width = tab_strip_->tab_at(1)->width(); - EXPECT_LT(initial_width, tab_strip_->tab_at(0)->width()); - - task_environment()->FastForwardBy(TabAnimation::kAnimationDuration / 2); - - EXPECT_GT(tab_strip_->tab_at(1)->width(), initial_width); - EXPECT_LT(tab_strip_->tab_at(1)->width(), tab_strip_->tab_at(0)->width()); - - // Fast-forward by more than enough to ensure the animation finishes. - task_environment()->FastForwardBy(TabAnimation::kAnimationDuration); - - EXPECT_EQ(tab_strip_->tab_at(0)->width(), tab_strip_->tab_at(1)->width()); -} - TEST_P(TabStripTest, GroupHeaderBasics) { - tab_strip_->SetBounds(0, 0, 1000, 100); + tab_strip_parent_->SetBounds(0, 0, 1000, 100); bounds_animator()->SetAnimationDuration(base::TimeDelta()); tab_strip_->AddTabAt(0, TabRendererData(), false); @@ -1069,7 +1058,7 @@ } TEST_P(TabStripTest, GroupHeaderBetweenTabs) { - tab_strip_->SetBounds(0, 0, 1000, 100); + tab_strip_parent_->SetBounds(0, 0, 1000, 100); bounds_animator()->SetAnimationDuration(base::TimeDelta()); tab_strip_->AddTabAt(0, TabRendererData(), false); @@ -1086,7 +1075,7 @@ } TEST_P(TabStripTest, GroupHeaderMovesRightWithTab) { - tab_strip_->SetBounds(0, 0, 2000, 100); + tab_strip_parent_->SetBounds(0, 0, 2000, 100); for (int i = 0; i < 4; i++) tab_strip_->AddTabAt(i, TabRendererData(), false); base::Optional<tab_groups::TabGroupId> group = @@ -1104,7 +1093,7 @@ } TEST_P(TabStripTest, GroupHeaderMovesLeftWithTab) { - tab_strip_->SetBounds(0, 0, 2000, 100); + tab_strip_parent_->SetBounds(0, 0, 2000, 100); for (int i = 0; i < 4; i++) tab_strip_->AddTabAt(i, TabRendererData(), false); base::Optional<tab_groups::TabGroupId> group = @@ -1122,7 +1111,7 @@ } TEST_P(TabStripTest, GroupHeaderDoesntMoveReorderingTabsInGroup) { - tab_strip_->SetBounds(0, 0, 2000, 100); + tab_strip_parent_->SetBounds(0, 0, 2000, 100); for (int i = 0; i < 4; i++) tab_strip_->AddTabAt(i, TabRendererData(), false); base::Optional<tab_groups::TabGroupId> group = @@ -1148,7 +1137,7 @@ } TEST_P(TabStripTest, GroupHeaderMovesOnRegrouping) { - tab_strip_->SetBounds(0, 0, 2000, 100); + tab_strip_parent_->SetBounds(0, 0, 2000, 100); for (int i = 0; i < 3; i++) tab_strip_->AddTabAt(i, TabRendererData(), false); tab_groups::TabGroupId group0 = tab_groups::TabGroupId::GenerateNew(); @@ -1177,7 +1166,7 @@ } TEST_P(TabStripTest, UngroupedTabMovesLeftOfHeader) { - tab_strip_->SetBounds(0, 0, 2000, 100); + tab_strip_parent_->SetBounds(0, 0, 2000, 100); for (int i = 0; i < 2; i++) tab_strip_->AddTabAt(i, TabRendererData(), false); tab_groups::TabGroupId group = tab_groups::TabGroupId::GenerateNew(); @@ -1195,7 +1184,7 @@ // This can happen when a tab in the middle of a group starts to close. TEST_P(TabStripTest, DiscontinuousGroup) { - tab_strip_->SetBounds(0, 0, 1000, 100); + tab_strip_parent_->SetBounds(0, 0, 1000, 100); bounds_animator()->SetAnimationDuration(base::TimeDelta()); tab_strip_->AddTabAt(0, TabRendererData(), false); @@ -1229,7 +1218,7 @@ } TEST_P(TabStripTest, GroupUnderlineBasics) { - tab_strip_->SetBounds(0, 0, 1000, 100); + tab_strip_parent_->SetBounds(0, 0, 1000, 100); bounds_animator()->SetAnimationDuration(base::TimeDelta()); controller_->AddTab(0, false); @@ -1263,7 +1252,7 @@ } TEST_P(TabStripTest, GroupHighlightBasics) { - tab_strip_->SetBounds(0, 0, 1000, 100); + tab_strip_parent_->SetBounds(0, 0, 1000, 100); bounds_animator()->SetAnimationDuration(base::TimeDelta()); controller_->AddTab(0, false); @@ -1285,7 +1274,7 @@ } TEST_P(TabStripTest, ChangingLayoutTypeResizesTabs) { - tab_strip_->SetBounds(0, 0, 1000, 100); + tab_strip_parent_->SetBounds(0, 0, 1000, 100); tab_strip_->AddTabAt(0, TabRendererData(), false); Tab* tab = tab_strip_->tab_at(0);
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc index b938651..9e3a5f3 100644 --- a/chrome/browser/ui/views/tabs/tab_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -34,6 +34,8 @@ #include "ui/gfx/favicon_size.h" #include "ui/views/controls/button/image_button.h" #include "ui/views/controls/label.h" +#include "ui/views/layout/flex_layout.h" +#include "ui/views/view_class_properties.h" #include "ui/views/widget/widget.h" using views::Widget; @@ -353,8 +355,16 @@ controller_ = new FakeBaseTabStripController; tab_strip_ = new TabStrip(std::unique_ptr<TabStripController>(controller_)); controller_->set_tab_strip(tab_strip_); + // The tab strip must be added to the view hierarchy for it to create the // buttons. + views::FlexLayout* layout_manager = + parent_.SetLayoutManager(std::make_unique<views::FlexLayout>()); + layout_manager->SetOrientation(views::LayoutOrientation::kHorizontal) + .SetDefault( + views::kFlexBehaviorKey, + views::FlexSpecification(views::MinimumFlexSizeRule::kScaleToZero, + views::MaximumFlexSizeRule::kUnbounded)); parent_.AddChildView(tab_strip_); parent_.set_owned_by_client();
diff --git a/chrome/browser/ui/views/translate/translate_bubble_view_unittest.cc b/chrome/browser/ui/views/translate/translate_bubble_view_unittest.cc index a8953dab..4bf219c 100644 --- a/chrome/browser/ui/views/translate/translate_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/translate/translate_bubble_view_unittest.cc
@@ -234,11 +234,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiTranslateButton) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); EXPECT_FALSE(mock_model_->translate_called_); @@ -248,6 +243,9 @@ } TEST_F(TranslateBubbleViewTest, OptionsMenuNeverTranslateLanguage) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); EXPECT_FALSE(bubble_->GetWidget()->IsClosed()); @@ -265,11 +263,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiOptionsMenuNeverTranslateLanguage) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); EXPECT_FALSE(bubble_->GetWidget()->IsClosed()); @@ -287,6 +280,9 @@ } TEST_F(TranslateBubbleViewTest, OptionsMenuNeverTranslateSite) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + // NEVER_TRANSLATE_SITE should only show up for sites that can be blacklisted. mock_model_->SetCanBlacklistSite(true); CreateAndShowBubble(); @@ -306,11 +302,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiOptionsMenuNeverTranslateSite) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - // NEVER_TRANSLATE_SITE should only show up for sites that can be blacklisted. mock_model_->SetCanBlacklistSite(true); CreateAndShowBubble(); @@ -354,6 +345,9 @@ } TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndCancelButton) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); @@ -378,6 +372,9 @@ } TEST_F(TranslateBubbleViewTest, AlwaysTranslateCheckboxAndDoneButton) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); @@ -402,11 +399,6 @@ } TEST_F(TranslateBubbleViewTest, TabUIAlwaysTranslateCheckboxShortcut) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - mock_model_->SetShouldShowAlwaysTranslateShortcut(true); CreateAndShowBubble(); @@ -426,11 +418,6 @@ } TEST_F(TranslateBubbleViewTest, TabUIAlwaysTranslateCheckboxAndCloseButton) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_SOURCE_LANGUAGE); @@ -455,11 +442,6 @@ } TEST_F(TranslateBubbleViewTest, TabUIAlwaysTranslateCheckboxAndDoneButton) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_SOURCE_LANGUAGE); @@ -484,6 +466,9 @@ } TEST_F(TranslateBubbleViewTest, DoneButton) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); @@ -504,11 +489,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiSourceDoneButton) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_SOURCE_LANGUAGE); @@ -532,11 +512,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiTargetDoneButton) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_TARGET_LANGUAGE); @@ -559,6 +534,9 @@ } TEST_F(TranslateBubbleViewTest, DoneButtonWithoutTranslating) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); EXPECT_EQ(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE, bubble_->GetViewState()); @@ -587,11 +565,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiDoneButtonWithoutTranslating) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); // Translate the page once. @@ -616,6 +589,9 @@ } TEST_F(TranslateBubbleViewTest, CancelButtonReturningBeforeTranslate) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_BEFORE_TRANSLATE); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); @@ -628,6 +604,9 @@ } TEST_F(TranslateBubbleViewTest, CancelButtonReturningAfterTranslate) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_AFTER_TRANSLATE); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); @@ -640,6 +619,9 @@ } TEST_F(TranslateBubbleViewTest, CancelButtonReturningError) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ERROR); bubble_->SwitchView(TranslateBubbleModel::VIEW_STATE_ADVANCED); @@ -651,6 +633,9 @@ } TEST_F(TranslateBubbleViewTest, OptionsMenuRespectsBlacklistSite) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + mock_model_->SetCanBlacklistSite(false); CreateAndShowBubble(); @@ -665,11 +650,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiOptionsMenuRespectsBlacklistSite) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - mock_model_->SetCanBlacklistSite(false); CreateAndShowBubble(); @@ -684,6 +664,9 @@ } TEST_F(TranslateBubbleViewTest, AlwaysTranslateLanguageMenuItem) { + scoped_feature_list_.InitAndDisableFeature( + language::kUseButtonTranslateBubbleUi); + CreateAndShowBubble(); TriggerOptionsMenu(); @@ -721,11 +704,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiAlwaysTranslateLanguageMenuItem) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); TriggerOptionsMenuTab(); @@ -763,11 +741,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiAlwaysTranslateTriggerTranslation) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); TriggerOptionsMenuTab(); @@ -798,11 +771,6 @@ } TEST_F(TranslateBubbleViewTest, TabUiTabSelectedAfterTranslation) { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - language::kUseButtonTranslateBubbleUi, - {{language::kTranslateUIBubbleKey, - language::kTranslateUIBubbleTabValue}}); - CreateAndShowBubble(); EXPECT_EQ(bubble_->tabbed_pane_->GetSelectedTabIndex(), static_cast<size_t>(0));
diff --git a/chrome/browser/ui/views/webauthn/authenticator_bio_enrollment_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_bio_enrollment_sheet_view.cc new file mode 100644 index 0000000..c0fdd943 --- /dev/null +++ b/chrome/browser/ui/views/webauthn/authenticator_bio_enrollment_sheet_view.cc
@@ -0,0 +1,64 @@ +// 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/webauthn/authenticator_bio_enrollment_sheet_view.h" + +#include "chrome/app/vector_icons/vector_icons.h" +#include "chrome/browser/ui/views/accessibility/non_accessible_image_view.h" +#include "chrome/browser/ui/views/webauthn/ring_progress_bar.h" +#include "ui/gfx/paint_vector_icon.h" +#include "ui/views/layout/fill_layout.h" +#include "ui/views/vector_icons.h" + +#include <utility> + +namespace { +static constexpr int kFingerprintSize = 120; +static constexpr SkColor kFingerprintColor = SkColorSetRGB(66, 133, 224); +static constexpr int kRingSize = 228; + +double CalculateProgressFor(double samples_remaining, double max_samples) { + return 1 - samples_remaining / (max_samples <= 0 ? 1 : max_samples); +} +} // namespace + +AuthenticatorBioEnrollmentSheetView::AuthenticatorBioEnrollmentSheetView( + std::unique_ptr<AuthenticatorBioEnrollmentSheetModel> sheet_model) + : AuthenticatorRequestSheetView(std::move(sheet_model)) {} + +AuthenticatorBioEnrollmentSheetView::~AuthenticatorBioEnrollmentSheetView() = + default; + +std::unique_ptr<views::View> +AuthenticatorBioEnrollmentSheetView::BuildStepSpecificContent() { + auto* bio_model = static_cast<AuthenticatorBioEnrollmentSheetModel*>(model()); + double target = CalculateProgressFor(bio_model->bio_samples_remaining(), + bio_model->max_bio_samples()); + double initial; + if (target <= 0) { + initial = target; + } else { + initial = CalculateProgressFor(bio_model->bio_samples_remaining() + 1, + bio_model->max_bio_samples()); + } + + auto animation_container = std::make_unique<views::View>(); + animation_container->SetLayoutManager(std::make_unique<views::FillLayout>()); + + auto image_view = std::make_unique<NonAccessibleImageView>(); + image_view->SetVerticalAlignment(views::ImageView::Alignment::kCenter); + gfx::IconDescription icon_description( + target >= 1 ? views::kMenuCheckIcon : kFingerprintIcon, kFingerprintSize, + kFingerprintColor); + image_view->SetImage(gfx::CreateVectorIcon(icon_description)); + animation_container->AddChildView(std::move(image_view)); + + auto ring_progress_bar = std::make_unique<RingProgressBar>(); + ring_progress_bar_ = ring_progress_bar.get(); + ring_progress_bar->SetPreferredSize(gfx::Size(kRingSize, kRingSize)); + ring_progress_bar->SetValue(initial, target); + animation_container->AddChildView(std::move(ring_progress_bar)); + + return animation_container; +}
diff --git a/chrome/browser/ui/views/webauthn/authenticator_bio_enrollment_sheet_view.h b/chrome/browser/ui/views/webauthn/authenticator_bio_enrollment_sheet_view.h new file mode 100644 index 0000000..7038704a --- /dev/null +++ b/chrome/browser/ui/views/webauthn/authenticator_bio_enrollment_sheet_view.h
@@ -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. + +#ifndef CHROME_BROWSER_UI_VIEWS_WEBAUTHN_AUTHENTICATOR_BIO_ENROLLMENT_SHEET_VIEW_H_ +#define CHROME_BROWSER_UI_VIEWS_WEBAUTHN_AUTHENTICATOR_BIO_ENROLLMENT_SHEET_VIEW_H_ + +#include "chrome/browser/ui/views/webauthn/authenticator_request_sheet_view.h" +#include "chrome/browser/ui/webauthn/sheet_models.h" + +class RingProgressBar; + +// Represents a sheet in the Web Authentication request dialog that allows the +// user to input pin code used to connect to BLE security key. +class AuthenticatorBioEnrollmentSheetView + : public AuthenticatorRequestSheetView { + public: + explicit AuthenticatorBioEnrollmentSheetView( + std::unique_ptr<AuthenticatorBioEnrollmentSheetModel> sheet_model); + ~AuthenticatorBioEnrollmentSheetView() override; + + private: + // AuthenticatorRequestSheetView: + std::unique_ptr<views::View> BuildStepSpecificContent() override; + + RingProgressBar* ring_progress_bar_; + + DISALLOW_COPY_AND_ASSIGN(AuthenticatorBioEnrollmentSheetView); +}; + +#endif // CHROME_BROWSER_UI_VIEWS_WEBAUTHN_AUTHENTICATOR_BIO_ENROLLMENT_SHEET_VIEW_H_
diff --git a/chrome/browser/ui/views/webauthn/ring_progress_bar.cc b/chrome/browser/ui/views/webauthn/ring_progress_bar.cc new file mode 100644 index 0000000..48638fc --- /dev/null +++ b/chrome/browser/ui/views/webauthn/ring_progress_bar.cc
@@ -0,0 +1,74 @@ +// 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/webauthn/ring_progress_bar.h" + +#include "cc/paint/paint_flags.h" +#include "third_party/skia/include/core/SkPath.h" +#include "ui/accessibility/ax_enums.mojom.h" +#include "ui/accessibility/ax_node_data.h" +#include "ui/gfx/animation/linear_animation.h" +#include "ui/gfx/canvas.h" +#include "ui/gfx/color_utils.h" +#include "ui/gfx/skia_util.h" +#include "ui/native_theme/native_theme.h" + +namespace { +constexpr float kStrokeWidth = 4; +constexpr base::TimeDelta kAnimationDuration = + base::TimeDelta::FromMilliseconds(200); +static constexpr SkColor kRingColor = SkColorSetRGB(66, 133, 224); +static constexpr SkColor kBackgroundColor = SkColorSetRGB(218, 220, 224); +} // namespace + +RingProgressBar::RingProgressBar() = default; +RingProgressBar::~RingProgressBar() = default; + +void RingProgressBar::SetValue(double initial, double target) { + initial_ = std::max(0., std::min(initial, 1.)); + target_ = std::max(0., std::min(target, 1.)); + animation_ = std::make_unique<gfx::LinearAnimation>(this); + animation_->SetDuration(kAnimationDuration); + animation_->Start(); +} + +void RingProgressBar::GetAccessibleNodeData(ui::AXNodeData* node_data) { + node_data->role = ax::mojom::Role::kProgressIndicator; +} + +void RingProgressBar::OnPaint(gfx::Canvas* canvas) { + gfx::Rect content_bounds = GetContentsBounds(); + // Draw the background ring that gets progressively filled. + gfx::PointF center(content_bounds.width() / 2, content_bounds.height() / 2); + const double radius = + (std::min(content_bounds.width(), content_bounds.height()) - + kStrokeWidth) / + 2; + cc::PaintFlags background_flags; + background_flags.setStyle(cc::PaintFlags::Style::kStroke_Style); + background_flags.setAntiAlias(true); + background_flags.setColor(kBackgroundColor); + background_flags.setStrokeWidth(kStrokeWidth); + canvas->DrawCircle(center, radius, std::move(background_flags)); + + // Draw the filled portion of the circle. + SkPath ring_path; + SkRect bounds{/*fLeft=*/(content_bounds.width() / 2 - radius), + /*fTop=*/(content_bounds.height() / 2 - radius), + /*fRight=*/(content_bounds.width() / 2 + radius), + /*fBottom=*/(content_bounds.height() / 2 + radius)}; + ring_path.addArc( + std::move(bounds), /*startAngle=*/-90, + /*sweepAngle=*/360 * animation_->CurrentValueBetween(initial_, target_)); + cc::PaintFlags ring_flags; + ring_flags.setStyle(cc::PaintFlags::Style::kStroke_Style); + ring_flags.setAntiAlias(true); + ring_flags.setColor(kRingColor); + ring_flags.setStrokeWidth(kStrokeWidth); + canvas->DrawPath(std::move(ring_path), std::move(ring_flags)); +} + +void RingProgressBar::AnimationProgressed(const gfx::Animation* animation) { + SchedulePaint(); +}
diff --git a/chrome/browser/ui/views/webauthn/ring_progress_bar.h b/chrome/browser/ui/views/webauthn/ring_progress_bar.h new file mode 100644 index 0000000..a6263a4 --- /dev/null +++ b/chrome/browser/ui/views/webauthn/ring_progress_bar.h
@@ -0,0 +1,40 @@ +// 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_WEBAUTHN_RING_PROGRESS_BAR_H_ +#define CHROME_BROWSER_UI_VIEWS_WEBAUTHN_RING_PROGRESS_BAR_H_ + +#include "ui/gfx/animation/animation_delegate.h" +#include "ui/views/view.h" + +namespace gfx { +class Animation; +class LinearAnimation; +} // namespace gfx + +// A progress bar that takes the shape of a ring. +class RingProgressBar : public views::View, public gfx::AnimationDelegate { + public: + RingProgressBar(); + ~RingProgressBar() override; + + // Sets the progress value, animating from |initial| to |target|. Valid values + // are between 0 and 1. + void SetValue(double initial, double target); + + private: + // views::View: + void GetAccessibleNodeData(ui::AXNodeData* node_data) override; + void OnPaint(gfx::Canvas* canvas) override; + + // gfx::AnimationDelegate: + void AnimationProgressed(const gfx::Animation* animation) override; + + double initial_ = 0; + double target_ = 0; + + std::unique_ptr<gfx::LinearAnimation> animation_; +}; + +#endif // CHROME_BROWSER_UI_VIEWS_WEBAUTHN_RING_PROGRESS_BAR_H_
diff --git a/chrome/browser/ui/views/webauthn/sheet_view_factory.cc b/chrome/browser/ui/views/webauthn/sheet_view_factory.cc index 1f7011a1..2d631e3 100644 --- a/chrome/browser/ui/views/webauthn/sheet_view_factory.cc +++ b/chrome/browser/ui/views/webauthn/sheet_view_factory.cc
@@ -8,6 +8,7 @@ #include "base/logging.h" #include "chrome/browser/ui/autofill/payments/webauthn_dialog_model.h" +#include "chrome/browser/ui/views/webauthn/authenticator_bio_enrollment_sheet_view.h" #include "chrome/browser/ui/views/webauthn/authenticator_ble_pin_entry_sheet_view.h" #include "chrome/browser/ui/views/webauthn/authenticator_client_pin_entry_sheet_view.h" #include "chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.h" @@ -166,6 +167,10 @@ AuthenticatorGenericErrorSheetModel:: ForClientPinErrorAuthenticatorRemoved(dialog_model)); break; + case Step::kInlineBioEnrollment: + sheet_view = std::make_unique<AuthenticatorBioEnrollmentSheetView>( + std::make_unique<AuthenticatorBioEnrollmentSheetModel>(dialog_model)); + break; case Step::kRetryInternalUserVerification: sheet_view = std::make_unique<AuthenticatorRequestSheetView>( std::make_unique<AuthenticatorRetryUvSheetModel>(dialog_model));
diff --git a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc index 8ed53f01..7f081e9 100644 --- a/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc +++ b/chrome/browser/ui/webauthn/authenticator_dialog_browsertest.cc
@@ -6,6 +6,7 @@ #include <utility> #include "base/bind_helpers.h" +#include "base/test/bind_test_util.h" #include "build/build_config.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" @@ -109,6 +110,14 @@ } else if (name == "get_pin_fallback") { model->set_internal_uv_locked(); model->CollectPIN(8, base::Bind([](std::string pin) {})); + } else if (name == "inline_bio_enrollment") { + model->StartInlineBioEnrollment(bio_samples_remaining_); + timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(2), + base::BindLambdaForTesting([&, weak_model = model.get()] { + weak_model->OnSampleCollected(--bio_samples_remaining_); + if (bio_samples_remaining_ <= 0) + timer_.Stop(); + })); } else if (name == "retry_uv") { model->OnRetryUserVerification(5); } else if (name == "retry_uv_two_tries_remaining") { @@ -173,6 +182,9 @@ } private: + base::RepeatingTimer timer_; + int bio_samples_remaining_ = 5; + DISALLOW_COPY_AND_ASSIGN(AuthenticatorDialogTest); }; @@ -279,6 +291,11 @@ ShowAndVerifyUi(); } +IN_PROC_BROWSER_TEST_F(AuthenticatorDialogTest, + InvokeUi_inline_bio_enrollment) { + ShowAndVerifyUi(); +} + IN_PROC_BROWSER_TEST_F(AuthenticatorDialogTest, InvokeUi_retry_uv) { ShowAndVerifyUi(); }
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc index 1c7334d..c9ff5ea 100644 --- a/chrome/browser/ui/webauthn/sheet_models.cc +++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -925,6 +925,62 @@ return PossibleResidentKeyWarning(dialog_model()); } +// AuthenticatorBioEnrollmentSheetModel ---------------------------------- + +AuthenticatorBioEnrollmentSheetModel::AuthenticatorBioEnrollmentSheetModel( + AuthenticatorRequestDialogModel* dialog_model) + : AuthenticatorSheetModelBase(dialog_model) {} + +AuthenticatorBioEnrollmentSheetModel::~AuthenticatorBioEnrollmentSheetModel() = + default; + +bool AuthenticatorBioEnrollmentSheetModel::IsActivityIndicatorVisible() const { + return !IsAcceptButtonVisible(); +} + +const gfx::VectorIcon& +AuthenticatorBioEnrollmentSheetModel::GetStepIllustration( + ImageColorScheme color_scheme) const { + return color_scheme == ImageColorScheme::kDark ? kWebauthnFingerprintDarkIcon + : kWebauthnFingerprintIcon; +} + +base::string16 AuthenticatorBioEnrollmentSheetModel::GetStepTitle() const { + return l10n_util::GetStringUTF16( + IDS_SETTINGS_SECURITY_KEYS_BIO_ENROLLMENT_ADD_TITLE); +} + +base::string16 AuthenticatorBioEnrollmentSheetModel::GetStepDescription() + const { + return IsAcceptButtonVisible() + ? l10n_util::GetStringUTF16( + IDS_SETTINGS_SECURITY_KEYS_BIO_ENROLLMENT_ENROLLING_COMPLETE_LABEL) + : l10n_util::GetStringUTF16( + IDS_SETTINGS_SECURITY_KEYS_BIO_ENROLLMENT_ENROLLING_LABEL); +} + +bool AuthenticatorBioEnrollmentSheetModel::IsAcceptButtonEnabled() const { + return true; +} + +bool AuthenticatorBioEnrollmentSheetModel::IsAcceptButtonVisible() const { + return dialog_model()->bio_samples_remaining() <= 0; +} + +base::string16 AuthenticatorBioEnrollmentSheetModel::GetAcceptButtonLabel() + const { + return l10n_util::GetStringUTF16(IDS_WEBAUTHN_PIN_ENTRY_NEXT); +} + +bool AuthenticatorBioEnrollmentSheetModel::IsCancelButtonVisible() const { + return !IsAcceptButtonVisible(); +} + +base::string16 AuthenticatorBioEnrollmentSheetModel::GetCancelButtonLabel() + const { + return l10n_util::GetStringUTF16(IDS_WEBAUTHN_INLINE_ENROLLMENT_CANCEL_LABEL); +} + // AuthenticatorRetryUvSheetModel ------------------------------------- AuthenticatorRetryUvSheetModel::AuthenticatorRetryUvSheetModel(
diff --git a/chrome/browser/ui/webauthn/sheet_models.h b/chrome/browser/ui/webauthn/sheet_models.h index b31ddf9..dc2b81d7e 100644 --- a/chrome/browser/ui/webauthn/sheet_models.h +++ b/chrome/browser/ui/webauthn/sheet_models.h
@@ -417,6 +417,32 @@ base::string16 GetAdditionalDescription() const override; }; +class AuthenticatorBioEnrollmentSheetModel + : public AuthenticatorSheetModelBase { + public: + explicit AuthenticatorBioEnrollmentSheetModel( + AuthenticatorRequestDialogModel* dialog_model); + ~AuthenticatorBioEnrollmentSheetModel() override; + + int max_bio_samples() { return dialog_model()->max_bio_samples(); } + int bio_samples_remaining() { + return dialog_model()->bio_samples_remaining(); + } + + private: + // AuthenticatorSheetModelBase: + bool IsActivityIndicatorVisible() const override; + const gfx::VectorIcon& GetStepIllustration( + ImageColorScheme color_scheme) const override; + base::string16 GetStepTitle() const override; + base::string16 GetStepDescription() const override; + bool IsAcceptButtonEnabled() const override; + bool IsAcceptButtonVisible() const override; + base::string16 GetAcceptButtonLabel() const override; + bool IsCancelButtonVisible() const override; + base::string16 GetCancelButtonLabel() const override; +}; + class AuthenticatorRetryUvSheetModel : public AuthenticatorSheetModelBase { public: explicit AuthenticatorRetryUvSheetModel(
diff --git a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc index 95822cd..c21f11b 100644 --- a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.cc
@@ -80,6 +80,12 @@ a11y_nav_buttons_toggle_metrics_reporter_timer_.FireNow(); } +void MarketingOptInScreenHandler::UpdateA11ySettingsButtonVisibility( + bool shown) { + CallJS("login.MarketingOptInScreen.updateA11ySettingsButtonVisibility", + shown); +} + void MarketingOptInScreenHandler::UpdateA11yShelfNavigationButtonToggle( bool enabled) { CallJS("login.MarketingOptInScreen.updateA11yNavigationButtonToggle",
diff --git a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h index a54b171..a4898e6 100644 --- a/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h +++ b/chrome/browser/ui/webui/chromeos/login/marketing_opt_in_screen_handler.h
@@ -30,6 +30,9 @@ // Hides the contents of the screen. virtual void Hide() = 0; + // Sets whether the a11y Settings button is visible. + virtual void UpdateA11ySettingsButtonVisibility(bool shown) = 0; + // Sets whether the a11y setting for showing shelf navigation buttons is // toggled on or off. virtual void UpdateA11yShelfNavigationButtonToggle(bool enabled) = 0; @@ -58,6 +61,7 @@ void Bind(MarketingOptInScreen* screen) override; void Show() override; void Hide() override; + void UpdateA11ySettingsButtonVisibility(bool shown) override; void UpdateA11yShelfNavigationButtonToggle(bool enabled) override; void SetOptInVisibility(bool visible) override; void SetEmailToggleState(bool checked) override;
diff --git a/chrome/browser/ui/webui/media/media_feeds_ui.cc b/chrome/browser/ui/webui/media/media_feeds_ui.cc index 8d927925..2ffddb82 100644 --- a/chrome/browser/ui/webui/media/media_feeds_ui.cc +++ b/chrome/browser/ui/webui/media/media_feeds_ui.cc
@@ -53,7 +53,9 @@ } void MediaFeedsUI::GetMediaFeeds(GetMediaFeedsCallback callback) { - GetMediaHistoryService()->GetMediaFeedsForDebug(std::move(callback)); + GetMediaHistoryService()->GetMediaFeeds( + media_history::MediaHistoryKeyedService::GetMediaFeedsRequest(), + std::move(callback)); } void MediaFeedsUI::GetItemsForMediaFeed(int64_t feed_id,
diff --git a/chrome/browser/ui/webui/memory_internals_ui.cc b/chrome/browser/ui/webui/memory_internals_ui.cc index ab68e4f..a06b58d 100644 --- a/chrome/browser/ui/webui/memory_internals_ui.cc +++ b/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -149,9 +149,12 @@ // Hops to the IO thread to enumerate child processes, and back to the UI // thread to fill in the renderer processes. static void GetChildProcessesOnIOThread( - base::WeakPtr<MemoryInternalsDOMHandler> dom_handler); - void GetProfiledPids(std::vector<base::Value> children); - void ReturnProcessListOnUIThread(std::vector<base::Value> children, + base::WeakPtr<MemoryInternalsDOMHandler> dom_handler, + const std::string& callback_id); + void GetProfiledPids(const std::string& callback_id, + std::vector<base::Value> children); + void ReturnProcessListOnUIThread(const std::string& callback_id, + std::vector<base::Value> children, std::vector<base::ProcessId> profiled_pids); // SelectFileDialog::Listener implementation: @@ -201,22 +204,26 @@ void MemoryInternalsDOMHandler::HandleRequestProcessList( const base::ListValue* args) { + AllowJavascript(); + std::string callback_id = args->GetList()[0].GetString(); + // This is called on the UI thread, the child process iterator must run on // the IO thread, while the render process iterator must run on the UI thread. base::PostTask( FROM_HERE, {content::BrowserThread::IO}, base::BindOnce(&MemoryInternalsDOMHandler::GetChildProcessesOnIOThread, - weak_factory_.GetWeakPtr())); + weak_factory_.GetWeakPtr(), std::move(callback_id))); } void MemoryInternalsDOMHandler::HandleSaveDump(const base::ListValue* args) { base::FilePath default_file = base::FilePath().AppendASCII( base::StringPrintf("trace_with_heap_dump.json.gz")); + AllowJavascript(); + #if defined(OS_ANDROID) base::Value result("Saving..."); - AllowJavascript(); - CallJavascriptFunction("setSaveDumpMessage", result); + FireWebUIListener("save-dump-progress", result); // On Android write to the user data dir. // TODO(bug 757115) Does it make sense to show the Android file picker here @@ -273,7 +280,8 @@ } void MemoryInternalsDOMHandler::GetChildProcessesOnIOThread( - base::WeakPtr<MemoryInternalsDOMHandler> dom_handler) { + base::WeakPtr<MemoryInternalsDOMHandler> dom_handler, + const std::string& callback_id) { std::vector<base::Value> result; // The only non-renderer child processes that currently support out-of-process @@ -291,10 +299,11 @@ base::PostTask(FROM_HERE, {content::BrowserThread::UI}, base::BindOnce(&MemoryInternalsDOMHandler::GetProfiledPids, - dom_handler, std::move(result))); + dom_handler, callback_id, std::move(result))); } void MemoryInternalsDOMHandler::GetProfiledPids( + const std::string& callback_id, std::vector<base::Value> children) { DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); heap_profiling::Supervisor* supervisor = @@ -305,17 +314,18 @@ base::PostTask( FROM_HERE, {content::BrowserThread::UI}, base::BindOnce(&MemoryInternalsDOMHandler::ReturnProcessListOnUIThread, - weak_factory_.GetWeakPtr(), std::move(children), - std::vector<base::ProcessId>())); + weak_factory_.GetWeakPtr(), callback_id, + std::move(children), std::vector<base::ProcessId>())); return; } - supervisor->GetProfiledPids( - base::BindOnce(&MemoryInternalsDOMHandler::ReturnProcessListOnUIThread, - weak_factory_.GetWeakPtr(), std::move(children))); + supervisor->GetProfiledPids(base::BindOnce( + &MemoryInternalsDOMHandler::ReturnProcessListOnUIThread, + weak_factory_.GetWeakPtr(), callback_id, std::move(children))); } void MemoryInternalsDOMHandler::ReturnProcessListOnUIThread( + const std::string& callback_id, std::vector<base::Value> children, std::vector<base::ProcessId> profiled_pids) { // This function will be called with the child processes that are not @@ -364,16 +374,14 @@ result.SetKey("message", base::Value(GetMessageString())); result.SetKey("processes", base::Value(std::move(process_list))); - AllowJavascript(); - CallJavascriptFunction("returnProcessList", result); + ResolveJavascriptCallback(base::Value(callback_id), result); } void MemoryInternalsDOMHandler::FileSelected(const base::FilePath& path, int index, void* params) { base::Value result("Saving..."); - AllowJavascript(); - CallJavascriptFunction("setSaveDumpMessage", result); + FireWebUIListener("save-dump-progress", result); ProfilingProcessHost::GetInstance()->SaveTraceWithHeapDumpToFile( path, @@ -389,8 +397,7 @@ void MemoryInternalsDOMHandler::SaveTraceFinished(bool success) { base::Value result(success ? "Save successful." : "Save failure."); - AllowJavascript(); - CallJavascriptFunction("setSaveDumpMessage", result); + FireWebUIListener("save-dump-progress", result); } } // namespace
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc index c7cfeb0..7807e56 100644 --- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc +++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -865,7 +865,8 @@ [](base::WeakPtr<AppLauncherHandler> app_launcher_handler, bool success) { LOCAL_HISTOGRAM_BOOLEAN("Apps.Launcher.UninstallSuccess", success); - app_launcher_handler->CleanupAfterUninstall(); + if (app_launcher_handler) + app_launcher_handler->CleanupAfterUninstall(); }, weak_ptr_factory_.GetWeakPtr());
diff --git a/chrome/browser/ui/webui/settings/chromeos/bluetooth_strings_provider.cc b/chrome/browser/ui/webui/settings/chromeos/bluetooth_strings_provider.cc new file mode 100644 index 0000000..f37b102 --- /dev/null +++ b/chrome/browser/ui/webui/settings/chromeos/bluetooth_strings_provider.cc
@@ -0,0 +1,158 @@ +// 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/webui/settings/chromeos/bluetooth_strings_provider.h" + +#include "base/bind.h" +#include "base/no_destructor.h" +#include "chrome/browser/ui/webui/chromeos/bluetooth_dialog_localized_strings_provider.h" +#include "chrome/browser/ui/webui/webui_util.h" +#include "chrome/common/webui_url_constants.h" +#include "chrome/grit/generated_resources.h" +#include "content/public/browser/web_ui_data_source.h" +#include "device/bluetooth/bluetooth_adapter_factory.h" +#include "device/bluetooth/dbus/bluez_dbus_manager.h" +#include "device/bluetooth/strings/grit/bluetooth_strings.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/base/webui/web_ui_util.h" + +namespace chromeos { +namespace settings { +namespace { + +const std::vector<SearchConcept>& GetBluetoothSearchConcepts() { + static const base::NoDestructor<std::vector<SearchConcept>> tags({ + // TODO(khorimoto): Add "Bluetooth" search concepts. + }); + return *tags; +} + +const std::vector<SearchConcept>& GetBluetoothOnSearchConcepts() { + static const base::NoDestructor<std::vector<SearchConcept>> tags({ + // TODO(khorimoto): Add "Bluetooth on" search concepts. + }); + return *tags; +} + +const std::vector<SearchConcept>& GetBluetoothOffSearchConcepts() { + static const base::NoDestructor<std::vector<SearchConcept>> tags({ + // TODO(khorimoto): Add "Bluetooth off" search concepts. + }); + return *tags; +} + +} // namespace + +BluetoothStringsProvider::BluetoothStringsProvider(Profile* profile, + Delegate* per_page_delegate) + : OsSettingsPerPageStringsProvider(profile, per_page_delegate) { + // Note: May be uninitialized in tests. + if (bluez::BluezDBusManager::IsInitialized()) { + device::BluetoothAdapterFactory::GetAdapter( + base::Bind(&BluetoothStringsProvider::OnFetchBluetoothAdapter, + weak_ptr_factory_.GetWeakPtr())); + } +} + +BluetoothStringsProvider::~BluetoothStringsProvider() { + if (bluetooth_adapter_) + bluetooth_adapter_->RemoveObserver(this); +} + +void BluetoothStringsProvider::AddUiStrings( + content::WebUIDataSource* html_source) const { + static constexpr webui::LocalizedString kLocalizedStrings[] = { + {"bluetoothConnected", IDS_SETTINGS_BLUETOOTH_CONNECTED}, + {"bluetoothConnectedWithBattery", + IDS_SETTINGS_BLUETOOTH_CONNECTED_WITH_BATTERY}, + {"bluetoothConnecting", IDS_SETTINGS_BLUETOOTH_CONNECTING}, + {"bluetoothDeviceListPaired", IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_PAIRED}, + {"bluetoothDeviceListUnpaired", + IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_UNPAIRED}, + {"bluetoothConnect", IDS_SETTINGS_BLUETOOTH_CONNECT}, + {"bluetoothDisconnect", IDS_SETTINGS_BLUETOOTH_DISCONNECT}, + {"bluetoothToggleA11yLabel", + IDS_SETTINGS_BLUETOOTH_TOGGLE_ACCESSIBILITY_LABEL}, + {"bluetoothExpandA11yLabel", + IDS_SETTINGS_BLUETOOTH_EXPAND_ACCESSIBILITY_LABEL}, + {"bluetoothNoDevices", IDS_SETTINGS_BLUETOOTH_NO_DEVICES}, + {"bluetoothNoDevicesFound", IDS_SETTINGS_BLUETOOTH_NO_DEVICES_FOUND}, + {"bluetoothNotConnected", IDS_SETTINGS_BLUETOOTH_NOT_CONNECTED}, + {"bluetoothPageTitle", IDS_SETTINGS_BLUETOOTH}, + {"bluetoothPairDevicePageTitle", + IDS_SETTINGS_BLUETOOTH_PAIR_DEVICE_TITLE}, + {"bluetoothRemove", IDS_SETTINGS_BLUETOOTH_REMOVE}, + {"bluetoothPrimaryUserControlled", + IDS_SETTINGS_BLUETOOTH_PRIMARY_USER_CONTROLLED}, + {"bluetoothDeviceType_computer", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_COMPUTER}, + {"bluetoothDeviceType_phone", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PHONE}, + {"bluetoothDeviceType_modem", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MODEM}, + {"bluetoothDeviceType_audio", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_AUDIO}, + {"bluetoothDeviceType_carAudio", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_CAR_AUDIO}, + {"bluetoothDeviceType_video", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_VIDEO}, + {"bluetoothDeviceType_peripheral", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PERIPHERAL}, + {"bluetoothDeviceType_joystick", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_JOYSTICK}, + {"bluetoothDeviceType_gamepad", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_GAMEPAD}, + {"bluetoothDeviceType_keyboard", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD}, + {"bluetoothDeviceType_mouse", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MOUSE}, + {"bluetoothDeviceType_tablet", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_TABLET}, + {"bluetoothDeviceType_keyboardMouseCombo", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO}, + {"bluetoothDeviceType_unknown", + IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_UNKNOWN}, + }; + AddLocalizedStringsBulk(html_source, kLocalizedStrings); + chromeos::bluetooth_dialog::AddLocalizedStrings(html_source); +} + +void BluetoothStringsProvider::AdapterPresentChanged( + device::BluetoothAdapter* adapter, + bool present) { + UpdateSearchTags(); +} + +void BluetoothStringsProvider::AdapterPoweredChanged( + device::BluetoothAdapter* adapter, + bool powered) { + UpdateSearchTags(); +} + +void BluetoothStringsProvider::OnFetchBluetoothAdapter( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter) { + bluetooth_adapter_ = bluetooth_adapter; + bluetooth_adapter_->AddObserver(this); + UpdateSearchTags(); +} + +void BluetoothStringsProvider::UpdateSearchTags() { + // Start with no search tags, then add them below if appropriate. + delegate()->RemoveSearchTags(GetBluetoothSearchConcepts()); + delegate()->RemoveSearchTags(GetBluetoothOnSearchConcepts()); + delegate()->RemoveSearchTags(GetBluetoothOffSearchConcepts()); + + if (!bluetooth_adapter_->IsPresent()) + return; + + delegate()->AddSearchTags(GetBluetoothSearchConcepts()); + + if (bluetooth_adapter_->IsPowered()) + delegate()->AddSearchTags(GetBluetoothOnSearchConcepts()); + else + delegate()->AddSearchTags(GetBluetoothOffSearchConcepts()); +} + +} // namespace settings +} // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/chromeos/bluetooth_strings_provider.h b/chrome/browser/ui/webui/settings/chromeos/bluetooth_strings_provider.h new file mode 100644 index 0000000..8c012dd --- /dev/null +++ b/chrome/browser/ui/webui/settings/chromeos/bluetooth_strings_provider.h
@@ -0,0 +1,50 @@ +// 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_WEBUI_SETTINGS_CHROMEOS_BLUETOOTH_STRINGS_PROVIDER_H_ +#define CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_BLUETOOTH_STRINGS_PROVIDER_H_ + +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/webui/settings/chromeos/os_settings_per_page_strings_provider.h" +#include "device/bluetooth/bluetooth_adapter.h" + +namespace content { +class WebUIDataSource; +} // namespace content + +namespace chromeos { +namespace settings { + +// Provides UI strings and search tags for Bluetooth settings. Different search +// tags are registered depending on whether the device has a Bluetooth chip and +// whether it is turned on or off. +class BluetoothStringsProvider : public OsSettingsPerPageStringsProvider, + public device::BluetoothAdapter::Observer { + public: + BluetoothStringsProvider(Profile* profile, Delegate* per_page_delegate); + ~BluetoothStringsProvider() override; + + private: + // OsSettingsPerPageStringsProvider: + void AddUiStrings(content::WebUIDataSource* html_source) const override; + + // device::BluetoothAdapter::Observer: + void AdapterPresentChanged(device::BluetoothAdapter* adapter, + bool present) override; + void AdapterPoweredChanged(device::BluetoothAdapter* adapter, + bool powered) override; + + void OnFetchBluetoothAdapter( + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter); + void UpdateSearchTags(); + + scoped_refptr<device::BluetoothAdapter> bluetooth_adapter_; + base::WeakPtrFactory<BluetoothStringsProvider> weak_ptr_factory_{this}; +}; + +} // namespace settings +} // namespace chromeos + +#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_CHROMEOS_BLUETOOTH_STRINGS_PROVIDER_H_
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc index fcb4cb972..5f9de07 100644 --- a/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.cc
@@ -34,11 +34,11 @@ #include "chrome/browser/supervised_user/supervised_user_service.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" #include "chrome/browser/ui/webui/chromeos/assistant_optin/assistant_optin_utils.h" -#include "chrome/browser/ui/webui/chromeos/bluetooth_dialog_localized_strings_provider.h" #include "chrome/browser/ui/webui/chromeos/network_element_localized_strings_provider.h" #include "chrome/browser/ui/webui/chromeos/smb_shares/smb_shares_localized_strings_provider.h" #include "chrome/browser/ui/webui/management_ui.h" #include "chrome/browser/ui/webui/policy_indicator_localized_strings_provider.h" +#include "chrome/browser/ui/webui/settings/chromeos/bluetooth_strings_provider.h" #include "chrome/browser/ui/webui/settings/chromeos/internet_strings_provider.h" #include "chrome/browser/ui/webui/settings/chromeos/search/search_concept.h" #include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h" @@ -63,7 +63,6 @@ #include "content/public/browser/web_ui_data_source.h" #include "content/public/common/content_features.h" #include "content/public/common/content_switches.h" -#include "device/bluetooth/strings/grit/bluetooth_strings.h" #include "media/base/media_switches.h" #include "ui/accessibility/accessibility_switches.h" #include "ui/base/l10n/l10n_util.h" @@ -931,63 +930,6 @@ } } -void AddBluetoothStrings(content::WebUIDataSource* html_source) { - static constexpr webui::LocalizedString kLocalizedStrings[] = { - {"bluetoothConnected", IDS_SETTINGS_BLUETOOTH_CONNECTED}, - {"bluetoothConnectedWithBattery", - IDS_SETTINGS_BLUETOOTH_CONNECTED_WITH_BATTERY}, - {"bluetoothConnecting", IDS_SETTINGS_BLUETOOTH_CONNECTING}, - {"bluetoothDeviceListPaired", IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_PAIRED}, - {"bluetoothDeviceListUnpaired", - IDS_SETTINGS_BLUETOOTH_DEVICE_LIST_UNPAIRED}, - {"bluetoothConnect", IDS_SETTINGS_BLUETOOTH_CONNECT}, - {"bluetoothDisconnect", IDS_SETTINGS_BLUETOOTH_DISCONNECT}, - {"bluetoothToggleA11yLabel", - IDS_SETTINGS_BLUETOOTH_TOGGLE_ACCESSIBILITY_LABEL}, - {"bluetoothExpandA11yLabel", - IDS_SETTINGS_BLUETOOTH_EXPAND_ACCESSIBILITY_LABEL}, - {"bluetoothNoDevices", IDS_SETTINGS_BLUETOOTH_NO_DEVICES}, - {"bluetoothNoDevicesFound", IDS_SETTINGS_BLUETOOTH_NO_DEVICES_FOUND}, - {"bluetoothNotConnected", IDS_SETTINGS_BLUETOOTH_NOT_CONNECTED}, - {"bluetoothPageTitle", IDS_SETTINGS_BLUETOOTH}, - {"bluetoothPairDevicePageTitle", - IDS_SETTINGS_BLUETOOTH_PAIR_DEVICE_TITLE}, - {"bluetoothRemove", IDS_SETTINGS_BLUETOOTH_REMOVE}, - {"bluetoothPrimaryUserControlled", - IDS_SETTINGS_BLUETOOTH_PRIMARY_USER_CONTROLLED}, - {"bluetoothDeviceType_computer", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_COMPUTER}, - {"bluetoothDeviceType_phone", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PHONE}, - {"bluetoothDeviceType_modem", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MODEM}, - {"bluetoothDeviceType_audio", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_AUDIO}, - {"bluetoothDeviceType_carAudio", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_CAR_AUDIO}, - {"bluetoothDeviceType_video", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_VIDEO}, - {"bluetoothDeviceType_peripheral", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_PERIPHERAL}, - {"bluetoothDeviceType_joystick", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_JOYSTICK}, - {"bluetoothDeviceType_gamepad", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_GAMEPAD}, - {"bluetoothDeviceType_keyboard", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD}, - {"bluetoothDeviceType_mouse", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_MOUSE}, - {"bluetoothDeviceType_tablet", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_TABLET}, - {"bluetoothDeviceType_keyboardMouseCombo", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_KEYBOARD_MOUSE_COMBO}, - {"bluetoothDeviceType_unknown", - IDS_BLUETOOTH_ACCESSIBILITY_DEVICE_TYPE_UNKNOWN}, - }; - AddLocalizedStringsBulk(html_source, kLocalizedStrings); - chromeos::bluetooth_dialog::AddLocalizedStrings(html_source); -} - void AddChromeOSUserStrings(content::WebUIDataSource* html_source, Profile* profile) { user_manager::UserManager* user_manager = user_manager::UserManager::Get(); @@ -2086,6 +2028,8 @@ // TODO(khorimoto): Add providers for the remaining pages. per_page_providers_.push_back( std::make_unique<InternetStringsProvider>(profile, /*delegate=*/this)); + per_page_providers_.push_back( + std::make_unique<BluetoothStringsProvider>(profile, /*delegate=*/this)); } OsSettingsLocalizedStringsProvider::~OsSettingsLocalizedStringsProvider() = @@ -2104,7 +2048,6 @@ AddAndroidAppStrings(html_source); AddAppManagementStrings(html_source); AddAppsStrings(html_source); - AddBluetoothStrings(html_source); AddChromeOSUserStrings(html_source, profile); AddCommonStrings(html_source, profile); AddCrostiniStrings(html_source, profile);
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 914d8126e..8361225 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1220,6 +1220,8 @@ {"safetyCheckParentButton", IDS_SETTINGS_SAFETY_CHECK_PARENT_BUTTON}, {"safetyCheckParentButtonAriaLabel", IDS_SETTINGS_SAFETY_CHECK_PARENT_BUTTON_ARIA_LABEL}, + {"safetyCheckParentButtonAriaLabelReload", + IDS_SETTINGS_CHECK_PASSWORDS_AGAIN}, {"safetyCheckIconRunningAriaLabel", IDS_SETTINGS_SAFETY_CHECK_ICON_RUNNING_ARIA_LABEL}, {"safetyCheckIconSafeAriaLabel",
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index b37f1a1..d39a7e7 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -307,22 +307,13 @@ web_ui->AddMessageHandler(std::make_unique<MetricsHandler>()); #if BUILDFLAG(OPTIMIZE_WEBUI) - if (base::FeatureList::IsEnabled(features::kSettingsPolymer3)) { - webui::SetupBundledWebUIDataSource(html_source, "settings.js", - IDR_SETTINGS_SETTINGS_ROLLUP_JS, - IDR_SETTINGS_SETTINGS_V3_HTML); - html_source->AddResourcePath("shared.rollup.js", - IDR_SETTINGS_SHARED_ROLLUP_JS); - html_source->AddResourcePath("lazy_load.js", - IDR_SETTINGS_LAZY_LOAD_ROLLUP_JS); - } else { - html_source->AddResourcePath("crisper.js", IDR_SETTINGS_CRISPER_JS); - html_source->AddResourcePath("lazy_load.crisper.js", - IDR_SETTINGS_LAZY_LOAD_CRISPER_JS); - html_source->AddResourcePath("lazy_load.html", - IDR_SETTINGS_LAZY_LOAD_VULCANIZED_HTML); - html_source->SetDefaultResource(IDR_SETTINGS_VULCANIZED_HTML); - } + webui::SetupBundledWebUIDataSource(html_source, "settings.js", + IDR_SETTINGS_SETTINGS_ROLLUP_JS, + IDR_SETTINGS_SETTINGS_V3_HTML); + html_source->AddResourcePath("shared.rollup.js", + IDR_SETTINGS_SHARED_ROLLUP_JS); + html_source->AddResourcePath("lazy_load.js", + IDR_SETTINGS_LAZY_LOAD_ROLLUP_JS); // Register SVG images that are purposefully not inlined in the HTML bundle // above. @@ -357,10 +348,7 @@ #else webui::SetupWebUIDataSource( html_source, base::make_span(kSettingsResources, kSettingsResourcesSize), - kGeneratedPath, - base::FeatureList::IsEnabled(features::kSettingsPolymer3) - ? IDR_SETTINGS_SETTINGS_V3_HTML - : IDR_SETTINGS_SETTINGS_HTML); + kGeneratedPath, IDR_SETTINGS_SETTINGS_V3_HTML); #endif AddBrowserLocalizedStrings(html_source, profile, web_ui->GetWebContents());
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc index d49987f..fe65561 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -140,6 +140,7 @@ {ContentSettingsType::SAFE_BROWSING_URL_CHECK_DATA, nullptr}, {ContentSettingsType::NATIVE_FILE_SYSTEM_READ_GUARD, nullptr}, {ContentSettingsType::STORAGE_ACCESS, nullptr}, + {ContentSettingsType::CAMERA_PAN_TILT_ZOOM, nullptr}, }; static_assert(base::size(kContentSettingsTypeGroupNames) == // ContentSettingsType starts at -1, so add 1 here.
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc index ed5f54c..a734a70e 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
@@ -4,12 +4,19 @@ #include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/tabs/tab_group_model.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h" #include "components/tab_groups/tab_group_id.h" #include "content/public/browser/web_contents.h" +#include "ui/base/clipboard/clipboard_format_type.h" +#include "ui/base/clipboard/custom_data_helper.h" +#include "ui/base/dragdrop/os_exchange_data.h" namespace tab_strip_ui { @@ -65,4 +72,37 @@ to_index, std::move(detached_contents), add_types, to_group_id); } +bool DropTabsInNewBrowser(Browser* new_browser, + const ui::OSExchangeData& drop_data) { + base::Pickle pickle; + drop_data.GetPickledData(ui::ClipboardFormatType::GetWebCustomDataType(), + &pickle); + + base::string16 tab_id_str; + ui::ReadCustomDataForType(pickle.data(), pickle.size(), + base::ASCIIToUTF16(kWebUITabIdDataType), + &tab_id_str); + if (tab_id_str.empty()) + return false; + + // |tab_id_str| should contain the extension tab id as a string. + int tab_id = -1; + if (!base::StringToInt(tab_id_str, &tab_id)) + return false; + + Browser* source_browser = nullptr; + int source_index = -1; + if (!extensions::ExtensionTabUtil::GetTabById( + tab_id, new_browser->profile(), /* include_incognito = */ false, + &source_browser, /* tab_strip = */ nullptr, + /* contents = */ nullptr, &source_index)) { + return false; + } + + MoveTabAcrossWindows(source_browser, source_index, new_browser, 0, + base::nullopt); + new_browser->tab_strip_model()->ActivateTabAt(0); + return true; +} + } // namespace tab_strip_ui
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h index 5d5c67f..282a75b 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.h
@@ -12,6 +12,10 @@ class Profile; class TabGroupModel; +namespace ui { +class OSExchangeData; +} + namespace tab_strip_ui { base::Optional<tab_groups::TabGroupId> GetTabGroupIdFromString( @@ -27,6 +31,15 @@ int to_index, base::Optional<tab_groups::TabGroupId> to_group_id = base::nullopt); +// Handles dropping tabs not destined for an existing tab strip. +// |new_browser| should be the newly created Browser with no tabs, and +// must have the same profile as the drag source. |drop_data| must have +// originated from a drag in a WebUI tab strip. If successful, the tabs +// reflected in |drop_data| will be moved from the source browser to +// |new_browser|. +bool DropTabsInNewBrowser(Browser* new_browser, + const ui::OSExchangeData& drop_data); + } // namespace tab_strip_ui #endif // CHROME_BROWSER_UI_WEBUI_TAB_STRIP_TAB_STRIP_UI_UTIL_H_
diff --git a/chrome/browser/upboarding/query_tiles/BUILD.gn b/chrome/browser/upboarding/query_tiles/BUILD.gn index 619a33e..8bc88c6 100644 --- a/chrome/browser/upboarding/query_tiles/BUILD.gn +++ b/chrome/browser/upboarding/query_tiles/BUILD.gn
@@ -61,25 +61,16 @@ if (is_android) { android_library("public_java") { sources = [ - "android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinator.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinatorFactory.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/Tile.java", + "android/java/src/org/chromium/chrome/browser/query_tiles/QueryTile.java", "android/java/src/org/chromium/chrome/browser/query_tiles/TileProvider.java", "android/java/src/org/chromium/chrome/browser/query_tiles/bridges/TileProviderBridge.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/QueryTileCoordinatorImpl.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListModel.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListProperties.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListPropertyViewBinder.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListView.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileSizeSupplier.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolder.java", - "android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolderFactory.java", ] deps = [ ":chrome_upboarding_query_tiles_java_resources", "//base:base_java", "//base:jni_java", + "//components/browser_ui/widget/android:java", "//third_party/android_deps:androidx_recyclerview_recyclerview_java", "//ui/android:ui_java", ] @@ -94,12 +85,7 @@ } android_resources("chrome_upboarding_query_tiles_java_resources") { - sources = [ - "android/java/res/drawable/query_tile_overlay.xml", - "android/java/res/layout/query_tile_view.xml", - "android/java/res/values/dimens.xml", - "android/java/res/values/styles.xml", - ] + sources = [] custom_package = "org.chromium.chrome.query_tiles" }
diff --git a/chrome/browser/upboarding/query_tiles/android/java/res/values/dimens.xml b/chrome/browser/upboarding/query_tiles/android/java/res/values/dimens.xml deleted file mode 100644 index 15f870d3..0000000 --- a/chrome/browser/upboarding/query_tiles/android/java/res/values/dimens.xml +++ /dev/null
@@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-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. --> - -<resources xmlns:tools="http://schemas.android.com/tools"> - - <!-- Tile dimensions --> - <dimen name="tile_corner_radius">8dp</dimen> - <dimen name="tile_ideal_width">86dp</dimen> - - <!-- Tile container dimensions --> - <dimen name="tile_grid_inter_tile_padding">12dp</dimen> - <dimen name="recycler_view_start_margin">16dp</dimen> -</resources>
diff --git a/chrome/browser/upboarding/query_tiles/android/java/res/values/styles.xml b/chrome/browser/upboarding/query_tiles/android/java/res/values/styles.xml deleted file mode 100644 index 735cc78..0000000 --- a/chrome/browser/upboarding/query_tiles/android/java/res/values/styles.xml +++ /dev/null
@@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-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. --> - -<resources xmlns:tools="http://schemas.android.com/tools"> - <style name="TextAppearance.WhiteText"> - <item name="android:textColor">@android:color/white</item> - <item name="android:textSize">@dimen/text_size_medium</item> - </style> -</resources>
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTile.java b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTile.java new file mode 100644 index 0000000..81bde7e8 --- /dev/null +++ b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTile.java
@@ -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. + +package org.chromium.chrome.browser.query_tiles; + +import org.chromium.components.browser_ui.widget.image_tiles.ImageTile; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Class encapsulating data needed to render a query tile for the query sites section on the NTP. + */ +public class QueryTile extends ImageTile { + /** The string to be used for building a query when this tile is clicked. */ + public final String queryText; + + /** The next level tiles to be shown when this tile is clicked. */ + public final List<QueryTile> children; + + /** Constructor. */ + public QueryTile(String id, String displayTitle, String accessibilityText, String queryText, + List<QueryTile> children) { + super(id, displayTitle, accessibilityText); + this.queryText = queryText; + this.children = + Collections.unmodifiableList(children == null ? new ArrayList<>() : children); + } +}
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinatorFactory.java b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinatorFactory.java deleted file mode 100644 index 4e18f8e..0000000 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinatorFactory.java +++ /dev/null
@@ -1,27 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.query_tiles; - -import android.content.Context; - -import org.chromium.base.Callback; -import org.chromium.chrome.browser.query_tiles.QueryTileCoordinator.TileVisualsProvider; -import org.chromium.chrome.browser.query_tiles.list.QueryTileCoordinatorImpl; - -/** - * Factory to create {@link QueryTileCoordinator} instances. - */ -public class QueryTileCoordinatorFactory { - /** - * Creates a {@link QueryTileCoordinator}. - * @param context The context associated with the current activity. - * @param tileClickCallback A callback to be invoked when a tile is clicked. - * @return A {@link QueryTileCoordinator}. - */ - public static QueryTileCoordinator create(Context context, Callback<Tile> tileClickCallback, - TileVisualsProvider tileVisualsProvider) { - return new QueryTileCoordinatorImpl(context, tileClickCallback, tileVisualsProvider); - } -} \ No newline at end of file
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/Tile.java b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/Tile.java deleted file mode 100644 index a566630..0000000 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/Tile.java +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.query_tiles; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Class encapsulating data needed to render a query tile for the query sites section on the NTP. - */ -public class Tile { - /** The ID representing this tile. */ - public final String id; - - /** The text to be shown on this tile. */ - public final String displayTitle; - - /** The text to be shown in accessibility mode. */ - public final String accessibilityText; - - /** The string to be used for building a query when this tile is clicked. */ - public final String queryText; - - /** The next level tiles to be shown when this tile is clicked. */ - public final List<Tile> children; - - /** Constructor. */ - public Tile(String id, String displayTitle, String accessibilityText, String queryText, - List<Tile> children) { - this.id = id; - this.displayTitle = displayTitle; - this.accessibilityText = accessibilityText; - this.queryText = queryText; - this.children = - Collections.unmodifiableList(children == null ? new ArrayList<>() : children); - } -}
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/TileProvider.java b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/TileProvider.java index 7ae2796..da47275 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/TileProvider.java +++ b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/TileProvider.java
@@ -20,7 +20,7 @@ * @param callback The {@link Callback} to be notified on completion. Returns an empty list if * no tiles are found. */ - void getQueryTiles(Callback<List<Tile>> callback); + void getQueryTiles(Callback<List<QueryTile>> callback); /** * Called to retrieve visuals for the given tile id.
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/bridges/TileProviderBridge.java b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/bridges/TileProviderBridge.java index 50429910..36af5fd 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/bridges/TileProviderBridge.java +++ b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/bridges/TileProviderBridge.java
@@ -12,7 +12,7 @@ import org.chromium.base.annotations.CalledByNative; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; -import org.chromium.chrome.browser.query_tiles.Tile; +import org.chromium.chrome.browser.query_tiles.QueryTile; import org.chromium.chrome.browser.query_tiles.TileProvider; import java.util.ArrayList; @@ -40,7 +40,7 @@ } @Override - public void getQueryTiles(Callback<List<Tile>> callback) { + public void getQueryTiles(Callback<List<QueryTile>> callback) { if (mNativeTileProviderBridge == 0) return; TileProviderBridgeJni.get().getQueryTiles(mNativeTileProviderBridge, this, callback); } @@ -52,14 +52,16 @@ } @CalledByNative - private static List<Tile> createList() { + private static List<QueryTile> createList() { return new ArrayList<>(); } @CalledByNative - private static Tile createTileAndMaybeAddToList(@Nullable List<Tile> list, String tileId, - String displayTitle, String accessibilityText, String queryText, List<Tile> children) { - Tile tile = new Tile(tileId, displayTitle, accessibilityText, queryText, children); + private static QueryTile createTileAndMaybeAddToList(@Nullable List<QueryTile> list, + String tileId, String displayTitle, String accessibilityText, String queryText, + List<QueryTile> children) { + QueryTile tile = + new QueryTile(tileId, displayTitle, accessibilityText, queryText, children); if (list != null) list.add(tile); return tile; } @@ -67,7 +69,7 @@ @NativeMethods interface Natives { void getQueryTiles(long nativeTileProviderBridge, TileProviderBridge caller, - Callback<List<Tile>> callback); + Callback<List<QueryTile>> callback); void getVisuals(long nativeTileProviderBridge, TileProviderBridge caller, String id, Callback<List<Bitmap>> callback); }
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/QueryTileCoordinatorImpl.java b/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/QueryTileCoordinatorImpl.java deleted file mode 100644 index 06116bf5..0000000 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/QueryTileCoordinatorImpl.java +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.chrome.browser.query_tiles.list; - -import android.content.Context; -import android.view.View; - -import org.chromium.base.Callback; -import org.chromium.chrome.browser.query_tiles.QueryTileCoordinator; -import org.chromium.chrome.browser.query_tiles.Tile; - -import java.util.List; - -/** - * The top level coordinator for the query tiles UI. - */ -public class QueryTileCoordinatorImpl implements QueryTileCoordinator { - private final TileListModel mModel; - private final TileListView mView; - - /** Constructor. */ - public QueryTileCoordinatorImpl(Context context, Callback<Tile> tileClickCallback, - TileVisualsProvider visualsProvider) { - mModel = new TileListModel(); - mView = new TileListView(context, mModel); - - mModel.getProperties().set(TileListProperties.CLICK_CALLBACK, tileClickCallback); - mModel.getProperties().set(TileListProperties.VISUALS_CALLBACK, visualsProvider); - } - - @Override - public View getView() { - return mView.getView(); - } - - @Override - public void setTiles(List<Tile> tiles) { - mModel.set(tiles); - } -}
diff --git a/chrome/browser/upboarding/query_tiles/android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileSectionTest.java b/chrome/browser/upboarding/query_tiles/android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileSectionTest.java index 0a5615d8..60106b70 100644 --- a/chrome/browser/upboarding/query_tiles/android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileSectionTest.java +++ b/chrome/browser/upboarding/query_tiles/android/javatests/src/org/chromium/chrome/browser/query_tiles/QueryTileSectionTest.java
@@ -8,8 +8,11 @@ import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.support.test.espresso.action.ViewActions; import android.support.test.filters.SmallTest; import org.junit.After; @@ -19,6 +22,7 @@ import org.junit.runner.RunWith; import org.chromium.base.Callback; +import org.chromium.base.ContextUtils; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.chrome.R; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -28,6 +32,8 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.NewTabPageTestUtils; import org.chromium.chrome.test.util.browser.Features; +import org.chromium.content_public.browser.test.util.Criteria; +import org.chromium.content_public.browser.test.util.CriteriaHelper; import java.util.ArrayList; import java.util.List; @@ -38,6 +44,8 @@ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class QueryTileSectionTest { + private static final String SEARCH_URL_PATTERN = "https://www.google.com/search?q="; + @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); @@ -58,24 +66,51 @@ @Features.EnableFeatures(ChromeFeatureList.QUERY_TILES) public void testSimpleTest() throws Exception { onView(withId(R.id.query_tiles)).check(matches(isDisplayed())); + onView(withText("Tile 1")).check(matches(isDisplayed())); + } + + @Test + @SmallTest + @Features.EnableFeatures(ChromeFeatureList.QUERY_TILES) + public void testLeafLevelTileLoadsSearchResultsPage() throws Exception { + onView(withId(R.id.query_tiles)).check(matches(isDisplayed())); + onView(withText("Tile 1")).perform(ViewActions.click()); + onView(withText("Tile 1_1")).check(matches(isDisplayed())).perform(ViewActions.click()); + waitForSearchResultsPage(mActivityTestRule.getActivity().getActivityTab()); + } + + private static void waitForSearchResultsPage(final Tab tab) { + CriteriaHelper.pollUiThread(new Criteria("The SRP was never loaded.") { + @Override + public boolean isSatisfied() { + return tab.getUrl().getValidSpecOrEmpty().contains(SEARCH_URL_PATTERN); + } + }); } private static class TestTileProvider implements TileProvider { - private List<Tile> mTiles = new ArrayList<>(); + private List<QueryTile> mTiles = new ArrayList<>(); private TestTileProvider() { - Tile tile = new Tile("1", "Tile 1", "Tile 1", "Tile 1", null); + List<QueryTile> children = new ArrayList<>(); + children.add(new QueryTile("tile1_1", "Tile 1_1", "Tile 1_1", "Tile 1_1 Query", null)); + QueryTile tile = new QueryTile("1", "Tile 1", "Tile 1", "Tile 1 Query", children); mTiles.add(tile); } @Override - public void getQueryTiles(Callback<List<Tile>> callback) { + public void getQueryTiles(Callback<List<QueryTile>> callback) { callback.onResult(mTiles); } @Override public void getVisuals(String id, Callback<List<Bitmap>> callback) { - callback.onResult(null); + List<Bitmap> bitmapList = new ArrayList<>(); + Bitmap bitmap = BitmapFactory.decodeResource( + ContextUtils.getApplicationContext().getResources(), + R.drawable.chrome_sync_logo); + bitmapList.add(bitmap); + callback.onResult(bitmapList); } } -} +} \ No newline at end of file
diff --git a/chrome/browser/web_applications/chrome_pwa_launcher/chrome_pwa_launcher_main.cc b/chrome/browser/web_applications/chrome_pwa_launcher/chrome_pwa_launcher_main.cc index 38311a7..ad8a7610 100644 --- a/chrome/browser/web_applications/chrome_pwa_launcher/chrome_pwa_launcher_main.cc +++ b/chrome/browser/web_applications/chrome_pwa_launcher/chrome_pwa_launcher_main.cc
@@ -25,23 +25,16 @@ kSuccess = 0, kStarted = 1, kError = 2, - kMaxValue = kStarted + kMaxValue = kError }; -// Returns the current executable's path, with capitalization preserved. If -// getting the current path fails, the launcher crashes. -base::FilePath GetCurrentExecutablePath() { - base::FilePath current_path; - CHECK(base::PathService::Get(base::FILE_EXE, ¤t_path)); - base::NormalizeFilePath(current_path, ¤t_path); - return current_path; -} - // Returns the path to chrome.exe stored in the "Last Browser" file. If the file // is not found, can't be read, or does not contain a valid path, the launcher // crashes. -base::FilePath GetChromePathFromLastBrowserFile( - const base::FilePath& current_path) { +base::FilePath GetChromePathFromLastBrowserFile() { + base::FilePath current_path; + CHECK(base::PathService::Get(base::FILE_EXE, ¤t_path)); + // The Last Browser file is expected to be in the User Data directory, which // is the great-grandparent of the current directory (User Data\<profile>\Web // Applications\<app ID>). @@ -99,8 +92,7 @@ logging_settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; logging::InitLogging(logging_settings); - base::FilePath current_path = GetCurrentExecutablePath(); - base::FilePath chrome_path = GetChromePathFromLastBrowserFile(current_path); + const base::FilePath chrome_path = GetChromePathFromLastBrowserFile(); install_static::InstallDetails::SetForProcess( install_static::MakeProductDetails(chrome_path.value()));
diff --git a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc index 4afa69c3b..85a27f9 100644 --- a/chrome/browser/web_applications/system_web_app_manager_browsertest.cc +++ b/chrome/browser/web_applications/system_web_app_manager_browsertest.cc
@@ -39,6 +39,7 @@ #include "content/public/browser/web_ui_controller_factory.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/mock_navigation_handle.h" +#include "content/public/test/test_launcher.h" #include "content/public/test/test_navigation_observer.h" #include "content/public/test/test_utils.h" #include "extensions/browser/extension_registry.h" @@ -821,6 +822,64 @@ }); } +// These tests use the App Service which is only enabled on Chrome OS. +#if defined(OS_CHROMEOS) +// Tests that SWA-specific data is correctly migrated to Web Apps without +// Extensions. +class SystemWebAppManagerMigrationTest + : public SystemWebAppManagerBrowserTestBase { + public: + SystemWebAppManagerMigrationTest() + : SystemWebAppManagerBrowserTestBase(/*install_mock=*/false) { + maybe_installation_ = + TestSystemWebAppInstallation::SetUpAppWithAdditionalSearchTerms(); + maybe_installation_->set_update_policy( + SystemWebAppManager::UpdatePolicy::kOnVersionChange); + + if (content::IsPreTest()) { + scoped_feature_list_.InitAndDisableFeature( + features::kDesktopPWAsWithoutExtensions); + } else { + scoped_feature_list_.InitAndEnableFeature( + features::kDesktopPWAsWithoutExtensions); + } + } + ~SystemWebAppManagerMigrationTest() override = default; + + protected: + std::vector<std::string> GetAppAdditionalSearchTerms() { + AppId app_id = GetManager().GetAppIdForSystemApp(GetMockAppType()).value(); + + std::vector<std::string> additional_search_terms; + apps::AppServiceProxy* proxy = + apps::AppServiceProxyFactory::GetForProfile(browser()->profile()); + const bool app_found = proxy->AppRegistryCache().ForOneApp( + app_id, [&additional_search_terms](const apps::AppUpdate& update) { + additional_search_terms = update.AdditionalSearchTerms(); + }); + CHECK(app_found); + + return additional_search_terms; + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +IN_PROC_BROWSER_TEST_F(SystemWebAppManagerMigrationTest, + PRE_ExtraDataIsMigrated) { + WaitForTestSystemAppInstall(); + EXPECT_EQ(std::vector<std::string>({"Security"}), + GetAppAdditionalSearchTerms()); +} + +IN_PROC_BROWSER_TEST_F(SystemWebAppManagerMigrationTest, ExtraDataIsMigrated) { + WaitForTestSystemAppInstall(); + EXPECT_EQ(std::vector<std::string>({"Security"}), + GetAppAdditionalSearchTerms()); +} +#endif // defined(OS_CHROMEOS) + class SystemWebAppManagerChromeUntrustedTest : public SystemWebAppManagerBrowserTest { public:
diff --git a/chrome/browser/web_applications/test/test_system_web_app_installation.cc b/chrome/browser/web_applications/test/test_system_web_app_installation.cc index 7be3310..b6437d2 100644 --- a/chrome/browser/web_applications/test/test_system_web_app_installation.cc +++ b/chrome/browser/web_applications/test/test_system_web_app_installation.cc
@@ -200,6 +200,7 @@ auto provider = std::make_unique<TestWebAppProvider>(profile); auto system_web_app_manager = std::make_unique<SystemWebAppManager>(profile); system_web_app_manager->SetSystemAppsForTesting({{type_, info}}); + system_web_app_manager->SetUpdatePolicyForTesting(update_policy_); provider->SetSystemWebAppManager(std::move(system_web_app_manager)); provider->Start(); return provider;
diff --git a/chrome/browser/web_applications/test/test_system_web_app_installation.h b/chrome/browser/web_applications/test/test_system_web_app_installation.h index 629f1f2..7ac7dbd9 100644 --- a/chrome/browser/web_applications/test/test_system_web_app_installation.h +++ b/chrome/browser/web_applications/test/test_system_web_app_installation.h
@@ -53,12 +53,19 @@ // Override the contents served by chrome://test-system-app/manifest.json. void SetManifest(std::string manifest); + void set_update_policy(SystemWebAppManager::UpdatePolicy update_policy) { + update_policy_ = update_policy; + } + private: TestSystemWebAppInstallation(SystemAppType type, SystemAppInfo info); Profile* profile_; std::unique_ptr<KeyedService> CreateWebAppProvider(SystemAppInfo info, Profile* profile); + + SystemWebAppManager::UpdatePolicy update_policy_ = + SystemWebAppManager::UpdatePolicy::kAlwaysUpdate; std::unique_ptr<TestWebAppProviderCreator> test_web_app_provider_creator_; const SystemAppType type_; std::unique_ptr<TestSystemWebAppWebUIControllerFactory>
diff --git a/chrome/browser/web_applications/web_app_migration_manager.cc b/chrome/browser/web_applications/web_app_migration_manager.cc index 91f5dcb..7653cee5 100644 --- a/chrome/browser/web_applications/web_app_migration_manager.cc +++ b/chrome/browser/web_applications/web_app_migration_manager.cc
@@ -167,6 +167,12 @@ if (!bookmark_app_registrar_.IsInstalled(app_id)) return false; + // SystemWebAppManager will re-install these. + if (bookmark_app_registrar_.HasExternalAppWithInstallSource( + app_id, ExternalInstallSource::kSystemInstalled)) { + return false; + } + GURL launch_url = bookmark_app_registrar_.GetAppLaunchURL(app_id); return GenerateAppIdFromURL(launch_url) == app_id; }
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index c036cef..c3be1d3 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -678,6 +678,20 @@ } } +void AuthenticatorRequestDialogModel::StartInlineBioEnrollment( + int max_bio_samples) { + max_bio_samples_ = max_bio_samples; + bio_samples_remaining_ = max_bio_samples; + SetCurrentStep(Step::kInlineBioEnrollment); +} + +void AuthenticatorRequestDialogModel::OnSampleCollected( + int bio_samples_remaining) { + DCHECK(current_step_ == Step::kInlineBioEnrollment); + *bio_samples_remaining_ = bio_samples_remaining; + OnSheetModelDidChange(); +} + void AuthenticatorRequestDialogModel::RequestAttestationPermission( base::OnceCallback<void(bool)> callback) { DCHECK(current_step_ != Step::kClosed);
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h index 662329a2..5469159 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.h +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -96,6 +96,7 @@ kClientPinErrorAuthenticatorRemoved, // Authenticator Internal User Verification + kInlineBioEnrollment, kRetryInternalUserVerification, // Confirm user consent to create a resident credential. Used prior to @@ -417,6 +418,11 @@ } base::Optional<int> pin_attempts() const { return pin_attempts_; } + void StartInlineBioEnrollment(int max_bio_samples); + void OnSampleCollected(int bio_samples_remaining); + int max_bio_samples() { return *max_bio_samples_; } + int bio_samples_remaining() { return *bio_samples_remaining_; } + // Flags the authenticator's internal user verification as locked. void set_internal_uv_locked() { uv_attempts_ = 0; } base::Optional<int> uv_attempts() const { return uv_attempts_; } @@ -515,6 +521,9 @@ base::RepeatingClosure bluetooth_adapter_power_on_callback_; BleDevicePairedCallback ble_device_paired_callback_; + base::Optional<int> max_bio_samples_; + base::Optional<int> bio_samples_remaining_; + base::OnceCallback<void(std::string)> pin_callback_; base::Optional<int> pin_attempts_; base::Optional<int> uv_attempts_;
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index cb677e0..75ab257 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -375,6 +375,12 @@ const base::Feature kHappinessTrackingSurveysForDesktopSettingsPrivacy{ "HappinessTrackingSurveysForDesktopSettingsPrivacy", base::FEATURE_DISABLED_BY_DEFAULT}; + +// Enables the migration of Happiness Tracking Surveys on Desktop (to the latest +// version). +const base::Feature kHappinessTrackingSurveysForDesktopMigration{ + "HappinessTrackingSurveysForDesktopMigration", + base::FEATURE_DISABLED_BY_DEFAULT}; #endif // !defined(OS_ANDROID) // Hide CorsLegacyModeEnabled enterprise policy support. This feature and
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 29db0d7f..75ae836 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -227,6 +227,9 @@ COMPONENT_EXPORT(CHROME_FEATURES) extern const base::Feature kHappinessTrackingSurveysForDesktopSettingsPrivacy; + +COMPONENT_EXPORT(CHROME_FEATURES) +extern const base::Feature kHappinessTrackingSurveysForDesktopMigration; #endif COMPONENT_EXPORT(CHROME_FEATURES)
diff --git a/chrome/common/chrome_version.h.in b/chrome/common/chrome_version.h.in index 54c1b1d1..f4d88ff 100644 --- a/chrome/common/chrome_version.h.in +++ b/chrome/common/chrome_version.h.in
@@ -9,6 +9,10 @@ #define CHROME_VERSION @MAJOR@,@MINOR@,@BUILD@,@PATCH@ #define CHROME_VERSION_STRING "@MAJOR@.@MINOR@.@BUILD@.@PATCH@" +#define CHROME_VERSION_MAJOR @MAJOR@ +#define CHROME_VERSION_MINOR @MINOR@ +#define CHROME_VERSION_BUILD @BUILD@ +#define CHROME_VERSION_PATCH @PATCH@ // Branding Information
diff --git a/chrome/common/cloud_print/BUILD.gn b/chrome/common/cloud_print/BUILD.gn index a08755dd..33104b5 100644 --- a/chrome/common/cloud_print/BUILD.gn +++ b/chrome/common/cloud_print/BUILD.gn
@@ -4,8 +4,6 @@ source_set("cloud_print") { sources = [ - "cloud_print_class_mac.h", - "cloud_print_class_mac.mm", "cloud_print_constants.cc", "cloud_print_constants.h", "cloud_print_helpers.cc",
diff --git a/chrome/common/cloud_print/cloud_print_class_mac.h b/chrome/common/cloud_print/cloud_print_class_mac.h deleted file mode 100644 index c2b7e44..0000000 --- a/chrome/common/cloud_print/cloud_print_class_mac.h +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright (c) 2011 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_COMMON_CLOUD_PRINT_CLOUD_PRINT_CLASS_MAC_H_ -#define CHROME_COMMON_CLOUD_PRINT_CLOUD_PRINT_CLASS_MAC_H_ - -#import <AppKit/AppKit.h> - -namespace cloud_print { - -// Four character constant to identify Cloud print IPC call. -extern const AEEventClass kAECloudPrintClass; - -} // namespace cloud_print - -#endif // CHROME_COMMON_CLOUD_PRINT_CLOUD_PRINT_CLASS_MAC_H_
diff --git a/chrome/common/cloud_print/cloud_print_class_mac.mm b/chrome/common/cloud_print/cloud_print_class_mac.mm deleted file mode 100644 index 9905e89d..0000000 --- a/chrome/common/cloud_print/cloud_print_class_mac.mm +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright (c) 2011 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/common/cloud_print/cloud_print_class_mac.h" - -namespace cloud_print { - -const AEEventClass kAECloudPrintClass = 'GCPp'; - -} // namespace cloud_print
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 87c316c3..deb29e17 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -2171,7 +2171,6 @@ // The name of the screen that has to be shown if OOBE has been interrupted. const char kOobeScreenPending[] = "OobeScreenPending"; - // A boolean pref to indicate if the marketing opt-in screen in OOBE is finished // for the user. const char kOobeMarketingOptInScreenFinished[] = @@ -2188,6 +2187,14 @@ // enrollment recovery flow upon next boot. const char kEnrollmentRecoveryRequired[] = "EnrollmentRecoveryRequired"; +// Pref name for whether we should show the Getting Started module in the Help +// app. +const char kHelpAppShouldShowGetStarted[] = "help_app.should_show_get_started"; + +// Pref name for whether the device was in tablet mode when going through +// the OOBE. +const char kHelpAppTabletModeDuringOobe[] = "help_app.tablet_mode_during_oobe"; + // List of usernames that used certificates pushed by policy before. // This is used to prevent these users from joining multiprofile sessions. const char kUsedPolicyCertificates[] = "policy.used_policy_certificates";
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index df514ad0..c4a2602c 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -699,6 +699,8 @@ extern const char kCanShowOobeGoodiesPage[]; extern const char kDeviceRegistered[]; extern const char kEnrollmentRecoveryRequired[]; +extern const char kHelpAppShouldShowGetStarted[]; +extern const char kHelpAppTabletModeDuringOobe[]; extern const char kUsedPolicyCertificates[]; extern const char kServerBackedDeviceState[]; extern const char kCustomizationDefaultWallpaperURL[];
diff --git a/chrome/common/search.mojom b/chrome/common/search.mojom index 1640c28..c7df2aea 100644 --- a/chrome/common/search.mojom +++ b/chrome/common/search.mojom
@@ -66,11 +66,20 @@ bool is_search_type; // Result of AutocompleteMatch::IsSearchType(). string type; // Result of AutocompleteMatchType::ToString(). bool swap_contents_and_description; + // ID of the group the suggestion belongs to. 0 if it does not belong to any. + int32 suggestion_group_id; bool supports_deletion; }; +struct SuggestionGroup { + mojo_base.mojom.String16 header; // Header for suggestion group. + bool hidden; // Whether suggestion group is allowed to appear in the results. +}; + struct AutocompleteResult { mojo_base.mojom.String16 input; + // Map of suggestion group IDs to their respective info. + map<int32, SuggestionGroup> suggestion_groups_map; array<AutocompleteMatch> matches; }; @@ -225,6 +234,11 @@ bool ctrl_key, bool meta_key, bool shift_key); + + // Tells the browser to allow suggestions with the given suggestion group ID + // to appear in the results if they currently are not allowed to or to prevent + // them from appearing in the results if they are currently permitted to. + ToggleSuggestionGroupIdVisibility(int32 suggestion_group_id); }; [Native]
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb index 82db041a..7b986d5 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb
@@ -18,7 +18,7 @@ <translation id="4744575902940448763">Zaporka vašeg poslovnog računa nije se mogla sinkronizirati s vašim Windows profilom jer vaša organizacija ograničava ažuriranja zaporki na vašem uređaju. Obratite se administratoru ako vam je potrebna pomoć.</translation> <translation id="5186761973554910131">Pri pokušaju promjene zaporke naveden je nevažeći naziv računala. Obratite se administratoru.</translation> <translation id="5265714013989877288">Ne možete nastaviti jer je došlo do pogreške prilikom promjene vaše zaporke za Windows. Obratite se administratoru.</translation> -<translation id="5581861273642234526">S ovim uređajem već je povezan drugi poslovni račun. Prijavite se sa svojim Windows računom.</translation> +<translation id="5581861273642234526">S ovim uređajem već je povezan drugi poslovni račun. Prijavite se svojim Windows računom.</translation> <translation id="6033715878377252112">Pomoć za Google davatelj vjerodajnica za Windows</translation> <translation id="6149399665202317746">Google davatelj vjerodajnica za Windows</translation> <translation id="6243062314475217481">Zaporka vašeg poslovnog računa nije dovoljno složena za Windows. Obratite se administratoru ako vam je potrebna pomoć.</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_ne.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_ne.xtb index df1ad4d1..559f1b2 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_ne.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_ne.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">तपाईंको संस्थाले तपाईंको यन्त्रमा पासवर्ड अद्यावधिक गर्ने सुविधामाथि रोक लगाएको हुनाले तपाईंको कार्य खाताको पासवर्ड तपाईंको Windows को प्रोफाइलसँग सिंक गर्न सकिएन। मद्दत प्राप्त गर्न आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।</translation> <translation id="5186761973554910131">पासवर्ड परिवर्तन गर्ने प्रयास गर्दा कम्प्युटरको गलत नाम प्रविष्टि गरियो। कृपया आफ्ना प्रशासकसँग सम्पर्क गर्नुहोस्।</translation> <translation id="5265714013989877288">तपाईंको Windows पासवर्ड परिवर्तन गर्ने क्रममा कुनै त्रुटि भएकाले अगाडि बढ्न सकिएन। कृपया आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।</translation> +<translation id="5581861273642234526">यो यन्त्रमा कार्यालयको अर्को खाता सम्बद्ध गरिसकिएको छ। आफ्नो Windows खाता प्रयोग गरी साइन इन गर्नुहोस्।</translation> <translation id="6033715878377252112">Windows को सहायकका लागि Google प्रमाण प्रदायक</translation> <translation id="6149399665202317746">Windows का लागि Google प्रमाण प्रदायक</translation> <translation id="6243062314475217481">तपाईंको कार्य खाताको पासवर्डले Windows ले तय गरेका जटिलतासम्बन्धी मापदण्डहरू पूरा गर्दैन। मद्दत प्राप्त गर्न आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्।</translation>
diff --git a/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb b/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb index 9823210..912f9bce 100644 --- a/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb +++ b/chrome/credential_provider/gaiacp/strings/gaia_resources_vi.xtb
@@ -18,6 +18,7 @@ <translation id="4744575902940448763">Mật khẩu tài khoản công việc của bạn không đồng bộ hóa được với hồ sơ trên Windows do tổ chức bạn đã hạn chế việc cập nhật mật khẩu trên thiết bị của bạn. Hãy liên hệ với quản trị viên để được trợ giúp.</translation> <translation id="5186761973554910131">Bạn đã cung cấp tên máy tính không hợp lệ khi cố thay đổi mật khẩu. Vui lòng liên hệ với quản trị viên.</translation> <translation id="5265714013989877288">Không thể tiếp tục do đã xảy ra lỗi khi thay đổi mật khẩu Windows của bạn. Vui lòng liên hệ với quản trị viên.</translation> +<translation id="5581861273642234526">Thiết bị này đã liên kết với một tài khoản công việc khác. Hãy đăng nhập bằng tài khoản Windows của bạn.</translation> <translation id="6033715878377252112">Trình trợ giúp của Trình cung cấp thông tin đăng nhập Google dành cho Windows</translation> <translation id="6149399665202317746">Trình cung cấp thông tin đăng nhập Google dành cho Windows</translation> <translation id="6243062314475217481">Mật khẩu tài khoản công việc của bạn không đáp ứng được các yêu cầu của Windows về độ phức tạp. Hãy liên hệ với quản trị viên để được trợ giúp.</translation>
diff --git a/chrome/installer/mini_installer/appid.h b/chrome/installer/mini_installer/appid.h index 83d59b1..ae1aa4c 100644 --- a/chrome/installer/mini_installer/appid.h +++ b/chrome/installer/mini_installer/appid.h
@@ -11,7 +11,6 @@ namespace google_update { extern const wchar_t kAppGuid[]; -extern const wchar_t kMultiInstallAppGuid[]; #if BUILDFLAG(GOOGLE_CHROME_BRANDING) extern const wchar_t kBetaAppGuid[];
diff --git a/chrome/installer/mini_installer/chrome_appid.cc b/chrome/installer/mini_installer/chrome_appid.cc index fbe607c..1388bdc 100644 --- a/chrome/installer/mini_installer/chrome_appid.cc +++ b/chrome/installer/mini_installer/chrome_appid.cc
@@ -10,14 +10,11 @@ #if BUILDFLAG(GOOGLE_CHROME_BRANDING) const wchar_t kAppGuid[] = L"{8A69D345-D564-463c-AFF1-A69D9E530F96}"; -const wchar_t kMultiInstallAppGuid[] = - L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}"; const wchar_t kBetaAppGuid[] = L"{8237E44A-0054-442C-B6B6-EA0509993955}"; const wchar_t kDevAppGuid[] = L"{401C381F-E0DE-4B85-8BD8-3F3F14FBDA57}"; const wchar_t kSxSAppGuid[] = L"{4ea16ac7-fd5a-47c3-875b-dbf4a2008c20}"; #else // BUILDFLAG(GOOGLE_CHROME_BRANDING) const wchar_t kAppGuid[] = L""; -const wchar_t kMultiInstallAppGuid[] = L""; #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) } // namespace google_update
diff --git a/chrome/renderer/searchbox/searchbox.cc b/chrome/renderer/searchbox/searchbox.cc index 926659e..a6825d7 100644 --- a/chrome/renderer/searchbox/searchbox.cc +++ b/chrome/renderer/searchbox/searchbox.cc
@@ -482,6 +482,11 @@ alt_key, ctrl_key, meta_key, shift_key); } +void SearchBox::ToggleSuggestionGroupIdVisibility(int32_t suggestion_group_id) { + embedded_search_service_->ToggleSuggestionGroupIdVisibility( + suggestion_group_id); +} + void SearchBox::SetPageSequenceNumber(int page_seq_no) { page_seq_no_ = page_seq_no; }
diff --git a/chrome/renderer/searchbox/searchbox.h b/chrome/renderer/searchbox/searchbox.h index cb0c2cb..ece41df1 100644 --- a/chrome/renderer/searchbox/searchbox.h +++ b/chrome/renderer/searchbox/searchbox.h
@@ -231,6 +231,11 @@ bool meta_key, bool shift_key); + // Tells the browser to allow suggestions with the given suggestion group ID + // to appear in the results if they currently are not allowed to or to prevent + // them from appearing in the results if they are currently permitted to. + void ToggleSuggestionGroupIdVisibility(int32_t suggestion_group_id); + bool is_focused() const { return is_focused_; } bool is_input_in_progress() const { return is_input_in_progress_; } bool is_key_capture_enabled() const { return is_key_capture_enabled_; }
diff --git a/chrome/renderer/searchbox/searchbox_extension.cc b/chrome/renderer/searchbox/searchbox_extension.cc index 9b9af48..d608fe7 100644 --- a/chrome/renderer/searchbox/searchbox_extension.cc +++ b/chrome/renderer/searchbox/searchbox_extension.cc
@@ -9,6 +9,7 @@ #include <string> #include <vector> +#include "base/containers/flat_map.h" #include "base/i18n/rtl.h" #include "base/json/json_writer.h" #include "base/json/string_escape.h" @@ -452,6 +453,7 @@ } dict.SetKey("descriptionClass", std::move(description_class)); dict.SetStringKey("destinationUrl", match->destination_url); + dict.SetIntKey("suggestionGroupId", match->suggestion_group_id); dict.SetStringKey("inlineAutocompletion", match->inline_autocompletion); dict.SetBoolKey("isSearchType", match->is_search_type); dict.SetStringKey("fillIntoEdit", match->fill_into_edit); @@ -467,6 +469,20 @@ return list; } +base::Value CreateSuggestionGroupsMap( + const base::flat_map<int32_t, chrome::mojom::SuggestionGroupPtr>& + suggestion_groups_map) { + base::Value result_map(base::Value::Type::DICTIONARY); + for (const auto& pair : suggestion_groups_map) { + base::Value suggestion_group(base::Value::Type::DICTIONARY); + suggestion_group.SetStringKey("header", pair.second->header); + suggestion_group.SetBoolKey("hidden", pair.second->hidden); + result_map.SetPath(base::NumberToString(pair.first), + std::move(suggestion_group)); + } + return result_map; +} + static const char kDispatchFocusChangedScript[] = "if (window.chrome &&" " window.chrome.embeddedSearch &&" @@ -640,6 +656,7 @@ bool ctrl_key, bool meta_key, bool shift_key); + static void ToggleSuggestionGroupIdVisibility(int32_t suggestion_group_id); DISALLOW_COPY_AND_ASSIGN(SearchBoxBindings); }; @@ -659,17 +676,19 @@ &SearchBoxBindings::IsKeyCaptureEnabled) .SetMethod("deleteAutocompleteMatch", &SearchBoxBindings::DeleteAutocompleteMatch) + .SetMethod("logCharTypedToRepaintLatency", + &SearchBoxBindings::LogCharTypedToRepaintLatency) .SetMethod("openAutocompleteMatch", &SearchBoxBindings::OpenAutocompleteMatch) .SetMethod("paste", &SearchBoxBindings::Paste) .SetMethod("queryAutocomplete", &SearchBoxBindings::QueryAutocomplete) .SetMethod("stopAutocomplete", &SearchBoxBindings::StopAutocomplete) - .SetMethod("logCharTypedToRepaintLatency", - &SearchBoxBindings::LogCharTypedToRepaintLatency) .SetMethod("startCapturingKeyStrokes", &SearchBoxBindings::StartCapturingKeyStrokes) .SetMethod("stopCapturingKeyStrokes", - &SearchBoxBindings::StopCapturingKeyStrokes); + &SearchBoxBindings::StopCapturingKeyStrokes) + .SetMethod("toggleSuggestionGroupIdVisibility", + &SearchBoxBindings::ToggleSuggestionGroupIdVisibility); } // static @@ -699,6 +718,15 @@ } // static +void SearchBoxBindings::ToggleSuggestionGroupIdVisibility( + int32_t suggestion_group_id) { + SearchBox* search_box = GetSearchBoxForCurrentContext(); + if (!search_box) + return; + search_box->ToggleSuggestionGroupIdVisibility(suggestion_group_id); +} + +// static void SearchBoxBindings::OpenAutocompleteMatch( int line, const std::string& url, @@ -1502,6 +1530,8 @@ base::Value dict(base::Value::Type::DICTIONARY); dict.SetStringKey("input", result->input); dict.SetKey("matches", CreateAutocompleteMatches(result->matches)); + dict.SetKey("suggestionGroupsMap", + CreateSuggestionGroupsMap(result->suggestion_groups_map)); std::string json; base::JSONWriter::Write(dict, &json);
diff --git a/chrome/services/app_service/public/cpp/BUILD.gn b/chrome/services/app_service/public/cpp/BUILD.gn index 569869a..0e9038f 100644 --- a/chrome/services/app_service/public/cpp/BUILD.gn +++ b/chrome/services/app_service/public/cpp/BUILD.gn
@@ -72,6 +72,8 @@ source_set("preferred_apps") { sources = [ + "preferred_apps_converter.cc", + "preferred_apps_converter.h", "preferred_apps_list.cc", "preferred_apps_list.h", ] @@ -95,6 +97,7 @@ "intent_test_util.cc", "intent_test_util.h", "intent_util_unittest.cc", + "preferred_apps_converter_unittest.cc", "preferred_apps_list_unittest.cc", ]
diff --git a/chrome/services/app_service/public/cpp/preferred_apps_converter.cc b/chrome/services/app_service/public/cpp/preferred_apps_converter.cc new file mode 100644 index 0000000..8f80b14 --- /dev/null +++ b/chrome/services/app_service/public/cpp/preferred_apps_converter.cc
@@ -0,0 +1,149 @@ +// 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 <memory> +#include <utility> + +#include "chrome/services/app_service/public/cpp/preferred_apps_converter.h" +#include "chrome/services/app_service/public/mojom/types.mojom.h" + +namespace { + +base::Value ConvertConditionValueToValue( + const apps::mojom::ConditionValuePtr& condition_value) { + base::Value condition_value_dict(base::Value::Type::DICTIONARY); + condition_value_dict.SetStringKey(apps::kValueKey, condition_value->value); + condition_value_dict.SetIntKey(apps::kMatchTypeKey, + static_cast<int>(condition_value->match_type)); + return condition_value_dict; +} + +base::Value ConvertConditionToValue( + const apps::mojom::ConditionPtr& condition) { + base::Value condition_dict(base::Value::Type::DICTIONARY); + condition_dict.SetIntKey(apps::kConditionTypeKey, + static_cast<int>(condition->condition_type)); + base::Value condition_values_list(base::Value::Type::LIST); + for (auto& condition_value : condition->condition_values) { + condition_values_list.Append(ConvertConditionValueToValue(condition_value)); + } + condition_dict.SetKey(apps::kConditionValuesKey, + std::move(condition_values_list)); + return condition_dict; +} + +base::Value ConvertIntentFilterToValue( + const apps::mojom::IntentFilterPtr& intent_filter) { + base::Value intent_filter_value(base::Value::Type::LIST); + for (auto& condition : intent_filter->conditions) { + intent_filter_value.Append(ConvertConditionToValue(condition)); + } + return intent_filter_value; +} + +apps::mojom::ConditionValuePtr ParseValueToConditionValue( + const base::Value& value) { + auto* value_string = value.FindStringKey(apps::kValueKey); + if (!value_string) { + return nullptr; + } + auto condition_value = apps::mojom::ConditionValue::New(); + condition_value->value = *value_string; + auto match_type = value.FindIntKey(apps::kMatchTypeKey); + if (!match_type.has_value()) { + return nullptr; + } + condition_value->match_type = + static_cast<apps::mojom::PatternMatchType>(match_type.value()); + return condition_value; +} + +apps::mojom::ConditionPtr ParseValueToCondition(const base::Value& value) { + auto condition_type = value.FindIntKey(apps::kConditionTypeKey); + if (!condition_type.has_value()) { + return nullptr; + } + auto condition = apps::mojom::Condition::New(); + condition->condition_type = + static_cast<apps::mojom::ConditionType>(condition_type.value()); + + auto* condition_values = value.FindKey(apps::kConditionValuesKey); + if (!condition_values || !condition_values->is_list()) { + return nullptr; + } + for (auto& condition_value : condition_values->GetList()) { + auto parsed_condition_value = ParseValueToConditionValue(condition_value); + if (!parsed_condition_value) { + return nullptr; + } + condition->condition_values.push_back(std::move(parsed_condition_value)); + } + return condition; +} + +apps::mojom::IntentFilterPtr ParseValueToIntentFilter( + const base::Value* value) { + if (!value || !value->is_list()) { + return nullptr; + } + auto intent_filter = apps::mojom::IntentFilter::New(); + for (auto& condition : value->GetList()) { + auto parsed_condition = ParseValueToCondition(condition); + if (!parsed_condition) { + return nullptr; + } + intent_filter->conditions.push_back(std::move(parsed_condition)); + } + return intent_filter; +} + +} // namespace + +namespace apps { + +const char kConditionTypeKey[] = "condition_type"; +const char kConditionValuesKey[] = "condition_values"; +const char kValueKey[] = "value"; +const char kMatchTypeKey[] = "match_type"; +const char kAppIdKey[] = "app_id"; +const char kIntentFilterKey[] = "intent_filter"; + +base::Value ConvertPreferredAppsToValue( + const PreferredAppsList::PreferredApps& preferred_apps) { + base::Value preferred_apps_value(base::Value::Type::LIST); + for (auto& preferred_app : preferred_apps) { + base::Value preferred_app_dict(base::Value::Type::DICTIONARY); + preferred_app_dict.SetKey( + kIntentFilterKey, + ConvertIntentFilterToValue(preferred_app->intent_filter)); + preferred_app_dict.SetStringKey(kAppIdKey, preferred_app->app_id); + preferred_apps_value.Append(std::move(preferred_app_dict)); + } + return preferred_apps_value; +} + +PreferredAppsList::PreferredApps ParseValueToPreferredApps( + const base::Value& preferred_apps_value) { + if (!preferred_apps_value.is_list()) { + return PreferredAppsList::PreferredApps(); + } + PreferredAppsList::PreferredApps preferred_apps; + for (auto& entry : preferred_apps_value.GetList()) { + auto* app_id = entry.FindStringKey(kAppIdKey); + if (!app_id) { + return PreferredAppsList::PreferredApps(); + } + auto parsed_intent_filter = + ParseValueToIntentFilter(entry.FindKey(kIntentFilterKey)); + if (!parsed_intent_filter) { + return PreferredAppsList::PreferredApps(); + } + auto new_preferred_app = apps::mojom::PreferredApp::New( + std::move(parsed_intent_filter), *app_id); + preferred_apps.push_back(std::move(new_preferred_app)); + } + return preferred_apps; +} + +} // namespace apps
diff --git a/chrome/services/app_service/public/cpp/preferred_apps_converter.h b/chrome/services/app_service/public/cpp/preferred_apps_converter.h new file mode 100644 index 0000000..ff19894 --- /dev/null +++ b/chrome/services/app_service/public/cpp/preferred_apps_converter.h
@@ -0,0 +1,54 @@ +// 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_SERVICES_APP_SERVICE_PUBLIC_CPP_PREFERRED_APPS_CONVERTER_H_ +#define CHROME_SERVICES_APP_SERVICE_PUBLIC_CPP_PREFERRED_APPS_CONVERTER_H_ + +#include "base/values.h" +#include "chrome/services/app_service/public/cpp/preferred_apps_list.h" + +namespace apps { + +extern const char kConditionTypeKey[]; +extern const char kConditionValuesKey[]; +extern const char kValueKey[]; +extern const char kMatchTypeKey[]; +extern const char kAppIdKey[]; +extern const char kIntentFilterKey[]; + +// Convert the PreferredAppsList struct to base::Value to write to JSON file. +// e.g. for preferred app with |app_id| "abcdefg", and |intent_filter| for url +// https://www.google.com/abc. +// The converted base::Value format will be: +//[ {"app_id": "abcdefg", +// "intent_filter": [ { +// "condition_type": 0, +// "condition_values": [ { +// "match_type": 0, +// "value": "https" +// } ] +// }, { +// "condition_type": 1, +// "condition_values": [ { +// "match_type": 0, +// "value": "www.google.com" +// } ] +// }, { +// "condition_type": 2, +// "condition_values": [ { +// "match_type": 2, +// "value": "/abc" +// } ] +// } ] +// } ] +base::Value ConvertPreferredAppsToValue( + const PreferredAppsList::PreferredApps& preferred_apps); + +// Parse the base::Value read from JSON file back to preferred apps struct. +PreferredAppsList::PreferredApps ParseValueToPreferredApps( + const base::Value& preferred_apps_value); + +} // namespace apps + +#endif // CHROME_SERVICES_APP_SERVICE_PUBLIC_CPP_PREFERRED_APPS_CONVERTER_H_
diff --git a/chrome/services/app_service/public/cpp/preferred_apps_converter_unittest.cc b/chrome/services/app_service/public/cpp/preferred_apps_converter_unittest.cc new file mode 100644 index 0000000..4554fba --- /dev/null +++ b/chrome/services/app_service/public/cpp/preferred_apps_converter_unittest.cc
@@ -0,0 +1,471 @@ +// 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/services/app_service/public/cpp/preferred_apps_converter.h" + +#include "base/json/json_reader.h" +#include "chrome/services/app_service/public/cpp/intent_filter_util.h" +#include "chrome/services/app_service/public/cpp/intent_test_util.h" +#include "chrome/services/app_service/public/cpp/intent_util.h" +#include "chrome/services/app_service/public/cpp/preferred_apps_list.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +const char kAppId1[] = "abcdefg"; + +} // namespace + +class PreferredAppsConverterTest : public testing::Test {}; + +// Test one simple entry with simple filter. +TEST_F(PreferredAppsConverterTest, ConvertSimpleEntry) { + GURL filter_url = GURL("https://www.google.com/abc"); + auto intent_filter = apps_util::CreateIntentFilterForUrlScope(filter_url); + + apps::PreferredAppsList preferred_apps; + preferred_apps.Init(); + preferred_apps.AddPreferredApp(kAppId1, intent_filter); + auto converted_value = + apps::ConvertPreferredAppsToValue(preferred_apps.GetReference()); + + // Check that each entry is correct. + ASSERT_EQ(1u, converted_value.GetList().size()); + auto& entry = converted_value.GetList()[0]; + EXPECT_EQ(kAppId1, *entry.FindStringKey(apps::kAppIdKey)); + + auto* converted_intent_filter = entry.FindKey(apps::kIntentFilterKey); + ASSERT_EQ(intent_filter->conditions.size(), + converted_intent_filter->GetList().size()); + + for (size_t i = 0; i < intent_filter->conditions.size(); i++) { + auto& condition = intent_filter->conditions[i]; + auto& converted_condition = converted_intent_filter->GetList()[i]; + auto& condition_values = condition->condition_values; + auto converted_condition_values = + converted_condition.FindKey(apps::kConditionValuesKey)->GetList(); + + EXPECT_EQ(static_cast<int>(condition->condition_type), + converted_condition.FindIntKey(apps::kConditionTypeKey)); + ASSERT_EQ(1u, converted_condition_values.size()); + EXPECT_EQ(condition_values[0]->value, + *converted_condition_values[0].FindStringKey(apps::kValueKey)); + EXPECT_EQ(static_cast<int>(condition_values[0]->match_type), + converted_condition_values[0].FindIntKey(apps::kMatchTypeKey)); + } + + auto preferred_apps_list = apps::ParseValueToPreferredApps(converted_value); + preferred_apps.Init(); + EXPECT_EQ(base::nullopt, preferred_apps.FindPreferredAppForUrl(filter_url)); + preferred_apps.Init(preferred_apps_list); + EXPECT_EQ(kAppId1, preferred_apps.FindPreferredAppForUrl(filter_url)); + GURL url_wrong_host = GURL("https://www.hahaha.com/"); + EXPECT_EQ(base::nullopt, + preferred_apps.FindPreferredAppForUrl(url_wrong_host)); +} + +// Test one simple entry with json string. +TEST_F(PreferredAppsConverterTest, ConvertSimpleEntryJson) { + GURL filter_url = GURL("https://www.google.com/abc"); + auto intent_filter = apps_util::CreateIntentFilterForUrlScope(filter_url); + + apps::PreferredAppsList preferred_apps; + preferred_apps.Init(); + preferred_apps.AddPreferredApp(kAppId1, intent_filter); + auto converted_value = + apps::ConvertPreferredAppsToValue(preferred_apps.GetReference()); + + const char expected_output_string[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> expected_output = + base::JSONReader::Read(expected_output_string); + ASSERT_TRUE(expected_output); + EXPECT_EQ(expected_output.value(), converted_value); +} + +// Test parse simple entry from json string. +TEST_F(PreferredAppsConverterTest, ParseSimpleEntryJson) { + const char test_string[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> test_value = base::JSONReader::Read(test_string); + ASSERT_TRUE(test_value); + auto parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + + GURL filter_url = GURL("https://www.google.com/abc"); + auto intent_filter = apps_util::CreateIntentFilterForUrlScope(filter_url); + + apps::PreferredAppsList preferred_apps; + preferred_apps.Init(); + preferred_apps.AddPreferredApp(kAppId1, intent_filter); + auto& expected_entry = preferred_apps.GetReference(); + + EXPECT_EQ(expected_entry, parsed_entry); +} + +TEST_F(PreferredAppsConverterTest, ParseJsonWithInvalidAppId) { + // Invalid key. + const char test_key[] = + "[ {\"app_idd\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> test_value = base::JSONReader::Read(test_key); + ASSERT_TRUE(test_value); + auto parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); + + // Invalid value. + const char test_string[] = + "[ {\"app_id\": 0," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + test_value = base::JSONReader::Read(test_string); + ASSERT_TRUE(test_value); + parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); +} + +TEST_F(PreferredAppsConverterTest, ParseJsonWithInvalidIntentFilter) { + // Invalid key. + const char test_key[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filterrr\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> test_value = base::JSONReader::Read(test_key); + ASSERT_TRUE(test_value); + auto parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); + + // Invalid value. + const char test_string[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": \"not_list\"" + "} ]"; + test_value = base::JSONReader::Read(test_string); + ASSERT_TRUE(test_value); + parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); +} + +TEST_F(PreferredAppsConverterTest, ParseJsonWithInvalidConditionType) { + // Invalid key. + const char test_key[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_typeeee\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> test_value = base::JSONReader::Read(test_key); + ASSERT_TRUE(test_value); + auto parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); + + // Invalid value. + const char test_string[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": \"not_int\"," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + test_value = base::JSONReader::Read(test_string); + ASSERT_TRUE(test_value); + parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); +} + +TEST_F(PreferredAppsConverterTest, ParseJsonWithInvalidValues) { + // Invalid key. + const char test_key[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_valuessss\": [ {" + " \"match_type\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> test_value = base::JSONReader::Read(test_key); + ASSERT_TRUE(test_value); + auto parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); + + // Invalid value. + const char test_string[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": \"not_list\"" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + test_value = base::JSONReader::Read(test_string); + ASSERT_TRUE(test_value); + parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); +} + +TEST_F(PreferredAppsConverterTest, ParseJsonWithInvalidMatchType) { + // Invalid key. + const char test_key[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_typeeeee\": 0," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> test_value = base::JSONReader::Read(test_key); + ASSERT_TRUE(test_value); + auto parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); + + // Invalid value. + const char test_string[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": \"not_int\"," + " \"value\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + test_value = base::JSONReader::Read(test_string); + ASSERT_TRUE(test_value); + parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); +} + +TEST_F(PreferredAppsConverterTest, ParseJsonWithInvalidValue) { + // Invalid key. + const char test_key[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"valueeeee\": \"https\"" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + base::Optional<base::Value> test_value = base::JSONReader::Read(test_key); + ASSERT_TRUE(test_value); + auto parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); + + // Invalid value. + const char test_string[] = + "[ {\"app_id\": \"abcdefg\"," + " \"intent_filter\": [ {" + " \"condition_type\": 0," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": {}" + " } ]" + " }, {" + " \"condition_type\": 1," + " \"condition_values\": [ {" + " \"match_type\": 0," + " \"value\": \"www.google.com\"" + " } ]" + " }, {" + " \"condition_type\": 2," + " \"condition_values\": [ {" + " \"match_type\": 2," + " \"value\": \"/abc\"" + " } ]" + " } ]" + "} ]"; + test_value = base::JSONReader::Read(test_string); + ASSERT_TRUE(test_value); + parsed_entry = apps::ParseValueToPreferredApps(test_value.value()); + EXPECT_TRUE(parsed_entry.empty()); +}
diff --git a/chrome/services/app_service/public/cpp/preferred_apps_list.cc b/chrome/services/app_service/public/cpp/preferred_apps_list.cc index 1b9c3fad..30bc0a2 100644 --- a/chrome/services/app_service/public/cpp/preferred_apps_list.cc +++ b/chrome/services/app_service/public/cpp/preferred_apps_list.cc
@@ -137,6 +137,7 @@ } void PreferredAppsList::Init() { + preferred_apps_ = PreferredApps(); initialized_ = true; } @@ -155,4 +156,8 @@ return initialized_; } +const PreferredAppsList::PreferredApps& PreferredAppsList::GetReference() { + return preferred_apps_; +} + } // namespace apps
diff --git a/chrome/services/app_service/public/cpp/preferred_apps_list.h b/chrome/services/app_service/public/cpp/preferred_apps_list.h index b7e864d3..df85c342 100644 --- a/chrome/services/app_service/public/cpp/preferred_apps_list.h +++ b/chrome/services/app_service/public/cpp/preferred_apps_list.h
@@ -77,6 +77,8 @@ bool IsInitialized(); + const PreferredApps& GetReference(); + private: PreferredApps preferred_apps_; bool initialized_ = false;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 6ff4045..bf5267e 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2195,6 +2195,7 @@ "../browser/chromeos/login/hid_detection_browsertest.cc", "../browser/chromeos/login/kiosk_browsertest.cc", "../browser/chromeos/login/lock/fingerprint_unlock_browsertest.cc", + "../browser/chromeos/login/lock/lock_screen_browsertest.cc", "../browser/chromeos/login/lock/screen_locker_browsertest.cc", "../browser/chromeos/login/lock/screen_locker_tester.cc", "../browser/chromeos/login/lock/screen_locker_tester.h", @@ -2273,6 +2274,8 @@ "../browser/chromeos/login/test/https_forwarder.h", "../browser/chromeos/login/test/local_policy_test_server_mixin.cc", "../browser/chromeos/login/test/local_policy_test_server_mixin.h", + "../browser/chromeos/login/test/local_state_mixin.cc", + "../browser/chromeos/login/test/local_state_mixin.h", "../browser/chromeos/login/test/login_manager_mixin.cc", "../browser/chromeos/login/test/login_manager_mixin.h", "../browser/chromeos/login/test/network_portal_detector_mixin.cc", @@ -2477,6 +2480,7 @@ "../browser/ui/ash/assistant/assistant_browsertest.cc", "../browser/ui/ash/assistant/assistant_test_mixin.cc", "../browser/ui/ash/assistant/assistant_test_mixin.h", + "../browser/ui/ash/assistant/assistant_timers_browsertest.cc", "../browser/ui/ash/assistant/test/fake_s3_server.cc", "../browser/ui/ash/assistant/test/fake_s3_server.h", ] @@ -3826,6 +3830,14 @@ "../browser/metrics/chrome_android_metrics_provider_unittest.cc", "../browser/notifications/notification_platform_bridge_android_unittest.cc", "../browser/omnibox/status/status_mediator_unittest.cc", + "../browser/omnibox/suggestions/answer/answer_suggestion_processor_unittest.cc", + "../browser/omnibox/suggestions/autocomplete_mediator_unittest.cc", + "../browser/omnibox/suggestions/base/base_suggestion_processor_unittest.cc", + "../browser/omnibox/suggestions/basic/basic_suggestion_processor_unittest.cc", + "../browser/omnibox/suggestions/clipboard/clipboard_suggestion_processor_unittest.cc", + "../browser/omnibox/suggestions/editurl/edit_url_suggestions_unittest.cc", + "../browser/omnibox/suggestions/entity/entity_suggestions_processor_unittest.cc", + "../browser/omnibox/suggestions/omnibox_suggestion_unittest.cc", "../browser/optimization_guide/android/optimization_guide_bridge_unittest.cc", "../browser/page_load_metrics/observers/android_page_load_metrics_observer_unittest.cc", "../browser/partnercustomizations/partner_browser_customizations_unittest.cc", @@ -4387,6 +4399,7 @@ "../browser/ui/app_list/search/arc/arc_app_reinstall_search_provider_unittest.cc", "../browser/ui/app_list/search/arc/arc_app_shortcuts_search_provider_unittest.cc", "../browser/ui/app_list/search/arc/arc_playstore_search_provider_unittest.cc", + "../browser/ui/app_list/search/assistant_search_provider_unittest.cc", "../browser/ui/app_list/search/common/file_icon_util_unittest.cc", "../browser/ui/app_list/search/cros_action_history/cros_action_recorder_tab_tracker_unittest.cc", "../browser/ui/app_list/search/cros_action_history/cros_action_recorder_unittest.cc", @@ -5360,7 +5373,6 @@ "../browser/ui/views/tabs/fake_base_tab_strip_controller.cc", "../browser/ui/views/tabs/fake_base_tab_strip_controller.h", "../browser/ui/views/tabs/stacked_tab_strip_layout_unittest.cc", - "../browser/ui/views/tabs/tab_animation_unittest.cc", "../browser/ui/views/tabs/tab_strip_layout_unittest.cc", "../browser/ui/views/tabs/tab_strip_unittest.cc", "../browser/ui/views/tabs/tab_unittest.cc",
diff --git a/chrome/test/android/BUILD.gn b/chrome/test/android/BUILD.gn index 57f385f8..c750f9f1 100644 --- a/chrome/test/android/BUILD.gn +++ b/chrome/test/android/BUILD.gn
@@ -250,5 +250,6 @@ "//third_party/ub-uiautomator:ub_uiautomator_java", "//ui/android:ui_java", "//ui/android:ui_java_test_support", + "//url:gurl_java", ] }
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java index 4c30013..e08aaa4 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
@@ -7,7 +7,6 @@ import android.app.Activity; import android.app.Instrumentation; import android.content.ComponentName; -import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -40,8 +39,6 @@ import org.chromium.chrome.browser.ntp.NewTabPage; import org.chromium.chrome.browser.omnibox.UrlBar; import org.chromium.chrome.browser.privacy.settings.PrivacyPreferencesManager; -import org.chromium.chrome.browser.settings.SettingsActivity; -import org.chromium.chrome.browser.settings.SettingsLauncher; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabCreationState; import org.chromium.chrome.browser.tab.TabLaunchType; @@ -601,22 +598,6 @@ } /** - * Launches the settings activity with the specified fragment. - * Returns the activity that was started. - * - * TODO(chouinard): This seems like mostly a duplicate of {@link - * SettingsActivityTest#startSettingsActivity}, try to consolidate to one. - */ - public SettingsActivity startSettingsActivity(String fragmentName) { - Context context = InstrumentationRegistry.getTargetContext(); - Intent intent = - SettingsLauncher.getInstance().createIntentForSettingsPage(context, fragmentName); - Activity activity = InstrumentationRegistry.getInstrumentation().startActivitySync(intent); - Assert.assertTrue(activity instanceof SettingsActivity); - return (SettingsActivity) activity; - } - - /** * Executes the given snippet of JavaScript code within the current tab. Returns the result of * its execution in JSON format. */
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 189c9ba4f..ec2677a 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
@@ -24,6 +24,7 @@ import org.chromium.content_public.browser.test.util.CriteriaHelper; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.TouchCommon; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.HashMap; @@ -73,12 +74,12 @@ private final List<OmniboxSuggestion> mSuggestions = new ArrayList<OmniboxSuggestion>(); private String mAutocompleteText; - public SuggestionsResultBuilder addGeneratedSuggestion( - int type, String text, String url) { + public SuggestionsResultBuilder addGeneratedSuggestion(int type, String text, GURL url) { 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, null, null)); + classifications, null, "", url, GURL.emptyGURL(), null, false, false, null, + null)); return this; }
diff --git a/chrome/test/base/ui_test_utils.cc b/chrome/test/base/ui_test_utils.cc index ceb4c30..6bb4991 100644 --- a/chrome/test/base/ui_test_utils.cc +++ b/chrome/test/base/ui_test_utils.cc
@@ -32,7 +32,6 @@ #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_list.h" -#include "chrome/browser/ui/browser_list_observer.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" #include "chrome/browser/ui/browser_window.h" @@ -161,50 +160,6 @@ DISALLOW_COPY_AND_ASSIGN(AppModalDialogWaiter); }; -class BrowserChangeObserver : public BrowserListObserver { - public: - enum class ChangeType { - kAdded, - kRemoved, - }; - - BrowserChangeObserver(Browser* browser, ChangeType type) - : browser_(browser), type_(type) { - BrowserList::AddObserver(this); - } - - ~BrowserChangeObserver() override { BrowserList::RemoveObserver(this); } - - Browser* Wait() { - run_loop_.Run(); - return browser_; - } - - // BrowserListObserver: - void OnBrowserAdded(Browser* browser) override { - if (type_ == ChangeType::kAdded) { - browser_ = browser; - run_loop_.Quit(); - } - } - - void OnBrowserRemoved(Browser* browser) override { - if (browser_ && browser_ != browser) - return; - - if (type_ == ChangeType::kRemoved) { - browser_ = browser; - run_loop_.Quit(); - } - } - - private: - Browser* browser_; - ChangeType type_; - base::RunLoop run_loop_; - - DISALLOW_COPY_AND_ASSIGN(BrowserChangeObserver); -}; class AutocompleteChangeObserver : public AutocompleteController::Observer { public: @@ -663,4 +618,35 @@ browser->tab_strip_model()->AddObserver(this); } +BrowserChangeObserver::BrowserChangeObserver(Browser* browser, ChangeType type) + : browser_(browser), type_(type) { + BrowserList::AddObserver(this); +} + +BrowserChangeObserver::~BrowserChangeObserver() { + BrowserList::RemoveObserver(this); +} + +Browser* BrowserChangeObserver::Wait() { + run_loop_.Run(); + return browser_; +} + +void BrowserChangeObserver::OnBrowserAdded(Browser* browser) { + if (type_ == ChangeType::kAdded) { + browser_ = browser; + run_loop_.Quit(); + } +} + +void BrowserChangeObserver::OnBrowserRemoved(Browser* browser) { + if (browser_ && browser_ != browser) + return; + + if (type_ == ChangeType::kRemoved) { + browser_ = browser; + run_loop_.Quit(); + } +} + } // namespace ui_test_utils
diff --git a/chrome/test/base/ui_test_utils.h b/chrome/test/base/ui_test_utils.h index dae7da88..0b7be6f 100644 --- a/chrome/test/base/ui_test_utils.h +++ b/chrome/test/base/ui_test_utils.h
@@ -350,6 +350,32 @@ DISALLOW_COPY_AND_ASSIGN(HistoryEnumerator); }; +class BrowserChangeObserver : public BrowserListObserver { + public: + enum class ChangeType { + kAdded, + kRemoved, + }; + + BrowserChangeObserver(Browser* browser, ChangeType type); + + ~BrowserChangeObserver() override; + + Browser* Wait(); + + // BrowserListObserver: + void OnBrowserAdded(Browser* browser) override; + + void OnBrowserRemoved(Browser* browser) override; + + private: + Browser* browser_; + ChangeType type_; + base::RunLoop run_loop_; + + DISALLOW_COPY_AND_ASSIGN(BrowserChangeObserver); +}; + } // namespace ui_test_utils #endif // CHROME_TEST_BASE_UI_TEST_UTILS_H_
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn index ae0e921..cc72b5ae 100644 --- a/chrome/test/chromedriver/BUILD.gn +++ b/chrome/test/chromedriver/BUILD.gn
@@ -154,8 +154,6 @@ "chrome/ui_events.h", "chrome/util.cc", "chrome/util.h", - "chrome/version.cc", - "chrome/version.h", "chrome/web_view.h", "chrome/web_view_impl.cc", "chrome/web_view_impl.h",
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc index 9635bff..cc33fca 100644 --- a/chrome/test/chromedriver/capabilities.cc +++ b/chrome/test/chromedriver/capabilities.cc
@@ -23,7 +23,6 @@ #include "chrome/test/chromedriver/chrome/mobile_device.h" #include "chrome/test/chromedriver/chrome/page_load_strategy.h" #include "chrome/test/chromedriver/chrome/status.h" -#include "chrome/test/chromedriver/chrome/version.h" #include "chrome/test/chromedriver/constants/version.h" #include "chrome/test/chromedriver/logging.h" #include "chrome/test/chromedriver/session.h"
diff --git a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc index 9b61d0b..7be6976f 100644 --- a/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc +++ b/chrome/test/chromedriver/chrome/chrome_desktop_impl.cc
@@ -22,7 +22,6 @@ #include "chrome/test/chromedriver/chrome/devtools_event_listener.h" #include "chrome/test/chromedriver/chrome/devtools_http_client.h" #include "chrome/test/chromedriver/chrome/status.h" -#include "chrome/test/chromedriver/chrome/version.h" #include "chrome/test/chromedriver/chrome/web_view_impl.h" #include "chrome/test/chromedriver/constants/version.h" #include "chrome/test/chromedriver/net/timeout.h"
diff --git a/chrome/test/chromedriver/chrome/version.cc b/chrome/test/chromedriver/chrome/version.cc deleted file mode 100644 index 7d9d4799..0000000 --- a/chrome/test/chromedriver/chrome/version.cc +++ /dev/null
@@ -1,16 +0,0 @@ -// Copyright (c) 2013 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/test/chromedriver/chrome/version.h" - -#include "base/strings/stringprintf.h" -#include "chrome/common/chrome_version.h" - -namespace { - -const int kSupportedBrowserVersion[] = {CHROME_VERSION}; - -} // namespace - -const int kSupportedBrowserMajorVersion = kSupportedBrowserVersion[0];
diff --git a/chrome/test/chromedriver/chrome/version.h b/chrome/test/chromedriver/chrome/version.h deleted file mode 100644 index 85436b65..0000000 --- a/chrome/test/chromedriver/chrome/version.h +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright (c) 2013 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_TEST_CHROMEDRIVER_CHROME_VERSION_H_ -#define CHROME_TEST_CHROMEDRIVER_CHROME_VERSION_H_ - -#include <string> - -extern const int kSupportedBrowserMajorVersion; - -#endif // CHROME_TEST_CHROMEDRIVER_CHROME_VERSION_H_
diff --git a/chrome/test/chromedriver/chrome_launcher.cc b/chrome/test/chromedriver/chrome_launcher.cc index ac4bace..5d4d0e74 100644 --- a/chrome/test/chromedriver/chrome_launcher.cc +++ b/chrome/test/chromedriver/chrome_launcher.cc
@@ -37,6 +37,7 @@ #include "build/build_config.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_result_codes.h" +#include "chrome/common/chrome_version.h" #include "chrome/test/chromedriver/chrome/chrome_android_impl.h" #include "chrome/test/chromedriver/chrome/chrome_desktop_impl.h" #include "chrome/test/chromedriver/chrome/chrome_finder.h" @@ -48,7 +49,6 @@ #include "chrome/test/chromedriver/chrome/embedded_automation_extension.h" #include "chrome/test/chromedriver/chrome/status.h" #include "chrome/test/chromedriver/chrome/user_data_dir.h" -#include "chrome/test/chromedriver/chrome/version.h" #include "chrome/test/chromedriver/chrome/web_view.h" #include "chrome/test/chromedriver/constants/version.h" #include "chrome/test/chromedriver/log_replay/chrome_replay_impl.h" @@ -265,14 +265,13 @@ LOG(WARNING) << "You are using an unsupported command-line switch: " "--disable-build-check. Please don't report bugs that " "cannot be reproduced with this switch removed."; - } else if (browser_info->major_version != kSupportedBrowserMajorVersion) { + } else if (browser_info->major_version != CHROME_VERSION_MAJOR) { if (browser_info->major_version == 0) { // TODO(https://crbug.com/932013): Content Shell doesn't report a version // number. Skip version checking with a warning. LOG(WARNING) << "Unable to retrieve " << kBrowserShortName << " version. Unable to verify browser compatibility."; - } else if (browser_info->major_version == - kSupportedBrowserMajorVersion + 1) { + } else if (browser_info->major_version == CHROME_VERSION_MAJOR + 1) { // TODO(https://crbug.com/chromedriver/2656): Since we don't currently // release ChromeDriver for dev or canary channels, allow using // ChromeDriver version n (e.g., Beta) with Chrome version n+1 (e.g., Dev @@ -286,7 +285,7 @@ kSessionNotCreated, base::StringPrintf("This version of %s only supports %s version %d", kChromeDriverProductFullName, kBrowserShortName, - kSupportedBrowserMajorVersion)); + CHROME_VERSION_MAJOR)); } }
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc index 33b6a8b..83e45f47 100644 --- a/chrome/test/chromedriver/session_commands.cc +++ b/chrome/test/chromedriver/session_commands.cc
@@ -31,7 +31,6 @@ #include "chrome/test/chromedriver/chrome/geoposition.h" #include "chrome/test/chromedriver/chrome/javascript_dialog_manager.h" #include "chrome/test/chromedriver/chrome/status.h" -#include "chrome/test/chromedriver/chrome/version.h" #include "chrome/test/chromedriver/chrome/web_view.h" #include "chrome/test/chromedriver/chrome_launcher.h" #include "chrome/test/chromedriver/command_listener.h"
diff --git a/chrome/test/data/ad_tagging/create_frame.js b/chrome/test/data/ad_tagging/create_frame.js index ff0fb5cf..dcbb142 100644 --- a/chrome/test/data/ad_tagging/create_frame.js +++ b/chrome/test/data/ad_tagging/create_frame.js
@@ -74,12 +74,12 @@ frame.contentDocument.head.appendChild(script1); let script2 = document.createElement('script'); - script1.async = false; + script2.async = false; script2.src = 'ad_script.js'; frame.contentDocument.head.appendChild(script2); let script3 = document.createElement('script'); - script1.async = false; + script3.async = false; script3.src = 'ad_script_2.js'; // Set title so we know when all scripts have loaded. script3.onload = function() {
diff --git a/chrome/test/data/android/render_tests/NewTabPageTest.focus_fake_box.Nexus_5-19.png.sha1 b/chrome/test/data/android/render_tests/NewTabPageTest.focus_fake_box.Nexus_5-19.png.sha1 deleted file mode 100644 index 77ea34d..0000000 --- a/chrome/test/data/android/render_tests/NewTabPageTest.focus_fake_box.Nexus_5-19.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -cc9c9ce7b8b6cc5c7e7d6c710e1f6686c7ecfc22 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/NewTabPageTest.focus_fake_box.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/NewTabPageTest.focus_fake_box.Nexus_5X-23.png.sha1 new file mode 100644 index 0000000..6389072c --- /dev/null +++ b/chrome/test/data/android/render_tests/NewTabPageTest.focus_fake_box.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@ +978cf88f5f04f0182dec99909ac1ee924b6459f3 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_default.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_default.Nexus_5X-23.png.sha1 new file mode 100644 index 0000000..bc09e0b0 --- /dev/null +++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_default.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@ +c9e5389c744c53789815d5e261318878c40f7ea0 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_secondary_hidden.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_secondary_hidden.Nexus_5X-23.png.sha1 new file mode 100644 index 0000000..3176143 --- /dev/null +++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeDisabled-promo_card_secondary_hidden.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@ +0d84ac8f32c48d2afc229a6463bee79b53335985 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_default.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_default.Nexus_5X-23.png.sha1 new file mode 100644 index 0000000..3c16d12 --- /dev/null +++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_default.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@ +982a511260d7e5fa409cbca929afd391576ba704 \ No newline at end of file
diff --git a/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_secondary_hidden.Nexus_5X-23.png.sha1 b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_secondary_hidden.Nexus_5X-23.png.sha1 new file mode 100644 index 0000000..ba2352a --- /dev/null +++ b/chrome/test/data/android/render_tests/PromoCardViewRenderTest.NightModeEnabled-promo_card_secondary_hidden.Nexus_5X-23.png.sha1
@@ -0,0 +1 @@ +ab82cc5251a4646330dc78844b4a8bc9c140d8a0 \ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_browser/open_gallery/manifest.json b/chrome/test/data/extensions/api_test/file_browser/open_gallery/manifest.json new file mode 100644 index 0000000..290034c --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_browser/open_gallery/manifest.json
@@ -0,0 +1,20 @@ +{ + // chrome-extension://pkplfbidichfdicaijlchgnapepdginl + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDfX9dHNh948bt00YhZBm3P6E5QLaOt+v8kXVtibQfiPtOD2FTScB/f0wX/EQWVO7BkaSOsRkTPcPIgocyMPYr2FLgqGLFlYT9nQpKJZUFNF5oJ5rG6Nv7ppf4zEB3j6da1IBRTz2yOZ+6O1TMZxol/V62/QcqrJeggsHTEPGLdr9Ua4b1Ka0xKJnJngZljsbw93FI1o+P9dAh5BS6wTPiZI/vmJVjvMTkSTnaZ3n9Go2t7A0XLcSxLcVyuLAd2mAvSN0mIviOukdM66wr7llif71nKuUt+4qvlr/r9HfwzN6pA4jkwhtS1UD+3CmB+wsHwsnohNcuu4FIQ6rgq/7QIDAQAB", + "name": "chrome.fileManagerPrivate tests", + "version": "0.1", + "manifest_version": 2, + "description": "Tests of chrome.fileManagerPrivate.* component extension methods", + "app": { + "background": { + "scripts": ["test.js"] + } + }, + "permissions": [ + "fileManagerPrivate", + { + "fileSystem": ["requestFileSystem"] + } + ] +} +
diff --git a/chrome/test/data/extensions/api_test/file_browser/open_gallery/test.js b/chrome/test/data/extensions/api_test/file_browser/open_gallery/test.js new file mode 100644 index 0000000..b172d9b --- /dev/null +++ b/chrome/test/data/extensions/api_test/file_browser/open_gallery/test.js
@@ -0,0 +1,63 @@ +// 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. + +/** + * Runs tests to verify that file browser tasks for natively supported file + * types are handled by the appropriate default-installed system app. + */ + +const kTestPng = 'test_dir/test_file.png'; +const kTestRawImage = 'test_dir/test_file.arw'; + +/** + * Finds the `volumeType` volume then resolves the provided `path` as an Entry. + */ +function getFileEntry(volumeType, path) { + return new Promise(resolve => { + chrome.fileManagerPrivate.getVolumeMetadataList(list => { + const volume = list.find(v => v.volumeType === volumeType); + chrome.test.assertTrue(!!volume, `${volumeType} volume not found.`); + chrome.fileSystem.requestFileSystem({volumeId: volume.volumeId}, fs => { + fs.root.getFile( + path, {}, + entry => { + resolve(entry); + }, + fileError => { + chrome.test.fail( + `Unable to getFile "${path}": ${fileError.message}`); + }); + }); + }); + }); +} + +/** + * A method the camera app uses to open its "camera roll". Instrumented for + * testing. See chromeos/camera/src/js/browser_proxy/browser_proxy.js. + */ +function openGallery(entry) { + // "nlkncpkkdoccmpiclbokaimcnedabhhm" is the Gallery component chrome app's + // extension ID. This task id is hard-coded in the Camera component app. + const id = 'nlkncpkkdoccmpiclbokaimcnedabhhm|app|open'; + function taskCallback(taskResult) { + chrome.test.assertEq( + chrome.fileManagerPrivate.TaskResult.MESSAGE_SENT, taskResult); + chrome.test.succeed(); + } + chrome.fileManagerPrivate.executeTask(id, [entry], taskCallback); +} + +function testPngOpensGallery() { + getFileEntry('testing', kTestPng).then(openGallery); +} + +function testRawOpensGallery() { + getFileEntry('testing', kTestRawImage).then(openGallery); +} + +// Handle the case where JSTestStarter has already injected a test to run. +if (self.testNameToRun) { + chrome.test.runTests([self[testNameToRun]]); +}
diff --git a/chrome/test/data/extensions/api_test/history/regular/delete_prohibited.js b/chrome/test/data/extensions/api_test/history/regular/delete_prohibited.js index 8cad145..dd1dcec 100644 --- a/chrome/test/data/extensions/api_test/history/regular/delete_prohibited.js +++ b/chrome/test/data/extensions/api_test/history/regular/delete_prohibited.js
@@ -7,10 +7,6 @@ var PROHIBITED_ERR = "Browsing history is not allowed to be deleted."; -// The maximum number of tries querying the history database to make sure that -// the initial addUrl calls succeeded. -var MAX_HISTORY_TRIES = 10; - function deleteProhibitedTestVerification() { removeItemRemovedListener(); chrome.test.fail("Delete was prohibited, but succeeded anyway."); @@ -46,15 +42,9 @@ var query = { 'text': '' }; chrome.history.addUrl({ url: GOOGLE_URL }, pass(function() { chrome.history.addUrl({ url: PICASA_URL }, pass(function() { - // Humans use 1-based counting. - var tries = 1; chrome.history.search(query, pass(function lambda(resultsBefore) { if (verifyHistory(resultsBefore)) { // Success: proceed with the test. - if (tries > 1) { - console.log("Warning: Added URLs took " + tries + " tries to " + - "show up in history. See http://crbug.com/176828."); - } testFunction(fail(PROHIBITED_ERR, function() { chrome.history.search(query, pass(function(resultsAfter) { assertEq(resultsBefore.sort(sortResults), @@ -62,14 +52,7 @@ removeItemRemovedListener(); })); })); - } else if (tries < MAX_HISTORY_TRIES) { - // Results not yet in history: try again. See http://crbug.com/176828. - ++tries; - waitAFewSeconds(0.1, pass(function() { - chrome.history.search(query, pass(lambda)); - })); } else { - // Too many tries: fail. chrome.test.fail("Added URLs never showed up in the history. " + "See http://crbug.com/176828."); }
diff --git a/chrome/test/data/extensions/api_test/history/regular/misc_search.js b/chrome/test/data/extensions/api_test/history/regular/misc_search.js index bda75d39..30b6fa3 100644 --- a/chrome/test/data/extensions/api_test/history/regular/misc_search.js +++ b/chrome/test/data/extensions/api_test/history/regular/misc_search.js
@@ -56,66 +56,4 @@ populateHistory(urls, function() { }); }); }, - - function fullTextSearch() { - chrome.history.deleteAll(function() { - // The continuation of the test after the windows have been opened. - var validateTest = function() { - // Continue with the test. - // A title search for www.a.com should find a. - var query = { 'text': 'www.a.com' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(A_RELATIVE_URL, results[0].url); - - // Text in the body of b.html. - query = { 'text': 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' }; - chrome.history.search(query, function(results) { - assertEq(1, results.length); - assertEq(B_RELATIVE_URL, results[0].url); - - // The test has succeeded. - chrome.test.succeed(); - }); - }); - }; - - // Setup a callback object for tab events. - var urls = [A_RELATIVE_URL, B_RELATIVE_URL]; - var tabIds = []; - - function listenerCallback() { - if (tabIds.length < urls.length) { - return; - } - - // Ensure both tabs have completed loading. - for (var index = 0, id; id = tabIds[index]; index++) { - if (!tabsCompleteData[id] || - tabsCompleteData[id] != 'complete') { - return; - }; - } - - // Unhook callbacks. - tabCompleteCallback = null; - chrome.tabs.onUpdated.removeListener(tabsCompleteListener); - - // Allow indexing to occur. - waitAFewSeconds(3, function() { - validateTest(); - }); - } - - tabCompleteCallback = listenerCallback; - chrome.tabs.onUpdated.addListener(tabsCompleteListener); - - // Navigate to a few pages. - urls.forEach(function(url) { - chrome.tabs.create({ 'url': url }, function(tab) { - tabIds.push(tab.id); - }); - }); - }); - } ]);
diff --git a/chrome/test/data/session_restore/close_onload.html b/chrome/test/data/session_restore/close_onload.html new file mode 100644 index 0000000..27e3476 --- /dev/null +++ b/chrome/test/data/session_restore/close_onload.html
@@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html> +<body onload="closeWin()"> +<script> +function closeWin() { + + window.open('', '_self').close(); +} +</script> +</body> +</html> \ No newline at end of file
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index dd896ac..74f2e8b 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -22,7 +22,6 @@ "history/history_focus_test.js", "new_tab_page/new_tab_page_interactive_test.js", "print_preview/print_preview_interactive_ui_tests.js", - "settings/cr_settings_interactive_ui_tests.js", "settings/cr_settings_v3_interactive_ui_tests.js", ] @@ -97,16 +96,8 @@ "resources/webui_resources_browsertest.js", "resources/webui_resources_v3_browsertest.js", "sandboxstatus_browsertest.js", - "settings/a11y/about_a11y_test.js", - "settings/a11y/accessibility_a11y_test.js", - "settings/a11y/basic_a11y_test.js", - "settings/a11y/edit_dictionary_a11y_test.js", - "settings/a11y/passwords_a11y_test.js", "settings/a11y/v3_a11y_browsertest.js", - "settings/cr_settings_browsertest.js", "settings/cr_settings_v3_browsertest.js", - "settings/help_page_browsertest.js", - "settings/settings_idle_load_browsertest.js", "settings/settings_idle_load_v3_browsertest.js", "text_defaults_browsertest.js", "webui_resource_async_browsertest.js", @@ -158,8 +149,6 @@ ] } else { sources += [ - "settings/a11y/manage_profile_a11y_test.js", - "settings/a11y/sign_out_a11y_test.js", "signin/signin_browsertest.js", "user_manager/user_manager_browsertest.js", "welcome/a11y_tests.js",
diff --git a/chrome/test/data/webui/cr_components/cr_components_browsertest.js b/chrome/test/data/webui/cr_components/cr_components_browsertest.js index e5b4dd7..8dfa8701 100644 --- a/chrome/test/data/webui/cr_components/cr_components_browsertest.js +++ b/chrome/test/data/webui/cr_components/cr_components_browsertest.js
@@ -98,42 +98,3 @@ }); GEN('#endif'); - -GEN('#if defined(USE_NSS_CERTS)'); - -/** - * Test fixture for chrome://settings/certificates. This tests the - * certificate-manager component in the context of the Settings privacy page. - * @constructor - * @extends {CrComponentsBrowserTest} - */ -function CrComponentsCertificateManagerTest() {} - -CrComponentsCertificateManagerTest.prototype = { - __proto__: CrComponentsBrowserTest.prototype, - - /** - * Using the certificate-manager instance within - * chrome://settings/privacy_page for these tests, so that all strings are - * properly defined. - * @override - */ - browsePreload: 'chrome://settings/privacy_page/privacy_page.html', - - /** @override */ - featureList: {disabled: ['features::kSettingsPolymer3']}, - - /** @override */ - extraLibraries: CrComponentsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - '../settings/ensure_lazy_loaded.js', - 'certificate_manager_test.js', - ]), -}; - -TEST_F('CrComponentsCertificateManagerTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif // defined(USE_NSS_CERTS)');
diff --git a/chrome/test/data/webui/settings/a11y/about_a11y_test.js b/chrome/test/data/webui/settings/a11y/about_a11y_test.js deleted file mode 100644 index 96dcfdd..0000000 --- a/chrome/test/data/webui/settings/a11y/about_a11y_test.js +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Define accessibility tests for the ABOUT route. - */ - -// SettingsAccessibilityTest fixture. -GEN_INCLUDE([ - 'settings_accessibility_test.js', -]); - -/** - * Test fixture for ABOUT - * @constructor - * @extends {PolymerTest} - */ -function SettingsA11yAbout() {} - -SettingsA11yAbout.prototype = { - __proto__: SettingsAccessibilityTest.prototype, - - extraLibraries: SettingsAccessibilityTest.prototype.extraLibraries.concat([ - '../../test_browser_proxy.js', - '../test_about_page_browser_proxy.js', - ]), -}; - -AccessibilityTest.define('SettingsA11yAbout', { - /** @override */ - name: 'ABOUT', - /** @override */ - axeOptions: SettingsAccessibilityTest.axeOptions, - /** @override */ - setup: function() { - // Reset to a blank page. - PolymerTest.clearBody(); - - // Set the URL to be that of specific route to load upon injecting - // settings-ui. Simply calling - // settings.Router.getInstance().navigateTo(route) prevents use of mock APIs - // for fake data. - window.history.pushState( - 'object or string', 'Test', settings.routes.ABOUT.path); - - if (AccessibilityTest.isChromeOS) { - const aboutPageProxy = new TestAboutPageBrowserProxy(); - // Regulatory info is added when the image is loaded async. - // Add a fake string to mimic the image text. - aboutPageProxy.setRegulatoryInfo('This is fake regulatory info'); - } - const settingsUi = document.createElement('settings-ui'); - document.body.appendChild(settingsUi); - }, - - /** @override */ - tests: {'Accessible with No Changes': function() {}}, - /** @override */ - violationFilter: SettingsAccessibilityTest.violationFilter, -});
diff --git a/chrome/test/data/webui/settings/a11y/accessibility_a11y_test.js b/chrome/test/data/webui/settings/a11y/accessibility_a11y_test.js deleted file mode 100644 index 158bdaf..0000000 --- a/chrome/test/data/webui/settings/a11y/accessibility_a11y_test.js +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Define accessibility tests for the ACCESSIBILITY route. - */ - -// SettingsAccessibilityTest fixture. -GEN_INCLUDE([ - 'settings_accessibility_test.js', -]); - -AccessibilityTest.define('SettingsAccessibilityTest', { - /** @override */ - name: 'ACCESSIBILITY', - /** @override */ - axeOptions: SettingsAccessibilityTest.axeOptions, - /** @override */ - setup: function() { - settings.Router.getInstance().navigateTo(settings.routes.ACCESSIBILITY); - Polymer.dom.flush(); - }, - /** @override */ - tests: {'Accessible with No Changes': function() {}}, - /** @override */ - violationFilter: SettingsAccessibilityTest.violationFilter, -});
diff --git a/chrome/test/data/webui/settings/a11y/basic_a11y_test.js b/chrome/test/data/webui/settings/a11y/basic_a11y_test.js deleted file mode 100644 index dc9f4217..0000000 --- a/chrome/test/data/webui/settings/a11y/basic_a11y_test.js +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Define accessibility tests for the BASIC route. - */ - -// SettingsAccessibilityTest fixture. -GEN_INCLUDE([ - 'settings_accessibility_test.js', -]); - -AccessibilityTest.define('SettingsAccessibilityTest', { - /** @override */ - name: 'BASIC', - /** @override */ - axeOptions: SettingsAccessibilityTest.axeOptions, - /** @override */ - tests: {'Accessible with No Changes': function() {}}, - /** @override */ - violationFilter: SettingsAccessibilityTest.violationFilter, -});
diff --git a/chrome/test/data/webui/settings/a11y/crostini_accessibility_test.js b/chrome/test/data/webui/settings/a11y/crostini_accessibility_test.js index 4c22dde..4fb23966 100644 --- a/chrome/test/data/webui/settings/a11y/crostini_accessibility_test.js +++ b/chrome/test/data/webui/settings/a11y/crostini_accessibility_test.js
@@ -15,6 +15,7 @@ ]); GEN('#include "chrome/browser/chromeos/crostini/crostini_pref_names.h"'); +GEN('#include "chrome/browser/chromeos/crostini/fake_crostini_features.h"'); GEN('#include "chrome/browser/profiles/profile.h"'); GEN('#include "chrome/browser/ui/browser.h"'); GEN('#include "chrome/common/chrome_features.h"'); @@ -37,5 +38,7 @@ testGenPreamble() { GEN(' browser()->profile()->GetPrefs()->SetBoolean('); GEN(' crostini::prefs::kCrostiniEnabled, true);'); + GEN(' crostini::FakeCrostiniFeatures fake_crostini_features;'); + GEN(' fake_crostini_features.SetAll(true);'); } };
diff --git a/chrome/test/data/webui/settings/a11y/edit_dictionary_a11y_test.js b/chrome/test/data/webui/settings/a11y/edit_dictionary_a11y_test.js deleted file mode 100644 index b470cf4..0000000 --- a/chrome/test/data/webui/settings/a11y/edit_dictionary_a11y_test.js +++ /dev/null
@@ -1,100 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** @fileoverview Define accessibility tests for the EDIT_DICTIONARY route. */ - -// Disable since the EDIT_DICTIONARY route does not exist on Mac. -// TODO(crbug.com/1012370) flaky on Linux b/c assertTrue(!!languagesPage); -// TODO(crbug.com/1012370) flaky on Win the same way -GEN('#if !defined(OS_MACOSX) && !defined(OS_LINUX) && !defined(OS_WIN)'); - -// SettingsAccessibilityTest fixture. -GEN_INCLUDE([ - 'settings_accessibility_test.js', -]); - -// eslint-disable-next-line no-var -var EditDictionaryA11yTest = class extends SettingsAccessibilityTest { - /** @override */ - get extraLibraries() { - return super.extraLibraries.concat([ - '../../fake_chrome_event.js', - '../../test_browser_proxy.js', - '../../test_util.js', - '../fake_language_settings_private.js', - '../fake_settings_private.js', - ]); - } -}; - -function getDictionaryPage() { - const settingsUI = document.querySelector('settings-ui'); - assertTrue(!!settingsUI); - const settingsMain = settingsUI.$.main; - assertTrue(!!settingsMain); - const settingsBasicPage = settingsMain.$$('settings-basic-page'); - assertTrue(!!settingsBasicPage); - const languagesPage = settingsBasicPage.$$('settings-languages-page'); - assertTrue(!!languagesPage); - const dictionaryPage = languagesPage.$$('settings-edit-dictionary-page'); - assertTrue(!!dictionaryPage); - return dictionaryPage; -} - -AccessibilityTest.define('EditDictionaryA11yTest', { - /** @override */ - name: 'EDIT_DICTIONARY', - - /** @type {settings.FakeLanguageSettingsPrivate} */ - languageSettingsPrivate_: null, - - /** @override */ - violationFilter: - Object.assign({}, SettingsAccessibilityTest.violationFilter, { - // Excuse custom input elements. - 'aria-valid-attr-value': function(nodeResult) { - const describerId = - nodeResult.element.getAttribute('aria-describedby'); - return describerId === '' && nodeResult.element.tagName == 'INPUT'; - }, - 'tabindex': function(nodeResult) { - // TODO(crbug.com/808276): remove this exception when bug is fixed. - return nodeResult.element.getAttribute('tabindex') == '0'; - }, - }), - - /** @override */ - setup: async function() { - // Don't replace b/c each test case needs to use the same fake. - if (!this.languageSettingsPrivate_) { - this.languageSettingsPrivate_ = - new settings.FakeLanguageSettingsPrivate(), - settings.languageSettingsPrivateApiForTest = - this.languageSettingsPrivate_; - } - - settings.Router.getInstance().navigateTo(settings.routes.EDIT_DICTIONARY); - Polymer.dom.flush(); - await test_util.flushTasks(); - }, - - /** @override */ - tests: { - 'Accessible with No Changes': function() { - const dictionaryPage = getDictionaryPage(); - assertFalse(!!dictionaryPage.$$('#list')); - }, - - 'Load data to list': function() { - const dictionaryPage = getDictionaryPage(); - - this.languageSettingsPrivate_.addSpellcheckWord('one'); - - assertTrue(!!dictionaryPage.$$('#list')); - assertEquals(1, dictionaryPage.$$('#list').items.length); - }, - }, -}); - -GEN('#endif // !defined(OS_MACOSX) && !defined(OS_LINUX)');
diff --git a/chrome/test/data/webui/settings/a11y/manage_profile_a11y_test.js b/chrome/test/data/webui/settings/a11y/manage_profile_a11y_test.js deleted file mode 100644 index 156642da..0000000 --- a/chrome/test/data/webui/settings/a11y/manage_profile_a11y_test.js +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Define accessibility tests for the MANAGE_PROFILE route. - * Non-Chrome OS only. - */ - -// SettingsAccessibilityTest fixture. -GEN_INCLUDE([ - 'settings_accessibility_test.js', -]); - -AccessibilityTest.define('SettingsAccessibilityTest', { - /** @override */ - name: 'MANAGE_PROFILE', - /** @override */ - axeOptions: SettingsAccessibilityTest.axeOptions, - /** @override */ - setup: function() { - settings.Router.getInstance().navigateTo(settings.routes.MANAGE_PROFILE); - Polymer.dom.flush(); - }, - /** @override */ - tests: {'Accessible with No Changes': function() {}}, - /** @override */ - violationFilter: - Object.assign({}, SettingsAccessibilityTest.violationFilter, { - // Excuse custom input elements. - 'aria-valid-attr-value': function(nodeResult) { - const describerId = - nodeResult.element.getAttribute('aria-describedby'); - return describerId === '' && nodeResult.element.tagName == 'INPUT'; - }, - 'tabindex': function(nodeResult) { - // TODO(crbug.com/808276): remove this exception when bug is fixed. - return nodeResult.element.getAttribute('tabindex') == '0'; - }, - }), -});
diff --git a/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js b/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js deleted file mode 100644 index c5d65c5..0000000 --- a/chrome/test/data/webui/settings/a11y/passwords_a11y_test.js +++ /dev/null
@@ -1,102 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** @fileoverview Define accessibility tests for the PASSWORDS route. */ - -// TODO(crbug/1064966) Flaky on Linux CFI. -GEN('#if !(defined(OS_LINUX) && defined(IS_CFI))'); - -// SettingsAccessibilityTest fixture. -GEN_INCLUDE([ - 'settings_accessibility_test.js', -]); - -/** - * Test fixture for PASSWORDS - * @constructor - * @extends {PolymerTest} - */ -function SettingsA11yPasswords() {} - -SettingsA11yPasswords.prototype = { - __proto__: SettingsAccessibilityTest.prototype, - - // Include files that define the mocha tests. - extraLibraries: SettingsAccessibilityTest.prototype.extraLibraries.concat([ - '../../test_browser_proxy.js', - '../passwords_and_autofill_fake_data.js', - '../test_password_manager_proxy.js', - ]), -}; - -AccessibilityTest.define('SettingsA11yPasswords', { - /** @override */ - name: 'PASSWORDS', - /** @type {PasswordManager} */ - passwordManager: null, - /** @type {PasswordsSectionElement}*/ - passwordsSection: null, - - /** @override */ - setup: function() { - return new Promise((resolve) => { - // Reset to a blank page. - PolymerTest.clearBody(); - - // Set the URL to be that of specific route to load upon injecting - // settings-ui. Simply calling - // settings.Router.getInstance().navigateTo(route) prevents use of mock - // APIs for fake data. - window.history.pushState( - 'object or string', 'Test', settings.routes.PASSWORDS.path); - - PasswordManagerImpl.instance_ = new TestPasswordManagerProxy(); - this.passwordManager = PasswordManagerImpl.getInstance(); - - const settingsUi = document.createElement('settings-ui'); - - // The settings section will expand to load the PASSWORDS route (based on - // the URL set above) once the settings-ui element is attached - settingsUi.addEventListener('settings-section-expanded', () => { - // Passwords section should be loaded before setup is complete. - this.passwordsSection = settingsUi.$$('settings-main') - .$$('settings-basic-page') - .$$('settings-autofill-page') - .$$('passwords-section'); - assertTrue(!!this.passwordsSection); - - assertEquals( - this.passwordManager, this.passwordsSection.passwordManager_); - - resolve(); - }); - - document.body.appendChild(settingsUi); - }); - }, - - /** @override */ - tests: { - 'Accessible with 0 passwords': function() { - assertEquals(0, this.passwordsSection.savedPasswords.length); - }, - 'Accessible with 10 passwords': function() { - const fakePasswords = []; - for (let i = 0; i < 10; i++) { - fakePasswords.push(autofill_test_util.createPasswordEntry()); - } - // Set list of passwords. - this.passwordManager.lastCallback.addSavedPasswordListChangedListener( - fakePasswords); - Polymer.dom.flush(); - - assertEquals(10, this.passwordsSection.savedPasswords.length); - }, - }, - - /** @override */ - violationFilter: SettingsAccessibilityTest.violationFilter, -}); - -GEN('#endif // !(defined(OS_LINUX) && defined(IS_CFI))'); \ No newline at end of file
diff --git a/chrome/test/data/webui/settings/a11y/sign_out_a11y_test.js b/chrome/test/data/webui/settings/a11y/sign_out_a11y_test.js deleted file mode 100644 index b4fefe3..0000000 --- a/chrome/test/data/webui/settings/a11y/sign_out_a11y_test.js +++ /dev/null
@@ -1,103 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Suite of accessibility tests for the SIGN_OUT route. - * Not used on Chrome OS since signing out is done at the OS level, not within - * the Chrome Browser. - */ - -// SettingsAccessibilityTest fixture. -GEN_INCLUDE([ - 'settings_accessibility_test.js', -]); - -/** - * Test fixture for SIGN_OUT - * @constructor - * @extends {PolymerTest} - */ -function SettingsA11ySignOut() {} - -SettingsA11ySignOut.prototype = { - __proto__: SettingsAccessibilityTest.prototype, - - // Include files that define the mocha tests. - extraLibraries: SettingsAccessibilityTest.prototype.extraLibraries.concat([ - '../../test_browser_proxy.js', - '../../test_util.js', - '../sync_test_util.js', - '../test_sync_browser_proxy.js', - ]), -}; - -AccessibilityTest.define('SettingsA11ySignOut', { - /** @override */ - name: 'SIGN_OUT', - /** @type {SettingsPeoplePageElement}*/ - peoplePage: null, - /** @type {TestSyncBrowserProxy}*/ - browserProxy: null, - /** @override */ - axeOptions: SettingsAccessibilityTest.axeOptions, - /** @override */ - setup: function() { - // Reset the blank to be a blank page. - PolymerTest.clearBody(); - - // Set the URL of the page to render to load the correct view upon - // injecting settings-ui without attaching listeners. - window.history.pushState( - 'object or string', 'Test', settings.routes.PEOPLE.path); - - this.browserProxy = new TestSyncBrowserProxy(); - settings.SyncBrowserProxyImpl.instance_ = this.browserProxy; - - const settingsUi = document.createElement('settings-ui'); - document.body.appendChild(settingsUi); - Polymer.dom.flush(); - - this.peoplePage = settingsUi.$$('settings-main') - .$$('settings-basic-page') - .$$('settings-people-page'); - assert(!!this.peoplePage); - - sync_test_util.simulateSyncStatus({ - signedIn: false, - signinAllowed: true, - syncSystemEnabled: true, - disabled: false, - }); - }, - /** @override */ - tests: { - 'Accessible Dialog': function() { - let parent = null; - - return this.browserProxy.getSyncStatus() - .then(syncStatus => { - // Navigate to the sign out dialog. - Polymer.dom.flush(); - - parent = this.peoplePage.$$('settings-sync-account-control'); - parent.syncStatus = { - firstSetupInProgress: false, - signedIn: true, - signedInUsername: 'bar@bar.com', - statusAction: settings.StatusAction.NO_ACTION, - hasError: false, - disabled: false, - }; - return test_util.waitBeforeNextRender(parent); - }) - .then(() => { - disconnectButton = parent.$$('#turn-off'); - assert(!!disconnectButton); - disconnectButton.click(); - }); - } - }, - /** @override */ - violationFilter: SettingsAccessibilityTest.violationFilter, -});
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js deleted file mode 100644 index 058e416..0000000 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ /dev/null
@@ -1,2323 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** @fileoverview Runs the Polymer Settings tests. */ - -// Polymer BrowserTest fixture. -GEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']); - -GEN('#if defined(OS_CHROMEOS)'); -GEN('#include "chromeos/constants/chromeos_features.h"'); -GEN('#endif // defined(OS_CHROMEOS)'); - -GEN('#include "build/branding_buildflags.h"'); -GEN('#include "chrome/browser/ui/ui_features.h"'); -GEN('#include "chrome/common/chrome_features.h"'); -GEN('#include "components/autofill/core/common/autofill_features.h"'); -GEN('#include "components/omnibox/common/omnibox_features.h"'); -GEN('#include "components/password_manager/core/common/password_manager_features.h"'); - -/** - * Test fixture for Polymer Settings elements. - * @constructor - * @extends {PolymerTest} - */ -function CrSettingsBrowserTest() {} - -CrSettingsBrowserTest.prototype = { - __proto__: PolymerTest.prototype, - - /** @override */ - get browsePreload() { - throw 'this is abstract and should be overridden by subclasses'; - }, - - /** @override */ - extraLibraries: [ - ...PolymerTest.prototype.extraLibraries, - 'ensure_lazy_loaded.js', - ], - - /** @override */ - get featureList() { - return { - enabled: this.featureListInternal.enabled || [], - disabled: [ - 'features::kSettingsPolymer3', - ...(this.featureListInternal.disabled || []), - ], - }; - }, - - /** @return {!{enabled: !Array<string>, disabled: !Array<string>}} */ - get featureListInternal() { - return {enabled: [], disabled: []}; - }, - - /** @override */ - setUp: function() { - PolymerTest.prototype.setUp.call(this); - - settings.ensureLazyLoaded(); - }, -}; - -// Have to include command_line.h manually due to GEN calls below. -GEN('#include "base/command_line.h"'); - -function CrSettingsCheckboxTest() {} - -CrSettingsCheckboxTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/settings_checkbox.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'checkbox_tests.js', - ]), -}; - -TEST_F('CrSettingsCheckboxTest', 'DISABLED_All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/cookies_page.html - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsCookiesPageTest() {} - -CrSettingsCookiesPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/cookies_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_metrics_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'cookies_page_test.js', - ]), -}; - -TEST_F('CrSettingsCookiesPageTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSliderTest() {} - -CrSettingsSliderTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/settings_slider.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - 'settings_slider_tests.js', - ]), -}; - -TEST_F('CrSettingsSliderTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsTextareaTest() {} - -CrSettingsTextareaTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/settings_textarea.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'settings_textarea_tests.js', - ]), -}; - -TEST_F('CrSettingsTextareaTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsToggleButtonTest() {} - -CrSettingsToggleButtonTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/settings_toggle_button.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'settings_toggle_button_tests.js', - ]), -}; - -TEST_F('CrSettingsToggleButtonTest', 'All', function() { - mocha.run(); -}); - -function CrSettingsDropdownMenuTest() {} - -CrSettingsDropdownMenuTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/settings_dropdown_menu.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'dropdown_menu_tests.js', - ]), -}; - -TEST_F('CrSettingsDropdownMenuTest', 'All', function() { - mocha.run(); -}); - -function CrSettingsPrefUtilTest() {} - -CrSettingsPrefUtilTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/prefs/pref_util.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'pref_util_tests.js', - ]), -}; - -TEST_F('CrSettingsPrefUtilTest', 'All', function() { - mocha.run(); -}); - -function CrSettingsPrefsTest() {} - -CrSettingsPrefsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/prefs/prefs.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../fake_chrome_event.js', - 'fake_settings_private.js', - 'prefs_test_cases.js', - 'prefs_tests.js', - ]), -}; - -TEST_F('CrSettingsPrefsTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsAboutPageTest() {} - -CrSettingsAboutPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/about_page/about_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_lifetime_browser_proxy.js', - 'test_about_page_browser_proxy.js', - 'about_page_tests.js', - ]), -}; - -TEST_F('CrSettingsAboutPageTest', 'AboutPage', function() { - mocha.grep('AboutPageTest_AllBuilds').run(); -}); - -GEN('#if BUILDFLAG(GOOGLE_CHROME_BRANDING)'); -TEST_F('CrSettingsAboutPageTest', 'AboutPage_OfficialBuild', function() { - mocha.grep('AboutPageTest_OfficialBuilds').run(); -}); -GEN('#endif'); - -/** - * Test fixture for - * chrome/browser/resources/settings/autofill_page/autofill_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsAutofillPageTest() {} - -CrSettingsAutofillPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/autofill_page/autofill_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../fake_chrome_event.js', - '../test_browser_proxy.js', - 'ensure_lazy_loaded.js', - 'fake_settings_private.js', - 'passwords_and_autofill_fake_data.js', - 'test_open_window_proxy.js', - 'test_password_manager_proxy.js', - 'test_plural_string_proxy.js', - 'autofill_page_test.js', - ]), -}; - -TEST_F('CrSettingsAutofillPageTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/autofill_page/autofill_section.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsAutofillSectionCompanyEnabledTest() {} - -CrSettingsAutofillSectionCompanyEnabledTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/autofill_page/autofill_section.html', - - /** @override */ - featureListInternal: - {enabled: ['autofill::features::kAutofillEnableCompanyName']}, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'passwords_and_autofill_fake_data.js', - '../test_util.js', - 'autofill_section_test.js', - ]), -}; - -TEST_F('CrSettingsAutofillSectionCompanyEnabledTest', 'All', function() { - // Use 'EnableCompanyName' to inform tests that the feature is enabled. - const loadTimeDataOverride = {}; - loadTimeDataOverride['EnableCompanyName'] = true; - loadTimeData.overrideValues(loadTimeDataOverride); - mocha.run(); -}); - -function CrSettingsAutofillSectionCompanyDisabledTest() {} - -CrSettingsAutofillSectionCompanyDisabledTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/autofill_page/autofill_section.html', - - /** @override */ - featureListInternal: - {disabled: ['autofill::features::kAutofillEnableCompanyName']}, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'passwords_and_autofill_fake_data.js', - '../test_util.js', - 'autofill_section_test.js', - ]), -}; - -TEST_F('CrSettingsAutofillSectionCompanyDisabledTest', 'All', function() { - // Use 'EnableCompanyName' to inform tests that the feature is disabled. - const loadTimeDataOverride = {}; - loadTimeDataOverride['EnableCompanyName'] = false; - loadTimeData.overrideValues(loadTimeDataOverride); - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/autofill_page/passwords_section.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPasswordsSectionTest() {} - -CrSettingsPasswordsSectionTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/autofill_page/passwords_section.html', - - /** @override */ - featureListInternal: - {enabled: ['password_manager::features::kPasswordCheck']}, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../mock_timer.js', - '../test_browser_proxy.js', - 'passwords_and_autofill_fake_data.js', - 'passwords_export_test.js', - 'passwords_section_test.js', - 'sync_test_util.js', - 'test_password_manager_proxy.js', - '../test_util.js', - ]), -}; - -TEST_F('CrSettingsPasswordsSectionTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/autofill_page/passwords_check.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPasswordsCheckTest() {} - -CrSettingsPasswordsCheckTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/autofill_page/password_check.html', - - /** @override */ - featureListInternal: - {enabled: ['password_manager::features::kPasswordCheck']}, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'passwords_and_autofill_fake_data.js', - 'sync_test_util.js', - 'test_open_window_proxy.js', - 'test_password_manager_proxy.js', - 'password_check_test.js', - ]), -}; - -TEST_F('CrSettingsPasswordsCheckTest', 'All', function() { - mocha.run(); -}); - -GEN('#if defined(OS_CHROMEOS)'); -/** - * Test fixture for CrOS specific behavior in - * chrome/browser/resources/settings/autofill_page/passwords_section.html. - * See http://crbug.com/917178 for details. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPasswordsSectionTest_Cros() {} - -CrSettingsPasswordsSectionTest_Cros.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/autofill_page/passwords_section.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../mock_timer.js', - '../test_util.js', - '../test_browser_proxy.js', - 'passwords_export_test.js', - 'passwords_and_autofill_fake_data.js', - 'passwords_section_test_cros.js', - 'test_password_manager_proxy.js', - ]), -}; - - -TEST_F('CrSettingsPasswordsSectionTest_Cros', 'All', function() { - mocha.run(); -}); -GEN('#endif // defined(OS_CHROMEOS)'); - -/** - * Test fixture for - * chrome/browser/resources/settings/autofill_page/payments_section.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPaymentsSectionTest() {} - -CrSettingsPaymentsSectionTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/autofill_page/payments_section.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'passwords_and_autofill_fake_data.js', - 'sync_test_util.js', - 'test_metrics_browser_proxy.js', - 'test_sync_browser_proxy.js', - '../test_util.js', - 'payments_section_test.js', - ]), -}; - -TEST_F('CrSettingsPaymentsSectionTest', 'All', function() { - mocha.run(); -}); - -GEN('#if !defined(OS_CHROMEOS)'); -/** - * Test fixture for - * chrome/browser/resources/settings/people_page/manage_profile.html. - * This is non-ChromeOS only. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPeoplePageManageProfileTest() {} - -CrSettingsPeoplePageManageProfileTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/manage_profile.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'people_page_manage_profile_test.js', - ]), -}; - -TEST_F('CrSettingsPeoplePageManageProfileTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif // !defined(OS_CHROMEOS)'); - -/** - * Test fixture for - * chrome/browser/resources/settings/people_page/people_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPeoplePageTest() {} - -CrSettingsPeoplePageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/people_page.html', - - // Omnibox's Document Provider adds a dynamic setting to a list which is - // length-checked in this test. The feature is defaulted on here during - // rollout, reflecting its value in fieldtrial_testing_config.json. - // See crbug.com/908435. - /** @override */ - featureListInternal: {enabled: ['omnibox::kDocumentProvider']}, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - '../test_util.js', - 'sync_test_util.js', - 'test_profile_info_browser_proxy.js', - 'test_sync_browser_proxy.js', - 'people_page_test.js', - ]), -}; - -TEST_F('CrSettingsPeoplePageTest', 'All', function() { - mocha.run(); -}); - -GEN('#if defined(OS_CHROMEOS)'); - -/** - * Test fixture for - * chrome/browser/resources/settings/people_page/people_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPeoplePageChromeOSTest() {} - -CrSettingsPeoplePageChromeOSTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/people_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'sync_test_util.js', - 'test_profile_info_browser_proxy.js', - 'test_sync_browser_proxy.js', - 'people_page_test_cros.js', - ]), -}; - -TEST_F('CrSettingsPeoplePageChromeOSTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif // defined(OS_CHROMEOS)'); - -/** - * Test fixture for - * chrome/browser/resources/settings/people_page/sync_account_control.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPeoplePageSyncAccountControlTest() {} - -CrSettingsPeoplePageSyncAccountControlTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/sync_account_control.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - '../test_util.js', - 'sync_test_util.js', - 'test_sync_browser_proxy.js', - 'sync_account_control_test.js', - ]), -}; - -TEST_F('CrSettingsPeoplePageSyncAccountControlTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/people_page/sync_controls.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPeoplePageSyncControlsTest() {} - -CrSettingsPeoplePageSyncControlsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/sync_controls.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'sync_test_util.js', - 'test_sync_browser_proxy.js', - '../test_util.js', - 'people_page_sync_controls_test.js', - ]), -}; - -TEST_F('CrSettingsPeoplePageSyncControlsTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/people_page/sync_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPeoplePageSyncPageTest() {} - -CrSettingsPeoplePageSyncPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/sync_page.html', - - // Omnibox's Document Provider adds a dynamic setting to a list which is - // length-checked in this test. The feature is defaulted on here during - // rollout, reflecting its value in fieldtrial_testing_config.json. - // See crbug.com/908435. - /** @override */ - featureListInternal: {enabled: ['omnibox::kDocumentProvider']}, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'sync_test_util.js', - 'test_sync_browser_proxy.js', - '../test_util.js', - 'people_page_sync_page_test.js', - ]), -}; - -TEST_F('CrSettingsPeoplePageSyncPageTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for chrome/browser/resources/settings/reset_page/. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsResetPageTest() {} - -CrSettingsResetPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/reset_page/reset_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_lifetime_browser_proxy.js', - 'test_reset_browser_proxy.js', - '../test_util.js', - 'reset_page_test.js', - ]), -}; - -TEST_F('CrSettingsResetPageTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/reset_page/reset_profile_banner.html - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsResetProfileBannerTest() {} - -CrSettingsResetProfileBannerTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/reset_page/reset_profile_banner.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_reset_browser_proxy.js', - 'reset_profile_banner_test.js', - ]), -}; - -TEST_F('CrSettingsResetProfileBannerTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsAppearancePageTest() {} - -CrSettingsAppearancePageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/appearance_page/appearance_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - '../test_browser_proxy.js', - 'appearance_page_test.js', - ]), -}; - -TEST_F('CrSettingsAppearancePageTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsAppearanceFontsPageTest() {} - -CrSettingsAppearanceFontsPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/appearance_page/appearance_fonts_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - '../test_browser_proxy.js', - 'appearance_fonts_page_test.js', - ]), -}; - -TEST_F('CrSettingsAppearanceFontsPageTest', 'All', function() { - mocha.run(); -}); - -GEN('#if defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)'); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsChromeCleanupPageTest() {} - -CrSettingsChromeCleanupPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/chrome_cleanup_page/chrome_cleanup_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'chrome_cleanup_page_test.js', - ]), -}; - -TEST_F('CrSettingsChromeCleanupPageTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsIncompatibleApplicationsPageTest() {} - -CrSettingsIncompatibleApplicationsPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/incompatible_applications_page/incompatible_applications_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'incompatible_applications_page_test.js', - ]), -}; - -TEST_F('CrSettingsIncompatibleApplicationsPageTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif // defined(OS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)'); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/ - * do-not-track-toggle.html - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsDoNotTrackToggleTest() {} - -CrSettingsDoNotTrackToggleTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/do_not_track_toggle.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_metrics_browser_proxy.js', - 'do_not_track_toggle_test.js', - ]), -}; - -TEST_F('CrSettingsDoNotTrackToggleTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsDownloadsPageTest() {} - -CrSettingsDownloadsPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/downloads_page/downloads_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - '../test_browser_proxy.js', - 'downloads_page_test.js', - ]), -}; - -TEST_F('CrSettingsDownloadsPageTest', 'All', function() { - mocha.run(); -}); - -GEN('#if !defined(OS_CHROMEOS)'); - -/** - * Test fixture for chrome/browser/resources/settings/default_browser_page/. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsDefaultBrowserTest() {} - -CrSettingsDefaultBrowserTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/default_browser_page/default_browser_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'default_browser_browsertest.js', - ]), -}; - -TEST_F('CrSettingsDefaultBrowserTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/people_page/import_data_dialog.html - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsImportDataDialogTest() {} - -CrSettingsImportDataDialogTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/import_data_dialog.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'import_data_dialog_test.js', - ]), -}; - -TEST_F('CrSettingsImportDataDialogTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif // !defined(OS_CHROMEOS)'); - -/** - * Test fixture for chrome/browser/resources/settings/search_page/. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSearchPageTest() {} - -CrSettingsSearchPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/search_page/search_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_search_engines_browser_proxy.js', - 'search_page_test.js', - ]), -}; - -TEST_F('CrSettingsSearchPageTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for chrome/browser/resources/settings/search_engines_page/. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSearchEnginesTest() {} - -CrSettingsSearchEnginesTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/search_engines_page/search_engines_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - '../test_util.js', - 'test_extension_control_browser_proxy.js', - 'test_search_engines_browser_proxy.js', - 'search_engines_page_test.js', - ]), -}; - -TEST_F('CrSettingsSearchEnginesTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/personalization_options.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPersonalizationOptionsTest() {} - -CrSettingsPersonalizationOptionsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/personalization_options.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - 'sync_test_util.js', - 'test_util.js', - '../test_util.js', - '../test_browser_proxy.js', - 'test_privacy_page_browser_proxy.js', - 'test_sync_browser_proxy.js', - 'personalization_options_test.js', - ]), -}; - -TEST_F('CrSettingsPersonalizationOptionsTest', 'AllBuilds', function() { - runMochaSuite('PersonalizationOptionsTests_AllBuilds'); -}); - -GEN('#if BUILDFLAG(GOOGLE_CHROME_BRANDING)'); -TEST_F('CrSettingsPersonalizationOptionsTest', 'OfficialBuild', function() { - runMochaSuite('PersonalizationOptionsTests_OfficialBuild'); -}); -GEN('#endif'); - -TEST_F('CrSettingsPersonalizationOptionsTest', 'AllBuildsOld', function() { - runMochaSuite('PersonalizationOptionsTests_AllBuilds_Old'); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/privacy_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPrivacyPageTest() {} - -CrSettingsPrivacyPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/privacy_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - '../test_util.js', - '../test_browser_proxy.js', - 'test_privacy_page_browser_proxy.js', - 'test_metrics_browser_proxy.js', - 'test_site_settings_prefs_browser_proxy.js', - 'test_sync_browser_proxy.js', - 'test_util.js', - 'privacy_page_test.js', - ]), -}; - -TEST_F('CrSettingsPrivacyPageTest', 'PrivacyPageTests', function() { - runMochaSuite('PrivacyPage'); -}); - -TEST_F('CrSettingsPrivacyPageTest', 'PrivacyPageRedesignTests', function() { - runMochaSuite('PrivacyPageRedesignEnabled'); -}); - -// TODO(crbug.com/1043665): flaky crash on Linux Tests (dbg). -TEST_F( - 'CrSettingsPrivacyPageTest', 'DISABLED_PrivacyPageSoundTests', function() { - runMochaSuite('PrivacyPageSound'); - }); - -TEST_F('CrSettingsPrivacyPageTest', 'UMALoggingTests', function() { - runMochaSuite('PrivacyPageUMACheck'); -}); - -GEN('#if defined(OS_MACOSX) || defined(OS_WIN)'); -// TODO(crbug.com/1043665): disabling due to failures on several builders. -TEST_F( - 'CrSettingsPrivacyPageTest', 'DISABLED_CertificateManagerTests', - function() { - runMochaSuite('NativeCertificateManager'); - }); -GEN('#endif'); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/privacy_page.html. - * with features::kPrivacySettingsRedesign enabled. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPrivacyPageRedesignTest() {} - -CrSettingsPrivacyPageRedesignTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/privacy_page.html', - - /** @override */ - featureListInternal: {enabled: ['features::kPrivacySettingsRedesign']}, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_hats_browser_proxy.js', - 'privacy_page_test.js', - ]), -}; - -TEST_F( - 'CrSettingsPrivacyPageRedesignTest', 'HappinessTrackingSurveysTests', - function() { - runMochaSuite('HappinessTrackingSurveys'); - }); - -/** - * Test fixture for - * chrome/browser/resources/settings/clear_browsing_data_dialog/ - * clear_browsing_data_dialog.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsClearBrowsingDataTest() {} - -CrSettingsClearBrowsingDataTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/clear_browsing_data_dialog/' + - 'clear_browsing_data_dialog.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - '../test_util.js', - '../test_browser_proxy.js', - 'clear_browsing_data_test.js', - 'test_sync_browser_proxy.js', - ]), -}; - -TEST_F( - 'CrSettingsClearBrowsingDataTest', 'ClearBrowsingDataAllPlatforms', - function() { - runMochaSuite('ClearBrowsingDataAllPlatforms'); - }); - -TEST_F('CrSettingsClearBrowsingDataTest', 'InstalledApps', () => { - runMochaSuite('InstalledApps'); -}); - -GEN('#if !defined(OS_CHROMEOS)'); -TEST_F( - 'CrSettingsClearBrowsingDataTest', 'ClearBrowsingDataDesktop', function() { - runMochaSuite('ClearBrowsingDataDesktop'); - }); -GEN('#endif'); - -/** - * Test fixture for - * chrome/browser/resources/settings/safety_check_page/safety_check_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSafetyCheckPageTest() {} - -CrSettingsSafetyCheckPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/safety_check_page/safety_check_page.html', - - /** @override */ - featureListInternal: { - enabled: [ - 'features::kPrivacySettingsRedesign', - 'password_manager::features::kPasswordCheck', - ], - }, - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'passwords_and_autofill_fake_data.js', - 'safety_check_page_test.js', - 'test_metrics_browser_proxy.js', - 'test_password_manager_proxy.js', - 'test_lifetime_browser_proxy.js', - 'test_open_window_proxy.js', - 'test_hats_browser_proxy.js', - ]), -}; - -TEST_F('CrSettingsSafetyCheckPageTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/secure_dns.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSecureDnsTest() {} - -CrSettingsSecureDnsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/secure_dns.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_privacy_page_browser_proxy.js', - 'secure_dns_test.js', - ]), -}; - -TEST_F('CrSettingsSecureDnsTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/site_settings_page/site_settings_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteSettingsPageTest() {} - -CrSettingsSiteSettingsPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings_page/site_settings_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - '../test_util.js', - '../test_browser_proxy.js', - 'test_site_settings_prefs_browser_proxy.js', - 'test_util.js', - 'site_settings_page_test.js', - ]) -}; - -TEST_F('CrSettingsSiteSettingsPageTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/ - * passwords-leak-detection-toggle.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsPasswordsLeakDetectionToggleTest() {} - -CrSettingsPasswordsLeakDetectionToggleTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/privacy_page/passwords_leak_detection_toggle.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'sync_test_util.js', - '../test_browser_proxy.js', - 'test_metrics_browser_proxy.js', - 'test_privacy_page_browser_proxy.js', - 'test_sync_browser_proxy.js', - 'passwords_leak_detection_toggle_test.js', - ]), -}; - -TEST_F('CrSettingsPasswordsLeakDetectionToggleTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteDataDetailsTest() {} - -CrSettingsSiteDataDetailsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/site_settings/site_data_details_subpage.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_local_data_browser_proxy.js', - 'site_data_details_subpage_tests.js', - ]), -}; - -TEST_F('CrSettingsSiteDataDetailsTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsChooserExceptionListTest() {} - -CrSettingsChooserExceptionListTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings/chooser_exception_list.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'chooser_exception_list_tests.js', - ]), -}; - -TEST_F('CrSettingsChooserExceptionListTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsChooserExceptionListEntryTest() {} - -CrSettingsChooserExceptionListEntryTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/site_settings/chooser_exception_list_entry.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../cr_elements/cr_policy_strings.js', - '../test_browser_proxy.js', - '../test_util.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'chooser_exception_list_entry_tests.js', - ]), -}; - -TEST_F('CrSettingsChooserExceptionListEntryTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsCategoryDefaultSettingTest() {} - -CrSettingsCategoryDefaultSettingTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/site_settings/category_default_setting.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'category_default_setting_tests.js', - ]), -}; - -TEST_F('CrSettingsCategoryDefaultSettingTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsCategorySettingExceptionsTest() {} - -CrSettingsCategorySettingExceptionsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/site_settings/category_setting_exceptions.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'ensure_lazy_loaded.js', - 'category_setting_exceptions_tests.js', - ]), -}; - -TEST_F('CrSettingsCategorySettingExceptionsTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteEntryTest() {} - -CrSettingsSiteEntryTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings/site_entry.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_local_data_browser_proxy.js', - 'test_util.js', - '../test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'site_entry_tests.js', - ]), -}; - -TEST_F('CrSettingsSiteEntryTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsAllSitesTest() {} - -CrSettingsAllSitesTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/privacy_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_local_data_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'all_sites_tests.js', - ]), -}; - -TEST_F('CrSettingsAllSitesTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteDetailsTest() {} - -CrSettingsSiteDetailsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings/site_details.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/util.js', - '../test_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'site_details_tests.js', - ]), -}; - -// Disabling on debug due to flaky timeout on Win7 Tests (dbg)(1) bot. -// https://crbug.com/825304 - later for other platforms in crbug.com/1021219. -GEN('#if !defined(NDEBUG)'); -GEN('#define MAYBE_All DISABLED_All'); -GEN('#else'); -GEN('#define MAYBE_All All'); -GEN('#endif'); - -TEST_F('CrSettingsSiteDetailsTest', 'MAYBE_All', function() { - mocha.run(); -}); -GEN('#undef MAYBE_All'); - - -/** - * Test fixture for - * chrome/browser/resources/settings/site_settings_page/ - * recent_site_permissions.js - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsRecentSitePermissionsTest() {} - -CrSettingsRecentSitePermissionsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/recent_site_permissions.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - '../test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'test_util.js', - 'recent_site_permissions_test.js', - ]), -}; - -TEST_F('CrSettingsRecentSitePermissionsTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/security_page.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSecurityPageTest() {} - -CrSettingsSecurityPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/security_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - '../test_util.js', - 'test_safe_browsing_browser_proxy.js', - 'test_sync_browser_proxy.js', - 'test_privacy_page_browser_proxy.js', - 'test_metrics_browser_proxy.js', - 'security_page_test.js', - ]), -}; - -TEST_F('CrSettingsSecurityPageTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteDetailsPermissionTest() {} - -CrSettingsSiteDetailsPermissionTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings/site_details_permission.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'site_details_permission_tests.js', - ]), -}; - -TEST_F('CrSettingsSiteDetailsPermissionTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteListTest() {} - -CrSettingsSiteListTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings/site_list.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_util.js', - '../test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'site_list_tests.js', - ]), -}; - -// TODO(crbug.com/929455): flaky, fix. -TEST_F('CrSettingsSiteListTest', 'DISABLED_SiteList', function() { - runMochaSuite('SiteList'); -}); - -TEST_F('CrSettingsSiteListTest', 'EditExceptionDialog', function() { - runMochaSuite('EditExceptionDialog'); -}); - -TEST_F('CrSettingsSiteListTest', 'AddExceptionDialog', function() { - runMochaSuite('AddExceptionDialog'); -}); - -GEN('#if defined(OS_CHROMEOS)'); -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteListChromeOSTest() {} - -CrSettingsSiteListChromeOSTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings/site_list.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_util.js', - '../test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'test_android_info_browser_proxy.js', - 'site_list_tests_cros.js', - ]), -}; - -// TODO(crbug.com/929455): flaky, fix. -TEST_F('CrSettingsSiteListChromeOSTest', 'DISABLED_AndroidSmsInfo', function() { - mocha.run(); -}); -GEN('#endif // defined(OS_CHROMEOS)'); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteListEntryTest() {} - -CrSettingsSiteListEntryTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_settings/site_list_entry.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../cr_elements/cr_policy_strings.js', - '../test_browser_proxy.js', - '../test_util.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'site_list_entry_tests.js', - ]), -}; - -TEST_F('CrSettingsSiteListEntryTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsZoomLevelsTest() {} - -CrSettingsZoomLevelsTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/privacy_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - '../test_util.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'ensure_lazy_loaded.js', - 'zoom_levels_tests.js', - ]), -}; - -TEST_F('CrSettingsZoomLevelsTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsProtocolHandlersTest() {} - -CrSettingsProtocolHandlersTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/privacy_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_util.js', - 'test_site_settings_prefs_browser_proxy.js', - 'ensure_lazy_loaded.js', - 'protocol_handlers_tests.js', - ]), -}; - -TEST_F('CrSettingsProtocolHandlersTest', 'All', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/privacy_page/security_keys_subpage.html - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSecurityKeysSubpageTest() {} - -CrSettingsSecurityKeysSubpageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/security_keys_subpage.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'security_keys_subpage_test.js', - ]), -}; - -TEST_F('CrSettingsSecurityKeysSubpageTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteDataTest() {} - -CrSettingsSiteDataTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - browsePreload: 'chrome://settings/siteData', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_local_data_browser_proxy.js', - 'site_data_test.js', - ]), -}; - -// Disabled for flakiness, see https://crbug.com/1061249 -TEST_F('CrSettingsSiteDataTest', 'DISABLED_All', function() { - mocha.run(); -}); - -/** - * Test fixture for chrome/browser/resources/settings/settings_menu/. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsMenuTest() {} - -CrSettingsMenuTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/settings_menu/settings_menu.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'settings_menu_test.js', - ]), -}; - -TEST_F('CrSettingsMenuTest', 'SettingsMenu', function() { - mocha.run(); -}); - -/** - * Test fixture for - * chrome/browser/resources/settings/settings_page/settings_subpage.html. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSubpageTest() {} - -CrSettingsSubpageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/settings_page/settings_subpage.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - 'test_util.js', - 'settings_subpage_test.js', - ]), -}; - -TEST_F('CrSettingsSubpageTest', 'All', function() { - mocha.run(); -}); - -GEN('#if !defined(OS_CHROMEOS)'); -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSystemPageTest() {} - -CrSettingsSystemPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/system_page/system_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_lifetime_browser_proxy.js', - 'system_page_tests.js', - ]), -}; - -TEST_F('CrSettingsSystemPageTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif // !defined(OS_CHROMEOS)'); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsStartupUrlsPageTest() {} - -CrSettingsStartupUrlsPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - browsePreload: 'chrome://settings/on_startup_page/startup_urls_page.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'startup_urls_page_test.js', - ]), -}; - -TEST_F('CrSettingsStartupUrlsPageTest', 'All', function() { - mocha.run(); -}); - -GEN('#if !defined(OS_MACOSX)'); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsEditDictionaryPageTest() {} - -CrSettingsEditDictionaryPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/languages_page/edit_dictionary_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../fake_chrome_event.js', - 'fake_settings_private.js', - '../test_browser_proxy.js', - 'fake_input_method_private.js', - 'fake_language_settings_private.js', - 'test_languages_browser_proxy.js', - 'edit_dictionary_page_test.js', - ]), -}; - -TEST_F('CrSettingsEditDictionaryPageTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif //!defined(OS_MACOSX)'); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsLanguagesTest() {} - -CrSettingsLanguagesTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/languages_page/languages.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '//ui/webui/resources/js/promise_resolver.js', - '../fake_chrome_event.js', - '../test_util.js', - '../test_browser_proxy.js', - 'fake_language_settings_private.js', - 'fake_settings_private.js', - 'fake_input_method_private.js', - 'test_languages_browser_proxy.js', - 'languages_tests.js', - ]), -}; - -TEST_F('CrSettingsLanguagesTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsLanguagesPageTest() {} - -CrSettingsLanguagesPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/languages_page/languages_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../fake_chrome_event.js', - '../test_util.js', - '../test_browser_proxy.js', - 'fake_settings_private.js', - 'fake_language_settings_private.js', - 'fake_input_method_private.js', - 'test_languages_browser_proxy.js', - 'languages_page_tests.js', - ]), -}; - -TEST_F('CrSettingsLanguagesPageTest', 'AddLanguagesDialog', function() { - mocha.grep(assert(languages_page_tests.TestNames.AddLanguagesDialog)).run(); -}); - -TEST_F('CrSettingsLanguagesPageTest', 'LanguageMenu', function() { - mocha.grep(assert(languages_page_tests.TestNames.LanguageMenu)).run(); -}); - -TEST_F('CrSettingsLanguagesPageTest', 'Spellcheck', function() { - mocha.grep(assert(languages_page_tests.TestNames.Spellcheck)).run(); -}); - -GEN('#if BUILDFLAG(GOOGLE_CHROME_BRANDING)'); -TEST_F('CrSettingsLanguagesPageTest', 'SpellcheckOfficialBuild', function() { - mocha.grep(assert(languages_page_tests.TestNames.SpellcheckOfficialBuild)) - .run(); -}); -GEN('#endif'); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsRouteTest() {} - -CrSettingsRouteTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/route.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'route_tests.js', - ]), -}; - -TEST_F('CrSettingsRouteTest', 'All', function() { - runMochaSuite('route'); -}); - -/** - * @constructor - * @extends {SettingsPageBrowserTest} - */ -function CrSettingsNonExistentRouteTest() {} - -CrSettingsNonExistentRouteTest.prototype = { - __proto__: CrSettingsRouteTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/non/existent/route', -}; - -// Failing on ChromiumOS dbg. https://crbug.com/709442 -GEN('#if (defined(OS_WIN) || defined(OS_CHROMEOS)) && !defined(NDEBUG)'); -GEN('#define MAYBE_NonExistentRoute DISABLED_NonExistentRoute'); -GEN('#else'); -GEN('#define MAYBE_NonExistentRoute NonExistentRoute'); -GEN('#endif'); -TEST_F('CrSettingsNonExistentRouteTest', 'MAYBE_NonExistentRoute', function() { - runMochaSuite('NonExistentRoute'); -}); - -/** - * @constructor - * @extends {SettingsPageBrowserTest} - */ -function CrSettingsRouteDynamicParametersTest() {} - -CrSettingsRouteDynamicParametersTest.prototype = { - __proto__: CrSettingsRouteTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/search?guid=a%2Fb&foo=42', -}; - -TEST_F('CrSettingsRouteDynamicParametersTest', 'All', function() { - runMochaSuite('DynamicParameters'); -}); - -/** - * Test fixture for chrome/browser/resources/settings/settings_main/. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsMainPageTest() {} - -CrSettingsMainPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/settings_main/settings_main.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - '../test_util.js', - 'settings_main_test.js', - ]), -}; - -// Times out on Windows Tests (dbg). See https://crbug.com/651296. -// Times out / crashes on chromium.linux/Linux Tests (dbg) crbug.com/667882 -GEN('#if !defined(NDEBUG)'); -GEN('#define MAYBE_MainPage DISABLED_MainPage'); -GEN('#else'); -GEN('#define MAYBE_MainPage MainPage'); -GEN('#endif'); -TEST_F('CrSettingsMainPageTest', 'MAYBE_MainPage', function() { - mocha.run(); -}); - -/** - * Test fixture for chrome/browser/resources/settings/search_settings.js. - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSearchTest() {} - -CrSettingsSearchTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/search_settings.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'search_settings_test.js', - ]), -}; - -TEST_F('CrSettingsSearchTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrCollapseRadioButtonTest() {} - -CrCollapseRadioButtonTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/collapse_radio_button.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - 'collapse_radio_button_tests.js', - ]), -}; - -TEST_F('CrCollapseRadioButtonTest', 'All', function() { - mocha.run(); -}); - - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrControlledButtonTest() {} - -CrControlledButtonTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/controlled_button.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'controlled_button_tests.js', - ]), -}; - -TEST_F('CrControlledButtonTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrControlledRadioButtonTest() {} - -CrControlledRadioButtonTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/controlled_radio_button.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'controlled_radio_button_tests.js', - ]), -}; - -TEST_F('CrControlledRadioButtonTest', 'All', function() { - mocha.run(); -}); - -GEN('#if BUILDFLAG(GOOGLE_CHROME_BRANDING) && !defined(OS_CHROMEOS)'); - -function CrSettingsMetricsReportingTest() {} - -CrSettingsMetricsReportingTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/privacy_page.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_privacy_page_browser_proxy.js', - 'metrics_reporting_tests.js', - ]), -}; - -TEST_F('CrSettingsMetricsReportingTest', 'All', function() { - mocha.run(); -}); - -GEN('#endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) && !defined(OS_CHROMEOS)'); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsExtensionControlledIndicatorTest() {} - -CrSettingsExtensionControlledIndicatorTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: - 'chrome://settings/controls/extension_controlled_indicator.html', - - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'test_extension_control_browser_proxy.js', - 'extension_controlled_indicator_tests.js', - ]), -}; - -TEST_F('CrSettingsExtensionControlledIndicatorTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsOnStartupPageTest() {} - -CrSettingsOnStartupPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/on_startup_page/on_startup_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'on_startup_page_tests.js', - ]), -}; - -TEST_F('CrSettingsOnStartupPageTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSiteFaviconTest() {} - -CrSettingsSiteFaviconTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/site_favicon.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'site_favicon_test.js', - ]), -}; - -TEST_F('CrSettingsSiteFaviconTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsBasicPageTest() {} - -CrSettingsBasicPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/basic_page/basic_page.html', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'basic_page_test.js', - ]), -}; - -TEST_F('CrSettingsBasicPageTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsAdvancedPageTest() {} - -CrSettingsAdvancedPageTest.prototype = { - __proto__: CrSettingsBrowserTest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/', - - /** @override */ - extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([ - 'settings_page_test_util.js', - 'advanced_page_test.js', - ]), -}; - -// Times out on debug builders because the Settings page can take several -// seconds to load in a Release build and several times that in a Debug build. -// See https://crbug.com/558434. -GEN('#if !defined(NDEBUG)'); -GEN('#define MAYBE_Load DISABLED_Load'); -GEN('#else'); -GEN('#define MAYBE_Load Load'); -GEN('#endif'); - -TEST_F('CrSettingsAdvancedPageTest', 'MAYBE_Load', function() { - mocha.run(); -});
diff --git a/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js b/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js deleted file mode 100644 index 23dab05..0000000 --- a/chrome/test/data/webui/settings/cr_settings_interactive_ui_tests.js +++ /dev/null
@@ -1,147 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** @fileoverview Runs the Polymer Settings interactive UI tests. */ - -// Polymer BrowserTest fixture. -GEN_INCLUDE(['//chrome/test/data/webui/polymer_interactive_ui_test.js']); - -GEN('#include "chrome/browser/ui/ui_features.h"'); - -/** - * Test fixture for interactive Polymer Settings elements. - * @constructor - * @extends {PolymerInteractiveUITest} - */ -function CrSettingsInteractiveUITest() {} - -CrSettingsInteractiveUITest.prototype = { - __proto__: PolymerInteractiveUITest.prototype, - - /** @override */ - get browsePreload() { - throw 'this is abstract and should be overriden by subclasses'; - }, - - /** @override */ - extraLibraries: [ - ...PolymerInteractiveUITest.prototype.extraLibraries, - 'ensure_lazy_loaded.js', - ], - - /** @override */ - get featureList() { - return {disabled: ['features::kSettingsPolymer3']}; - }, - - /** @override */ - setUp: function() { - PolymerInteractiveUITest.prototype.setUp.call(this); - - settings.ensureLazyLoaded(); - }, -}; - - -/** - * Test fixture for Sync Page. - * @constructor - * @extends {CrSettingsInteractiveUITest} - */ -function CrSettingsSyncPageTest() {} - -CrSettingsSyncPageTest.prototype = { - __proto__: CrSettingsInteractiveUITest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/people_page/sync_page.html', - - /** @override */ - extraLibraries: CrSettingsInteractiveUITest.prototype.extraLibraries.concat([ - '../test_browser_proxy.js', - 'sync_test_util.js', - 'test_sync_browser_proxy.js', - 'people_page_sync_page_interactive_test.js', - ]), -}; - -TEST_F('CrSettingsSyncPageTest', 'All', function() { - mocha.run(); -}); - - -/** - * @constructor - * @extends {CrSettingsInteractiveUITest} - */ -function CrSettingsAnimatedPagesTest() {} - -CrSettingsAnimatedPagesTest.prototype = { - __proto__: CrSettingsInteractiveUITest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/settings_page/settings_animated_pages.html', - - extraLibraries: CrSettingsInteractiveUITest.prototype.extraLibraries.concat([ - '../test_util.js', - 'test_util.js', - 'settings_animated_pages_test.js', - ]), -}; - -TEST_F('CrSettingsAnimatedPagesTest', 'All', function() { - mocha.run(); -}); - - -/** - * @constructor - * @extends {CrSettingsBrowserTest} - */ -function CrSettingsSecureDnsTest() {} - -CrSettingsSecureDnsTest.prototype = { - __proto__: CrSettingsInteractiveUITest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/privacy_page/secure_dns.html', - - /** @override */ - extraLibraries: CrSettingsInteractiveUITest.prototype.extraLibraries.concat([ - '../test_util.js', - '../test_browser_proxy.js', - 'test_privacy_page_browser_proxy.js', - 'secure_dns_interactive_test.js', - ]), -}; - -TEST_F('CrSettingsSecureDnsTest', 'All', function() { - mocha.run(); -}); - -/** - * @constructor - * @extends {CrSettingsInteractiveUITest} - */ -function SettingsUIInteractiveTest() {} - -SettingsUIInteractiveTest.prototype = { - __proto__: CrSettingsInteractiveUITest.prototype, - - /** @override */ - browsePreload: 'chrome://settings/settings_ui/settings_ui.html', - - /** @override */ - extraLibraries: CrSettingsInteractiveUITest.prototype.extraLibraries.concat([ - '../test_util.js', - 'settings_ui_tests.js', - ]), -}; - -// Flaky on Mac (see https://crbug.com/1065154). -GEN('#if !defined(OS_MACOSX)'); -TEST_F('SettingsUIInteractiveTest', 'All', function() { - mocha.run(); -}); -GEN('#endif');
diff --git a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js index ee2d70bc..dfb11e55 100644 --- a/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_v3_browsertest.js
@@ -430,6 +430,7 @@ ['DownloadsPage', 'downloads_page_test.m.js'], ['DropdownMenu', 'dropdown_menu_tests.m.js'], ['ExtensionControlledIndicator', 'extension_controlled_indicator_tests.m.js'], + ['HelpPage', 'help_page_v3_test.js'], ['Languages', 'languages_tests.m.js'], ['Menu', 'settings_menu_test.m.js'], ['OnStartupPage', 'on_startup_page_tests.m.js'],
diff --git a/chrome/test/data/webui/settings/help_page_browsertest.js b/chrome/test/data/webui/settings/help_page_browsertest.js deleted file mode 100644 index ca1df7f..0000000 --- a/chrome/test/data/webui/settings/help_page_browsertest.js +++ /dev/null
@@ -1,52 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** @fileoverview Material Help page tests. */ - -// Polymer BrowserTest fixture. -GEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']); - -GEN('#include "chrome/browser/ui/ui_features.h"'); - -/** - * @constructor - * @extends {PolymerTest} - */ -function SettingsHelpPageBrowserTest() {} - -SettingsHelpPageBrowserTest.prototype = { - __proto__: PolymerTest.prototype, - - /** @override */ - browsePreload: 'chrome://help/', - - /** @override */ - featureList: {disabled: ['features::kSettingsPolymer3']}, - - /** @override */ - extraLibraries: [ - ...PolymerTest.prototype.extraLibraries, - 'settings_page_test_util.js', - ], - - /** @override */ - setUp: function() { - // Intentionally bypassing SettingsPageBrowserTest#setUp. - PolymerTest.prototype.setUp.call(this); - }, -}; - -TEST_F('SettingsHelpPageBrowserTest', 'Load', function() { - // Register mocha tests. - suite('Help page', function() { - test('about section', function() { - return settings_page_test_util.getPage('about').then(function(page) { - expectTrue(!!settings_page_test_util.getSection(page, 'about')); - }); - }); - }); - - // Run all registered tests. - mocha.run(); -});
diff --git a/chrome/test/data/webui/settings/help_page_v3_test.js b/chrome/test/data/webui/settings/help_page_v3_test.js new file mode 100644 index 0000000..4f82da3 --- /dev/null +++ b/chrome/test/data/webui/settings/help_page_v3_test.js
@@ -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. + +/** @fileoverview Suite of tests for the Settings help page. */ + +// clang-format off +import 'chrome://settings/settings.js'; +import {getPage, getSection} from 'chrome://test/settings/settings_page_test_util.m.js'; +import {waitBeforeNextRender} from 'chrome://test/test_util.m.js'; +// clang-format on + +// Register mocha tests. +suite('SettingsHelpPage', function() { + setup(function() { + PolymerTest.clearBody(); + // The ChromeContentBrowserClient will rewrite chrome://help to + // chrome://settings/help. + window.history.pushState('', 'Test', 'chrome://settings/help'); + const settingsUi = document.createElement('settings-ui'); + document.body.appendChild(settingsUi); + + // Wait for the dom-if. + return waitBeforeNextRender(settingsUi); + }); + + test('about section', async () => { + const page = await getPage('about'); + expectTrue(!!getSection(page, 'about')); + }); +});
diff --git a/chrome/test/data/webui/settings/settings_idle_load_browsertest.js b/chrome/test/data/webui/settings/settings_idle_load_browsertest.js deleted file mode 100644 index bcfe82f..0000000 --- a/chrome/test/data/webui/settings/settings_idle_load_browsertest.js +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** @fileoverview Tests for settings-idle-load. */ - -GEN('#include "chrome/browser/ui/ui_features.h"'); - -/** - * @constructor - * @extends testing.Test - */ -function SettingsIdleLoadBrowserTest() {} - -SettingsIdleLoadBrowserTest.prototype = { - __proto__: testing.Test.prototype, - - /** @override */ - browsePreload: 'chrome://settings/controls/setting_idle_load.html', - - /** @override */ - extraLibraries: [ - '//third_party/mocha/mocha.js', - '../mocha_adapter.js', - 'idle_load_tests.js', - ], - - /** @override */ - get featureList() { - return {disabled: ['features::kSettingsPolymer3']}; - }, - - /** @override */ - isAsync: true, -}; - -TEST_F('SettingsIdleLoadBrowserTest', 'All', function() { - // Run all registered tests. - mocha.run(); -});
diff --git a/chrome/test/enterprise/e2e/.vpython b/chrome/test/enterprise/e2e/.vpython index 5949f55..ba49ded 100644 --- a/chrome/test/enterprise/e2e/.vpython +++ b/chrome/test/enterprise/e2e/.vpython
@@ -11,8 +11,8 @@ wheel: < name: "infra/celab/celab/windows-amd64" - # Source: https://ci.chromium.org/p/celab/builders/ci/Windows/b8887343739468092128 - version: "eZVniNpxV0CKdJ9K-_ooB5E4hvLmLlecU3erim2nPycC" + # Source: https://ci.chromium.org/p/celab/builders/ci/Windows/b8885329255459559360 + version: "pqWO7Z0XWimF3y7aev5Hwg2h3lYz7_abIqxmm-7hjMkC" > # googleapiclient
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn index 15013c46..c29023c 100644 --- a/chromeos/BUILD.gn +++ b/chromeos/BUILD.gn
@@ -46,9 +46,12 @@ "//chromeos/dbus", "//chromeos/dbus/constants", "//components/policy/proto", + "//crypto", + "//crypto:platform", "//google_apis", "//services/network/public/cpp:cpp", "//third_party/protobuf:protobuf_lite", + "//third_party/zlib/google:compression_utils", ] sources = [ "hugepage_text/hugepage_text.cc", @@ -61,6 +64,9 @@ "memory/pagemap.h", "memory/swap_configuration.cc", "memory/swap_configuration.h", + "memory/userspace_swap/region.h", + "memory/userspace_swap/swap_storage.cc", + "memory/userspace_swap/swap_storage.h", "policy/weekly_time/time_utils.cc", "policy/weekly_time/time_utils.h", "policy/weekly_time/weekly_time.cc", @@ -184,6 +190,8 @@ "//components/policy/proto", "//components/prefs:test_support", "//components/proxy_config", + "//crypto", + "//crypto:platform", "//dbus:test_support", "//google_apis", "//mojo/core/embedder", @@ -198,6 +206,7 @@ ] sources = [ "memory/pagemap_unittest.cc", + "memory/userspace_swap/swap_storage_unittest.cc", "policy/weekly_time/time_utils_unittest.cc", "policy/weekly_time/weekly_time_interval_unittest.cc", "policy/weekly_time/weekly_time_unittest.cc",
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 83c6789..c06beb3c 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -13039.0.0 \ No newline at end of file +13040.0.0 \ No newline at end of file
diff --git a/chromeos/chromeos_export.h b/chromeos/chromeos_export.h index 24b88c7..1f0cec8 100644 --- a/chromeos/chromeos_export.h +++ b/chromeos/chromeos_export.h
@@ -15,7 +15,7 @@ #endif // defined(CHROMEOS_IMPLEMENTATION) #else // defined(WIN32) -#if defined(CHROMEOS_IMPLEMENTATION) +#if defined(CHROMEOS_IMPLEMENTATION) || defined(IS_CHROMEOS_SYSTEM_IMPL) #define CHROMEOS_EXPORT __attribute__((visibility("default"))) #else #define CHROMEOS_EXPORT
diff --git a/chromeos/components/trial_group/trial_group_checker.cc b/chromeos/components/trial_group/trial_group_checker.cc index a128f4fb..1de11b8 100644 --- a/chromeos/components/trial_group/trial_group_checker.cc +++ b/chromeos/components/trial_group/trial_group_checker.cc
@@ -66,8 +66,7 @@ base::JSONReader::ValueWithError membership_info = base::JSONReader::ReadAndReturnValueWithError(*response_body, base::JSON_PARSE_RFC); - if (membership_info.error_code != base::JSONReader::JSON_NO_ERROR || - !membership_info.value->is_dict()) { + if (!membership_info.value || !membership_info.value->is_dict()) { std::move(callback_).Run(false); return; }
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc index 73124fc7..cf4d8e7 100644 --- a/chromeos/constants/chromeos_features.cc +++ b/chromeos/constants/chromeos_features.cc
@@ -197,7 +197,7 @@ base::FEATURE_DISABLED_BY_DEFAULT}; // The new ChromeOS Help App. https://crbug.com/1012578. -const base::Feature kHelpAppV2{"HelpAppV2", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kHelpAppV2{"HelpAppV2", base::FEATURE_ENABLED_BY_DEFAULT}; // Enable or disable Unified Input Logic for HMM decoder in the IME extension // on Chrome OS.
diff --git a/chromeos/memory/DEPS b/chromeos/memory/DEPS new file mode 100644 index 0000000..762b363 --- /dev/null +++ b/chromeos/memory/DEPS
@@ -0,0 +1,4 @@ +# These deps should be only the required deps for //chromeos/memory +include_rules = [ + "+third_party/zlib/google", +]
diff --git a/chromeos/memory/userspace_swap/region.h b/chromeos/memory/userspace_swap/region.h new file mode 100644 index 0000000..85f75fc --- /dev/null +++ b/chromeos/memory/userspace_swap/region.h
@@ -0,0 +1,98 @@ +// 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_MEMORY_USERSPACE_SWAP_REGION_H_ +#define CHROMEOS_MEMORY_USERSPACE_SWAP_REGION_H_ + +#include <sys/uio.h> +#include <cstdint> +#include <vector> + +#include "base/containers/span.h" +#include "base/numerics/checked_math.h" +#include "base/strings/string_piece.h" + +namespace chromeos { +namespace memory { +namespace userspace_swap { + +// A region describes a block of memory. +class Region { + public: + uintptr_t address = 0; + uintptr_t length = 0; + + Region() = default; + Region(Region&&) = default; + Region(const Region&) = default; + Region& operator=(const Region&) = default; + Region& operator=(Region&&) = default; + + // To avoid requiring callers to cast pointers or integral types to Regions, + // we're flexible and allow any pointer type or any integral type. We convert + // them to the types needed for a Region. This simplifies calling code + // tremendously. Static asserts enforce that the types are valid. + template <typename Address, typename Length> + Region(Address* address, Length length) + : address(reinterpret_cast<uintptr_t>(const_cast<Address*>(address))), + length(length) { + static_assert(std::is_integral<Length>::value, + "length must be an integral type"); + static_assert(sizeof(Length) <= sizeof(uintptr_t), + "Length cannot be longer than uint64_t"); + + // Verify that the end of this region is valid and wouldn't overflow if we + // added length to the address. + CHECK((base::CheckedNumeric<uintptr_t>(this->address) + this->length) + .IsValid()); + } + + template <typename Address, typename Length> + Region(Address address, Length length) + : Region(reinterpret_cast<void*>(address), length) { + static_assert(sizeof(Address) <= sizeof(void*), + "Address cannot be longer than a pointer type"); + } + + template <typename Address> + Region(Address address) : Region(address, 1) { + static_assert( + std::is_integral<Address>::value || std::is_pointer<Address>::value, + "Adress must be integral or pointer type"); + } + + template <typename T> + Region(const std::vector<T>& vec) + : Region(vec.data(), vec.size() * sizeof(T)) {} + + // AsIovec will return the iovec representation of this Region. + struct iovec AsIovec() const { + return {.iov_base = reinterpret_cast<void*>(address), .iov_len = length}; + } + + base::StringPiece AsStringPiece() const { + return base::StringPiece(reinterpret_cast<char*>(address), length); + } + + template <typename T> + base::span<T> AsSpan() const { + return base::span<T>(reinterpret_cast<T*>(address), length); + } + + bool operator<(const Region& other) const { + // Because the standard library treats equality as !less(a,b) && !less(b,a) + // our definition of less than will be that this has to be FULLY before + // other. Overlapping regions are not allowed and are explicitly checked + // before inserting by using find() any overlap would return equal, this + // also has the property that you can search for a Region of length 1 to + // find the mapping for a fault. + return ((address + length - 1) < other.address); + } +}; + +} // namespace userspace_swap +} // namespace memory +} // namespace chromeos + +#endif // CHROMEOS_MEMORY_USERSPACE_SWAP_REGION_H_
diff --git a/chromeos/memory/userspace_swap/swap_storage.cc b/chromeos/memory/userspace_swap/swap_storage.cc new file mode 100644 index 0000000..9d359cf8 --- /dev/null +++ b/chromeos/memory/userspace_swap/swap_storage.cc
@@ -0,0 +1,478 @@ +// 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 "chromeos/memory/userspace_swap/swap_storage.h" + +#include <fcntl.h> +#include <linux/userfaultfd.h> +#include <poll.h> +#include <stdlib.h> +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <sys/syscall.h> +#include <sys/vfs.h> +#include <unistd.h> +#include <cstring> + +#include "base/bind.h" +#include "base/containers/span.h" +#include "base/files/file_util.h" +#include "base/files/scoped_file.h" +#include "base/macros.h" +#include "base/no_destructor.h" +#include "base/numerics/checked_math.h" +#include "base/path_service.h" +#include "base/posix/eintr_wrapper.h" +#include "base/process/process_metrics.h" +#include "base/task/post_task.h" +#include "base/threading/scoped_blocking_call.h" +#include "crypto/aead.h" +#include "crypto/random.h" +#include "third_party/zlib/google/compression_utils.h" + +namespace chromeos { +namespace memory { +namespace userspace_swap { + +namespace { + +// Adds a compression layer to a SwapFile. +class CompressedSwapFile : public SwapFile { + public: + ~CompressedSwapFile() override; + + // SwapFile impl: + bool WriteToSwap(const Region& src, Region* swap_region) override; + ssize_t ReadFromSwap(const Region& swap_region, const Region& dest) override; + + protected: + friend class SwapFile; + friend class EncryptedCompressedSwapFile; + + explicit CompressedSwapFile(base::ScopedFD fd); + + // Compress will compress the region |src| into the region |dest| returning + // true if successful. Upon successful completion |compressed_size| will + // contain the number of compressed bytes written to |dest|. + static bool Compress(const Region& src, + const Region& dest, + size_t* compressed_size); + + // Decompress will decompress the region |src| into |dest|. It is expected + // that |dest| be large enough to hold the decompressed buffer, the return + // value is the number of decompressed bytes. + static ssize_t Decompress(const Region& src, const Region& dest); + + private: + DISALLOW_COPY_AND_ASSIGN(CompressedSwapFile); +}; + +// Adds an encryption layer to a SwapFile. +class EncryptedSwapFile : public SwapFile { + public: + ~EncryptedSwapFile() override; + + // SwapFile impl: + bool WriteToSwap(const Region& src, Region* swap_region) override; + ssize_t ReadFromSwap(const Region& swap_region, const Region& dest) override; + + protected: + friend class SwapFile; + + explicit EncryptedSwapFile(base::ScopedFD fd); + + // This key and nonce are random and ephemeral. + crypto::Aead aead_; + std::vector<uint8_t> key_; + std::vector<uint8_t> nonce_; + + private: + DISALLOW_COPY_AND_ASSIGN(EncryptedSwapFile); +}; + +// Adds a encryption layer to a compressed swap file. +class EncryptedCompressedSwapFile : public EncryptedSwapFile { + public: + ~EncryptedCompressedSwapFile() override; + + // SwapFile impl: + bool WriteToSwap(const Region& src, Region* swap_region) override; + ssize_t ReadFromSwap(const Region& swap_region, const Region& dest) override; + + protected: + friend class SwapFile; + + explicit EncryptedCompressedSwapFile(base::ScopedFD fd); + + private: + DISALLOW_COPY_AND_ASSIGN(EncryptedCompressedSwapFile); +}; + +// Because for some inputs that aren't compressible it can result in a size +// that's slightly larger, we allow for this. +constexpr size_t kCompressionExtra = 32 << 10; + +} // namespace + +// Static +std::unique_ptr<SwapFile> SwapFile::Create(Type type) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + // We enforce that the file is encrypted. + CHECK(type & Type::kEncrypted); + + base::FilePath directory; + if (!GetDirectoryForSwapFile(&directory)) { + return nullptr; + } + + // We open the file with O_TMPFILE which creates an unnamed inode and anything + // written to the file will be lost when this fd is closed. O_EXCL prevents + // this file from being linked to the filesystem. Note, O_EXCL behaves + // differently because of O_TMPFILE. For more information on this see man 2 + // open. + base::ScopedFD swap_fd(HANDLE_EINTR( + open(directory.value().c_str(), O_TMPFILE | O_EXCL | O_RDWR | O_CLOEXEC, + S_IRUSR | S_IWUSR))); + + if (!swap_fd.is_valid()) { + PLOG(ERROR) << "Unable to open a temporary swap file in " << directory; + return nullptr; + } + + return SwapFile::WrapFD(std::move(swap_fd), type); +} + +std::unique_ptr<SwapFile> SwapFile::WrapFD(base::ScopedFD swap_fd, Type type) { + std::unique_ptr<SwapFile> swap; + if (type == (Type::kCompressed | Type::kEncrypted)) { + swap.reset(new EncryptedCompressedSwapFile(std::move(swap_fd))); + } else if (type == Type::kCompressed) { + swap.reset(new CompressedSwapFile(std::move(swap_fd))); + } else if (type == Type::kEncrypted) { + swap.reset(new EncryptedSwapFile(std::move(swap_fd))); + } else { + swap.reset(new SwapFile(std::move(swap_fd))); + } + + return swap; +} + +SwapFile::~SwapFile() = default; +SwapFile::SwapFile(base::ScopedFD fd) : fd_(std::move(fd)) {} + +base::ScopedFD SwapFile::ReleaseFD() { + return std::move(fd_); +} + +uint64_t SwapFile::GetUsageKB() const { + struct stat statbuf = {}; + fstat(fd_.get(), &statbuf); + // fstat returns the number of 512byte blocks, we convert to KB. + return (statbuf.st_blocks * 512) >> 10; +} + +// Static +bool SwapFile::GetDirectoryForSwapFile(base::FilePath* file_path) { + // We cache the file path so we don't have to repeatedly call these functions. + static base::FilePath cached_path = []() -> base::FilePath { + // We try to look for the unecrypted swap folder first, if it doesn't exist + // we will fall back the user's home directory. If that happens it means + // we're encrypted before writing to an encrypted file system so we log a + // warning. + const base::FilePath swap_folder( + "/mnt/stateful_partition/unencrypted/swap/"); + if (base::PathExists(swap_folder)) { + return swap_folder; + } + + LOG(WARNING) << "Swap folder " << swap_folder + << " did not exist so userspace swap will be be disabled"; + return base::FilePath(); + }(); + + if (!cached_path.empty()) { + *file_path = cached_path; + return true; + } + + return false; +} + +// Static +uint64_t SwapFile::GetBackingStoreFreeSpaceKB() { + base::FilePath swap_file_dir; + if (!GetDirectoryForSwapFile(&swap_file_dir)) { + return 0; + } + + struct statfs buf = {}; + if (statfs(swap_file_dir.value().c_str(), &buf) < 0) { + PLOG(ERROR) << "Unable to get backing store space freespace for swap"; + return 0; + } + + // Convert number of blocks to KB. + return (buf.f_bavail * buf.f_bsize) >> 10; +} + +bool SwapFile::WriteToSwap(const Region& src, Region* swap_region) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + // Writes are the only operations that cannot happen concurrently. Writes use + // write(2) and adjust the file pointer so this is a critical section. Reads + // and drops use position pread(2)/fallocate(2) and can safely be performed + // concurrently as they only access those regions and do not affect the file + // pointer. + base::AutoLock scoped_lock(write_lock_); + + // We capture the current file pointer to determine where we started writing + // at. + DCHECK(swap_region); + swap_region->address = lseek(fd_.get(), 0, SEEK_CUR); + swap_region->length = 0; + + while (swap_region->length < src.length) { + int bytes_written = HANDLE_EINTR(write( + fd_.get(), reinterpret_cast<char*>(src.address) + swap_region->length, + src.length - swap_region->length)); + + if (bytes_written <= 0) { + // We want the user to see errno from the write(2) call and not from + // lseek(2) should it also fail. + int write_failed_errno = errno; + + // Seek back the file pointer as anything partially written is not + // tracked and would have been wasted file space. + lseek(fd_.get(), swap_region->address, SEEK_SET); + + // We want the user to see errno from the write(2) call and not from + // lseek(2). + errno = write_failed_errno; + swap_region->address = 0; + swap_region->length = 0; + return false; + } + + swap_region->length += bytes_written; + } + + return true; +} + +ssize_t SwapFile::ReadFromSwap(const Region& swap_region, const Region& dest) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + CHECK_EQ(swap_region.length, dest.length); + + uint64_t bytes_read = 0; + while (bytes_read < swap_region.length) { + int64_t res = HANDLE_EINTR(pread( + fd_.get(), reinterpret_cast<char*>(dest.address) + bytes_read, + swap_region.length - bytes_read, swap_region.address + bytes_read)); + if (res <= 0) { + return res; + } + + bytes_read += res; + } + return bytes_read; +} + +bool SwapFile::DropFromSwap(const Region& swap_region) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + int res = HANDLE_EINTR(fallocate(fd_.get(), + FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, + swap_region.address, swap_region.length)); + if (res < 0) { + return false; + } + + return true; +} + +CompressedSwapFile::~CompressedSwapFile() = default; + +CompressedSwapFile::CompressedSwapFile(base::ScopedFD fd) + : SwapFile(std::move(fd)) {} + +// Static +inline bool CompressedSwapFile::Compress(const Region& src, + const Region& dest, + size_t* compressed_size) { + return compression::GzipCompress(src.AsStringPiece(), + reinterpret_cast<char*>(dest.address), + dest.length, compressed_size, + /* malloc_fn= */ nullptr, + /* free_fn= */ nullptr); +} + +bool CompressedSwapFile::WriteToSwap(const Region& src, Region* swap_region) { + // We use a larger buffer because in some situations the compression can + // actually be larger than the input, while this is very rare we allow for it. + uint64_t buf_size = + (base::CheckedNumeric<uint64_t>(src.length) + kCompressionExtra) + .ValueOrDie(); + std::vector<uint8_t> compressed_buf(buf_size); + + size_t compressed_size = 0; + + // Compress src into compressed buf. + if (!CompressedSwapFile::Compress(src, Region(compressed_buf), + &compressed_size)) { + errno = EIO; + return false; + } + compressed_buf.resize(compressed_size); + + // Now write our compressed buffer to disk. + return SwapFile::WriteToSwap(Region(compressed_buf), swap_region); +} + +// Static +inline ssize_t CompressedSwapFile::Decompress(const Region& src, + const Region& dest) { + uint32_t uncompressed_size = + compression::GetUncompressedSize(src.AsStringPiece()); + CHECK_EQ(dest.length, uncompressed_size); + + if (!compression::GzipUncompress(src.AsStringPiece(), dest.AsStringPiece())) { + errno = EIO; + return -1; + } + + return uncompressed_size; +} + +ssize_t CompressedSwapFile::ReadFromSwap(const Region& swap_region, + const Region& dest) { + // Read from disk and then decompress directly into the buffer. + std::vector<uint8_t> compressed_buf(swap_region.length); + + ssize_t read_res = + SwapFile::ReadFromSwap(swap_region, Region(compressed_buf)); + if (read_res != static_cast<ssize_t>(swap_region.length)) { + return read_res; + } + compressed_buf.resize(read_res); + + return CompressedSwapFile::Decompress(Region(compressed_buf), dest); +} + +EncryptedSwapFile::~EncryptedSwapFile() { + memset(key_.data(), 0, key_.size()); + memset(nonce_.data(), 0, nonce_.size()); +} + +EncryptedSwapFile::EncryptedSwapFile(base::ScopedFD fd) + : SwapFile(std::move(fd)), aead_(crypto::Aead::AES_256_GCM_SIV) { + key_.resize(aead_.KeyLength()); + nonce_.resize(aead_.NonceLength()); + + CHECK_EQ(aead_.KeyLength(), key_.size()); + CHECK_EQ(aead_.NonceLength(), nonce_.size()); + + crypto::RandBytes(nonce_); + crypto::RandBytes(key_); + + aead_.Init(key_); +} + +bool EncryptedSwapFile::WriteToSwap(const Region& src, Region* swap_region) { + std::vector<uint8_t> cipher_text = + aead_.Seal(src.AsSpan<const uint8_t>(), nonce_, + /* additional data */ base::span<const uint8_t>()); + if (cipher_text.empty()) { + LOG(ERROR) << "Unable to encrypt region"; + errno = EIO; + return false; + } + + // Write the encrypted contents to disk. + return SwapFile::WriteToSwap(Region(cipher_text), swap_region); +} + +ssize_t EncryptedSwapFile::ReadFromSwap(const Region& swap_region, + const Region& dest) { + // Start by reading the contents from the swap file and then decrypt it. + std::vector<uint8_t> cipher_text(swap_region.length); + ssize_t read_bytes = SwapFile::ReadFromSwap(swap_region, Region(cipher_text)); + if (read_bytes != static_cast<ssize_t>(swap_region.length)) { + errno = EIO; + return -1; + } + cipher_text.resize(read_bytes); + + base::Optional<std::vector<uint8_t>> decrypted = + aead_.Open(cipher_text, nonce_, + /* additional data */ base::span<const uint8_t>()); + if (!decrypted) { + LOG(ERROR) << "Decryption failure"; + errno = EIO; + return -1; + } + + if (dest.length < decrypted.value().size()) { + LOG(ERROR) << "Decryption buffer too small"; + errno = ENOMEM; + return -1; + } + + memcpy(reinterpret_cast<void*>(dest.address), decrypted.value().data(), + decrypted.value().size()); + return decrypted.value().size(); +} + +EncryptedCompressedSwapFile::~EncryptedCompressedSwapFile() = default; +EncryptedCompressedSwapFile::EncryptedCompressedSwapFile(base::ScopedFD fd) + : EncryptedSwapFile(std::move(fd)) {} + +ssize_t EncryptedCompressedSwapFile::ReadFromSwap(const Region& swap_region, + const Region& dest) { + // First read from the encrypted swap file then decompress. Because + // compression may have resulted in a size which is larger than the original + // payload for some rare inputs we allow for this. + uint64_t buf_size = + (base::CheckedNumeric<uint64_t>(dest.length) + kCompressionExtra) + .ValueOrDie(); + std::vector<uint8_t> compressed_buf(buf_size); + + ssize_t read_res = + EncryptedSwapFile::ReadFromSwap(swap_region, Region(compressed_buf)); + if (read_res == -1) { + PLOG(ERROR) << "Read failed " << read_res; + return read_res; + } + compressed_buf.resize(read_res); + + // Decompress directly into the destination region. + return CompressedSwapFile::Decompress(Region(compressed_buf), dest); +} + +bool EncryptedCompressedSwapFile::WriteToSwap(const Region& src, + Region* swap_region) { + // First compress the memory and then write to encrypted swap file. + + // We use a larger buffer because in some situations the compression can + // actually be larger than the input, while this is very rare we allow for it. + uint64_t buf_size = + (base::CheckedNumeric<uint64_t>(src.length) + kCompressionExtra) + .ValueOrDie(); + std::vector<uint8_t> compressed_buf(buf_size); + size_t compressed_size = 0; + + if (!CompressedSwapFile::Compress(src, Region(compressed_buf), + &compressed_size)) { + return false; + } + compressed_buf.resize(compressed_size); + + // Now write to the EncryptedSwapFile. + return EncryptedSwapFile::WriteToSwap(Region(compressed_buf), swap_region); +} + +} // namespace userspace_swap +} // namespace memory +} // namespace chromeos
diff --git a/chromeos/memory/userspace_swap/swap_storage.h b/chromeos/memory/userspace_swap/swap_storage.h new file mode 100644 index 0000000..6969411 --- /dev/null +++ b/chromeos/memory/userspace_swap/swap_storage.h
@@ -0,0 +1,95 @@ +// 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_MEMORY_USERSPACE_SWAP_SWAP_STORAGE_H_ +#define CHROMEOS_MEMORY_USERSPACE_SWAP_SWAP_STORAGE_H_ + +#include "base/files/file_path.h" +#include "base/files/scoped_file.h" +#include "base/macros.h" +#include "base/memory/weak_ptr.h" +#include "base/synchronization/lock.h" +#include "chromeos/chromeos_export.h" +#include "chromeos/memory/userspace_swap/region.h" + +namespace chromeos { +namespace memory { +namespace userspace_swap { + +// SwapFile is the implementation for a disk backed swap file. This class is +// thread safe as synchronization is handled internally where necessary. +class CHROMEOS_EXPORT SwapFile { + public: + virtual ~SwapFile(); + + enum Type { + // kStandard is a normal file without compression or encryption. + kStandard = 0, + // kCompressed is an optional compression layer. + kCompressed = (1 << 1), + // kEncrypted is an optional encryption layer. + kEncrypted = (1 << 2), + // You can use both modes with a bitwise or kCompressed | kEncrypted. + }; + + // Create a new swap file, this can only be called from the browser as + // renderer seccomp policies would not allow it. Note: kEncrypted is + // required for ALL swap files, this call will fail without kEncrypted. + static std::unique_ptr<SwapFile> Create(Type type); + + // GetBackingStoreFreeSpaceKB() returns the number of KB free on the backing + // device. + static uint64_t GetBackingStoreFreeSpaceKB(); + + // WriteToSwap will write a memory region from |source| into the swap file. + // Upon successful completion the method will return true and |swap_region| + // will contain the Region for where it was written in swap. This method will + // return false on error and errno will be set. + virtual bool WriteToSwap(const Region& source, Region* swap_region); + + // ReadFromSwap reads the |swap_region| from the swap file writing it into + // |dest|. The return value is the number of bytes read from the swap file. On + // error ReadFromSwap will return -1 and errno will be set. + virtual ssize_t ReadFromSwap(const Region& swap_region, const Region& dest); + + // DropFromSwap can be used to reclaim the disk blocks for |swap_region|, it + // punches a hole in the file to accomplish this and may not immediately be + // reflected when the block is still partially in use by another region. This + // method will return false on failure and errno will be set. + virtual bool DropFromSwap(const Region& swap_region); + + // GetUsageKB returns the number of KiB the swap file is currently using on + // disk. + virtual uint64_t GetUsageKB() const; + + // ReleaseFD is used for donating the internal fd. + base::ScopedFD ReleaseFD(); + + protected: + static bool GetDirectoryForSwapFile(base::FilePath* file_path); + + // Given an FD to an already open swap file wrap it into a SwapFile class, + // this is primarily for ease of testing each implementation. + static std::unique_ptr<SwapFile> WrapFD(base::ScopedFD swap_fd, Type type); + + explicit SwapFile(base::ScopedFD fd); + + base::ScopedFD fd_; + + private: + friend class SwapStorageTest; + + // We use this lock to serialize WriteToSwap calls. (Concurrent reads and + // drops are safe, because they use syscalls which do not rely on the file + // pointer, specifically pread(2) and fallocate(2) respectively). + base::Lock write_lock_; + + DISALLOW_COPY_AND_ASSIGN(SwapFile); +}; + +} // namespace userspace_swap +} // namespace memory +} // namespace chromeos + +#endif // CHROMEOS_MEMORY_USERSPACE_SWAP_SWAP_STORAGE_H_
diff --git a/chromeos/memory/userspace_swap/swap_storage_unittest.cc b/chromeos/memory/userspace_swap/swap_storage_unittest.cc new file mode 100644 index 0000000..b76abc5 --- /dev/null +++ b/chromeos/memory/userspace_swap/swap_storage_unittest.cc
@@ -0,0 +1,192 @@ +// Copyright (c) 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 "chromeos/memory/userspace_swap/swap_storage.h" + +#include <fcntl.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <chrono> +#include <random> + +#include "base/files/file_util.h" +#include "base/files/scoped_file.h" +#include "base/logging.h" +#include "base/posix/eintr_wrapper.h" +#include "chromeos/memory/userspace_swap/region.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { +namespace memory { +namespace userspace_swap { + +class SwapStorageTest : public testing::Test, + public testing::WithParamInterface<SwapFile::Type> { + public: + SwapStorageTest() + : random_(/* seen prng */ + std::chrono::system_clock::now().time_since_epoch().count()) {} + + protected: + void SetUp() override { + // Start by creating a temporary file we will use for this test and then + // wrapping it in the swap type we're testing. + base::FilePath temp_file; + ASSERT_TRUE(base::CreateTemporaryFile(&temp_file)); + + base::ScopedFD swap_fd; + swap_fd.reset(HANDLE_EINTR(open(temp_file.MaybeAsASCII().c_str(), + O_RDWR | O_CLOEXEC, S_IRUSR | S_IWUSR))); + + ASSERT_NE(unlink(temp_file.MaybeAsASCII().c_str()), -1); + + ASSERT_TRUE(swap_fd.is_valid()); + + // Wrap this FD in the swap file type for this test. + swap_ = SwapFile::WrapFD(std::move(swap_fd), GetParam()); + ASSERT_NE(swap_, nullptr); + } + + void FillRandom(std::string* str, int size) { + for (int j = 0; j < size; ++j) { + str->append(1, static_cast<char>(random_() % 255)); + } + + ASSERT_EQ(str->size(), static_cast<std::string::size_type>(size)); + } + + std::default_random_engine random_; + std::unique_ptr<SwapFile> swap_; +}; + +// We test all the different variations of a swap file to make sure all +// functionality is properly implemented, this will test: +// - Standard swap file with no compression or encryption. +// - A compressed swap file. +// - An encrypted swap file. +// - A compressed and encrypted swap file. +INSTANTIATE_TEST_SUITE_P( + SwapStorageTest, + SwapStorageTest, + testing::Values( + SwapFile::Type::kStandard /* no compression or encryption */, + SwapFile::Type::kCompressed, + SwapFile::Type::kEncrypted, + SwapFile::Type::kEncrypted | SwapFile::Type::kCompressed)); + +TEST_P(SwapStorageTest, SimpleWriteRead) { + std::string buffer = "hello world"; + + // Swap address can be at index 0 so we use UINT64_MAX to differentiate. + Region swap_region(std::numeric_limits<uint64_t>::max(), 0); + + // Write it to swap and validate we also got back sane values for swap pos and + // length. + ASSERT_TRUE(swap_->WriteToSwap(Region(buffer.c_str(), buffer.length()), + &swap_region)); + ASSERT_NE(swap_region.address, std::numeric_limits<uint64_t>::max()); + ASSERT_NE(swap_region.length, 0u); + + // Read the region from swap in [swap_pos, swap_pos + swap_len] + char read_buf[buffer.length()]; + memset(read_buf, 0, sizeof(read_buf)); + ASSERT_EQ( + swap_->ReadFromSwap(swap_region, Region(read_buf, sizeof(read_buf))), + static_cast<ssize_t>(sizeof(read_buf))); + + // We should have correctly read back what we wrote. + ASSERT_EQ(memcmp(read_buf, buffer.c_str(), sizeof(read_buf)), 0); +} + +TEST_P(SwapStorageTest, ManyWriteRead) { + // Write 1000 random length buffers and then read them back in a random order + // and make sure they are as expected. + std::vector<std::pair<std::string, Region>> buffers; + + constexpr int kNumBuffers = 1000; + buffers.reserve(kNumBuffers); + for (int i = 0; i < kNumBuffers; ++i) { + // Choose a random length between 1 byte and 10KB + int buffer_len = (random_() % (10 << 10)) + 1; + std::string buf; + buf.reserve(buffer_len); + FillRandom(&buf, buffer_len); + + // Swap pos can be at index 0 so we use UINT64_MAX to differentiate. + Region swap_region(std::numeric_limits<uint64_t>::max(), 0); + + // Write it to swap and validate we also got back sane values for swap pos + // and length. + ASSERT_TRUE( + swap_->WriteToSwap(Region(buf.c_str(), buf.size()), &swap_region)); + ASSERT_NE(swap_region.address, std::numeric_limits<uint64_t>::max()); + ASSERT_NE(swap_region.length, 0u); + + // Save where this buffer was written. + buffers.emplace_back(std::move(buf), swap_region); + } + + // Shuffle the ordering of the buffers so we read them back in a random order. + std::shuffle(buffers.begin(), buffers.end(), random_); + + // Read back all the regions and verify. + for (const auto& buf : buffers) { + char read_buf[buf.first.size()]; + memset(read_buf, 0, sizeof(read_buf)); + ASSERT_EQ(swap_->ReadFromSwap(/* Region */ buf.second, + Region(read_buf, sizeof(read_buf))), + static_cast<ssize_t>(sizeof(read_buf))); + + // We should have correctly read back what we wrote. + ASSERT_EQ(memcmp(read_buf, buf.first.c_str(), sizeof(read_buf)), 0); + + // Now drop it from the swap. + ASSERT_TRUE(swap_->DropFromSwap(/* Region */ buf.second)); + } +} + +TEST_P(SwapStorageTest, DropFromSwap) { + // This test validates that we can drop what we wrote from the swap file and + // the block size will return to the original size. + uint64_t block_size_kb_before = swap_->GetUsageKB(); + std::string buffer; + + // We want to fill buffer with what should be many blocks of random data so we + // can fully observe the growing and shrinking size. + FillRandom(&buffer, 32 * (4 << 10)); + + // Swap pos can be at index 0 so we use UINT64_MAX to differentiate. + Region swap_region(std::numeric_limits<uint64_t>::max(), 0); + + // Write it to swap and validate we also got back sane values for swap pos and + // length. + ASSERT_TRUE( + swap_->WriteToSwap(Region(buffer.c_str(), buffer.size()), &swap_region)); + ASSERT_NE(swap_region.address, std::numeric_limits<uint64_t>::max()); + ASSERT_NE(swap_region.length, 0u); + + uint64_t block_size_kb = swap_->GetUsageKB(); + ASSERT_GT(block_size_kb, block_size_kb_before); + + // Read the region from swap in [swap_pos, swap_pos + swap_len] + char read_buf[buffer.length()]; + memset(read_buf, 0, sizeof(read_buf)); + ASSERT_EQ( + swap_->ReadFromSwap(swap_region, Region(read_buf, sizeof(read_buf))), + static_cast<ssize_t>(sizeof(read_buf))); + + // We should have correctly read back what we wrote. + ASSERT_EQ(memcmp(read_buf, buffer.c_str(), sizeof(read_buf)), 0); + + // Now we will drop it. + ASSERT_TRUE(swap_->DropFromSwap(swap_region)); + + // Finally check the size. + uint64_t block_size_kb_end = swap_->GetUsageKB(); + ASSERT_LT(block_size_kb_end, block_size_kb); +} + +} // namespace userspace_swap +} // namespace memory +} // namespace chromeos
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc index dbcf775c..b052bc2 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -454,12 +454,9 @@ void AssistantManagerServiceImpl::StartEditReminderInteraction( const std::string& client_id) { - const std::string interaction = CreateEditReminderInteraction(client_id); - assistant_client::VoicelessOptions voiceless_options; - - voiceless_options.is_user_initiated = true; - assistant_manager_internal_->SendVoicelessInteraction( - interaction, std::string(), voiceless_options, [](auto) {}); + SendVoicelessInteraction(CreateEditReminderInteraction(client_id), + /*description=*/std::string(), + /*is_user_initiated=*/true); } void AssistantManagerServiceImpl::StartScreenContextInteraction( @@ -528,11 +525,9 @@ SerializeNotificationRequestInteraction( notification_id, consistency_token, opaque_token, action_index); - assistant_client::VoicelessOptions options; - options.is_user_initiated = true; - - assistant_manager_internal_->SendVoicelessInteraction( - request_interaction, "RequestNotification", options, [](auto) {}); + SendVoicelessInteraction(request_interaction, + /*description=*/"RequestNotification", + /*is_user_initiated=*/true); } void AssistantManagerServiceImpl::DismissNotification( @@ -555,7 +550,8 @@ options.obfuscated_gaia_id = notification->obfuscated_gaia_id; assistant_manager_internal_->SendVoicelessInteraction( - dismissed_interaction, "DismissNotification", options, [](auto) {}); + dismissed_interaction, /*description=*/"DismissNotification", options, + [](auto) {}); } void AssistantManagerServiceImpl::OnConversationTurnStartedInternal( @@ -646,6 +642,10 @@ mojom::AssistantInteractionResolution::kMultiDeviceHotwordLoss); } break; + // This is only applicable in longform barge-in mode, which we do not use. + case Resolution::LONGFORM_KEEP_MIC_OPEN: + NOTREACHED(); + break; } } @@ -1041,10 +1041,10 @@ LogUnsupportedChange(modify_setting_args); } -void AssistantManagerServiceImpl::OnModifySettingsAction( - const std::string& modify_setting_args_proto) { - api::client_op::ModifySettingArgs modify_setting_args; - modify_setting_args.ParseFromString(modify_setting_args_proto); +void AssistantManagerServiceImpl::OnModifyDeviceSetting( + const api::client_op::ModifySettingArgs& modify_setting_args) { + ENSURE_MAIN_THREAD(&AssistantManagerServiceImpl::OnModifyDeviceSetting, + modify_setting_args); DCHECK(IsSettingSupported(modify_setting_args.setting_id())); receive_modify_settings_proto_response_ = true; @@ -1109,14 +1109,18 @@ } } -ActionModule::Result AssistantManagerServiceImpl::HandleModifySettingClientOp( - const std::string& modify_setting_args_proto) { - DVLOG(2) << "HandleModifySettingClientOp=" << modify_setting_args_proto; - main_task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&AssistantManagerServiceImpl::OnModifySettingsAction, - weak_factory_.GetWeakPtr(), modify_setting_args_proto)); - return ActionModule::Result::Ok(); +void AssistantManagerServiceImpl::OnGetDeviceSettings( + int interaction_id, + const api::client_op::GetDeviceSettingsArgs& args) { + // Collect the required information. + std::vector<DeviceSetting> result; + for (const std::string& setting_id : args.setting_ids()) + result.emplace_back(setting_id, IsSettingSupported(setting_id)); + + SendVoicelessInteraction( + CreateGetDeviceSettingInteraction(interaction_id, result), + /*description=*/"get_settings_result", + /*is_user_initiated=*/true); } bool AssistantManagerServiceImpl::IsSettingSupported( @@ -1184,6 +1188,8 @@ UpdateInternalOptions(new_assistant_manager_internal_); + new_assistant_manager_internal_->SetLocaleOverride( + GetLocaleOrDefault(assistant_state()->locale().value())); new_assistant_manager_internal_->SetDisplayConnection( new_display_connection_.get()); new_assistant_manager_internal_->RegisterActionModule(action_module_.get()); @@ -1259,7 +1265,8 @@ options.obfuscated_gaia_id = interaction.user_id; assistant_manager_internal_->SendVoicelessInteraction( - interaction_proto, "open_provider_response", options, [](auto) {}); + interaction_proto, /*description=*/"open_provider_response", options, + [](auto) {}); } void AssistantManagerServiceImpl::HandleVerifyAndroidAppResponse( @@ -1281,7 +1288,8 @@ options.is_user_initiated = true; assistant_manager_internal_->SendVoicelessInteraction( - interaction_proto, "verify_provider_response", options, [](auto) {}); + interaction_proto, /*description=*/"verify_provider_response", options, + [](auto) {}); } // This method runs on the LibAssistant thread. @@ -1349,15 +1357,6 @@ internal_options->SetClientControlEnabled( assistant::features::IsRoutinesEnabled()); - // TODO(meilinw): remove this logic and instead use the new config flag - // once we uprev. - if (chromeos::features::IsAmbientModeEnabled() || - base::CommandLine::ForCurrentProcess()->HasSwitch( - chromeos::switches::kDisableGaiaServices)) { - internal_options->SetUserCredentialMode( - assistant_client::InternalOptions::UserCredentialMode::SIGNED_OUT); - } - if (!features::IsVoiceMatchDisabled()) internal_options->EnableRequireVoiceMatchVerification(); @@ -1464,13 +1463,6 @@ assistant::features::IsAppSupportEnabled() && enabled); } -void AssistantManagerServiceImpl::StopAlarmTimerRinging() { - if (!assistant_manager_internal_) - return; - - assistant_manager_internal_->GetAlarmTimerManager()->StopRinging(); -} - void AssistantManagerServiceImpl::AddTimeToTimer(const std::string& id, base::TimeDelta duration) { if (!assistant_manager_internal_) @@ -1480,6 +1472,11 @@ id, duration.InSeconds()); } +void AssistantManagerServiceImpl::RemoveAlarmTimer(const std::string& id) { + if (assistant_manager_internal_) + assistant_manager_internal_->GetAlarmTimerManager()->RemoveEvent(id); +} + void AssistantManagerServiceImpl::NotifyEntryIntoAssistantUi( mojom::AssistantEntryPoint entry_point) { base::AutoLock lock(last_trigger_source_lock_); @@ -1493,6 +1490,18 @@ return trigger_source; } +void AssistantManagerServiceImpl::SendVoicelessInteraction( + const std::string& interaction, + const std::string& description, + bool is_user_initiated) { + assistant_client::VoicelessOptions voiceless_options; + + voiceless_options.is_user_initiated = is_user_initiated; + + assistant_manager_internal_->SendVoicelessInteraction( + interaction, description, voiceless_options, [](auto) {}); +} + std::string AssistantManagerServiceImpl::GetLastSearchSource() { return ConsumeLastTriggerSource(); } @@ -1541,13 +1550,10 @@ const std::string interaction = CreateSendFeedbackInteraction( assistant_feedback->assistant_debug_info_allowed, assistant_feedback->description, assistant_feedback->screenshot_png); - assistant_client::VoicelessOptions voiceless_options; - voiceless_options.is_user_initiated = false; - - assistant_manager_internal_->SendVoicelessInteraction( - interaction, "send feedback with details", voiceless_options, - [](auto) {}); + SendVoicelessInteraction(interaction, + /*description=*/"send feedback with details", + /*is_user_initiated=*/false); } void AssistantManagerServiceImpl::UpdateMediaState() {
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h index 5d58a43..22fe5dc 100644 --- a/chromeos/services/assistant/assistant_manager_service_impl.h +++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -86,6 +86,9 @@ // Since LibAssistant is a standalone library, all callbacks come from it // running on threads not owned by Chrome. Thus we need to post the callbacks // onto the main thread. +// NOTE: this class may start/stop LibAssistant multiple times throughout its +// lifetime. This may occur, for example, if the user manually toggles Assistant +// enabled/disabled in settings or switches to a non-primary profile. class COMPONENT_EXPORT(ASSISTANT_SERVICE) AssistantManagerServiceImpl : public AssistantManagerService, public ::chromeos::assistant::action::AssistantActionObserver, @@ -154,7 +157,7 @@ void NotifyEntryIntoAssistantUi( mojom::AssistantEntryPoint entry_point) override; void AddTimeToTimer(const std::string& id, base::TimeDelta duration) override; - void StopAlarmTimerRinging() override; + void RemoveAlarmTimer(const std::string& id) override; // AssistantActionObserver overrides: void OnScheduleWait(int id, int time_ms) override; @@ -171,6 +174,11 @@ const action::InteractionInfo& interaction) override; void OnVerifyAndroidApp(const std::vector<action::AndroidAppInfo>& apps_info, const action::InteractionInfo& interaction) override; + void OnModifyDeviceSetting( + const ::assistant::api::client_op::ModifySettingArgs& args) override; + void OnGetDeviceSettings( + int interaction_id, + const ::assistant::api::client_op::GetDeviceSettingsArgs& args) override; // AssistantEventObserver overrides: void OnSpeechLevelUpdated(float speech_level) override; @@ -186,8 +194,6 @@ void OnRespondingStarted(bool is_error_response) override; // AssistantManagerDelegate overrides: - assistant_client::ActionModule::Result HandleModifySettingClientOp( - const std::string& modify_setting_args_proto) override; bool IsSettingSupported(const std::string& setting_id) override; bool SupportsModifySettings() override; void OnConversationTurnStartedInternal( @@ -293,6 +299,10 @@ std::string ConsumeLastTriggerSource(); + void SendVoicelessInteraction(const std::string& interaction, + const std::string& description, + bool is_user_initiated); + ash::mojom::AssistantAlarmTimerController* assistant_alarm_timer_controller(); ash::mojom::AssistantNotificationController* assistant_notification_controller();
diff --git a/chromeos/services/assistant/fake_assistant_manager_service_impl.cc b/chromeos/services/assistant/fake_assistant_manager_service_impl.cc index 1684729..da357fc 100644 --- a/chromeos/services/assistant/fake_assistant_manager_service_impl.cc +++ b/chromeos/services/assistant/fake_assistant_manager_service_impl.cc
@@ -117,7 +117,7 @@ base::TimeDelta duration) { } -void FakeAssistantManagerServiceImpl::StopAlarmTimerRinging() {} +void FakeAssistantManagerServiceImpl::RemoveAlarmTimer(const std::string& id) {} void FakeAssistantManagerServiceImpl::SetStateAndInformObservers( State new_state) {
diff --git a/chromeos/services/assistant/fake_assistant_manager_service_impl.h b/chromeos/services/assistant/fake_assistant_manager_service_impl.h index daac05f..cf0ca17c 100644 --- a/chromeos/services/assistant/fake_assistant_manager_service_impl.h +++ b/chromeos/services/assistant/fake_assistant_manager_service_impl.h
@@ -75,7 +75,7 @@ void NotifyEntryIntoAssistantUi( mojom::AssistantEntryPoint entry_point) override; void AddTimeToTimer(const std::string& id, base::TimeDelta duration) override; - void StopAlarmTimerRinging() override; + void RemoveAlarmTimer(const std::string& id) override; // Update the state to the corresponding value, and inform the // |AssistantStateObserver| of the change.
diff --git a/chromeos/services/assistant/public/features.cc b/chromeos/services/assistant/public/features.cc index f82eae9..30ca25d 100644 --- a/chromeos/services/assistant/public/features.cc +++ b/chromeos/services/assistant/public/features.cc
@@ -26,6 +26,9 @@ const base::Feature kAssistantConversationStartersV2{ "AssistantConversationStartersV2", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kAssistantLauncherChipIntegration{ + "AssistantLauncherChipIntegration", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kAssistantProactiveSuggestions{ "AssistantProactiveSuggestions", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -82,9 +85,6 @@ const base::Feature kAssistantTimersV2{"AssistantTimersV2", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::Feature kInAssistantNotifications{ - "InAssistantNotifications", base::FEATURE_DISABLED_BY_DEFAULT}; - const base::Feature kEnableClearCutLog{"EnableClearCutLog", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -151,8 +151,8 @@ return base::FeatureList::IsEnabled(kAssistantFeedbackUi); } -bool IsInAssistantNotificationsEnabled() { - return base::FeatureList::IsEnabled(kInAssistantNotifications); +bool IsLauncherChipIntegrationEnabled() { + return base::FeatureList::IsEnabled(kAssistantLauncherChipIntegration); } bool IsMediaSessionIntegrationEnabled() {
diff --git a/chromeos/services/assistant/public/features.h b/chromeos/services/assistant/public/features.h index b56133f4..025f2b9 100644 --- a/chromeos/services/assistant/public/features.h +++ b/chromeos/services/assistant/public/features.h
@@ -32,6 +32,10 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kAssistantAppSupport; +// Enables Assistant launcher chip integration. +COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) +extern const base::Feature kAssistantLauncherChipIntegration; + // Enables Assistant proactive suggestions. COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kAssistantProactiveSuggestions; @@ -62,10 +66,6 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kAssistantTimersV2; -// Enables in-Assistant notifications. -COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) -extern const base::Feature kInAssistantNotifications; - // Enables clear cut logging. COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) extern const base::Feature kEnableClearCutLog; @@ -115,7 +115,7 @@ COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsFeedbackUiEnabled(); COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) -bool IsInAssistantNotificationsEnabled(); +bool IsLauncherChipIntegrationEnabled(); COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsMediaSessionIntegrationEnabled();
diff --git a/chromeos/services/assistant/public/mojom/assistant.mojom b/chromeos/services/assistant/public/mojom/assistant.mojom index 5cb5ca144..c7de917 100644 --- a/chromeos/services/assistant/public/mojom/assistant.mojom +++ b/chromeos/services/assistant/public/mojom/assistant.mojom
@@ -142,8 +142,9 @@ // this method is a no-op if there is no existing timer identified by |id|. AddTimeToTimer(string id, mojo_base.mojom.TimeDelta duration); - // Stops timer or alarm ringing. - StopAlarmTimerRinging(); + // Remove the alarm/timer specified by |id|. + // NOTE: this is a no-op if no such alarm/timer exists. + RemoveAlarmTimer(string id); }; // Enumeration of Assistant entry points. These values are persisted to logs.
diff --git a/chromeos/services/assistant/public/mojom/assistant_notification.mojom b/chromeos/services/assistant/public/mojom/assistant_notification.mojom index 38950e0..0ddfe4b 100644 --- a/chromeos/services/assistant/public/mojom/assistant_notification.mojom +++ b/chromeos/services/assistant/public/mojom/assistant_notification.mojom
@@ -7,25 +7,9 @@ import "mojo/public/mojom/base/time.mojom"; import "url/mojom/url.mojom"; +// TODO(b:153495778): Remove notification types. // Enumeration of notification types. enum AssistantNotificationType { - // A notification of type |kInAssistant| will only be displayed within - // Assistant UI. If Assistant UI is not visible at the time of notification - // creation, the notification will be queued up until Assistant UI becomes - // visible. When Assistant UI dismisses, notifications of this type are - // dismissed. - kInAssistant, - - // A notification of type |kPreferInAssistant| may be shown in either - // Assistant UI or the Message Center, depending on Assistant visibility - // state. If Assistant UI is not visible, notifications of this type will - // show immediately in the Message Center unless the user has opted out of - // seeing system notifications. Once Assistant UI becomes visible, or if it - // is already visible at the time of notification creation, notifications of - // this type are converted to notifications of type |kInAssistant| and they - // will finish out their lifetimes as in-Assistant notifications. - kPreferInAssistant, - // A notification of type |kSystem| will only be displayed within the Message // Center. It is immediately added to the Message Center regardless of // Assistant UI visibility state, although it may not be added if the user has
diff --git a/chromeos/services/assistant/utils.cc b/chromeos/services/assistant/utils.cc index 5b528ff..5e82cbf 100644 --- a/chromeos/services/assistant/utils.cc +++ b/chromeos/services/assistant/utils.cc
@@ -113,6 +113,15 @@ // Enable logging. internal.SetBoolKey("enable_logging", true); + // This only enables logging to local disk combined with the flag above. When + // user choose to file a Feedback report, user can examine the log and choose + // to upload the log with the report or not. + internal.SetBoolKey("logging_opt_in", true); + + // Allows libassistant to automatically toggle signed-out mode depending on + // whether it has auth_tokens. + internal.SetBoolKey("enable_signed_out_mode", true); + config.SetKey("internal", std::move(internal)); Value audio_input(Type::DICTIONARY);
diff --git a/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc index 875150ea..f9c5c760 100644 --- a/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc +++ b/chromeos/services/cros_healthd/public/cpp/service_connection_unittest.cc
@@ -122,11 +122,11 @@ "MST7MDT,M3.2.0,M11.1.0" /* posix */, "America/Denver" /* region */)); } -mojom::MemoryInfoPtr MakeMemoryInfo() { - return mojom::MemoryInfo::New(987123 /* total_memory_kib */, - 346432 /* free_memory_kib */, - 45863 /* available_memory_kib */, - 43264 /* page_faults_since_last_boot */); +mojom::MemoryResultPtr MakeMemoryResult() { + return mojom::MemoryResult::NewMemoryInfo(mojom::MemoryInfo::New( + 987123 /* total_memory_kib */, 346432 /* free_memory_kib */, + 45863 /* available_memory_kib */, + 43264 /* page_faults_since_last_boot */)); } base::Optional<std::vector<mojom::BacklightInfoPtr>> MakeBacklightInfo() { @@ -151,7 +151,7 @@ MakeNonRemovableBlockDeviceInfo() /* block_device_info */, MakeCachedVpdInfo() /* vpd_info */, MakeCpuResult() /* cpu_result */, MakeTimezoneResult() /* timezone_result */, - MakeMemoryInfo() /* memory_info */, + MakeMemoryResult() /* memory_result */, MakeBacklightInfo() /* backlight_info */, MakeFanResult() /* fan_result */ ); }
diff --git a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom index 8f42697..c09b479 100644 --- a/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom +++ b/chromeos/services/cros_healthd/public/mojom/cros_healthd_probe.mojom
@@ -150,6 +150,15 @@ string region; }; +// Memory probe result. Can either be populated with the MemoryInfo or an +// error retrieving the information. +union MemoryResult { + // Valid MemoryInfo. + MemoryInfo memory_info; + // The error that occurred attempting to retrieve the MemoryInfo. + ProbeError error; +}; + // Memory information. struct MemoryInfo { // Total memory, in KiB. @@ -214,7 +223,7 @@ TimezoneResult? timezone_result; // Information about the system's memory. Only present when kMemory was // included in the categories input to ProbeTelemetryInfo. - MemoryInfo? memory_info; + MemoryResult? memory_result; // Information about all of the device's backlights. Only present when // kBacklight was included in the categories input to ProbeTelemetryInfo. array<BacklightInfo>? backlight_info;
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.cc b/components/arc/intent_helper/arc_intent_helper_bridge.cc index 504c6193..8878c8f 100644 --- a/components/arc/intent_helper/arc_intent_helper_bridge.cc +++ b/components/arc/intent_helper/arc_intent_helper_bridge.cc
@@ -233,7 +233,8 @@ arc::mojom::CameraIntentMode mode, bool should_handle_result, bool should_down_scale, - bool is_secure) { + bool is_secure, + int32_t task_id) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); base::DictionaryValue intent_info; @@ -245,7 +246,7 @@ << "&shouldHandleResult=" << should_handle_result << "&shouldDownScale=" << should_down_scale << "&isSecure=" << is_secure; - g_control_camera_app_delegate->LaunchCameraApp(queries.str()); + g_control_camera_app_delegate->LaunchCameraApp(queries.str(), task_id); } void ArcIntentHelperBridge::OnIntentFiltersUpdatedForPackage(
diff --git a/components/arc/intent_helper/arc_intent_helper_bridge.h b/components/arc/intent_helper/arc_intent_helper_bridge.h index 4d5db0a..5be0309 100644 --- a/components/arc/intent_helper/arc_intent_helper_bridge.h +++ b/components/arc/intent_helper/arc_intent_helper_bridge.h
@@ -92,7 +92,8 @@ arc::mojom::CameraIntentMode mode, bool should_handle_result, bool should_down_scale, - bool is_secure) override; + bool is_secure, + int32_t task_id) override; void OnIntentFiltersUpdatedForPackage( const std::string& package_name, std::vector<IntentFilter> intent_filters) override;
diff --git a/components/arc/intent_helper/control_camera_app_delegate.h b/components/arc/intent_helper/control_camera_app_delegate.h index e4724f3..53db3cee4 100644 --- a/components/arc/intent_helper/control_camera_app_delegate.h +++ b/components/arc/intent_helper/control_camera_app_delegate.h
@@ -14,8 +14,9 @@ virtual ~ControlCameraAppDelegate() = default; // Launches the camera app from Android camera intent with the intent - // information as url |queries|. - virtual void LaunchCameraApp(const std::string& queries) = 0; + // information as url |queries|. |task_id| represents the id of the caller + // task in ARC. + virtual void LaunchCameraApp(const std::string& queries, int32_t task_id) = 0; // Closes the camera app. virtual void CloseCameraApp() = 0;
diff --git a/components/arc/mojom/intent_helper.mojom b/components/arc/mojom/intent_helper.mojom index 5f8308c..92fca253 100644 --- a/components/arc/mojom/intent_helper.mojom +++ b/components/arc/mojom/intent_helper.mojom
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Next MinVersion: 36 +// Next MinVersion: 37 module arc.mojom; @@ -288,12 +288,13 @@ // intent expects the captured image would be down-scaled to a small enough // size. If |is_secure| is true, the intent is fired when the device is // secured, which means the camera app should not show any user-sensitive - // data. + // data. |task_id| represents the id of the caller task in ARC. [MinVersion=28] LaunchCameraApp@12(uint32 intent_id, CameraIntentMode mode, bool should_handle_result, bool should_down_scale, - bool is_secure); + bool is_secure, + [MinVersion=36] int32 task_id); // Called when intent filters are updated for one package. This will be // called when apps are installed, uninstalled or updated.
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc index 0083a84..994324ad 100644 --- a/components/autofill/core/browser/autofill_manager.cc +++ b/components/autofill/core/browser/autofill_manager.cc
@@ -1412,6 +1412,10 @@ DCHECK(credit_card); FillCreditCardForm(credit_card_query_id_, credit_card_form_, credit_card_field_, *credit_card, cvc); + if (base::FeatureList::IsEnabled(features::kAutofillCacheServerCardInfo) && + credit_card->record_type() == CreditCard::FULL_SERVER_CARD) { + credit_card_access_manager_->CacheUnmaskedCardInfo(*credit_card, cvc); + } } void AutofillManager::OnDidEndTextFieldEditing() {
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc index d6ffcf0e..158006c 100644 --- a/components/autofill/core/browser/autofill_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -686,8 +686,6 @@ credit_card2.set_use_count(5); credit_card2.set_use_date(AutofillClock::Now() - base::TimeDelta::FromDays(4)); - // Set arbitrary nickname to the second card. - credit_card2.SetNickname(ASCIIToUTF16(kArbitraryNickname)); personal_data_.AddCreditCard(credit_card2); CreditCard credit_card3; @@ -767,11 +765,12 @@ parts, l10n_util::GetStringUTF8(IDS_AUTOFILL_ADDRESS_SUMMARY_SEPARATOR)); } -class CreditCardSuggestionMatchingTest +// Credit card suggestion tests related with keyboard accessary and nickname. +class CreditCardSuggestionTest : public AutofillManagerTest, public testing::WithParamInterface<std::tuple<bool, bool>> { protected: - CreditCardSuggestionMatchingTest() + CreditCardSuggestionTest() : is_keyboard_accessory_enabled_(std::get<0>(GetParam())), is_surfacing_server_card_nickname_enabled_(std::get<1>(GetParam())) {} @@ -1577,16 +1576,59 @@ } // Test that we return credit card profile suggestions when the selected form -// field is not the credit card number field. -TEST_P(CreditCardSuggestionMatchingTest, GetCreditCardSuggestions_NonCCNumber) { +// field is the credit card number field. +TEST_P(CreditCardSuggestionTest, GetCreditCardSuggestions_CCNumber) { + // Set nickname with the corresponding guid of the Mastercard 8765. + personal_data_.SetNicknameForCardWithGUID( + "00000000-0000-0000-0000-000000000005", kArbitraryNickname); // Set up our form data. FormData form; CreateTestCreditCardFormData(&form, true, false); std::vector<FormData> forms(1, form); FormsSeen(forms); - const FormFieldData& field = form.fields[0]; - GetAutofillSuggestions(form, field); + const FormFieldData& credit_card_number_field = form.fields[1]; + GetAutofillSuggestions(form, credit_card_number_field); + + const std::string visa_value = + std::string("Visa ") + test::ObfuscatedCardDigitsAsUTF8("3456"); + // Mastercard has a valid nickname. Display nickname + last four in the + // suggestion title when feature enabled. + const std::string master_card_value = + (IsSurfacingServerCardNicknameEnabled() ? kArbitraryNickname + " " + : std::string("Mastercard ")) + + test::ObfuscatedCardDigitsAsUTF8("8765"); + +#if defined(OS_ANDROID) || defined(OS_IOS) + const std::string visa_label = std::string("04/99"); + const std::string master_card_label = std::string("10/98"); +#else + const std::string visa_label = std::string("Expires on 04/99"); + const std::string master_card_label = std::string("Expires on 10/98"); +#endif + + // Test that we sent the right values to the external delegate. + CheckSuggestions(kDefaultPageID, + Suggestion(visa_value, visa_label, kVisaCard, + autofill_manager_->GetPackedCreditCardID(4)), + Suggestion(master_card_value, master_card_label, kMasterCard, + autofill_manager_->GetPackedCreditCardID(5))); +} + +// Test that we return credit card profile suggestions when the selected form +// field is not the credit card number field. +TEST_P(CreditCardSuggestionTest, GetCreditCardSuggestions_NonCCNumber) { + // Set nickname with the corresponding guid of the Mastercard 8765. + personal_data_.SetNicknameForCardWithGUID( + "00000000-0000-0000-0000-000000000005", kArbitraryNickname); + // Set up our form data. + FormData form; + CreateTestCreditCardFormData(&form, true, false); + std::vector<FormData> forms(1, form); + FormsSeen(forms); + + const FormFieldData& cardholder_name_field = form.fields[0]; + GetAutofillSuggestions(form, cardholder_name_field); const std::string obfuscated_last_four_digits1 = test::ObfuscatedCardDigitsAsUTF8("3456"); @@ -6386,7 +6428,7 @@ // Verify that typing "dre" matches "Nancy Drew" when substring matching is // enabled. -TEST_P(CreditCardSuggestionMatchingTest, +TEST_P(CreditCardSuggestionTest, DisplayCreditCardSuggestionsWithMatchingTokens) { base::test::ScopedFeatureList features; features.InitAndEnableFeature(features::kAutofillTokenPrefixMatching); @@ -8330,7 +8372,7 @@ // Second bool is to indicate whether AutofillEnableSurfacingServerCardNickname // is enabled. INSTANTIATE_TEST_SUITE_P(All, - CreditCardSuggestionMatchingTest, + CreditCardSuggestionTest, testing::Combine(testing::Bool(), testing::Bool())); } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc index 2472d97..57a64c62 100644 --- a/components/autofill/core/browser/autofill_test_utils.cc +++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -437,6 +437,15 @@ return credit_card; } +CreditCard GetMaskedServerCardWithInvalidNickname() { + CreditCard credit_card(CreditCard::MASKED_SERVER_CARD, "c789"); + test::SetCreditCardInfo(&credit_card, "Test user", "1111" /* Visa */, + NextMonth().c_str(), NextYear().c_str(), "1"); + credit_card.SetNetworkForMaskedCard(kVisaCard); + credit_card.SetNickname(ASCIIToUTF16("Invalid nickname which is too long")); + return credit_card; +} + CreditCard GetFullServerCard() { CreditCard credit_card(CreditCard::FULL_SERVER_CARD, "c123"); test::SetCreditCardInfo(&credit_card, "Full Carter",
diff --git a/components/autofill/core/browser/autofill_test_utils.h b/components/autofill/core/browser/autofill_test_utils.h index 49dd131..b5c2d002 100644 --- a/components/autofill/core/browser/autofill_test_utils.h +++ b/components/autofill/core/browser/autofill_test_utils.h
@@ -136,6 +136,7 @@ CreditCard GetMaskedServerCard(); CreditCard GetMaskedServerCardAmex(); CreditCard GetMaskedServerCardWithNickname(); +CreditCard GetMaskedServerCardWithInvalidNickname(); // Returns a full server card full of dummy info. CreditCard GetFullServerCard();
diff --git a/components/autofill/core/browser/data_model/credit_card.cc b/components/autofill/core/browser/data_model/credit_card.cc index 4d79128..87e7c6ad 100644 --- a/components/autofill/core/browser/data_model/credit_card.cc +++ b/components/autofill/core/browser/data_model/credit_card.cc
@@ -114,7 +114,8 @@ network_(kGenericCard), expiration_month_(0), expiration_year_(0), - server_status_(OK) {} + server_status_(OK), + card_issuer_(ISSUER_UNKNOWN) {} CreditCard::CreditCard(RecordType type, const std::string& server_id) : CreditCard() { @@ -515,6 +516,7 @@ temp_card_first_name_ = credit_card.temp_card_first_name_; temp_card_last_name_ = credit_card.temp_card_last_name_; nickname_ = credit_card.nickname_; + card_issuer_ = credit_card.card_issuer_; set_guid(credit_card.guid()); set_origin(credit_card.origin()); @@ -592,11 +594,22 @@ return comparison; if (static_cast<int>(server_status_) < - static_cast<int>(credit_card.server_status_)) + static_cast<int>(credit_card.server_status_)) { return -1; + } if (static_cast<int>(server_status_) > - static_cast<int>(credit_card.server_status_)) + static_cast<int>(credit_card.server_status_)) { return 1; + } + + if (static_cast<int>(card_issuer_) < + static_cast<int>(credit_card.card_issuer_)) { + return -1; + } + if (static_cast<int>(card_issuer_) > + static_cast<int>(credit_card.card_issuer_)) { + return 1; + } // Do not distinguish masked server cards from full server cards as this is // not needed and not desired - we want to identify masked server card from @@ -746,7 +759,7 @@ if (number().empty()) return std::make_pair(name_on_card_, base::string16()); - base::string16 obfuscated_cc_number = NetworkAndLastFourDigits(); + base::string16 obfuscated_cc_number = NicknameOrNetworkAndLastFourDigits(); // No expiration date set. if (!expiration_month_ || !expiration_year_) return std::make_pair(obfuscated_cc_number, base::string16()); @@ -971,8 +984,8 @@ << " " << credit_card.bank_name() << " " << " " << credit_card.record_type() << " " << credit_card.use_count() << " " << credit_card.use_date() << " " - << credit_card.billing_address_id() << " " - << credit_card.nickname(); + << credit_card.billing_address_id() << " " << credit_card.nickname() + << " " << credit_card.card_issuer(); } void CreditCard::SetNameOnCardFromSeparateParts() {
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h index b55d775bd..4c41bdff 100644 --- a/components/autofill/core/browser/data_model/credit_card.h +++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -60,6 +60,12 @@ OK, }; + // The Issuer for the card. + enum Issuer { + ISSUER_UNKNOWN = 0, + GOOGLE = 1, + }; + CreditCard(const std::string& guid, const std::string& origin); // Creates a server card. The type must be MASKED_SERVER_CARD or @@ -138,6 +144,9 @@ // with whitespaces, and trim leading/trailing whitespaces). void SetNickname(const base::string16& nickname); + Issuer card_issuer() const { return card_issuer_; } + void set_card_issuer(Issuer card_issuer) { card_issuer_ = card_issuer; } + // For use in STL containers. void operator=(const CreditCard& credit_card); @@ -227,7 +236,8 @@ // Various display functions. - // Card preview summary, for example: "Visa - ****1234", ", 01/2020". + // Card preview summary, for example: "Nickname/Network - ****1234", + // ", 01/2020". const std::pair<base::string16, base::string16> LabelPieces() const; // Like LabelPieces, but appends the two pieces together. const base::string16 Label() const; @@ -343,6 +353,10 @@ // The nickname of the card. May be empty when nickname is not set. base::string16 nickname_; + + // The issuer for the card. This is populated from the sync response. It has a + // default value of CreditCard::ISSUER_UNKNOWN. + Issuer card_issuer_; }; // So we can compare CreditCards with EXPECT_EQ().
diff --git a/components/autofill/core/browser/data_model/credit_card_unittest.cc b/components/autofill/core/browser/data_model/credit_card_unittest.cc index db48712..f733e1d 100644 --- a/components/autofill/core/browser/data_model/credit_card_unittest.cc +++ b/components/autofill/core/browser/data_model/credit_card_unittest.cc
@@ -92,6 +92,12 @@ // of different possible summary strings. Variations occur based on the // existence of credit card number, month, and year fields. TEST(CreditCardTest, PreviewSummaryAndNetworkAndLastFourDigitsStrings) { + base::test::ScopedFeatureList scoped_feature_list; + base::string16 valid_nickname = ASCIIToUTF16("My Visa Card"); + // Enable the flag. + scoped_feature_list.InitAndEnableFeature( + features::kAutofillEnableSurfacingServerCardNickname); + // Case 0: empty credit card. CreditCard credit_card0(base::GenerateGUID(), "https://www.example.com/"); base::string16 summary0 = credit_card0.Label(); @@ -142,7 +148,7 @@ test::ObfuscatedCardDigitsAsUTF8("5100")), obfuscated3); - // Case 4: Have everything. + // Case 4: Have everything except nickname. CreditCard credit_card4(base::GenerateGUID(), "https://www.example.com/"); test::SetCreditCardInfo(&credit_card4, "John Dillinger", "5105 1051 0510 5100", "01", "2010", "1"); @@ -169,6 +175,33 @@ EXPECT_EQ(UTF8ToUTF16(std::string("Card ") + test::ObfuscatedCardDigitsAsUTF8("5100")), obfuscated5); + + // Case 6: Have everything including nickname. + CreditCard credit_card6(base::GenerateGUID(), "https://www.example.com/"); + test::SetCreditCardInfo(&credit_card6, "John Dillinger", + "5105 1051 0510 5100", "01", "2010", "1"); + credit_card6.SetNickname(valid_nickname); + base::string16 summary6 = credit_card6.Label(); + EXPECT_EQ( + valid_nickname + + UTF8ToUTF16(std::string(" ") + + test::ObfuscatedCardDigitsAsUTF8("5100") + ", 01/2010"), + summary6); + + // Case 7: Have everything including nickname but flag is off. + // Reset and disable the feature flag. + scoped_feature_list.Reset(); + scoped_feature_list.InitAndDisableFeature( + features::kAutofillEnableSurfacingServerCardNickname); + CreditCard credit_card7(base::GenerateGUID(), "https://www.example.com/"); + test::SetCreditCardInfo(&credit_card7, "John Dillinger", + "5105 1051 0510 5100" /* Mastercard */, "01", "2010", + "1"); + credit_card7.SetNickname(valid_nickname); + base::string16 summary7 = credit_card7.Label(); + EXPECT_EQ(UTF8ToUTF16(std::string("Mastercard ") + + test::ObfuscatedCardDigitsAsUTF8("5100") + ", 01/2010"), + summary7); } TEST(CreditCardTest, NicknameAndLastFourDigitsStrings) { @@ -676,6 +709,11 @@ b.set_record_type(LOCAL_CARD); EXPECT_LT(0, a.Compare(b)); + // Card with UNKNOWN_ISSUER is different from GOOGLE issued card. + a.set_card_issuer(CreditCard::ISSUER_UNKNOWN); + b.set_card_issuer(CreditCard::GOOGLE); + EXPECT_GT(0, a.Compare(b)); + // Different values produce non-zero results. test::SetCreditCardInfo(&a, "Jimmy", nullptr, nullptr, nullptr, ""); test::SetCreditCardInfo(&b, "Ringo", nullptr, nullptr, nullptr, "");
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.cc b/components/autofill/core/browser/payments/credit_card_access_manager.cc index 20b3c65..139cba5d 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/guid.h" +#include "base/metrics/histogram_functions.h" #include "base/strings/string16.h" #include "base/synchronization/waitable_event.h" #include "base/task/post_task.h" @@ -29,6 +30,7 @@ #include "components/autofill/core/browser/payments/webauthn_callback_types.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/common/autofill_clock.h" +#include "components/autofill/core/common/autofill_payments_features.h" #include "components/autofill/core/common/autofill_tick_clock.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -259,6 +261,20 @@ return; } + if (base::FeatureList::IsEnabled(features::kAutofillCacheServerCardInfo)) { + // If card has been previously unmasked, use cached data. + std::unordered_map<std::string, CachedServerCardInfo>::iterator it = + unmasked_card_cache_.find(card->server_id()); + if (it != unmasked_card_cache_.end()) { // key is in cache + accessor->OnCreditCardFetched(/*did_succeed=*/true, + /*CreditCard=*/&it->second.card, + /*cvc=*/it->second.cvc); + base::UmaHistogramCounts1000("Autofill.UsedCachedServerCard", + ++it->second.cache_uses); + return; + } + } + // Latency metrics should only be logged if the user is verifiable and the // flag is turned on. If flag is turned off, then |is_user_verifiable_| is not // set. @@ -353,6 +369,13 @@ #endif } +void CreditCardAccessManager::CacheUnmaskedCardInfo(const CreditCard& card, + const base::string16& cvc) { + DCHECK_EQ(card.record_type(), CreditCard::FULL_SERVER_CARD); + CachedServerCardInfo card_info = {card, cvc, 0}; + unmasked_card_cache_[card.server_id()] = card_info; +} + UnmaskAuthFlowType CreditCardAccessManager::GetAuthenticationType( bool get_unmask_details_returned) { bool fido_auth_enabled =
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.h b/components/autofill/core/browser/payments/credit_card_access_manager.h index c786cc4..df77560e 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.h +++ b/components/autofill/core/browser/payments/credit_card_access_manager.h
@@ -8,6 +8,7 @@ #include <memory> #include <set> #include <string> +#include <unordered_map> #include <utility> #include <vector> @@ -45,6 +46,17 @@ kCvcFallbackFromFido = 4, }; +struct CachedServerCardInfo { + public: + // An unmasked CreditCard. + CreditCard card; + + base::string16 cvc; + + // Number of times this card was accessed from the cache. + int cache_uses = 0; +}; + // Manages logic for accessing credit cards either stored locally or stored // with Google Payments. Owned by AutofillManager. #if defined(OS_IOS) @@ -110,6 +122,11 @@ // TODO(crbug/949269): Add a rate limiter to counter spam clicking. void OnSettingsPageFIDOAuthToggled(bool opt_in); + // Caches CreditCard and corresponding CVC for unmasked card so that + // card info can later be filled without attempting to auth again. + // TODO(crbug/1069929): Add browsertests for this. + void CacheUnmaskedCardInfo(const CreditCard& card, const base::string16& cvc); + CreditCardCVCAuthenticator* GetOrCreateCVCAuthenticator(); #if !defined(OS_IOS) @@ -299,6 +316,10 @@ // The object attempting to access a card. base::WeakPtr<Accessor> accessor_; + // Cached data of cards which have been unmasked. This is cleared upon page + // navigation. Map key is the card's server_id. + std::unordered_map<std::string, CachedServerCardInfo> unmasked_card_cache_; + base::WeakPtrFactory<CreditCardAccessManager> weak_ptr_factory_{this}; DISALLOW_COPY_AND_ASSIGN(CreditCardAccessManager);
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc index 0aeceae..7e628113 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
@@ -223,15 +223,17 @@ personal_data_manager_.AddCreditCard(local_card); } - void CreateServerCard(std::string guid, std::string number = std::string()) { - CreditCard masked_server_card = CreditCard(); - test::SetCreditCardInfo(&masked_server_card, "Elvis Presley", - number.c_str(), NextMonth().c_str(), - NextYear().c_str(), "1"); - masked_server_card.set_guid(guid); - masked_server_card.set_record_type(CreditCard::MASKED_SERVER_CARD); + void CreateServerCard(std::string guid, + std::string number = std::string(), + bool masked = true) { + CreditCard server_card = CreditCard(); + test::SetCreditCardInfo(&server_card, "Elvis Presley", number.c_str(), + NextMonth().c_str(), NextYear().c_str(), "1"); + server_card.set_guid(guid); + server_card.set_record_type(masked ? CreditCard::MASKED_SERVER_CARD + : CreditCard::FULL_SERVER_CARD); - personal_data_manager_.AddServerCreditCard(masked_server_card); + personal_data_manager_.AddServerCreditCard(server_card); } CreditCardCVCAuthenticator* GetCVCAuthenticator() { @@ -1762,6 +1764,30 @@ EXPECT_FALSE(IsAuthenticationInProgress()); } +// Ensures that the use of |unmasked_card_cache_| is set and logged correctly. +TEST_F(CreditCardAccessManagerTest, FetchCreditCardUsesUnmaskedCardCache) { + scoped_feature_list_.InitAndEnableFeature( + features::kAutofillCacheServerCardInfo); + base::HistogramTester histogram_tester; + CreateServerCard(kTestGUID, kTestNumber, /*masked=*/false); + CreditCard* unmasked_card = + credit_card_access_manager_->GetCreditCard(kTestGUID); + credit_card_access_manager_->CacheUnmaskedCardInfo( + *unmasked_card, base::UTF8ToUTF16(kTestCvc)); + + CreateServerCard(kTestGUID, kTestNumber, /*masked=*/true); + CreditCard* masked_card = + credit_card_access_manager_->GetCreditCard(kTestGUID); + + credit_card_access_manager_->FetchCreditCard(masked_card, + accessor_->GetWeakPtr()); + histogram_tester.ExpectBucketCount("Autofill.UsedCachedServerCard", 1, 1); + + credit_card_access_manager_->FetchCreditCard(masked_card, + accessor_->GetWeakPtr()); + histogram_tester.ExpectBucketCount("Autofill.UsedCachedServerCard", 2, 1); +} + // TODO(crbug/949269): Once metrics are added, create test to ensure that // PrepareToFetchCreditCard() is properly rate limited.
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index d68d2949d..f0d7a26 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1680,7 +1680,7 @@ } void PersonalDataManager::LoadUpiIds() { - if (!database_helper_->GetServerDatabase()) + if (!database_helper_->GetLocalDatabase()) return; CancelPendingLocalQuery(&pending_upi_ids_query_); @@ -2057,7 +2057,7 @@ // Otherwise the label is the card number, or if that is empty the // cardholder name. The label should never repeat the value. if (type.GetStorableType() == CREDIT_CARD_NUMBER) { - suggestion->value = credit_card->NetworkAndLastFourDigits(); + suggestion->value = credit_card->NicknameOrNetworkAndLastFourDigits(); #if defined(OS_ANDROID) || defined(OS_IOS) suggestion->label = credit_card->GetInfo(
diff --git a/components/autofill/core/browser/test_personal_data_manager.cc b/components/autofill/core/browser/test_personal_data_manager.cc index 5159d46..426ac67 100644 --- a/components/autofill/core/browser/test_personal_data_manager.cc +++ b/components/autofill/core/browser/test_personal_data_manager.cc
@@ -325,4 +325,20 @@ NotifyPersonalDataObserver(); } +void TestPersonalDataManager::SetNicknameForCardWithGUID( + const char* guid, + const std::string& nickname) { + for (auto& card : local_credit_cards_) { + if (card->guid() == guid) { + card->SetNickname(base::ASCIIToUTF16(nickname)); + } + } + for (auto& card : server_credit_cards_) { + if (card->guid() == guid) { + card->SetNickname(base::ASCIIToUTF16(nickname)); + } + } + NotifyPersonalDataObserver(); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/test_personal_data_manager.h b/components/autofill/core/browser/test_personal_data_manager.h index 03befec..beccfef 100644 --- a/components/autofill/core/browser/test_personal_data_manager.h +++ b/components/autofill/core/browser/test_personal_data_manager.h
@@ -88,6 +88,10 @@ // Adds a cloud token data to |server_credit_card_cloud_token_data_|. void AddCloudTokenData(const CreditCardCloudTokenData& cloud_token_data); + // Sets a local/server card's nickname based on the provided |guid|. + void SetNicknameForCardWithGUID(const char* guid, + const std::string& nickname); + void set_timezone_country_code(const std::string& timezone_country_code) { timezone_country_code_ = timezone_country_code; }
diff --git a/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.cc b/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.cc index 700ba90..605a35e 100644 --- a/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.cc +++ b/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.cc
@@ -164,7 +164,7 @@ ShouldRequestExpirationDate() ? IDS_AUTOFILL_CARD_UNMASK_PROMPT_EXPIRED_TITLE : IDS_AUTOFILL_CARD_UNMASK_PROMPT_TITLE, - card_.NetworkAndLastFourDigits()); + card_.NicknameOrNetworkAndLastFourDigits()); #endif } @@ -185,7 +185,8 @@ } // The iOS UI shows the card details in the instructions text since they // don't fit in the title. - return l10n_util::GetStringFUTF16(ids, card_.NetworkAndLastFourDigits()); + return l10n_util::GetStringFUTF16(ids, + card_.NicknameOrNetworkAndLastFourDigits()); #else return l10n_util::GetStringUTF16( card_.record_type() == autofill::CreditCard::LOCAL_CARD
diff --git a/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.h b/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.h index e2e18628..67e6622b 100644 --- a/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.h +++ b/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl.h
@@ -70,7 +70,6 @@ protected: // Exposed for testing. CardUnmaskPromptView* view() { return card_unmask_view_; } - void SetCreditCardForTesting(CreditCard test_card) { card_ = test_card; } private: bool AllowsRetry(AutofillClient::PaymentsRpcResult result);
diff --git a/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl_unittest.cc b/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl_unittest.cc index 0b9f3f7..8183bb6e 100644 --- a/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl_unittest.cc +++ b/components/autofill/core/browser/ui/payments/card_unmask_prompt_controller_impl_unittest.cc
@@ -82,10 +82,6 @@ should_offer_webauthn_ = should; } - void SetCreditCardForTesting(CreditCard card) { - CardUnmaskPromptControllerImpl::SetCreditCardForTesting(card); - } - base::WeakPtr<TestCardUnmaskPromptController> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } @@ -107,17 +103,7 @@ base::BindOnce( &CardUnmaskPromptControllerImplGenericTest::GetCardUnmaskPromptView, base::Unretained(this)), - test::GetMaskedServerCard(), AutofillClient::UNMASK_FOR_AUTOFILL, - delegate_->GetWeakPtr()); - } - - void ShowPromptAmex() { - controller_->ShowPrompt( - base::BindOnce( - &CardUnmaskPromptControllerImplGenericTest::GetCardUnmaskPromptView, - base::Unretained(this)), - test::GetMaskedServerCardAmex(), AutofillClient::UNMASK_FOR_AUTOFILL, - delegate_->GetWeakPtr()); + card_, AutofillClient::UNMASK_FOR_AUTOFILL, delegate_->GetWeakPtr()); } void ShowPromptAndSimulateResponse(bool should_store_pan, @@ -137,6 +123,9 @@ value); } + void SetCreditCardForTesting(CreditCard card) { card_ = card; } + + CreditCard card_ = test::GetMaskedServerCard(); base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<TestCardUnmaskPromptView> test_unmask_prompt_view_; std::unique_ptr<TestingPrefServiceSimple> pref_service_; @@ -467,6 +456,90 @@ "Autofill.UnmaskPrompt.UnmaskingDuration.Failure", 1); } +// Ensures the card information is shown correctly in the instruction message on +// iOS and in the title on other platforms. +TEST_F(CardUnmaskPromptControllerImplTest, DisplayCardInformation) { + ShowPrompt(); +#if defined(OS_IOS) + EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetInstructionsMessage()) + .find("Mastercard " + test::ObfuscatedCardDigitsAsUTF8( + "2109")) != std::string::npos); +#else + EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetWindowTitle()) + .find("Mastercard " + test::ObfuscatedCardDigitsAsUTF8( + "2109")) != std::string::npos); +#endif +} + +// Ensures to fallback to network name in the instruction message on iOS and in +// the title on other platforms when the experiment is disabled, even though the +// nickname is valid. +TEST_F(CardUnmaskPromptControllerImplTest, Nickname_ExpOffNicknameValid) { + scoped_feature_list_.InitAndDisableFeature( + features::kAutofillEnableSurfacingServerCardNickname); + SetCreditCardForTesting(test::GetMaskedServerCardWithNickname()); + ShowPrompt(); +#if defined(OS_IOS) + EXPECT_TRUE( + base::UTF16ToUTF8(controller_->GetInstructionsMessage()).find("Visa") != + std::string::npos); + EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetInstructionsMessage()) + .find("Test nickname") != std::string::npos); +#else + EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Visa") != + std::string::npos); + EXPECT_FALSE( + base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Test nickname") != + std::string::npos); +#endif +} + +// Ensures to fallback to network name in the instruction message on iOS and in +// the title on other platforms when the nickname is invalid. +TEST_F(CardUnmaskPromptControllerImplTest, Nickname_ExpOnNicknameInvalid) { + scoped_feature_list_.InitAndEnableFeature( + features::kAutofillEnableSurfacingServerCardNickname); + SetCreditCardForTesting(test::GetMaskedServerCardWithInvalidNickname()); + ShowPrompt(); +#if defined(OS_IOS) + EXPECT_TRUE( + base::UTF16ToUTF8(controller_->GetInstructionsMessage()).find("Visa") != + std::string::npos); + EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetInstructionsMessage()) + .find("Invalid nickname which is too long") != + std::string::npos); +#else + EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Visa") != + std::string::npos); + EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetWindowTitle()) + .find("Invalid nickname which is too long") != + std::string::npos); +#endif +} + +// Ensures the nickname is displayed (instead of network) in the instruction +// message on iOS and in the title on other platforms when experiment is enabled +// and the nickname is valid. +TEST_F(CardUnmaskPromptControllerImplTest, Nickname_ExpOnNicknameValid) { + scoped_feature_list_.InitAndEnableFeature( + features::kAutofillEnableSurfacingServerCardNickname); + SetCreditCardForTesting(test::GetMaskedServerCardWithNickname()); + ShowPrompt(); +#if defined(OS_IOS) + EXPECT_FALSE( + base::UTF16ToUTF8(controller_->GetInstructionsMessage()).find("Visa") != + std::string::npos); + EXPECT_TRUE(base::UTF16ToUTF8(controller_->GetInstructionsMessage()) + .find("Test nickname") != std::string::npos); +#else + EXPECT_FALSE(base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Visa") != + std::string::npos); + EXPECT_TRUE( + base::UTF16ToUTF8(controller_->GetWindowTitle()).find("Test nickname") != + std::string::npos); +#endif +} + struct CvcCase { const char* input; bool valid; @@ -537,7 +610,8 @@ TEST_P(CvcInputAmexValidationTest, CvcInputValidation) { auto cvc_case_amex = GetParam(); - ShowPromptAmex(); + SetCreditCardForTesting(test::GetMaskedServerCardAmex()); + ShowPrompt(); EXPECT_EQ(cvc_case_amex.valid, controller_->InputCvcIsValid(ASCIIToUTF16(cvc_case_amex.input))); if (!cvc_case_amex.valid)
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index 69375a5..bd41ce10 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -1229,7 +1229,8 @@ "exp_year," // 9 "metadata.billing_address_id," // 10 "bank_name," // 11 - "nickname " // 12 + "nickname," // 12 + "card_issuer " // 13 "FROM masked_credit_cards masked " "LEFT OUTER JOIN unmasked_credit_cards USING (id) " "LEFT OUTER JOIN server_card_metadata metadata USING (id)")); @@ -1273,6 +1274,8 @@ card->set_billing_address_id(s.ColumnString(index++)); card->set_bank_name(s.ColumnString(index++)); card->SetNickname(s.ColumnString16(index++)); + card->set_card_issuer( + static_cast<CreditCard::Issuer>(s.ColumnInt(index++))); credit_cards->push_back(std::move(card)); } return s.Succeeded(); @@ -1531,8 +1534,9 @@ "exp_month," // 5 "exp_year," // 6 "bank_name," // 7 - "nickname)" // 8 - "VALUES (?,?,?,?,?,?,?,?,?)")); + "nickname," // 8 + "card_issuer)" // 9 + "VALUES (?,?,?,?,?,?,?,?,?,?)")); int index; for (const CreditCard& card : credit_cards) { DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type()); @@ -1548,6 +1552,7 @@ card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); masked_insert.BindString(index++, card.bank_name()); masked_insert.BindString16(index++, card.nickname()); + masked_insert.BindInt(index++, static_cast<int>(card.card_issuer())); masked_insert.Run(); masked_insert.Reset(true); } @@ -2962,8 +2967,9 @@ "exp_month," // 5 "exp_year," // 6 "bank_name," // 7 - "nickname)" // 8 - "VALUES (?,?,?,?,?,?,?,?,?)")); + "nickname," // 8 + "card_issuer)" // 9 + "VALUES (?,?,?,?,?,?,?,?,?,?)")); int index; for (const CreditCard& card : credit_cards) { DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type()); @@ -2979,6 +2985,7 @@ card.GetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR)); masked_insert.BindString(index++, card.bank_name()); masked_insert.BindString16(index++, card.nickname()); + masked_insert.BindInt(index++, static_cast<int>(card.card_issuer())); masked_insert.Run(); masked_insert.Reset(true);
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc index d5b4f45..84c2a30 100644 --- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
@@ -1892,6 +1892,7 @@ inputs[1].SetServerStatus(CreditCard::EXPIRED); base::string16 nickname = ASCIIToUTF16("Grocery card"); inputs[1].SetNickname(nickname); + inputs[1].set_card_issuer(CreditCard::Issuer::GOOGLE); test::SetServerCreditCards(table_.get(), inputs); @@ -1919,6 +1920,9 @@ EXPECT_TRUE(outputs[0]->nickname().empty()); EXPECT_EQ(nickname, outputs[1]->nickname()); + + EXPECT_EQ(CreditCard::Issuer::ISSUER_UNKNOWN, outputs[0]->card_issuer()); + EXPECT_EQ(CreditCard::Issuer::GOOGLE, outputs[1]->card_issuer()); } TEST_F(AutofillTableTest, SetGetRemoveServerCardMetadata) {
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 00fc1d7..a751e17 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -28,6 +28,11 @@ "AutofillAlwaysReturnCloudTokenizedCard", base::FEATURE_DISABLED_BY_DEFAULT}; +// If enabled, when a server card is unmasked, its info will be cached until +// page navigation to simplify consecutive fills on the same page. +const base::Feature kAutofillCacheServerCardInfo{ + "AutofillCacheServerCardInfo", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kAutofillCreditCardAblationExperiment{ "AutofillCreditCardAblationExperiment", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h index e383725..f71528d 100644 --- a/components/autofill/core/common/autofill_payments_features.h +++ b/components/autofill/core/common/autofill_payments_features.h
@@ -20,6 +20,7 @@ // All features in alphabetical order. extern const base::Feature kAutofillAlwaysReturnCloudTokenizedCard; +extern const base::Feature kAutofillCacheServerCardInfo; extern const base::Feature kAutofillCreditCardAblationExperiment; extern const base::Feature kAutofillCreditCardAuthentication; extern const base::Feature kAutofillCreditCardUploadFeedback;
diff --git a/components/autofill/core/common/autofill_regex_constants.cc b/components/autofill/core/common/autofill_regex_constants.cc index 6690faa..9735629 100644 --- a/components/autofill/core/common/autofill_regex_constants.cc +++ b/components/autofill/core/common/autofill_regex_constants.cc
@@ -176,12 +176,12 @@ const char kNameOnCardContextualRe[] = "name"; const char kCardNumberRe[] = "(add)?(?:card|cc|acct).?(?:number|#|no|num|field)" - "|(?<!telefon|haus)nummer" // de-DE - "|カード番号" // ja-JP - "|Номер.*карты" // ru - "|信用卡号|信用卡号码" // zh-CN - "|信用卡卡號" // zh-TW - "|카드" // ko-KR + "|(?<!telefon|haus|person|fødsels)nummer" // de-DE, sv-SE, no + "|カード番号" // ja-JP + "|Номер.*карты" // ru + "|信用卡号|信用卡号码" // zh-CN + "|信用卡卡號" // zh-TW + "|카드" // ko-KR // es/pt/fr "|(numero|número|numéro)(?!.*(document|fono|phone|réservation))";
diff --git a/components/autofill/core/common/gaia_id_hash.cc b/components/autofill/core/common/gaia_id_hash.cc index b7bc05a..f8ec2c6 100644 --- a/components/autofill/core/common/gaia_id_hash.cc +++ b/components/autofill/core/common/gaia_id_hash.cc
@@ -51,6 +51,10 @@ return gaia_id_hash_.size() == crypto::kSHA256Length; } +bool operator<(const GaiaIdHash& lhs, const GaiaIdHash& rhs) { + return lhs.gaia_id_hash_ < rhs.gaia_id_hash_; +} + bool operator==(const GaiaIdHash& lhs, const GaiaIdHash& rhs) { return lhs.gaia_id_hash_ == rhs.gaia_id_hash_; } @@ -59,4 +63,8 @@ return !(lhs == rhs); } +GaiaIdHash& GaiaIdHash::operator=(const GaiaIdHash& form) = default; + +GaiaIdHash& GaiaIdHash::operator=(GaiaIdHash&& form) = default; + } // namespace autofill
diff --git a/components/autofill/core/common/gaia_id_hash.h b/components/autofill/core/common/gaia_id_hash.h index 05f8a957..e603690 100644 --- a/components/autofill/core/common/gaia_id_hash.h +++ b/components/autofill/core/common/gaia_id_hash.h
@@ -33,12 +33,15 @@ bool IsValid() const; + friend bool operator<(const GaiaIdHash& lhs, const GaiaIdHash& rhs); friend bool operator==(const GaiaIdHash& lhs, const GaiaIdHash& rhs); friend bool operator!=(const GaiaIdHash& lhs, const GaiaIdHash& rhs); + GaiaIdHash& operator=(const GaiaIdHash& form); + GaiaIdHash& operator=(GaiaIdHash&& form); private: explicit GaiaIdHash(const std::string& gaia_id_hash); - const std::string gaia_id_hash_; + std::string gaia_id_hash_; }; } // namespace autofill
diff --git a/components/autofill/core/common/password_form.cc b/components/autofill/core/common/password_form.cc index d84a157b..06d85e9 100644 --- a/components/autofill/core/common/password_form.cc +++ b/components/autofill/core/common/password_form.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "components/autofill/core/common/password_form.h" + #include <algorithm> #include <ostream> #include <sstream> @@ -11,7 +13,6 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" -#include "components/autofill/core/common/password_form.h" namespace autofill { @@ -96,6 +97,13 @@ form.form_data.is_gaia_with_skip_save_password_form); target->SetBoolean("is_new_password_reliable", form.is_new_password_reliable); target->SetString("in_store", StoreToString(form.in_store)); + + std::vector<std::string> hashes; + hashes.reserve(form.moving_blocked_for_list.size()); + for (const auto& gaia_id_hash : form.moving_blocked_for_list) { + hashes.push_back(gaia_id_hash.ToBase64()); + } + target->SetString("moving_blocked_for_list", base::JoinString(hashes, ", ")); } } // namespace @@ -199,7 +207,8 @@ submission_event == form.submission_event && only_for_fallback == form.only_for_fallback && is_new_password_reliable == form.is_new_password_reliable && - in_store == form.in_store; + in_store == form.in_store && + moving_blocked_for_list == form.moving_blocked_for_list; } bool PasswordForm::operator!=(const PasswordForm& form) const {
diff --git a/components/autofill/core/common/password_form.h b/components/autofill/core/common/password_form.h index d11a279..f2fceff 100644 --- a/components/autofill/core/common/password_form.h +++ b/components/autofill/core/common/password_form.h
@@ -13,6 +13,7 @@ #include "base/time/time.h" #include "components/autofill/core/common/form_data.h" +#include "components/autofill/core/common/gaia_id_hash.h" #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h" #include "url/gurl.h" #include "url/origin.h" @@ -307,6 +308,11 @@ }; Store in_store = Store::kNotSet; + // Vector of hashes of the gaia id for users who prefer not to move this + // password form to their account. This list is used to suppress the move + // prompt for those users. + std::vector<GaiaIdHash> moving_blocked_for_list; + // Return true if we consider this form to be a change password form. // We use only client heuristics, so it could include signup forms. bool IsPossibleChangePasswordForm() const;
diff --git a/components/autofill_assistant/browser/interactions.proto b/components/autofill_assistant/browser/interactions.proto index 5117cde..1bb3b0cf 100644 --- a/components/autofill_assistant/browser/interactions.proto +++ b/components/autofill_assistant/browser/interactions.proto
@@ -38,6 +38,7 @@ SetTextProto set_text = 8; ToggleUserActionProto toggle_user_action = 9; SetViewVisibilityProto set_view_visibility = 11; + SetViewEnabledProto set_view_enabled = 12; } // Optional model identifier pointing to a single boolean. If set, the // callback will only be invoked if the condition is true. @@ -276,3 +277,13 @@ reserved 2; } + +// Enables or disables a view. Note that disabled views won't react to click +// events. +message SetViewEnabledProto { + // The view to modify. + optional string view_identifier = 1; + + // Whether the view should be enabled or not. Must point to a single boolean. + optional ValueReferenceProto enabled = 2; +}
diff --git a/components/autofill_assistant/browser/view_layout.proto b/components/autofill_assistant/browser/view_layout.proto index 9cb5b99..c51d474 100644 --- a/components/autofill_assistant/browser/view_layout.proto +++ b/components/autofill_assistant/browser/view_layout.proto
@@ -100,6 +100,8 @@ optional string content_description = 6; // Whether the view is initially visible or not. optional bool visible = 7 [default = true]; + // Whether the view is initially enabled or not. + optional bool enabled = 8 [default = true]; } // Parameters configuring how views attach to their parents.
diff --git a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java index 5e57ac62..b946021e 100644 --- a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java +++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/ModalDialogView.java
@@ -16,13 +16,18 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.IntDef; + import org.chromium.base.Callback; import org.chromium.base.Log; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.components.browser_ui.widget.BoundedLinearLayout; import org.chromium.components.browser_ui.widget.FadingEdgeScrollView; import org.chromium.ui.UiUtils; import org.chromium.ui.modaldialog.ModalDialogProperties; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Field; /** @@ -30,6 +35,19 @@ */ public class ModalDialogView extends BoundedLinearLayout implements View.OnClickListener { private static final String TAG = "ModalDialogView"; + private static final String UMA_SECURITY_FILTERED_TOUCH_RESULT = + "Android.ModalDialog.SecurityFilteredTouchResult"; + + // Intdef with constants for recording the result of filtering touch events on security + // sensitive dialogs. Should stay in sync with the SecurityFilteredTouchResult enum defined in + // tools/metrics/histograms/enums.xml. + @IntDef({SecurityFilteredTouchResult.BLOCKED, SecurityFilteredTouchResult.HANDLED}) + @Retention(RetentionPolicy.SOURCE) + public @interface SecurityFilteredTouchResult { + int HANDLED = 0; + int BLOCKED = 1; + int NUM_ENTRIES = 2; + } private ModalDialogProperties.Controller mController; @@ -45,6 +63,7 @@ private Callback<Integer> mOnButtonClickedCallback; private boolean mTitleScrollable; private boolean mFilterTouchForSecurity; + private boolean mFilteredTouchResultRecorded; /** * Constructor for inflating from XML. @@ -188,13 +207,24 @@ // introduced on M+. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false; + boolean shouldBlockTouchEvent = false; + try { Field field = MotionEvent.class.getField("FLAG_WINDOW_IS_PARTIALLY_OBSCURED"); - if ((ev.getFlags() & field.getInt(null)) != 0) return true; + if ((ev.getFlags() & field.getInt(null)) != 0) { + shouldBlockTouchEvent = true; + } + if (ev.getAction() == MotionEvent.ACTION_DOWN && !mFilteredTouchResultRecorded) { + mFilteredTouchResultRecorded = true; + RecordHistogram.recordEnumeratedHistogram(UMA_SECURITY_FILTERED_TOUCH_RESULT, + shouldBlockTouchEvent ? SecurityFilteredTouchResult.BLOCKED + : SecurityFilteredTouchResult.HANDLED, + SecurityFilteredTouchResult.NUM_ENTRIES); + } } catch (NoSuchFieldException | IllegalAccessException e) { Log.e(TAG, "Reflection failure: " + e); } - return false; + return shouldBlockTouchEvent; }; positiveButton.setFilterTouchesWhenObscured(true);
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd index 480b7bb..1e772656 100644 --- a/components/browser_ui/strings/android/browser_ui_strings.grd +++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -404,6 +404,14 @@ <message name="IDS_DOWNLOAD_UI_GB" desc="String indicating the size of a downloaded file (in progress or complete), in gigabytes."> <ph name="gigabytes">%1$3.2f<ex>12.5</ex></ph> GB </message> + + <!-- Override URL --> + <message name="IDS_BLOCKED_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is blocked."> + Navigation is blocked: <ph name="URL">%1$s<ex>intent://abcd</ex></ph> + </message> + <message name="IDS_UNREACHABLE_NAVIGATION_WARNING" desc="Warning message added to dev tools console when navigation to a given URL is unreachable."> + Navigation is unreachable: <ph name="URL">%1$s<ex>intent://abcd</ex></ph> + </message> </messages> </release> </grit>
diff --git a/components/browser_ui/widget/android/BUILD.gn b/components/browser_ui/widget/android/BUILD.gn index 32a49a3d..54599ff76 100644 --- a/components/browser_ui/widget/android/BUILD.gn +++ b/components/browser_ui/widget/android/BUILD.gn
@@ -30,6 +30,7 @@ "java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionLayout.java", "java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java", "java/src/org/chromium/components/browser_ui/widget/RoundedCornerImageView.java", + "java/src/org/chromium/components/browser_ui/widget/RoundedIconGenerator.java", "java/src/org/chromium/components/browser_ui/widget/TintedDrawable.java", "java/src/org/chromium/components/browser_ui/widget/ViewResourceFrameLayout.java", "java/src/org/chromium/components/browser_ui/widget/WrappingLayout.java", @@ -47,6 +48,18 @@ "java/src/org/chromium/components/browser_ui/widget/highlight/PulseDrawable.java", "java/src/org/chromium/components/browser_ui/widget/highlight/PulseInterpolator.java", "java/src/org/chromium/components/browser_ui/widget/highlight/ViewHighlighter.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTile.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinator.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinatorFactory.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileConfig.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileCoordinatorImpl.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListModel.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListProperties.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListPropertyViewBinder.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListView.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileSizeSupplier.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolder.java", + "java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolderFactory.java", "java/src/org/chromium/components/browser_ui/widget/listmenu/BasicListMenu.java", "java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenu.java", "java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuButton.java", @@ -54,6 +67,10 @@ "java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemAdapter.java", "java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemProperties.java", "java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuItemViewBinder.java", + "java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java", + "java/src/org/chromium/components/browser_ui/widget/promo/PromoCardProperties.java", + "java/src/org/chromium/components/browser_ui/widget/promo/PromoCardView.java", + "java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewBinder.java", "java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java", "java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java", "java/src/org/chromium/components/browser_ui/widget/scrim/ScrimProperties.java", @@ -78,12 +95,14 @@ deps = [ ":java_resources", "//base:base_java", + "//components/embedder_support/android:util_java", "//third_party/android_deps:android_support_v4_java", "//third_party/android_deps:android_support_v7_appcompat_java", "//third_party/android_deps:androidx_recyclerview_recyclerview_java", "//third_party/android_deps:com_android_support_interpolator_java", "//third_party/android_deps:com_google_android_material_material_java", "//ui/android:ui_java", + "//url:gurl_java", ] } @@ -136,6 +155,7 @@ "java/res/drawable/ic_check_googblue_24dp_animated.xml", "java/res/drawable/list_item_icon_modern_bg.xml", "java/res/drawable/modern_toolbar_text_box_background.xml", + "java/res/drawable/query_tile_overlay.xml", "java/res/drawable/search_toolbar_modern_bg.xml", "java/res/layout/app_menu_divider.xml", "java/res/layout/app_menu_layout.xml", @@ -146,7 +166,9 @@ "java/res/layout/modern_list_item_view.xml", "java/res/layout/more_progress_button.xml", "java/res/layout/number_roll_view.xml", + "java/res/layout/promo_card_view.xml", "java/res/layout/promo_dialog_layout.xml", + "java/res/layout/query_tile_view.xml", "java/res/layout/radio_button_layout_element.xml", "java/res/layout/radio_button_with_description.xml", "java/res/layout/radio_button_with_edit_text.xml", @@ -195,9 +217,12 @@ "java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java", "java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionLayoutTest.java", "java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditTextTest.java", + "java/src/org/chromium/components/browser_ui/widget/RoundedIconGeneratorTest.java", "java/src/org/chromium/components/browser_ui/widget/WrappingLayoutTest.java", "java/src/org/chromium/components/browser_ui/widget/highlight/ViewHighlighterTest.java", "java/src/org/chromium/components/browser_ui/widget/listmenu/ListMenuRenderTest.java", + "java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinatorTest.java", + "java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java", "java/src/org/chromium/components/browser_ui/widget/scrim/ScrimTest.java", ] deps = [ @@ -228,6 +253,7 @@ "test/java/res/drawable-xhdpi/promo_dialog_test_drawable.png", "test/java/res/drawable-xxhdpi/promo_dialog_test_drawable.png", "test/java/res/drawable-xxxhdpi/promo_dialog_test_drawable.png", + "test/java/res/drawable/logo_avatar_anonymous.xml", "test/java/res/drawable/promo_dialog_test_vector.xml", "test/java/res/layout/dual_control_test_layout.xml", "test/java/res/layout/radio_button_render_test.xml",
diff --git a/components/browser_ui/widget/android/DEPS b/components/browser_ui/widget/android/DEPS index 8f7d1b5..1f24fea 100644 --- a/components/browser_ui/widget/android/DEPS +++ b/components/browser_ui/widget/android/DEPS
@@ -1,4 +1,5 @@ include_rules = [ - "+ui/android", + "+components/embedder_support/android", "+content/public/test/android", + "+ui/android", ]
diff --git a/chrome/browser/upboarding/query_tiles/android/java/res/drawable/query_tile_overlay.xml b/components/browser_ui/widget/android/java/res/drawable/query_tile_overlay.xml similarity index 88% rename from chrome/browser/upboarding/query_tiles/android/java/res/drawable/query_tile_overlay.xml rename to components/browser_ui/widget/android/java/res/drawable/query_tile_overlay.xml index 810276c2..2127d51 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/res/drawable/query_tile_overlay.xml +++ b/components/browser_ui/widget/android/java/res/drawable/query_tile_overlay.xml
@@ -12,5 +12,5 @@ android:startColor="#00000000" android:type="linear" /> <corners - android:radius="@dimen/tile_corner_radius"/> + android:radius="@dimen/default_rounded_corner_radius"/> </shape>
diff --git a/components/browser_ui/widget/android/java/res/layout/promo_card_view.xml b/components/browser_ui/widget/android/java/res/layout/promo_card_view.xml new file mode 100644 index 0000000..d2f1828 --- /dev/null +++ b/components/browser_ui/widget/android/java/res/layout/promo_card_view.xml
@@ -0,0 +1,90 @@ +<?xml version="1.0" encoding="utf-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. --> + +<org.chromium.components.browser_ui.widget.promo.PromoCardView + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:orientation="vertical" + android:background="@drawable/hairline_border_card_background" + android:padding="@dimen/promo_padding"> + + <!-- Promo Header--> + <FrameLayout + android:id="@+id/promo_header" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/promo_header_margin_vertical"> + + <ImageView + android:id="@+id/promo_image" + android:layout_width="@dimen/promo_image_size" + android:layout_height="@dimen/promo_image_size" + android:layout_gravity="center" + android:scaleType="fitCenter" + tools:ignore="ContentDescription" /> + + <org.chromium.ui.widget.ChromeImageButton + android:id="@+id/promo_close_button" + android:layout_width="@dimen/promo_close_btn_size" + android:layout_height="@dimen/promo_close_btn_size" + android:layout_gravity="top|end" + android:contentDescription="@string/close" + android:background="?android:attr/selectableItemBackground" + android:scaleType="fitCenter" + android:src="@drawable/btn_close" + app:tint="@color/default_icon_color" /> + </FrameLayout> + + <org.chromium.ui.widget.TextViewWithLeading + android:id="@+id/promo_title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/promo_title_margin_vertical" + android:layout_marginEnd="@dimen/promo_description_margin_horizontal" + android:layout_marginStart="@dimen/promo_description_margin_horizontal" + android:gravity="center" + android:textAppearance="@style/TextAppearance.TextLarge.Primary" + android:layout_below="@+id/promo_header" + app:leading="@dimen/text_size_large_leading"/> + + <org.chromium.ui.widget.TextViewWithLeading + android:id="@+id/promo_description" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/promo_description_margin_vertical" + android:layout_marginEnd="@dimen/promo_description_margin_horizontal" + android:layout_marginStart="@dimen/promo_description_margin_horizontal" + android:layout_below="@+id/promo_title" + android:gravity="center" + android:textAppearance="@style/TextAppearance.TextSmall.Secondary" + app:leading="@dimen/text_size_small_leading" /> + + <org.chromium.ui.widget.ButtonCompat + android:id="@+id/promo_primary_button" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/promo_buttons_margin_horizontal" + android:layout_marginStart="@dimen/promo_buttons_margin_horizontal" + android:ellipsize="end" + android:singleLine="true" + android:layout_below="@+id/description" + style="@style/FilledButton.Flat" /> + + <org.chromium.ui.widget.ButtonCompat + android:id="@+id/promo_secondary_button" + style="@style/TextButton" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/promo_buttons_margin_horizontal" + android:layout_marginStart="@dimen/promo_buttons_margin_horizontal" + android:ellipsize="end" + android:singleLine="true" + android:layout_below="@+id/primary_button"/> + +</org.chromium.components.browser_ui.widget.promo.PromoCardView>
diff --git a/chrome/browser/upboarding/query_tiles/android/java/res/layout/query_tile_view.xml b/components/browser_ui/widget/android/java/res/layout/query_tile_view.xml similarity index 77% rename from chrome/browser/upboarding/query_tiles/android/java/res/layout/query_tile_view.xml rename to components/browser_ui/widget/android/java/res/layout/query_tile_view.xml index ae0b1c0..242ab6d 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/res/layout/query_tile_view.xml +++ b/components/browser_ui/widget/android/java/res/layout/query_tile_view.xml
@@ -16,10 +16,10 @@ android:layout_gravity="center_horizontal" android:scaleType="centerCrop" android:importantForAccessibility="no" - app:cornerRadiusBottomStart="@dimen/tile_corner_radius" - app:cornerRadiusBottomEnd="@dimen/tile_corner_radius" - app:cornerRadiusTopStart="@dimen/tile_corner_radius" - app:cornerRadiusTopEnd="@dimen/tile_corner_radius" /> + app:cornerRadiusBottomStart="@dimen/default_rounded_corner_radius" + app:cornerRadiusBottomEnd="@dimen/default_rounded_corner_radius" + app:cornerRadiusTopStart="@dimen/default_rounded_corner_radius" + app:cornerRadiusTopEnd="@dimen/default_rounded_corner_radius" /> <ImageView android:id="@+id/gradient_overlay" @@ -35,5 +35,5 @@ android:layout_alignParentBottom="true" android:layout_marginBottom="12dp" android:layout_marginStart="16dp" - android:textAppearance="@style/TextAppearance.WhiteText"/> -</RelativeLayout> \ No newline at end of file + android:textAppearance="@style/TextAppearance.TextMedium.Primary.Light"/> +</RelativeLayout>
diff --git a/components/browser_ui/widget/android/java/res/values/dimens.xml b/components/browser_ui/widget/android/java/res/values/dimens.xml index 147b3d3b..b8e5a15 100644 --- a/components/browser_ui/widget/android/java/res/values/dimens.xml +++ b/components/browser_ui/widget/android/java/res/values/dimens.xml
@@ -62,6 +62,16 @@ 24dp is needed to completely round the corners. --> <dimen name="modern_toolbar_background_corner_radius">24dp</dimen> + <!-- Promo cards dimensions --> + <dimen name="promo_image_size">24dp</dimen> + <dimen name="promo_padding">16dp</dimen> + <dimen name="promo_header_margin_vertical">8dp</dimen> + <dimen name="promo_close_btn_size">24dp</dimen> + <dimen name="promo_title_margin_vertical">8dp</dimen> + <dimen name="promo_description_margin_horizontal">8dp</dimen> + <dimen name="promo_description_margin_vertical">16dp</dimen> + <dimen name="promo_buttons_margin_horizontal">8dp</dimen> + <!-- TextBubble dimensions --> <dimen name="text_bubble_margin">4dp</dimen> <dimen name="text_bubble_corner_radius">8dp</dimen> @@ -71,4 +81,11 @@ <!-- Default list dimensions --> <dimen name="default_list_row_padding">16dp</dimen> + + <!-- Query tile dimensions --> + <dimen name="tile_ideal_width">86dp</dimen> + + <!-- Query tile container dimensions --> + <dimen name="tile_grid_inter_tile_padding">12dp</dimen> + </resources>
diff --git a/components/browser_ui/widget/android/java/res/values/styles.xml b/components/browser_ui/widget/android/java/res/values/styles.xml index c485bbd..d6895d0 100644 --- a/components/browser_ui/widget/android/java/res/values/styles.xml +++ b/components/browser_ui/widget/android/java/res/values/styles.xml
@@ -84,5 +84,4 @@ <item name="android:windowEnterAnimation">@anim/textbubble_in</item> <item name="android:windowExitAnimation">@anim/textbubble_out</item> </style> - </resources>
diff --git a/components/favicon/android/java/src/org/chromium/components/favicon/FaviconFallbackGenerator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedIconGenerator.java similarity index 94% rename from components/favicon/android/java/src/org/chromium/components/favicon/FaviconFallbackGenerator.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedIconGenerator.java index a6c9f5d..ecdd972a 100644 --- a/components/favicon/android/java/src/org/chromium/components/favicon/FaviconFallbackGenerator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedIconGenerator.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.components.favicon; +package org.chromium.components.browser_ui.widget; import android.content.res.Resources; import android.graphics.Bitmap; @@ -28,8 +28,8 @@ * Generator for transparent icons containing a rounded rectangle with a given background color, * having a centered character drawn on top of it. */ -public class FaviconFallbackGenerator { - private static final String TAG = "FaviconFallbackGenerator"; +public class RoundedIconGenerator { + private static final String TAG = "RoundedIconGenerator"; private final int mIconWidthPx; private final int mIconHeightPx; @@ -53,7 +53,7 @@ * @param backgroundColor Color with which the rounded rectangle should be drawn. * @param textSizeDp Size at which the text should be drawn in dp. */ - public FaviconFallbackGenerator(Resources res, int iconWidthDp, int iconHeightDp, + public RoundedIconGenerator(Resources res, int iconWidthDp, int iconHeightDp, int cornerRadiusDp, int backgroundColor, int textSizeDp) { this((int) (res.getDisplayMetrics().density * iconWidthDp), (int) (res.getDisplayMetrics().density * iconHeightDp), @@ -70,7 +70,7 @@ * @param backgroundColor Color at which the rounded rectangle should be drawn. * @param textSizePx Size at which the text should be drawn in pixels. */ - public FaviconFallbackGenerator(int iconWidthPx, int iconHeightPx, int cornerRadiusPx, + public RoundedIconGenerator(int iconWidthPx, int iconHeightPx, int cornerRadiusPx, int backgroundColor, float textSizePx) { mIconWidthPx = iconWidthPx; mIconHeightPx = iconHeightPx;
diff --git a/components/favicon/android/java/src/org/chromium/components/favicon/FaviconFallbackGeneratorTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedIconGeneratorTest.java similarity index 85% rename from components/favicon/android/java/src/org/chromium/components/favicon/FaviconFallbackGeneratorTest.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedIconGeneratorTest.java index 643b2206..4a20edd 100644 --- a/components/favicon/android/java/src/org/chromium/components/favicon/FaviconFallbackGeneratorTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RoundedIconGeneratorTest.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.components.favicon; +package org.chromium.components.browser_ui.widget; import android.content.Context; import android.graphics.Color; @@ -20,10 +20,10 @@ import org.chromium.base.test.util.Feature; /** - * Unit tests for FaviconFallbackGenerator. + * Unit tests for RoundedIconGenerator. */ @RunWith(BaseJUnit4ClassRunner.class) -public class FaviconFallbackGeneratorTest { +public class RoundedIconGeneratorTest { private Context mContext; @Before @@ -34,16 +34,16 @@ } private String getIconTextForUrl(String url, boolean includePrivateRegistries) { - return FaviconFallbackGenerator.getIconTextForUrl(url, includePrivateRegistries); + return RoundedIconGenerator.getIconTextForUrl(url, includePrivateRegistries); } /** - * Verifies that FaviconFallbackGenerator's ability to generate icons based on URLs considers + * Verifies that RoundedIconGenerator's ability to generate icons based on URLs considers * the appropriate parts of the URL for the icon to generate. */ @Test @SmallTest - @Feature({"Browser", "FaviconFallbackGenerator"}) + @Feature({"Browser", "RoundedIconGenerator"}) public void testGetIconTextForUrl() { // Verify valid domains when including private registries. Assert.assertEquals("google.com", getIconTextForUrl("https://google.com/", true)); @@ -74,14 +74,14 @@ */ @Test @SmallTest - @Feature({"Browser", "FaviconFallbackGenerator"}) + @Feature({"Browser", "RoundedIconGenerator"}) public void testGenerateIconForText() { final int iconSizeDp = 32; final int iconCornerRadiusDp = 20; final int iconTextSizeDp = 12; int iconColor = Color.GRAY; - FaviconFallbackGenerator generator = new FaviconFallbackGenerator(mContext.getResources(), + RoundedIconGenerator generator = new RoundedIconGenerator(mContext.getResources(), iconSizeDp, iconSizeDp, iconCornerRadiusDp, iconColor, iconTextSizeDp); Assert.assertTrue(generator.generateIconForText("") != null);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTile.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTile.java new file mode 100644 index 0000000..bb0ba5f --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTile.java
@@ -0,0 +1,27 @@ +// 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.components.browser_ui.widget.image_tiles; + +/** + * Class encapsulating data needed to render a image tile. An {@link ImageTile} is a tile meant to + * show an image with some text. + */ +public class ImageTile { + /** The ID representing this tile. */ + public final String id; + + /** The text to be shown on this tile. */ + public final String displayTitle; + + /** The text to be shown in accessibility mode. */ + public final String accessibilityText; + + /** Constructor. */ + public ImageTile(String id, String displayTitle, String accessibilityText) { + this.id = id; + this.displayTitle = displayTitle; + this.accessibilityText = accessibilityText; + } +}
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinator.java similarity index 72% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinator.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinator.java index f95f12ef..84326ae1 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/QueryTileCoordinator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinator.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.query_tiles; +package org.chromium.components.browser_ui.widget.image_tiles; import android.graphics.Bitmap; import android.view.View; @@ -12,9 +12,9 @@ import java.util.List; /** - * The top level coordinator for the query tiles UI. + * The top level coordinator for the image tiles UI. */ -public interface QueryTileCoordinator { +public interface ImageTileCoordinator { /** @return A {@link View} representing this coordinator. */ View getView(); @@ -22,7 +22,7 @@ * Sets a list of tiles to be displayed. * @param tiles The list of tiles to be displayed. */ - void setTiles(List<Tile> tiles); + void setTiles(List<ImageTile> tiles); /** A helper interface to support retrieving {@link Bitmap}s asynchronously. */ @FunctionalInterface @@ -30,9 +30,9 @@ /** * Called to get the visuals required for showing the tile. The result consists a list of * bitmaps, as the UI might use more than one bitmap to represent the tile. - * @param tile The {@link Tile} to get the {@link Bitmap} for. + * @param tile The {@link ImageTile} to get the {@link Bitmap} for. * @param callback A {@link Callback} that will be notified on completion. */ - void getVisuals(Tile tile, Callback<List<Bitmap>> callback); + void getVisuals(ImageTile tile, Callback<List<Bitmap>> callback); } } \ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinatorFactory.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinatorFactory.java new file mode 100644 index 0000000..fe7f9a6 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/ImageTileCoordinatorFactory.java
@@ -0,0 +1,33 @@ +// 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.components.browser_ui.widget.image_tiles; + +import android.content.Context; + +import org.chromium.base.Callback; +import org.chromium.components.browser_ui.widget.image_tiles.ImageTileCoordinator.TileVisualsProvider; + +/** + * Factory to create an {@link ImageTileCoordinator} instance. + * The {@link ImageTileCoordinator} is a generic widget that can display a list of images inside a + * carousel. For using this widget, + * - Create a {@link ImageTileCoordinator}. + * - Call {@link ImageTileCoordinator#setTiles(List)} with a list of {@link ImageTile}s to be + * shown. + * - Implement {@link TileVisualsProvider} to provide thumbnails for the images. + * - Define click handlers to be invoked when the tiles are clicked. + */ +public class ImageTileCoordinatorFactory { + /** + * Creates a {@link ImageTileCoordinator}. + * @param context The context associated with the current activity. + * @param tileClickCallback A callback to be invoked when a tile is clicked. + * @return A {@link ImageTileCoordinator}. + */ + public static ImageTileCoordinator create(Context context, TileConfig config, + Callback<ImageTile> tileClickCallback, TileVisualsProvider tileVisualsProvider) { + return new TileCoordinatorImpl(context, config, tileClickCallback, tileVisualsProvider); + } +} \ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/OWNERS b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/OWNERS new file mode 100644 index 0000000..149edce --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/OWNERS
@@ -0,0 +1,9 @@ +# primary reviewers +shaktisahu@chromium.org + +# backup reviewers +dtrainor@chromium.org + +# TEAM: chrome-upboarding@google.com +# COMPONENT: UI>Browser>Mobile +# OS: Android
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileConfig.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileConfig.java new file mode 100644 index 0000000..c1159da --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileConfig.java
@@ -0,0 +1,34 @@ +// 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.components.browser_ui.widget.image_tiles; + +/** Provides the configuration params required by the tiles UI. */ +public class TileConfig { + public final String umaPrefix; + + /** Constructor. */ + private TileConfig(Builder builder) { + umaPrefix = builder.mUmaPrefix; + } + + /** Helper class for building a {@link TileConfig}. */ + public static class Builder { + private String mUmaPrefix; + + /** + * Sets the histogram prefix to be used while collecting metrics. + * @param umaPrefix The prefix to be used for histograms. + * @return A {@link Builder} instance. + */ + public Builder setUmaPrefix(String umaPrefix) { + mUmaPrefix = umaPrefix; + return this; + } + + public TileConfig build() { + return new TileConfig(this); + } + } +} \ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileCoordinatorImpl.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileCoordinatorImpl.java new file mode 100644 index 0000000..d20f3a56 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileCoordinatorImpl.java
@@ -0,0 +1,40 @@ +// 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.components.browser_ui.widget.image_tiles; + +import android.content.Context; +import android.view.View; + +import org.chromium.base.Callback; + +import java.util.List; + +/** + * The top level coordinator for the tiles UI. + */ +class TileCoordinatorImpl implements ImageTileCoordinator { + private final TileListModel mModel; + private final TileListView mView; + + /** Constructor. */ + public TileCoordinatorImpl(Context context, TileConfig config, + Callback<ImageTile> tileClickCallback, TileVisualsProvider visualsProvider) { + mModel = new TileListModel(); + mView = new TileListView(context, config, mModel); + + mModel.getProperties().set(TileListProperties.CLICK_CALLBACK, tileClickCallback); + mModel.getProperties().set(TileListProperties.VISUALS_CALLBACK, visualsProvider); + } + + @Override + public View getView() { + return mView.getView(); + } + + @Override + public void setTiles(List<ImageTile> tiles) { + mModel.set(tiles); + } +}
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListModel.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListModel.java similarity index 81% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListModel.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListModel.java index 78eded6..ceeea13 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListModel.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListModel.java
@@ -2,18 +2,17 @@ // 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.query_tiles.list; +package org.chromium.components.browser_ui.widget.image_tiles; -import org.chromium.chrome.browser.query_tiles.Tile; import org.chromium.ui.modelutil.ListModel; import org.chromium.ui.modelutil.PropertyModel; /** - * This model represents the data required to build a list UI around a set of {@link Tile}s. + * This model represents the data required to build a list UI around a set of {@link ImageTile}s. * This includes (1) a {@link ListModel} implementation and (2) exposing a * {@link PropertyModel} for shared item properties and general list information. */ -class TileListModel extends ListModel<Tile> { +class TileListModel extends ListModel<ImageTile> { private final PropertyModel mListProperties = new PropertyModel(TileListProperties.ALL_KEYS); /**
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListProperties.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListProperties.java similarity index 62% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListProperties.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListProperties.java index f65234c..2a60d7d1 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListProperties.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListProperties.java
@@ -2,25 +2,24 @@ // 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.query_tiles.list; +package org.chromium.components.browser_ui.widget.image_tiles; import org.chromium.base.Callback; -import org.chromium.chrome.browser.query_tiles.QueryTileCoordinator.TileVisualsProvider; -import org.chromium.chrome.browser.query_tiles.Tile; +import org.chromium.components.browser_ui.widget.image_tiles.ImageTileCoordinator.TileVisualsProvider; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; /** - * The properties required to build a {@link Tile} which contain two types of properties: + * The properties required to build a {@link ImageTile} which contain two types of properties: * (1) A set of properties that act directly on the list view itself. (2) A set of * properties that are effectively shared across all list items like callbacks. */ interface TileListProperties { + /** The callback to run when a {@link ImageTile} is clicked on the UI. */ + WritableObjectPropertyKey<Callback<ImageTile>> CLICK_CALLBACK = + new WritableObjectPropertyKey<>(); - /** The callback to run when a {@link Tile} is clicked on the UI. */ - WritableObjectPropertyKey<Callback<Tile>> CLICK_CALLBACK = new WritableObjectPropertyKey<>(); - - /** The provider to retrieve expensive visuals for a {@link Tile}. */ + /** The provider to retrieve expensive visuals for a {@link ImageTile}. */ WritableObjectPropertyKey<TileVisualsProvider> VISUALS_CALLBACK = new WritableObjectPropertyKey<>();
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListPropertyViewBinder.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListPropertyViewBinder.java similarity index 90% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListPropertyViewBinder.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListPropertyViewBinder.java index 8a95e41..443d4e0 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListPropertyViewBinder.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListPropertyViewBinder.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.query_tiles.list; +package org.chromium.components.browser_ui.widget.image_tiles; import androidx.recyclerview.widget.RecyclerView;
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListView.java similarity index 92% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListView.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListView.java index 6c55e76..88b3b9d2 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileListView.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileListView.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.query_tiles.list; +package org.chromium.components.browser_ui.widget.image_tiles; import android.content.Context; import android.content.res.Configuration; @@ -16,13 +16,13 @@ import androidx.recyclerview.widget.RecyclerView.ItemDecoration; import androidx.recyclerview.widget.RecyclerView.State; -import org.chromium.chrome.query_tiles.R; +import org.chromium.components.browser_ui.widget.R; import org.chromium.ui.modelutil.ForwardingListObservable; import org.chromium.ui.modelutil.PropertyModelChangeProcessor; import org.chromium.ui.modelutil.RecyclerViewAdapter; /** - * The View component of a query tiles. This takes the {@link TileListModel} and creates the + * The View component of the tiles UI. This takes the {@link TileListModel} and creates the * glue to display it on the screen. */ class TileListView { @@ -33,7 +33,7 @@ private final TileSizeSupplier mTileSizeSupplier; /** Constructor. */ - public TileListView(Context context, TileListModel model) { + public TileListView(Context context, TileConfig config, TileListModel model) { mModel = model; mView = new RecyclerView(context) { @Override
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileSizeSupplier.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileSizeSupplier.java similarity index 90% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileSizeSupplier.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileSizeSupplier.java index ee18401..b9f453d 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileSizeSupplier.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileSizeSupplier.java
@@ -2,13 +2,14 @@ // 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.query_tiles.list; +package org.chromium.components.browser_ui.widget.image_tiles; + import android.content.Context; import android.content.res.Resources; import org.chromium.base.supplier.Supplier; -import org.chromium.chrome.browser.query_tiles.list.TileSizeSupplier.TileSize; -import org.chromium.chrome.query_tiles.R; +import org.chromium.components.browser_ui.widget.R; +import org.chromium.components.browser_ui.widget.image_tiles.TileSizeSupplier.TileSize; /** * A helper class to compute dimensions for the carousel layout. @@ -65,6 +66,6 @@ private int getAvailableWidth() { // TODO(shaktisahu): Cap this for tablet and landscape to 600dp. return mResources.getDisplayMetrics().widthPixels - - 2 * mResources.getDimensionPixelOffset(R.dimen.recycler_view_start_margin); + - 2 * mResources.getDimensionPixelOffset(R.dimen.default_list_row_padding); } }
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolder.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolder.java similarity index 86% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolder.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolder.java index b8a018b8..4a75585 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolder.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolder.java
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.query_tiles.list; +package org.chromium.components.browser_ui.widget.image_tiles; import android.view.View; import android.widget.ImageView; @@ -10,12 +10,11 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; -import org.chromium.chrome.browser.query_tiles.Tile; -import org.chromium.chrome.query_tiles.R; +import org.chromium.components.browser_ui.widget.R; import org.chromium.ui.modelutil.PropertyModel; /** - * A {@link ViewHolder} responsible for building and setting properties on the query tile views. + * A {@link ViewHolder} responsible for building and setting properties on the tiles. */ class TileViewHolder extends ViewHolder { /** Creates an instance of a {@link TileViewHolder}. */ @@ -28,7 +27,7 @@ * @param properties The shared {@link PropertyModel} all items can access. * @param tile The {@link ListItem} to visually represent in this {@link ViewHolder}. */ - public void bind(PropertyModel properties, Tile tile) { + public void bind(PropertyModel properties, ImageTile tile) { TextView title = itemView.findViewById(R.id.title); title.setText(tile.displayTitle); itemView.setOnClickListener(
diff --git a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolderFactory.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolderFactory.java similarity index 81% rename from chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolderFactory.java rename to components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolderFactory.java index fc30e17..7990d3e 100644 --- a/chrome/browser/upboarding/query_tiles/android/java/src/org/chromium/chrome/browser/query_tiles/list/TileViewHolderFactory.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/image_tiles/TileViewHolderFactory.java
@@ -2,18 +2,19 @@ // 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.query_tiles.list; +package org.chromium.components.browser_ui.widget.image_tiles; + import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.chromium.base.supplier.Supplier; -import org.chromium.chrome.browser.query_tiles.list.TileSizeSupplier.TileSize; -import org.chromium.chrome.query_tiles.R; +import org.chromium.components.browser_ui.widget.R; +import org.chromium.components.browser_ui.widget.image_tiles.TileSizeSupplier.TileSize; import org.chromium.ui.modelutil.RecyclerViewAdapter; /** - * A factory class to create view holders for the query tiles. + * A factory class to create view holders for the tiles. */ class TileViewHolderFactory implements RecyclerViewAdapter.ViewHolderFactory<TileViewHolder> { private final Supplier<TileSize> mTileSizeSupplier;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java new file mode 100644 index 0000000..fe975f5 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java
@@ -0,0 +1,60 @@ +// 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.components.browser_ui.widget.promo; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; + +import org.chromium.components.browser_ui.widget.R; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; + +/** + * PromoCard Coordinator that owns the view and the model change processor. Client will need to + * create another layer of controller to own this coordinator, and pass in the {@link PropertyModel} + * to initialize the view. + */ +public class PromoCardCoordinator { + private PromoCardView mPromoCardView; + private PropertyModelChangeProcessor mModelChangeProcessor; + private String mFeatureName; + + /** + * Create the Coordinator of PromoCard that owns the view and the change process. + * @param context Context used to create the view. + * @param model {@link PropertyModel} built with {@link PromoCardProperties}. + * @param featureName Name of the feature of this promo. Will be used to create keys for + * SharedPreference. + */ + public PromoCardCoordinator(Context context, PropertyModel model, String featureName) { + mPromoCardView = (PromoCardView) LayoutInflater.from(context).inflate( + R.layout.promo_card_view, null, false); + mModelChangeProcessor = PropertyModelChangeProcessor.create( + model, mPromoCardView, new PromoCardViewBinder()); + mFeatureName = featureName; + } + + /** + * Destroy the PromoCard component and release the PropertyModelChangeProcessor. + */ + public void destroy() { + mModelChangeProcessor.destroy(); + } + + /** + * @return {@link PromoCardView} held by this promo component. + */ + public View getView() { + return mPromoCardView; + } + + /** + * @return Name of the feature this promo is representing. + */ + public String getFeatureName() { + return mFeatureName; + } +}
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinatorTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinatorTest.java new file mode 100644 index 0000000..4e8a4d3 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinatorTest.java
@@ -0,0 +1,122 @@ +// 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.components.browser_ui.widget.promo; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; +import android.view.View; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.CallbackHelper; +import org.chromium.components.browser_ui.widget.test.R; +import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * Basic test for creating, using the promo component with {@link PromoCardCoordinator}. + */ +@RunWith(BaseJUnit4ClassRunner.class) +public class PromoCardCoordinatorTest { + private Context mContext; + private PropertyModel mModel; + private PromoCardCoordinator mPromoCardCoordinator; + private PromoCardView mView; + + @Before + public void setUp() { + mContext = InstrumentationRegistry.getInstrumentation().getContext(); + mModel = new PropertyModel.Builder(PromoCardProperties.ALL_KEYS).build(); + mPromoCardCoordinator = new PromoCardCoordinator(mContext, mModel, "test-feature"); + mView = (PromoCardView) mPromoCardCoordinator.getView(); + + Assert.assertNotNull("PromoCardView is null", mView); + } + + @Test + @SmallTest + public void testTextImageBinding() { + final Drawable testImage = + mContext.getResources().getDrawable(R.drawable.logo_avatar_anonymous); + final String titleString = "Some string for title"; + final String testString = "Some test string"; + final String primaryButtonString = "Primary button string"; + final String secondaryButtonString = "Secondary button string"; + + TestThreadUtils.runOnUiThreadBlocking(() -> { + mModel.set(PromoCardProperties.TITLE, titleString); + mModel.set(PromoCardProperties.DESCRIPTION, testString); + mModel.set(PromoCardProperties.IMAGE, testImage); + mModel.set(PromoCardProperties.PRIMARY_BUTTON_TEXT, primaryButtonString); + mModel.set(PromoCardProperties.SECONDARY_BUTTON_TEXT, secondaryButtonString); + }); + + Assert.assertEquals( + "Promo image drawable is different.", testImage, mView.mPromoImage.getDrawable()); + Assert.assertEquals( + "Promo title is different.", titleString, mView.mTitle.getText().toString()); + Assert.assertEquals("Promo description is different.", testString, + mView.mDescription.getText().toString()); + Assert.assertEquals("Promo primary button text is different.", primaryButtonString, + mView.mPrimaryButton.getText().toString()); + Assert.assertEquals("Promo secondary button text is different.", secondaryButtonString, + mView.mSecondaryButton.getText().toString()); + + // Change the description again + final String testString2 = "Some other test string."; + TestThreadUtils.runOnUiThreadBlocking( + () -> { mModel.set(PromoCardProperties.DESCRIPTION, testString2); }); + Assert.assertEquals(testString2, mView.mDescription.getText().toString()); + } + + @Test + @SmallTest + public void testChangeVisibility() { + Assert.assertEquals(mView.getVisibility(), View.VISIBLE); + Assert.assertEquals(mView.mSecondaryButton.getVisibility(), View.VISIBLE); + + // Hide the secondary button + TestThreadUtils.runOnUiThreadBlocking( + () -> { mModel.set(PromoCardProperties.SECONDARY_BUTTON_VISIBLE, false); }); + Assert.assertEquals("Secondary button is still visible.", View.GONE, + mView.mSecondaryButton.getVisibility()); + } + + @Test + @SmallTest + public void testActionBinding() throws Exception { + final CallbackHelper primaryClickCallback = new CallbackHelper(); + final CallbackHelper secondaryClickCallback = new CallbackHelper(); + final CallbackHelper dismissClickCallback = new CallbackHelper(); + + mModel.set(PromoCardProperties.PRIMARY_BUTTON_CALLBACK, + (v) -> primaryClickCallback.notifyCalled()); + mModel.set(PromoCardProperties.SECONDARY_BUTTON_CALLBACK, + (v) -> secondaryClickCallback.notifyCalled()); + mModel.set(PromoCardProperties.CLOSE_BUTTON_CALLBACK, + (v) -> dismissClickCallback.notifyCalled()); + + TestThreadUtils.runOnUiThreadBlocking(() -> mView.mPrimaryButton.performClick()); + primaryClickCallback.waitForCallback("Primary button callback is never called.", 0); + Assert.assertEquals( + "Primary button should be clicked once.", 1, primaryClickCallback.getCallCount()); + + TestThreadUtils.runOnUiThreadBlocking(() -> mView.mSecondaryButton.performClick()); + secondaryClickCallback.waitForCallback("Secondary button callback is never called.", 0); + Assert.assertEquals("Secondary button should be clicked once.", 1, + secondaryClickCallback.getCallCount()); + + TestThreadUtils.runOnUiThreadBlocking(() -> mView.mDismissButton.performClick()); + dismissClickCallback.waitForCallback("Close button callback is never called.", 0); + Assert.assertEquals( + "Dismissed button should be clicked once.", 1, dismissClickCallback.getCallCount()); + } +}
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardProperties.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardProperties.java new file mode 100644 index 0000000..882e21e3c --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardProperties.java
@@ -0,0 +1,54 @@ +// 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.components.browser_ui.widget.promo; + +import android.graphics.drawable.Drawable; +import android.view.View; + +import org.chromium.base.Callback; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; +import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; + +/** + * Properties for PromoCardView. + */ +public class PromoCardProperties { + // Visible related properties + public static final WritableBooleanPropertyKey SECONDARY_BUTTON_VISIBLE = + new WritableBooleanPropertyKey(); + + // View related properties + public static final WritableObjectPropertyKey<Drawable> IMAGE = + new WritableObjectPropertyKey<>(); + + public static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>(); + + public static final WritableObjectPropertyKey<String> DESCRIPTION = + new WritableObjectPropertyKey<>(); + + public static final WritableObjectPropertyKey<String> PRIMARY_BUTTON_TEXT = + new WritableObjectPropertyKey<>(); + + public static final WritableObjectPropertyKey<String> SECONDARY_BUTTON_TEXT = + new WritableObjectPropertyKey<>(); + + // Callback related properties + public static final WritableObjectPropertyKey<Callback<View>> PRIMARY_BUTTON_CALLBACK = + new WritableObjectPropertyKey<>(); + + public static final WritableObjectPropertyKey<Callback<View>> SECONDARY_BUTTON_CALLBACK = + new WritableObjectPropertyKey<>(); + + public static final WritableObjectPropertyKey<Callback<View>> CLOSE_BUTTON_CALLBACK = + new WritableObjectPropertyKey<>(); + + /** + * All the property keys needed to create the model for {@link PromoCardView}. + */ + public static final PropertyKey[] ALL_KEYS = new PropertyKey[] {SECONDARY_BUTTON_VISIBLE, IMAGE, + TITLE, DESCRIPTION, PRIMARY_BUTTON_TEXT, SECONDARY_BUTTON_TEXT, PRIMARY_BUTTON_CALLBACK, + SECONDARY_BUTTON_CALLBACK, CLOSE_BUTTON_CALLBACK}; +}
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardView.java new file mode 100644 index 0000000..8dd8a4d3 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardView.java
@@ -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. + +package org.chromium.components.browser_ui.widget.promo; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; + +import org.chromium.components.browser_ui.widget.R; +import org.chromium.ui.widget.ButtonCompat; +import org.chromium.ui.widget.ChromeImageButton; + +/** + * A promo card view that contains an image view in the top center, a block of short description, + * two button compat and a close button. + */ +class PromoCardView extends LinearLayout { + ImageView mPromoImage; + TextView mTitle; + TextView mDescription; + ButtonCompat mPrimaryButton; + ChromeImageButton mDismissButton; + ButtonCompat mSecondaryButton; + + public PromoCardView(Context context) { + this(context, null); + } + + public PromoCardView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + public void onFinishInflate() { + super.onFinishInflate(); + + // Find members + mPromoImage = findViewById(R.id.promo_image); + mTitle = findViewById(R.id.promo_title); + mDescription = findViewById(R.id.promo_description); + mPrimaryButton = findViewById(R.id.promo_primary_button); + mDismissButton = findViewById(R.id.promo_close_button); + mSecondaryButton = findViewById(R.id.promo_secondary_button); + } +}
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewBinder.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewBinder.java new file mode 100644 index 0000000..f73a70d --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewBinder.java
@@ -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. + +package org.chromium.components.browser_ui.widget.promo; + +import android.view.View; + +import org.chromium.base.Callback; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; + +/** + * View binder than binds the promo view with the property model. + */ +class PromoCardViewBinder + implements PropertyModelChangeProcessor + .ViewBinder<PropertyModel, PromoCardView, PropertyKey> { + @Override + public void bind(PropertyModel model, PromoCardView view, PropertyKey propertyKey) { + if (propertyKey == PromoCardProperties.IMAGE) { + view.mPromoImage.setImageDrawable(model.get(PromoCardProperties.IMAGE)); + } else if (propertyKey == PromoCardProperties.TITLE) { + view.mTitle.setText(model.get(PromoCardProperties.TITLE)); + } else if (propertyKey == PromoCardProperties.DESCRIPTION) { + view.mDescription.setText(model.get(PromoCardProperties.DESCRIPTION)); + } else if (propertyKey == PromoCardProperties.PRIMARY_BUTTON_TEXT) { + view.mPrimaryButton.setText(model.get(PromoCardProperties.PRIMARY_BUTTON_TEXT)); + } else if (propertyKey == PromoCardProperties.SECONDARY_BUTTON_TEXT) { + view.mSecondaryButton.setText(model.get(PromoCardProperties.SECONDARY_BUTTON_TEXT)); + + // Visibility properties + } else if (propertyKey == PromoCardProperties.SECONDARY_BUTTON_VISIBLE) { + view.mSecondaryButton.setVisibility( + model.get(PromoCardProperties.SECONDARY_BUTTON_VISIBLE) ? View.VISIBLE + : View.GONE); + + // Callback properties + } else if (propertyKey == PromoCardProperties.PRIMARY_BUTTON_CALLBACK) { + Callback<View> callback = model.get(PromoCardProperties.PRIMARY_BUTTON_CALLBACK); + view.mPrimaryButton.setOnClickListener(callback::onResult); + } else if (propertyKey == PromoCardProperties.SECONDARY_BUTTON_CALLBACK) { + Callback<View> callback = model.get(PromoCardProperties.SECONDARY_BUTTON_CALLBACK); + view.mSecondaryButton.setOnClickListener(callback::onResult); + } else if (propertyKey == PromoCardProperties.CLOSE_BUTTON_CALLBACK) { + Callback<View> callback = model.get(PromoCardProperties.CLOSE_BUTTON_CALLBACK); + view.mDismissButton.setOnClickListener(callback::onResult); + } + } +}
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java new file mode 100644 index 0000000..496ba2c --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java
@@ -0,0 +1,103 @@ +// 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.components.browser_ui.widget.promo; + +import android.app.Activity; +import android.support.test.filters.SmallTest; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.LinearLayout.LayoutParams; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.test.params.BaseJUnit4RunnerDelegate; +import org.chromium.base.test.params.ParameterAnnotations.ClassParameter; +import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate; +import org.chromium.base.test.params.ParameterSet; +import org.chromium.base.test.params.ParameterizedRunner; +import org.chromium.base.test.util.Feature; +import org.chromium.components.browser_ui.widget.test.R; +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.ui.modelutil.PropertyModel; +import org.chromium.ui.test.util.DummyUiActivityTestCase; +import org.chromium.ui.test.util.NightModeTestUtils; +import org.chromium.ui.test.util.RenderTestRule; +import org.chromium.ui.widget.ButtonCompat; + +import java.util.List; + +/** + * Render test for {@link PromoCardView}. + */ +@RunWith(ParameterizedRunner.class) +@UseRunnerDelegate(BaseJUnit4RunnerDelegate.class) +public class PromoCardViewRenderTest extends DummyUiActivityTestCase { + @ClassParameter + private static List<ParameterSet> sClassParams = + new NightModeTestUtils.NightModeParams().getParameters(); + + @Rule + public RenderTestRule mRenderTestRule = + new RenderTestRule("chrome/test/data/android/render_tests"); + + public PromoCardViewRenderTest(boolean nightModeEnabled) { + NightModeTestUtils.setUpNightModeForDummyUiActivity(nightModeEnabled); + mRenderTestRule.setNightModeEnabled(nightModeEnabled); + } + + private PromoCardCoordinator mPromoCardCoordinator; + private PropertyModel mModel; + + @Override + public void setUpTest() throws Exception { + super.setUpTest(); + Activity activity = getActivity(); + mModel = + new PropertyModel.Builder(PromoCardProperties.ALL_KEYS) + .with(PromoCardProperties.IMAGE, activity, R.drawable.logo_avatar_anonymous) + .with(PromoCardProperties.TITLE, "Title for Promo Card.") + .with(PromoCardProperties.DESCRIPTION, "Description for Promo Card.") + .with(PromoCardProperties.PRIMARY_BUTTON_TEXT, "Primary button") + .with(PromoCardProperties.SECONDARY_BUTTON_TEXT, "Secondary button") + .build(); + mPromoCardCoordinator = new PromoCardCoordinator(activity, mModel, "render-test"); + + TestThreadUtils.runOnUiThreadBlocking(() -> { + // Set the content and add the promo card into the window + LinearLayout content = new LinearLayout(activity); + activity.setContentView(content); + content.addView(mPromoCardCoordinator.getView(), + new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + }); + } + + @Test + @SmallTest + @Feature({"RenderTest"}) + public void testDefault() throws Exception { + mRenderTestRule.render(mPromoCardCoordinator.getView(), "promo_card_default"); + } + + @Test + @SmallTest + @Feature({"RenderTest"}) + public void testHideSecondaryButton() throws Exception { + mModel.set(PromoCardProperties.SECONDARY_BUTTON_VISIBLE, false); + + CriteriaHelper.pollUiThread(Criteria.equals(View.GONE, () -> { + ButtonCompat secondaryButton = + mPromoCardCoordinator.getView().findViewById(R.id.promo_secondary_button); + return secondaryButton.getVisibility(); + })); + + mRenderTestRule.render(mPromoCardCoordinator.getView(), "promo_card_secondary_hidden"); + } +}
diff --git a/components/browser_ui/widget/android/test/java/res/drawable/logo_avatar_anonymous.xml b/components/browser_ui/widget/android/test/java/res/drawable/logo_avatar_anonymous.xml new file mode 100644 index 0000000..b6534a5 --- /dev/null +++ b/components/browser_ui/widget/android/test/java/res/drawable/logo_avatar_anonymous.xml
@@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + tools:targetApi="21" + android:width="40dp" + android:height="40dp" + android:viewportWidth="192" + android:viewportHeight="192"> + + <path + android:fillColor="#E0E0E0" + android:pathData="M96,0C43.01,0,0,43.01,0,96s43.01,96,96,96s96-43.01,96-96S148.99,0,96,0z" /> + <path + android:fillColor="#BDBDBD" + android:pathData="M96,85.09c13.28,0,24-10.72,24-24c0-13.28-10.72-24-24-24s-24,10.72-24,24 +C72,74.37,82.72,85.09,96,85.09z" /> + <path + android:fillColor="#BDBDBD" + android:pathData="M96,99.27c-29.33,0-52.36,14.18-52.36,27.27c11.09,17.06,30.51,28.36,52.36,28.36 +s41.27-11.3,52.36-28.36C148.36,113.45,125.33,99.27,96,99.27z" /> + <path + android:pathData="M 0 0 H 192 V 192 H 0 V 0 Z" /> +</vector>
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc index 79711fe3..8094e228 100644 --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -595,6 +595,7 @@ ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, ContentSettingsInfo::PERSISTENT, ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY); + Register(ContentSettingsType::STORAGE_ACCESS, "storage-access", CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, WhitelistedSchemes(), ForceAllowedOrigins(), @@ -605,6 +606,18 @@ ContentSettingsInfo::INHERIT_IN_INCOGNITO, ContentSettingsInfo::PERSISTENT, ContentSettingsInfo::EXCEPTIONS_ON_SECURE_AND_INSECURE_ORIGINS); + + Register(ContentSettingsType::CAMERA_PAN_TILT_ZOOM, "camera-pan-tilt-zoom", + CONTENT_SETTING_ASK, WebsiteSettingsInfo::UNSYNCABLE, + WhitelistedSchemes(kChromeUIScheme, kChromeDevToolsScheme), + ForceAllowedOrigins(), + ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, + CONTENT_SETTING_ASK), + WebsiteSettingsInfo::SINGLE_ORIGIN_ONLY_SCOPE, + WebsiteSettingsRegistry::DESKTOP, + ContentSettingsInfo::INHERIT_IF_LESS_PERMISSIVE, + ContentSettingsInfo::PERSISTENT, + ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY); } void ContentSettingsRegistry::Register(
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc index 55be84e..aa09812d 100644 --- a/components/content_settings/core/common/content_settings.cc +++ b/components/content_settings/core/common/content_settings.cc
@@ -87,6 +87,7 @@ {ContentSettingsType::AR, 65}, {ContentSettingsType::NATIVE_FILE_SYSTEM_READ_GUARD, 66}, {ContentSettingsType::STORAGE_ACCESS, 67}, + {ContentSettingsType::CAMERA_PAN_TILT_ZOOM, 68}, }; } // namespace
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h index 4ba439f..210ec6c 100644 --- a/components/content_settings/core/common/content_settings_types.h +++ b/components/content_settings/core/common/content_settings_types.h
@@ -205,6 +205,10 @@ // TODO(https://crbug.com/989663): Reconcile the two. STORAGE_ACCESS, + // Content setting which stores whether to allow a site to control camera + // movements. It does not give access to camera. + CAMERA_PAN_TILT_ZOOM, + NUM_TYPES, };
diff --git a/components/cronet/url_request_context_config_unittest.cc b/components/cronet/url_request_context_config_unittest.cc index a8ff8269..43e1fdfb 100644 --- a/components/cronet/url_request_context_config_unittest.cc +++ b/components/cronet/url_request_context_config_unittest.cc
@@ -69,7 +69,7 @@ {"QUIC", "set_quic_flags"}, base::Value( "FLAGS_quic_max_aggressive_retransmittable_on_wire_ping_count=5," - "FLAGS_quic_reloadable_flag_quic_enable_version_t050=true," + "FLAGS_quic_reloadable_flag_quic_enable_version_t050_v2=true," "FLAGS_quic_reloadable_flag_quic_enable_version_draft_27=true")); options.SetPath({"AsyncDNS", "enable"}, base::Value(true)); options.SetPath({"NetworkErrorLogging", "enable"}, base::Value(true)); @@ -143,7 +143,7 @@ // Initialize QUIC flags set by the config. FLAGS_quic_max_aggressive_retransmittable_on_wire_ping_count = 0; - FLAGS_quic_reloadable_flag_quic_enable_version_t050 = false; + FLAGS_quic_reloadable_flag_quic_enable_version_t050_v2 = false; FLAGS_quic_reloadable_flag_quic_enable_version_draft_27 = false; URLRequestContextConfig config( @@ -196,7 +196,7 @@ EXPECT_EQ(quic_connection_options, quic_params->connection_options); EXPECT_EQ(FLAGS_quic_max_aggressive_retransmittable_on_wire_ping_count, 5); - EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t050); + EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t050_v2); EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_draft_27); // Check Custom QUIC User Agent Id.
diff --git a/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc b/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc index d55e6cb..5f073353 100644 --- a/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc +++ b/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc
@@ -24,7 +24,6 @@ #include "components/dom_distiller/core/dom_distiller_request_view_base.h" #include "components/dom_distiller/core/dom_distiller_service.h" #include "components/dom_distiller/core/experiments.h" -#include "components/dom_distiller/core/feedback_reporter.h" #include "components/dom_distiller/core/task_tracker.h" #include "components/dom_distiller/core/url_constants.h" #include "components/dom_distiller/core/url_utils.h"
diff --git a/components/dom_distiller/core/BUILD.gn b/components/dom_distiller/core/BUILD.gn index d3a5354..e4a90fc2 100644 --- a/components/dom_distiller/core/BUILD.gn +++ b/components/dom_distiller/core/BUILD.gn
@@ -35,8 +35,6 @@ "dom_distiller_switches.h", "experiments.cc", "experiments.h", - "feedback_reporter.cc", - "feedback_reporter.h", "page_features.cc", "page_features.h", "pref_names.cc",
diff --git a/components/dom_distiller/core/feedback_reporter.cc b/components/dom_distiller/core/feedback_reporter.cc deleted file mode 100644 index 890833a..0000000 --- a/components/dom_distiller/core/feedback_reporter.cc +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/dom_distiller/core/feedback_reporter.h" - -#include "base/metrics/histogram_macros.h" - -namespace dom_distiller { - -FeedbackReporter::FeedbackReporter() {} - -FeedbackReporter::~FeedbackReporter() {} - -// static -void FeedbackReporter::ReportQuality(bool good) { - UMA_HISTOGRAM_BOOLEAN("DomDistiller.DistillationQuality", good); -} - -} // namespace dom_distiller
diff --git a/components/dom_distiller/core/feedback_reporter.h b/components/dom_distiller/core/feedback_reporter.h deleted file mode 100644 index 9802530..0000000 --- a/components/dom_distiller/core/feedback_reporter.h +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_DOM_DISTILLER_CORE_FEEDBACK_REPORTER_H_ -#define COMPONENTS_DOM_DISTILLER_CORE_FEEDBACK_REPORTER_H_ - -#include "base/macros.h" - -namespace dom_distiller { - -// FeedbackReporter handles reporting distillation quality. -class FeedbackReporter { - public: - FeedbackReporter(); - virtual ~FeedbackReporter(); - - // Reports the quality of the distillation. |good| represents whether the - // perceived quality of the distillation of a web page was good. - static void ReportQuality(bool good); - - private: - DISALLOW_COPY_AND_ASSIGN(FeedbackReporter); -}; - -} // namespace dom_distiller - -#endif // COMPONENTS_DOM_DISTILLER_CORE_FEEDBACK_REPORTER_H_
diff --git a/components/dom_distiller/core/javascript/dom_distiller_viewer.js b/components/dom_distiller/core/javascript/dom_distiller_viewer.js index d32d1b0..868b9eb 100644 --- a/components/dom_distiller/core/javascript/dom_distiller_viewer.js +++ b/components/dom_distiller/core/javascript/dom_distiller_viewer.js
@@ -80,14 +80,10 @@ updateToolbarColor(theme); } -function getClassFromElement(element, classList) { - let foundClass = classList[0]; - classList.forEach((cls) => { - if (element.classList.contains(cls)) { - foundClass = cls; - } - }); - return foundClass; +function getPageTheme() { + const cls = Array.from(document.body.classList) + .find((cls) => themeClasses.includes(cls)); + return cls ? cls : themeClasses[0]; } function updateToolbarColor(theme) { @@ -166,7 +162,9 @@ const fontSizeSlider = new FontSizeSlider( $('font-size-selection'), [14, 15, 16, 18, 20, 24, 28, 32, 40, 48]); -updateToolbarColor(getClassFromElement(document.body, themeClasses)); +// Set the toolbar color to match the page's theme. +updateToolbarColor(getPageTheme()); + maybeSetWebFont(); // The zooming speed relative to pinching speed.
diff --git a/components/download/internal/background_service/in_memory_download_unittest.cc b/components/download/internal/background_service/in_memory_download_unittest.cc index daeba85..c8d65fcc 100644 --- a/components/download/internal/background_service/in_memory_download_unittest.cc +++ b/components/download/internal/background_service/in_memory_download_unittest.cc
@@ -216,7 +216,7 @@ // Add some random header. auto response_head = network::mojom::URLResponseHead::New(); response_head->headers = base::MakeRefCounted<net::HttpResponseHeaders>(""); - response_head->headers->AddHeader("X-Random-Test-Header: 123"); + response_head->headers->SetHeader("X-Random-Test-Header", "123"); // The size must match for download as stream from SimpleUrlLoader. network::URLLoaderCompletionStatus status;
diff --git a/components/external_intents/android/BUILD.gn b/components/external_intents/android/BUILD.gn index 21f28ac6..7306854 100644 --- a/components/external_intents/android/BUILD.gn +++ b/components/external_intents/android/BUILD.gn
@@ -13,15 +13,18 @@ "java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java", "java/src/org/chromium/components/external_intents/ExternalNavigationParams.java", "java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java", + "java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java", "java/src/org/chromium/components/external_intents/RedirectHandler.java", "java/src/org/chromium/components/external_intents/RedirectHandlerImpl.java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] deps = [ + ":java_resources", "//base:base_java", "//base:jni_java", "//components/embedder_support/android:util_java", + "//components/navigation_interception/android:navigation_interception_java", "//content/public/android:content_java", "//third_party/android_deps:androidx_annotation_annotation_java", "//ui/android:ui_java", @@ -29,19 +32,31 @@ ] } +android_resources("java_resources") { + sources = [] + custom_package = "org.chromium.components.external_intents" + deps = [ "//components/browser_ui/strings/android:browser_ui_strings_grd" ] +} + generate_jni("jni_headers") { - sources = [ "java/src/org/chromium/components/external_intents/ExternalIntentsFeatureList.java" ] + sources = [ + "java/src/org/chromium/components/external_intents/ExternalIntentsFeatureList.java", + "java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java", + ] } static_library("android") { sources = [ "external_intents_feature_list.cc", "external_intents_feature_list.h", + "intercept_navigation_delegate_impl.cc", ] deps = [ ":jni_headers", "//base", + "//components/navigation_interception", + "//content/public/browser", ] }
diff --git a/components/external_intents/android/DEPS b/components/external_intents/android/DEPS index d188a0d9..9384f1c 100644 --- a/components/external_intents/android/DEPS +++ b/components/external_intents/android/DEPS
@@ -1,5 +1,7 @@ include_rules = [ "+components/embedder_support/android", + "+components/navigation_interception", + "+content/public/browser", "-content/public/android/java", "+content/public/android/java/src/org/chromium/content_public",
diff --git a/chrome/browser/android/intercept_navigation_delegate_impl.cc b/components/external_intents/android/intercept_navigation_delegate_impl.cc similarity index 85% rename from chrome/browser/android/intercept_navigation_delegate_impl.cc rename to components/external_intents/android/intercept_navigation_delegate_impl.cc index 725dbd75..f071e96 100644 --- a/chrome/browser/android/intercept_navigation_delegate_impl.cc +++ b/components/external_intents/android/intercept_navigation_delegate_impl.cc
@@ -2,11 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/android/chrome_jni_headers/InterceptNavigationDelegateImpl_jni.h" +#include "components/external_intents/android/jni_headers/InterceptNavigationDelegateImpl_jni.h" #include "components/navigation_interception/intercept_navigation_delegate.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/web_contents.h" +namespace external_intents { + static void JNI_InterceptNavigationDelegateImpl_AssociateWithWebContents( JNIEnv* env, const base::android::JavaParamRef<jobject>& jdelegate, @@ -19,3 +21,5 @@ std::make_unique<navigation_interception::InterceptNavigationDelegate>( env, jdelegate, /*escape_external_handler_value=*/true)); } + +} // namespace external_intents
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java similarity index 93% rename from chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java rename to components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java index 889792b..24837e7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
@@ -2,21 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.tab; +package org.chromium.components.external_intents; import androidx.annotation.VisibleForTesting; import org.chromium.base.ContextUtils; +import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.PostTask; -import org.chromium.chrome.R; -import org.chromium.components.external_intents.AuthenticatorNavigationInterceptor; -import org.chromium.components.external_intents.ExternalNavigationHandler; import org.chromium.components.external_intents.ExternalNavigationHandler.OverrideUrlLoadingResult; -import org.chromium.components.external_intents.ExternalNavigationParams; -import org.chromium.components.external_intents.InterceptNavigationDelegateClient; -import org.chromium.components.external_intents.RedirectHandlerImpl; import org.chromium.components.navigation_interception.InterceptNavigationDelegate; import org.chromium.components.navigation_interception.NavigationParams; import org.chromium.content_public.browser.NavigationController; @@ -33,6 +28,7 @@ * hence can cause UAF error. It should be done in an asynchronous fashion to avoid it. * See https://crbug.com/732260. */ +@JNINamespace("external_intents") public class InterceptNavigationDelegateImpl implements InterceptNavigationDelegate { private final AuthenticatorNavigationInterceptor mAuthenticatorHelper; private InterceptNavigationDelegateClient mClient; @@ -50,8 +46,7 @@ /** * Default constructor of {@link InterceptNavigationDelegateImpl}. */ - @VisibleForTesting - InterceptNavigationDelegateImpl(InterceptNavigationDelegateClient client) { + public InterceptNavigationDelegateImpl(InterceptNavigationDelegateClient client) { mClient = client; mAuthenticatorHelper = mClient.createAuthenticatorNavigationInterceptor(); associateWithWebContents(mClient.getWebContents()); @@ -85,9 +80,8 @@ return true; } - ExternalNavigationParams params = new ExternalNavigationParams.Builder(url, incognito) - .setOpenInNewTab(true) - .build(); + ExternalNavigationParams params = + new ExternalNavigationParams.Builder(url, incognito).setOpenInNewTab(true).build(); mLastOverrideUrlLoadingResult = mExternalNavHandler.shouldOverrideUrlLoading(params); return mLastOverrideUrlLoadingResult != ExternalNavigationHandler.OverrideUrlLoadingResult.NO_OVERRIDE; @@ -199,12 +193,10 @@ WebContents webContents = mClient.getWebContents(); if (mClearAllForwardHistoryRequired && webContents != null) { webContents.getNavigationController().pruneForwardEntries(); - } else if (mShouldClearRedirectHistoryForTabClobbering - && webContents != null) { + } else if (mShouldClearRedirectHistoryForTabClobbering && webContents != null) { // http://crbug/479056: Even if we clobber the current tab, we want to remove // redirect history to be consistent. - NavigationController navigationController = - webContents.getNavigationController(); + NavigationController navigationController = webContents.getNavigationController(); int indexBeforeRedirection = mClient.getOrCreateRedirectHandler() .getLastCommittedEntryIndexBeforeStartingNavigation();
diff --git a/components/favicon/android/BUILD.gn b/components/favicon/android/BUILD.gn deleted file mode 100644 index ff48ebd..0000000 --- a/components/favicon/android/BUILD.gn +++ /dev/null
@@ -1,30 +0,0 @@ -# Copyright 2020 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/config/android/rules.gni") - -android_library("java") { - sources = [ - "java/src/org/chromium/components/favicon/FaviconFallbackGenerator.java", - ] - - deps = [ - "//base:base_java", - "//components/embedder_support/android:util_java", - "//url:gurl_java", - ] -} - -android_library("javatests") { - testonly = true - - sources = [ "java/src/org/chromium/components/favicon/FaviconFallbackGeneratorTest.java" ] - deps = [ - ":java", - "//base:base_java_test_support", - "//third_party/android_support_test_runner:rules_java", - "//third_party/android_support_test_runner:runner_java", - "//third_party/junit", - ] -}
diff --git a/components/favicon/android/DEPS b/components/favicon/android/DEPS deleted file mode 100644 index 735adf49..0000000 --- a/components/favicon/android/DEPS +++ /dev/null
@@ -1,3 +0,0 @@ -include_rules = [ - "+components/embedder_support/android", -]
diff --git a/components/favicon/android/OWNERS b/components/favicon/android/OWNERS deleted file mode 100644 index 4083ec5..0000000 --- a/components/favicon/android/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://chrome/browser/ui/android/favicon/OWNERS
diff --git a/components/feed/core/v2/feed_store.cc b/components/feed/core/v2/feed_store.cc index 7321e84..f433a755 100644 --- a/components/feed/core/v2/feed_store.cc +++ b/components/feed/core/v2/feed_store.cc
@@ -55,6 +55,10 @@ return KeyForContentId("s/", content_id); } +std::string LocalActionKey(int32_t id) { + return kLocalActionPrefix + base::NumberToString(id); +} + std::string KeyForRecord(const feedstore::Record& record) { switch (record.data_case()) { case feedstore::Record::kStreamData: @@ -66,8 +70,7 @@ case feedstore::Record::kContent: return ContentKey(record.content().content_id()); case feedstore::Record::kLocalAction: - return kLocalActionPrefix + - base::NumberToString(record.local_action().id()); + return LocalActionKey(record.local_action().id()); case feedstore::Record::kSharedState: return SharedStateKey(record.shared_state().content_id()); case feedstore::Record::kNextStreamState: @@ -83,6 +86,11 @@ return key_set.contains(key); } +bool ActionsFilter(const std::string& key) { + return key.size() >= 2 && key[0] == kLocalActionPrefix[0] && + key[1] == kLocalActionPrefix[1]; +} + feedstore::Record MakeRecord(feedstore::Content content) { feedstore::Record record; *record.mutable_content() = std::move(content); @@ -363,6 +371,56 @@ base::WrapUnique(record->release_next_stream_state())); } +void FeedStore::ReadActions( + base::OnceCallback<void(std::vector<feedstore::StoredAction>)> callback) { + database_->LoadEntriesWithFilter( + base::BindRepeating(&ActionsFilter), + base::BindOnce(&FeedStore::OnReadActionsFinished, + weak_ptr_factory_.GetWeakPtr(), std::move(callback))); +} + +void FeedStore::OnReadActionsFinished( + base::OnceCallback<void(std::vector<feedstore::StoredAction>)> callback, + bool success, + std::unique_ptr<std::vector<feedstore::Record>> records) { + if (!success || !records) { + std::move(callback).Run({}); + return; + } + + std::vector<feedstore::StoredAction> actions; + actions.reserve(records->size()); + for (auto& record : *records) { + actions.push_back(std::move(record.local_action())); + } + std::move(callback).Run(std::move(actions)); +} + +void FeedStore::WriteActions(std::vector<feedstore::StoredAction> actions, + base::OnceCallback<void(bool)> callback) { + std::vector<feedstore::Record> records; + records.reserve(actions.size()); + for (auto& action : actions) { + feedstore::Record record; + *record.mutable_local_action() = std::move(action); + records.push_back(record); + } + Write(std::move(records), std::move(callback)); +} + +void FeedStore::RemoveActions(std::vector<LocalActionId> ids, + base::OnceCallback<void(bool)> callback) { + auto keys = std::make_unique<std::vector<std::string>>(); + keys->reserve(ids.size()); + for (LocalActionId id : ids) + keys->push_back(LocalActionKey(id.GetUnsafeValue())); + + database_->UpdateEntries( + /*entries_to_save=*/std::make_unique< + std::vector<std::pair<std::string, feedstore::Record>>>(), + /*key_to_remove=*/std::move(keys), std::move(callback)); +} + void FeedStore::Write(std::vector<feedstore::Record> records, base::OnceCallback<void(bool)> callback) { auto entries_to_save = std::make_unique<
diff --git a/components/feed/core/v2/feed_store.h b/components/feed/core/v2/feed_store.h index 3ae93ea..3ec819b 100644 --- a/components/feed/core/v2/feed_store.h +++ b/components/feed/core/v2/feed_store.h
@@ -13,6 +13,7 @@ #include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner.h" #include "components/feed/core/proto/v2/store.pb.h" +#include "components/feed/core/v2/types.h" #include "components/leveldb_proto/public/proto_database.h" #include "components/leveldb_proto/public/proto_database_provider.h" @@ -69,7 +70,12 @@ base::OnceCallback< void(std::unique_ptr<feedstore::StreamAndContentState>)> callback); - // TODO(iwells): implement reading stored actions + void ReadActions( + base::OnceCallback<void(std::vector<feedstore::StoredAction>)> callback); + void WriteActions(std::vector<feedstore::StoredAction> actions, + base::OnceCallback<void(bool)> callback); + void RemoveActions(std::vector<LocalActionId> ids, + base::OnceCallback<void(bool)> callback); // TODO(iwells): implement this // Deletes old records that are no longer needed @@ -111,6 +117,11 @@ bool success, std::unique_ptr<feedstore::Record> record); + void OnReadActionsFinished( + base::OnceCallback<void(std::vector<feedstore::StoredAction>)> callback, + bool success, + std::unique_ptr<std::vector<feedstore::Record>> records); + void OnWriteFinished(base::OnceCallback<void(bool)> callback, bool success); // TODO(iwells): implement
diff --git a/components/feed/core/v2/feed_store_unittest.cc b/components/feed/core/v2/feed_store_unittest.cc index e4f69d7..aefec88 100644 --- a/components/feed/core/v2/feed_store_unittest.cc +++ b/components/feed/core/v2/feed_store_unittest.cc
@@ -59,6 +59,18 @@ return record; } +feedstore::Record RecordForAction(feedstore::StoredAction action) { + feedstore::Record record; + *record.mutable_local_action() = std::move(action); + return record; +} + +feedstore::StoredAction MakeAction(int32_t id) { + feedstore::StoredAction action; + action.set_id(id); + return action; +} + } // namespace class FeedStoreTest : public testing::Test { @@ -429,27 +441,87 @@ MakeFeedStore({{"N", record}}); // Successful read - bool did_successful_read = false; - store_->ReadNextStreamState(base::BindLambdaForTesting( - [&](std::unique_ptr<feedstore::StreamAndContentState> result) { - did_successful_read = true; - ASSERT_TRUE(result); - EXPECT_TRUE(result->has_stream_data()); - EXPECT_EQ(result->content_size(), 1); - EXPECT_EQ(result->shared_state_size(), 1); - })); + CallbackReceiver<std::unique_ptr<feedstore::StreamAndContentState>> receiver; + store_->ReadNextStreamState(receiver.Bind()); fake_db_->GetCallback(true); - EXPECT_TRUE(did_successful_read); + ASSERT_NE(receiver.GetResult(), base::nullopt); + feedstore::StreamAndContentState* result = receiver.GetResult()->get(); + ASSERT_NE(result, nullptr); + EXPECT_TRUE(result->has_stream_data()); + EXPECT_EQ(result->content_size(), 1); + EXPECT_EQ(result->shared_state_size(), 1); // Failed read - bool did_failed_read = false; - store_->ReadNextStreamState(base::BindLambdaForTesting( - [&](std::unique_ptr<feedstore::StreamAndContentState> result) { - did_failed_read = true; - EXPECT_FALSE(result); - })); + receiver.GetResult().reset(); + store_->ReadNextStreamState(receiver.Bind()); fake_db_->GetCallback(false); - EXPECT_TRUE(did_failed_read); + EXPECT_NE(receiver.GetResult(), base::nullopt); + EXPECT_EQ(receiver.GetResult()->get(), nullptr); +} + +TEST_F(FeedStoreTest, ReadActions) { + feedstore::StoredAction action0 = MakeAction(0); + feedstore::StoredAction action1 = MakeAction(1); + feedstore::StoredAction action2 = MakeAction(2); + MakeFeedStore({{"a/0", RecordForAction(action0)}, + {"a/1", RecordForAction(action1)}, + {"a/2", RecordForAction(action2)}}); + + // Successful read + CallbackReceiver<std::vector<feedstore::StoredAction>> receiver; + store_->ReadActions(receiver.Bind()); + fake_db_->LoadCallback(true); + EXPECT_NE(receiver.GetResult(), base::nullopt); + EXPECT_EQ(receiver.GetResult()->size(), 3ul); + + // Failed read + receiver.GetResult().reset(); + store_->ReadActions(receiver.Bind()); + fake_db_->LoadCallback(false); + EXPECT_NE(receiver.GetResult(), base::nullopt); + EXPECT_EQ(receiver.GetResult()->size(), 0ul); +} + +TEST_F(FeedStoreTest, WriteActions) { + MakeFeedStore({}); + feedstore::StoredAction action = MakeAction(5); + + CallbackReceiver<bool> receiver; + store_->WriteActions({action}, receiver.Bind()); + fake_db_->UpdateCallback(true); + EXPECT_EQ(receiver.GetResult().value(), true); + ASSERT_EQ(db_entries_.size(), 1ul); + EXPECT_EQ(db_entries_["a/5"].local_action().id(), 5); + + receiver.GetResult().reset(); + store_->WriteActions({action}, receiver.Bind()); + fake_db_->UpdateCallback(false); + EXPECT_NE(receiver.GetResult(), base::nullopt); + EXPECT_EQ(receiver.GetResult().value(), false); +} + +TEST_F(FeedStoreTest, RemoveActions) { + feedstore::StoredAction action0 = MakeAction(0); + feedstore::StoredAction action1 = MakeAction(1); + feedstore::StoredAction action2 = MakeAction(2); + MakeFeedStore({{"a/0", RecordForAction(action0)}, + {"a/1", RecordForAction(action1)}, + {"a/2", RecordForAction(action2)}}); + + const std::vector<LocalActionId> ids = {LocalActionId(0), LocalActionId(1), + LocalActionId(2)}; + + CallbackReceiver<bool> receiver; + store_->RemoveActions(ids, receiver.Bind()); + fake_db_->UpdateCallback(true); + EXPECT_EQ(receiver.GetResult().value(), true); + EXPECT_EQ(db_entries_.size(), 0ul); + + receiver.GetResult().reset(); + store_->RemoveActions(ids, receiver.Bind()); + fake_db_->UpdateCallback(false); + EXPECT_NE(receiver.GetResult(), base::nullopt); + EXPECT_EQ(receiver.GetResult().value(), false); } } // namespace feed
diff --git a/components/feed/core/v2/types.h b/components/feed/core/v2/types.h index 2748da0..37f8616 100644 --- a/components/feed/core/v2/types.h +++ b/components/feed/core/v2/types.h
@@ -21,6 +21,9 @@ // it is assigned a new revision number. using ContentRevision = util::IdTypeU32<class ContentRevisionClass>; +// ID for a stored pending action. +using LocalActionId = util::IdType32<class LocalActionIdClass>; + std::string ToString(ContentRevision c); ContentRevision ToContentRevision(const std::string& str);
diff --git a/components/image_fetcher/core/cache/image_cache.cc b/components/image_fetcher/core/cache/image_cache.cc index 346811f..f619f4f 100644 --- a/components/image_fetcher/core/cache/image_cache.cc +++ b/components/image_fetcher/core/cache/image_cache.cc
@@ -224,7 +224,8 @@ void ImageCache::RunEvictionWhenFull() { // Storage is within limits, bail out. - if (metadata_store_->GetEstimatedSize() < kCacheMaxSize) { + if (metadata_store_->GetEstimatedSize(CacheStrategy::BEST_EFFORT) < + kCacheMaxSize) { return; }
diff --git a/components/image_fetcher/core/cache/image_cache_unittest.cc b/components/image_fetcher/core/cache/image_cache_unittest.cc index 1b44f0b..8291b03 100644 --- a/components/image_fetcher/core/cache/image_cache_unittest.cc +++ b/components/image_fetcher/core/cache/image_cache_unittest.cc
@@ -34,6 +34,7 @@ "cached_image_fetcher_last_startup_eviction_time"; constexpr char kImageFetcherEventHistogramName[] = "ImageFetcher.Events"; constexpr char kImageUrl[] = "http://gstatic.img.com/foo.jpg"; +constexpr char kOtherImageUrl[] = "http://gstatic.img.com/bar.jpg"; constexpr char kImageUrlHashed[] = "3H7UODDH3WKDWK6FQ3IZT3LQMVBPYJ4M"; constexpr char kImageData[] = "data"; const int kOverMaxCacheSize = 65 * 1024 * 1024; @@ -110,6 +111,17 @@ RunUntilIdle(); } + // Loads the image and verify the data callback. + void LoadImage(const std::string& url, const std::string& expected_data) { + EXPECT_CALL(*this, DataCallback(false, expected_data)); + image_cache()->LoadImage( + false, url, + base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, + base::Unretained(this))); + db()->LoadCallback(true); + RunUntilIdle(); + } + bool IsMetadataPresent(const std::string& key) { return db_store_.find(key) != db_store_.end(); } @@ -193,14 +205,7 @@ /* expiration_interval */ base::nullopt); RunUntilIdle(); - EXPECT_CALL(*this, DataCallback(false, kImageData)); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); - + LoadImage(kImageUrl, kImageData); image_cache()->DeleteImage(kImageUrl); RunUntilIdle(); @@ -233,14 +238,7 @@ image_cache()->SaveImage(kImageUrl, kImageData, /* needs_transcoding */ false, /* expiration_interval */ base::nullopt); - - EXPECT_CALL(*this, DataCallback(false, kImageData)); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage(kImageUrl, kImageData); } TEST_F(CachedImageFetcherImageCacheTest, Load) { @@ -248,13 +246,7 @@ auto metadata_before = GetMetadata(kImageUrlHashed); clock()->SetNow(clock()->Now() + base::TimeDelta::FromHours(1)); - EXPECT_CALL(*this, DataCallback(false, kImageData)); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage(kImageUrl, kImageData); db()->LoadCallback(true); db()->UpdateCallback(true); RunUntilIdle(); @@ -268,13 +260,7 @@ auto metadata_before = GetMetadata(kImageUrlHashed); clock()->SetNow(clock()->Now() + base::TimeDelta::FromHours(1)); - EXPECT_CALL(*this, DataCallback(false, kImageData)); - image_cache()->LoadImage( - true, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage(kImageUrl, kImageData); auto metadata_after = GetMetadata(kImageUrlHashed); ASSERT_TRUE(IsMetadataEqual(metadata_before, metadata_after)); @@ -283,24 +269,11 @@ TEST_F(CachedImageFetcherImageCacheTest, Delete) { PrepareImageCache(false); - EXPECT_CALL(*this, DataCallback(false, kImageData)); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); - + LoadImage(kImageUrl, kImageData); image_cache()->DeleteImage(kImageUrl); RunUntilIdle(); - EXPECT_CALL(*this, DataCallback(false, std::string())); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage(kImageUrl, ""); } TEST_F(CachedImageFetcherImageCacheTest, Eviction) { @@ -310,14 +283,7 @@ RunEvictionOnStartup(/* success */ true); ASSERT_EQ(clock()->Now(), prefs()->GetTime(kPrefLastStartupEviction)); - EXPECT_CALL(*this, DataCallback(false, std::string())); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); - + LoadImage(kImageUrl, ""); histogram_tester().ExpectBucketCount( kImageFetcherEventHistogramName, ImageFetcherEvent::kCacheStartupEvictionStarted, 1); @@ -326,6 +292,25 @@ ImageFetcherEvent::kCacheStartupEvictionFinished, 1); } +// Verifies eviction for CacheStrategy::HOLD_UNTIL_EXPIRED. +TEST_F(CachedImageFetcherImageCacheTest, EvictionHoldUtilExpires) { + PrepareImageCache(false); + clock()->SetNow(clock()->Now() + base::TimeDelta::FromDays(2)); + + image_cache()->SaveImage(kImageUrl, "image_data", false, + base::TimeDelta::FromDays(10)); + + image_cache()->SaveImage(kOtherImageUrl, "other_image_data", false, + base::TimeDelta::FromHours(1)); + RunUntilIdle(); + + // Forward the clock to make image with |kOtherImageUrl| expired. + clock()->SetNow(clock()->Now() + base::TimeDelta::FromHours(3)); + RunEvictionOnStartup(/* success */ true); + LoadImage(kImageUrl, "image_data"); + LoadImage(kOtherImageUrl, ""); +} + TEST_F(CachedImageFetcherImageCacheTest, EvictionWhenFull) { PrepareImageCache(false); InjectMetadata(kImageUrl, kOverMaxCacheSize, /* needs_transcoding */ false); @@ -333,13 +318,7 @@ RunEvictionWhenFull(/* success */ true); // The data should be removed because it's over the allowed limit. - EXPECT_CALL(*this, DataCallback(false, "")); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage(kImageUrl, ""); } TEST_F(CachedImageFetcherImageCacheTest, EvictionTooSoon) { @@ -348,13 +327,7 @@ clock()->SetNow(clock()->Now() + base::TimeDelta::FromDays(6)); RunEvictionOnStartup(/* success */ true); - EXPECT_CALL(*this, DataCallback(false, kImageData)); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage(kImageUrl, kImageData); } TEST_F(CachedImageFetcherImageCacheTest, EvictionWhenEvictionAlreadyPerformed) { @@ -364,14 +337,7 @@ clock()->Now()); clock()->SetNow(clock()->Now() + base::TimeDelta::FromHours(23)); RunEvictionOnStartup(/* success */ false); - - EXPECT_CALL(*this, DataCallback(false, kImageData)); - image_cache()->LoadImage( - false, kImageUrl, - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage(kImageUrl, kImageData); } TEST_F(CachedImageFetcherImageCacheTest, Reconciliation) { @@ -384,13 +350,7 @@ RunReconciliation(); // Data should be gone. - EXPECT_CALL(*this, DataCallback(false, std::string())); - image_cache()->LoadImage( - false, "foo", - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage("foo", ""); // Metadata should be gone. ASSERT_FALSE(IsMetadataPresent("bar")); @@ -407,13 +367,7 @@ RunReconciliation(); // Data should be gone. - EXPECT_CALL(*this, DataCallback(false, std::string())); - image_cache()->LoadImage( - false, "bar", - base::BindOnce(&CachedImageFetcherImageCacheTest::DataCallback, - base::Unretained(this))); - db()->LoadCallback(true); - RunUntilIdle(); + LoadImage("bar", ""); } TEST_F(CachedImageFetcherImageCacheTest, ReconciliationMismatchMetadata) {
diff --git a/components/image_fetcher/core/cache/image_metadata_store.h b/components/image_fetcher/core/cache/image_metadata_store.h index 5855a74..ff88dd6 100644 --- a/components/image_fetcher/core/cache/image_metadata_store.h +++ b/components/image_fetcher/core/cache/image_metadata_store.h
@@ -48,8 +48,9 @@ // Returns all the keys this store has. virtual void GetAllKeys(KeysCallback callback) = 0; - // Returns the total size of what's in metadata, possibly incorrect. - virtual int GetEstimatedSize() = 0; + // Returns the total size of what's in metadata for a given cache strategy, + // possibly incorrect. + virtual int64_t GetEstimatedSize(CacheStrategy cache_strategy) = 0; // Deletes all metadata that's been cached before the boundary given as // |expiration_time|.
diff --git a/components/image_fetcher/core/cache/image_metadata_store_leveldb.cc b/components/image_fetcher/core/cache/image_metadata_store_leveldb.cc index 66bfaba..ca3c081 100644 --- a/components/image_fetcher/core/cache/image_metadata_store_leveldb.cc +++ b/components/image_fetcher/core/cache/image_metadata_store_leveldb.cc
@@ -45,9 +45,9 @@ return key.compare(other_key) == 0; } -bool SortByLastUsedTime(const CachedImageMetadataProto& a, - const CachedImageMetadataProto& b) { - return a.last_used_time() < b.last_used_time(); +bool SortByLastUsedTime(const CachedImageMetadataProto* a, + const CachedImageMetadataProto* b) { + return a->last_used_time() < b->last_used_time(); } } // namespace @@ -71,8 +71,7 @@ std::unique_ptr<leveldb_proto::ProtoDatabase<CachedImageMetadataProto>> database, base::Clock* clock) - : estimated_size_(0), - initialization_status_(InitializationStatus::UNINITIALIZED), + : initialization_status_(InitializationStatus::UNINITIALIZED), database_(std::move(database)), clock_(clock) {} @@ -114,7 +113,6 @@ if (!IsInitialized()) { return; } - estimated_size_ += data_size; int64_t current_time = ToDatabaseTime(clock_->Now()); CachedImageMetadataProto metadata_proto; @@ -127,6 +125,9 @@ metadata_proto.set_cache_strategy(CacheStrategy::HOLD_UNTIL_EXPIRED); metadata_proto.set_expiration_interval( expiration_interval->InMicroseconds()); + estimated_size_[CacheStrategy::HOLD_UNTIL_EXPIRED] += data_size; + } else { + estimated_size_[CacheStrategy::BEST_EFFORT] += data_size; } auto entries_to_save = std::make_unique<MetadataKeyEntryVector>(); @@ -176,8 +177,9 @@ std::move(callback))); } -int ImageMetadataStoreLevelDB::GetEstimatedSize() { - return estimated_size_; +int64_t ImageMetadataStoreLevelDB::GetEstimatedSize( + CacheStrategy cache_strategy) { + return estimated_size_[cache_strategy]; } void ImageMetadataStoreLevelDB::EvictImageMetadata(base::Time expiration_time, @@ -266,32 +268,18 @@ return; } - size_t total_bytes_stored = 0; - int64_t expiration_database_time = ToDatabaseTime(expiration_time); std::vector<std::string> keys_to_remove; + std::map<CacheStrategy, std::vector<const CachedImageMetadataProto*>> + entries_map; for (const CachedImageMetadataProto& entry : *entries) { - if (entry.creation_time() <= expiration_database_time) { - keys_to_remove.emplace_back(entry.key()); - } else { - total_bytes_stored += entry.data_size(); - } + entries_map[entry.cache_strategy()].push_back(&entry); } - // Only sort and remove more if the byte limit isn't satisfied. - if (total_bytes_stored > bytes_left) { - std::sort(entries->begin(), entries->end(), SortByLastUsedTime); - for (const CachedImageMetadataProto& entry : *entries) { - if (total_bytes_stored <= bytes_left) { - break; - } - - keys_to_remove.emplace_back(entry.key()); - total_bytes_stored -= entry.data_size(); - } + for (auto& cache_strategy : entries_map) { + GetMetadataToRemove(cache_strategy.first, std::move(cache_strategy.second), + expiration_time, bytes_left, &keys_to_remove); } - estimated_size_ = total_bytes_stored; - if (keys_to_remove.empty()) { std::move(callback).Run({}); return; @@ -305,6 +293,59 @@ keys_to_remove)); } +void ImageMetadataStoreLevelDB::GetMetadataToRemove( + CacheStrategy cache_strategy, + std::vector<const CachedImageMetadataProto*> entries, + base::Time expiration_time, + const size_t bytes_left, + std::vector<std::string>* keys_to_remove) { + DCHECK(keys_to_remove); + size_t total_bytes_stored = 0; + int64_t expiration_database_time = ToDatabaseTime(expiration_time); + + switch (cache_strategy) { + case CacheStrategy::BEST_EFFORT: + // Removes expired entries. + for (const CachedImageMetadataProto* entry : entries) { + DCHECK_EQ(entry->cache_strategy(), CacheStrategy::BEST_EFFORT); + if (entry->creation_time() <= expiration_database_time) { + keys_to_remove->emplace_back(entry->key()); + } else { + total_bytes_stored += entry->data_size(); + } + } + + // Only sort and remove more if the byte limit isn't satisfied. + if (total_bytes_stored > bytes_left) { + std::sort(entries.begin(), entries.end(), SortByLastUsedTime); + for (const CachedImageMetadataProto* entry : entries) { + if (total_bytes_stored <= bytes_left) { + break; + } + + keys_to_remove->emplace_back(entry->key()); + total_bytes_stored -= entry->data_size(); + } + } + estimated_size_[cache_strategy] = total_bytes_stored; + break; + case CacheStrategy::HOLD_UNTIL_EXPIRED: + int64_t now = ToDatabaseTime(clock_->Now()); + int64_t total_size = 0; + for (const auto* entry : entries) { + DCHECK_EQ(entry->cache_strategy(), CacheStrategy::HOLD_UNTIL_EXPIRED); + DCHECK(entry->has_expiration_interval()); + if (entry->last_used_time() + entry->expiration_interval() < now) { + keys_to_remove->push_back(entry->key()); + } else { + total_size += entry->data_size(); + } + } + estimated_size_[cache_strategy] = total_size; + break; + } +} + void ImageMetadataStoreLevelDB::OnEvictImageMetadataDone( KeysCallback callback, std::vector<std::string> deleted_keys,
diff --git a/components/image_fetcher/core/cache/image_metadata_store_leveldb.h b/components/image_fetcher/core/cache/image_metadata_store_leveldb.h index 14a2b16..65eeae0 100644 --- a/components/image_fetcher/core/cache/image_metadata_store_leveldb.h +++ b/components/image_fetcher/core/cache/image_metadata_store_leveldb.h
@@ -64,7 +64,7 @@ // which means it hasn't been calculated yet, or it's an over-estimate. In // the case of an over estimate, it will be recified if you call into an // eviction routine. - int GetEstimatedSize() override; + int64_t GetEstimatedSize(CacheStrategy cache_strategy) override; void EvictImageMetadata(base::Time expiration_time, const size_t bytes_left, KeysCallback callback) override; @@ -89,11 +89,16 @@ KeysCallback callback, bool success, std::unique_ptr<std::vector<CachedImageMetadataProto>> entries); + void GetMetadataToRemove(CacheStrategy cache_strategy, + std::vector<const CachedImageMetadataProto*> entries, + base::Time expiration_time, + const size_t bytes_left, + std::vector<std::string>* keys_to_remove); void OnEvictImageMetadataDone(KeysCallback callback, std::vector<std::string> deleted_keys, bool success); - int estimated_size_; + std::map<CacheStrategy, int64_t> estimated_size_; InitializationStatus initialization_status_; std::unique_ptr<leveldb_proto::ProtoDatabase<CachedImageMetadataProto>> database_;
diff --git a/components/image_fetcher/core/cache/image_metadata_store_leveldb_unittest.cc b/components/image_fetcher/core/cache/image_metadata_store_leveldb_unittest.cc index 4100975..cce2e0fb 100644 --- a/components/image_fetcher/core/cache/image_metadata_store_leveldb_unittest.cc +++ b/components/image_fetcher/core/cache/image_metadata_store_leveldb_unittest.cc
@@ -328,8 +328,14 @@ TEST_F(CachedImageFetcherImageMetadataStoreLevelDBTest, GetEstimatedSize) { PrepareDatabase(true); + EXPECT_EQ(5, metadata_store()->GetEstimatedSize(CacheStrategy::BEST_EFFORT)); - EXPECT_EQ(5, metadata_store()->GetEstimatedSize()); + metadata_store()->SaveImageMetadata(kOtherImageKey, 15, + /* needs_transcoding */ false, + base::TimeDelta::FromDays(7)); + EXPECT_EQ(5, metadata_store()->GetEstimatedSize(CacheStrategy::BEST_EFFORT)); + EXPECT_EQ(15, metadata_store()->GetEstimatedSize( + CacheStrategy::HOLD_UNTIL_EXPIRED)); } TEST_F(CachedImageFetcherImageMetadataStoreLevelDBTest, @@ -351,8 +357,20 @@ TEST_F(CachedImageFetcherImageMetadataStoreLevelDBTest, GarbageCollect) { PrepareDatabase(true); + metadata_store()->SaveImageMetadata(kOtherImageKey, 100, + /* needs_transcoding */ false, + base::TimeDelta::FromSeconds(1)); + db()->UpdateCallback(true); + EXPECT_EQ(metadata_store()->GetEstimatedSize(CacheStrategy::BEST_EFFORT), + kImageDataLength); + EXPECT_EQ( + metadata_store()->GetEstimatedSize(CacheStrategy::HOLD_UNTIL_EXPIRED), + 100); + // Calling GC with something to be collected. - EXPECT_CALL(*this, OnKeysReturned(std::vector<std::string>({kImageKey}))); + EXPECT_CALL( + *this, + OnKeysReturned(std::vector<std::string>({kImageKey, kOtherImageKey}))); RunGarbageCollection( base::TimeDelta::FromHours(1), base::TimeDelta::FromHours(1), base::BindOnce( @@ -362,6 +380,10 @@ db()->UpdateCallback(true); ASSERT_FALSE(IsDataPresent(kImageKey)); + ASSERT_FALSE(IsDataPresent(kOtherImageKey)); + EXPECT_EQ(metadata_store()->GetEstimatedSize(CacheStrategy::BEST_EFFORT), 0); + EXPECT_EQ( + metadata_store()->GetEstimatedSize(CacheStrategy::HOLD_UNTIL_EXPIRED), 0); } TEST_F(CachedImageFetcherImageMetadataStoreLevelDBTest, GarbageCollectNoHits) {
diff --git a/components/language/core/common/language_experiments.cc b/components/language/core/common/language_experiments.cc index cb6c16c0..3d4bff9 100644 --- a/components/language/core/common/language_experiments.cc +++ b/components/language/core/common/language_experiments.cc
@@ -32,8 +32,9 @@ "NotifySyncOnLanguageDetermined", base::FEATURE_ENABLED_BY_DEFAULT}; // Base feature for Translate desktop UI experiment +// TODO(crbug.com/1054643): Clean up this flag and old UI code. const base::Feature kUseButtonTranslateBubbleUi{ - "UseButtonTranslateBubbleUI", base::FEATURE_DISABLED_BY_DEFAULT}; + "UseButtonTranslateBubbleUI", base::FEATURE_ENABLED_BY_DEFAULT}; // Params: const char kBackoffThresholdKey[] = "backoff_threshold"; @@ -43,10 +44,6 @@ const char kOverrideModelGeoValue[] = "geo"; const char kOverrideModelDefaultValue[] = "default"; -// Params for Translate Desktop UI experiment -const char kTranslateUIBubbleKey[] = "translate_ui_bubble_style"; -const char kTranslateUIBubbleTabValue[] = "tab"; - OverrideLanguageModel GetOverrideLanguageModel() { std::map<std::string, std::string> params; bool should_override_model = base::GetFieldTrialParamsByFeature( @@ -109,18 +106,10 @@ } TranslateUIBubbleModel GetTranslateUiBubbleModel() { - std::map<std::string, std::string> params; - if (base::GetFieldTrialParamsByFeature(language::kUseButtonTranslateBubbleUi, - ¶ms)) { - if (params[language::kTranslateUIBubbleKey] == - language::kTranslateUIBubbleTabValue) { - return language::TranslateUIBubbleModel::TAB; - } else { - return language::TranslateUIBubbleModel::DEFAULT; - } - } else { - return language::TranslateUIBubbleModel::DEFAULT; + if (base::FeatureList::IsEnabled(language::kUseButtonTranslateBubbleUi)) { + return language::TranslateUIBubbleModel::TAB; } + return language::TranslateUIBubbleModel::DEFAULT; } } // namespace language
diff --git a/components/language/core/common/language_experiments.h b/components/language/core/common/language_experiments.h index 665ace9..e2508dc 100644 --- a/components/language/core/common/language_experiments.h +++ b/components/language/core/common/language_experiments.h
@@ -36,10 +36,6 @@ // This feature uses the existing UI for translate bubble. extern const base::Feature kUseButtonTranslateBubbleUi; -// These feature params controls what translate bubble UI to display. -extern const char kTranslateUIBubbleKey[]; -extern const char kTranslateUIBubbleTabValue[]; - enum class OverrideLanguageModel { DEFAULT, FLUENT,
diff --git a/components/network_session_configurator/browser/network_session_configurator_unittest.cc b/components/network_session_configurator/browser/network_session_configurator_unittest.cc index cd78812..12e6dd7 100644 --- a/components/network_session_configurator/browser/network_session_configurator_unittest.cc +++ b/components/network_session_configurator/browser/network_session_configurator_unittest.cc
@@ -600,18 +600,18 @@ } TEST_F(NetworkSessionConfiguratorTest, QuicFlags) { - FLAGS_quic_reloadable_flag_quic_enable_version_t050 = false; + FLAGS_quic_reloadable_flag_quic_enable_version_t050_v2 = false; FLAGS_quic_reloadable_flag_quic_enable_version_draft_27 = false; std::map<std::string, std::string> field_trial_params; field_trial_params["set_quic_flags"] = - "FLAGS_quic_reloadable_flag_quic_enable_version_t050=true," + "FLAGS_quic_reloadable_flag_quic_enable_version_t050_v2=true," "FLAGS_quic_reloadable_flag_quic_enable_version_draft_27=true"; variations::AssociateVariationParams("QUIC", "Enabled", field_trial_params); base::FieldTrialList::CreateFieldTrial("QUIC", "Enabled"); ParseFieldTrials(); - EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t050); + EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_t050_v2); EXPECT_TRUE(FLAGS_quic_reloadable_flag_quic_enable_version_draft_27); }
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java index d1de8236..af19e869 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java
@@ -16,6 +16,8 @@ this.mNativePtr = nativePtr; } + public void destroy() {} + @CalledByNative protected long getNativePtr() { return mNativePtr;
diff --git a/components/page_info/android/BUILD.gn b/components/page_info/android/BUILD.gn index a27e73e..d7f1858 100644 --- a/components/page_info/android/BUILD.gn +++ b/components/page_info/android/BUILD.gn
@@ -68,6 +68,7 @@ "java/src/org/chromium/components/page_info/CertificateViewer.java", "java/src/org/chromium/components/page_info/ConnectionInfoPopup.java", "java/src/org/chromium/components/page_info/CookieControlsView.java", + "java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java", "java/src/org/chromium/components/page_info/PageInfoDialog.java", "java/src/org/chromium/components/page_info/PageInfoView.java", "java/src/org/chromium/components/page_info/SystemSettingsActivityRequiredListener.java", @@ -78,6 +79,8 @@ ":java_resources", "//base:base_java", "//base:jni_java", + "//components/feature_engagement/public:public_java", + "//components/omnibox/browser:browser_java", "//content/public/android:content_java", "//third_party/android_deps:android_support_v7_appcompat_java", "//third_party/android_deps:androidx_annotation_annotation_java",
diff --git a/components/page_info/android/DEPS b/components/page_info/android/DEPS index 657e1e6..d92dc1a4b 100644 --- a/components/page_info/android/DEPS +++ b/components/page_info/android/DEPS
@@ -1,4 +1,6 @@ include_rules = [ + "+components/feature_engagement/public/android/java", + "+components/omnibox/browser/android/java", "+components/strings/grit/components_strings.h", "-content/public/android", "+content/public/android/java/src/org/chromium/content_public",
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java new file mode 100644 index 0000000..13cee72e --- /dev/null +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoControllerDelegate.java
@@ -0,0 +1,29 @@ +// 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.components.page_info; + +import org.chromium.components.feature_engagement.Tracker; +import org.chromium.components.omnibox.AutocompleteSchemeClassifier; +import org.chromium.ui.modaldialog.ModalDialogManager; + +/** + * Interface that provides embedder-level information to PageInfoController. + */ +public interface PageInfoControllerDelegate { + // Returns the tracker. + Tracker getTracker(); + + // Create an AutoCompleteClassifier. + AutocompleteSchemeClassifier createAutocompleteSchemeClassifier(); + + // Whether cookie controls should be shown in Page Info UI. + boolean cookieControlsShown(); + + // Return the ModalDialogManager to be used. + ModalDialogManager getModalDialogManager(); + + // Whether Page Info UI should use dark colors. + boolean useDarkColors(); +}
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index dce4b9b..bdc8e7b5 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -489,6 +489,7 @@ "//components/test/data/password_manager/login_db_v24_broken.sql", "//components/test/data/password_manager/login_db_v25.sql", "//components/test/data/password_manager/login_db_v26.sql", + "//components/test/data/password_manager/login_db_v27.sql", "//components/test/data/password_manager/login_db_v2_broken.sql", "//components/test/data/password_manager/login_db_v3.sql", "//components/test/data/password_manager/login_db_v3_broken.sql",
diff --git a/components/password_manager/core/browser/fake_form_fetcher.cc b/components/password_manager/core/browser/fake_form_fetcher.cc index d8e8f40..51096e2 100644 --- a/components/password_manager/core/browser/fake_form_fetcher.cc +++ b/components/password_manager/core/browser/fake_form_fetcher.cc
@@ -52,6 +52,11 @@ return is_blacklisted_; } +bool FakeFormFetcher::IsMovingBlocked(const autofill::GaiaIdHash& destination, + const base::string16& username) const { + return false; +} + const std::vector<const PasswordForm*>& FakeFormFetcher::GetAllRelevantMatches() const { return non_federated_same_scheme_;
diff --git a/components/password_manager/core/browser/fake_form_fetcher.h b/components/password_manager/core/browser/fake_form_fetcher.h index 805f30e..3a3a7ea 100644 --- a/components/password_manager/core/browser/fake_form_fetcher.h +++ b/components/password_manager/core/browser/fake_form_fetcher.h
@@ -61,6 +61,8 @@ const override; bool IsBlacklisted() const override; + bool IsMovingBlocked(const autofill::GaiaIdHash& destination, + const base::string16& username) const override; const std::vector<const autofill::PasswordForm*>& GetAllRelevantMatches() const override;
diff --git a/components/password_manager/core/browser/form_fetcher.h b/components/password_manager/core/browser/form_fetcher.h index 4d0949d..81a608a 100644 --- a/components/password_manager/core/browser/form_fetcher.h +++ b/components/password_manager/core/browser/form_fetcher.h
@@ -11,6 +11,7 @@ #include "base/macros.h" #include "base/observer_list_types.h" #include "base/strings/string16.h" +#include "components/autofill/core/common/gaia_id_hash.h" namespace autofill { struct PasswordForm; @@ -79,6 +80,13 @@ // GetState() returns NOT_WAITING. virtual bool IsBlacklisted() const = 0; + // Whether moving the credentials with |username| from the + // local store to the account store for the user with + // |destination| GaiaIdHash is blocked. This is relevant only for account + // store users. + virtual bool IsMovingBlocked(const autofill::GaiaIdHash& destination, + const base::string16& username) const = 0; + // Non-federated matches obtained from the backend that have the same scheme // of this form. virtual const std::vector<const autofill::PasswordForm*>&
diff --git a/components/password_manager/core/browser/form_fetcher_impl.cc b/components/password_manager/core/browser/form_fetcher_impl.cc index 4d804853..ba6b652 100644 --- a/components/password_manager/core/browser/form_fetcher_impl.cc +++ b/components/password_manager/core/browser/form_fetcher_impl.cc
@@ -146,6 +146,12 @@ return is_blacklisted_; } +bool FormFetcherImpl::IsMovingBlocked(const autofill::GaiaIdHash& destination, + const base::string16& username) const { + NOTREACHED(); + return false; +} + const std::vector<const PasswordForm*>& FormFetcherImpl::GetAllRelevantMatches() const { return non_federated_same_scheme_;
diff --git a/components/password_manager/core/browser/form_fetcher_impl.h b/components/password_manager/core/browser/form_fetcher_impl.h index 4a8a00b..10e86970 100644 --- a/components/password_manager/core/browser/form_fetcher_impl.h +++ b/components/password_manager/core/browser/form_fetcher_impl.h
@@ -53,6 +53,9 @@ std::vector<const autofill::PasswordForm*> GetFederatedMatches() const override; bool IsBlacklisted() const override; + bool IsMovingBlocked(const autofill::GaiaIdHash& destination, + const base::string16& username) const override; + const std::vector<const autofill::PasswordForm*>& GetAllRelevantMatches() const override; const std::vector<const autofill::PasswordForm*>& GetBestMatches() @@ -70,6 +73,14 @@ std::vector<std::unique_ptr<autofill::PasswordForm>> forms) override; protected: + // Processes password form results and forwards them to the |consumers_|. + void ProcessPasswordStoreResults( + std::vector<std::unique_ptr<autofill::PasswordForm>> results); + + // Splits |results| into |federated_|, |non_federated_| and |blacklisted_|. + virtual void SplitResults( + std::vector<std::unique_ptr<autofill::PasswordForm>> results); + // PasswordStore results will be fetched for this description. const PasswordStore::FormDigest form_digest_; @@ -83,15 +94,6 @@ // password store returning results in the meantime. bool need_to_refetch_ = false; - // Processes password form results and forwards them to the |consumers_|. - void ProcessPasswordStoreResults( - std::vector<std::unique_ptr<autofill::PasswordForm>> results); - - // Splits |results| into |federated_|, |non_federated_| and |blacklisted_|. - virtual void SplitResults( - std::vector<std::unique_ptr<autofill::PasswordForm>> results); - - private: // Results obtained from PasswordStore: std::vector<std::unique_ptr<autofill::PasswordForm>> non_federated_; @@ -100,6 +102,7 @@ // non-federated matches. std::vector<std::unique_ptr<autofill::PasswordForm>> federated_; + private: // Non-federated credentials of the same scheme as the observed form. std::vector<const autofill::PasswordForm*> non_federated_same_scheme_;
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc index d6b0a90..0f1853e 100644 --- a/components/password_manager/core/browser/login_database.cc +++ b/components/password_manager/core/browser/login_database.cc
@@ -52,12 +52,13 @@ #include "url/origin.h" #include "url/url_constants.h" +using autofill::GaiaIdHash; using autofill::PasswordForm; namespace password_manager { // The current version number of the login database schema. -const int kCurrentVersionNumber = 26; +const int kCurrentVersionNumber = 27; // The oldest version of the schema such that a legacy Chrome client using that // version can still read/write the current database. const int kCompatibleVersionNumber = 19; @@ -87,6 +88,23 @@ return ret; } +base::Pickle SerializeGaiaIdHashVector(const std::vector<GaiaIdHash>& hashes) { + base::Pickle p; + for (const auto& hash : hashes) + p.WriteString(hash.ToBinary()); + return p; +} + +std::vector<GaiaIdHash> DeserializeGaiaIdHashVector(const base::Pickle& p) { + std::vector<GaiaIdHash> hashes; + std::string hash; + + base::PickleIterator iterator(p); + while (iterator.ReadString(&hash)) + hashes.push_back(GaiaIdHash::FromBinary(hash)); + return hashes; +} + namespace { // A simple class for scoping a login database transaction. This does not @@ -131,6 +149,7 @@ COLUMN_POSSIBLE_USERNAME_PAIRS, COLUMN_ID, COLUMN_DATE_LAST_USED, + COLUMN_MOVING_BLOCKED_FOR, COLUMN_NUM // Keep this last. }; @@ -198,6 +217,10 @@ usernames_pickle.size()); s->BindInt64(COLUMN_DATE_LAST_USED, form.date_last_used.ToDeltaSinceWindowsEpoch().InMicroseconds()); + base::Pickle moving_blocked_for_pickle = + SerializeGaiaIdHashVector(form.moving_blocked_for_list); + s->BindBlob(COLUMN_MOVING_BLOCKED_FOR, moving_blocked_for_pickle.data(), + moving_blocked_for_pickle.size()); } // Output parameter is the first one because of binding order. @@ -387,6 +410,12 @@ // Version 26 is the first version where the id is AUTOINCREMENT. SealVersion(builders, /*expected_version=*/26u); + // Version 27. Add the moving_blocked_for column to contain serialized list of + // gaia id hashes for users that prefer not to move this credential to their + // account store. + builders.logins->AddColumn("moving_blocked_for", "BLOB"); + SealVersion(builders, /*expected_version=*/27u); + DCHECK_EQ(static_cast<size_t>(COLUMN_NUM), builders.logins->NumberOfColumns()) << "Adjust LoginDatabaseTableColumns if you change column definitions " "here."; @@ -1124,6 +1153,10 @@ s.BindBlob(next_param++, username_pickle.data(), username_pickle.size()); s.BindInt64(next_param++, form.date_last_used.ToDeltaSinceWindowsEpoch().InMicroseconds()); + base::Pickle moving_blocked_for_pickle = + SerializeGaiaIdHashVector(form.moving_blocked_for_list); + s.BindBlob(next_param++, moving_blocked_for_pickle.data(), + moving_blocked_for_pickle.size()); // NOTE: Add new fields here unless the field is a part of the unique key. // If so, add new field below. @@ -1359,6 +1392,13 @@ generation_upload_status_int); form->date_last_used = base::Time::FromDeltaSinceWindowsEpoch( base::TimeDelta::FromMicroseconds(s.ColumnInt64(COLUMN_DATE_LAST_USED))); + if (s.ColumnByteLength(COLUMN_MOVING_BLOCKED_FOR)) { + base::Pickle pickle( + static_cast<const char*>(s.ColumnBlob(COLUMN_MOVING_BLOCKED_FOR)), + s.ColumnByteLength(COLUMN_MOVING_BLOCKED_FOR)); + form->moving_blocked_for_list = DeserializeGaiaIdHashVector(pickle); + } + DCHECK(autofill::mojom::IsKnownEnumValue(form->generation_upload_status)); return ENCRYPTION_RESULT_SUCCESS; }
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc index cb77509..3a3cc49 100644 --- a/components/password_manager/core/browser/login_database_unittest.cc +++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -38,6 +38,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/origin.h" +using autofill::GaiaIdHash; using autofill::PasswordForm; using autofill::ValueElementPair; using autofill::ValueElementVector; @@ -89,6 +90,8 @@ url::Origin::Create(GURL("https://accounts.google.com/")); form->skip_zero_click = true; form->in_store = PasswordForm::Store::kProfileStore; + form->moving_blocked_for_list.push_back(GaiaIdHash::FromGaiaId("user1")); + form->moving_blocked_for_list.push_back(GaiaIdHash::FromGaiaId("user2")); } // Helper functions to read the value of the first column of an executed @@ -181,6 +184,8 @@ // Serialization routines for vectors implemented in login_database.cc. base::Pickle SerializeValueElementPairs(const ValueElementVector& vec); ValueElementVector DeserializeValueElementPairs(const base::Pickle& pickle); +base::Pickle SerializeGaiaIdHashVector(const std::vector<GaiaIdHash>& hashes); +std::vector<GaiaIdHash> DeserializeGaiaIdHashVector(const base::Pickle& p); class LoginDatabaseTest : public testing::Test { protected: @@ -1148,6 +1153,23 @@ EXPECT_THAT(output, Eq(vec)); } +TEST_F(LoginDatabaseTest, GaiaIdHashVectorSerialization) { + // Empty vector. + std::vector<GaiaIdHash> vec; + base::Pickle temp = SerializeGaiaIdHashVector(vec); + std::vector<GaiaIdHash> output = DeserializeGaiaIdHashVector(temp); + EXPECT_THAT(output, Eq(vec)); + + // Normal data. + vec.push_back(GaiaIdHash::FromGaiaId("first")); + vec.push_back(GaiaIdHash::FromGaiaId("second")); + vec.push_back(GaiaIdHash::FromGaiaId("third")); + + temp = SerializeGaiaIdHashVector(vec); + output = DeserializeGaiaIdHashVector(temp); + EXPECT_THAT(output, Eq(vec)); +} + TEST_F(LoginDatabaseTest, UpdateIncompleteCredentials) { std::vector<std::unique_ptr<PasswordForm>> result; // Verify the database is empty. @@ -1337,6 +1359,7 @@ form.federation_origin = url::Origin::Create(GURL("https://accounts.google.com/")); form.skip_zero_click = true; + form.moving_blocked_for_list.push_back(GaiaIdHash::FromGaiaId("gaia_id")); PasswordStoreChangeList changes = db().UpdateLogin(form); EXPECT_EQ(UpdateChangeForForm(form, /*passwordchanged=*/true), changes);
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher.cc b/components/password_manager/core/browser/multi_store_form_fetcher.cc index 823b8c0b..065401fc 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher.cc +++ b/components/password_manager/core/browser/multi_store_form_fetcher.cc
@@ -63,6 +63,29 @@ return is_blacklisted_in_profile_store_; } +bool MultiStoreFormFetcher::IsMovingBlocked( + const autofill::GaiaIdHash& destination, + const base::string16& username) const { + for (const std::vector<std::unique_ptr<autofill::PasswordForm>>* + matches_vector : {&federated_, &non_federated_}) { + for (const auto& form : *matches_vector) { + // Only local entries can be moved to the account store (though + // account store matches should never have |moving_blocked_for_list| + // entries anyway). + if (form->IsUsingAccountStore()) + continue; + // Ignore PSL matches for blocking moving. + if (form->is_public_suffix_match) + continue; + if (form->username_value != username) + continue; + if (base::Contains(form->moving_blocked_for_list, destination)) + return true; + } + } + return false; +} + void MultiStoreFormFetcher::OnGetPasswordStoreResults( std::vector<std::unique_ptr<PasswordForm>> results) { DCHECK_EQ(State::WAITING, state_);
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher.h b/components/password_manager/core/browser/multi_store_form_fetcher.h index 3954b10..e22f6e4 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher.h +++ b/components/password_manager/core/browser/multi_store_form_fetcher.h
@@ -24,6 +24,8 @@ // FormFetcher overrides. void Fetch() override; bool IsBlacklisted() const override; + bool IsMovingBlocked(const autofill::GaiaIdHash& destination, + const base::string16& username) const override; void OnGetPasswordStoreResults( std::vector<std::unique_ptr<autofill::PasswordForm>> results) override;
diff --git a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc index 9f5ec72..67865de3 100644 --- a/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc +++ b/components/password_manager/core/browser/multi_store_form_fetcher_unittest.cc
@@ -7,6 +7,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/task_environment.h" #include "build/build_config.h" +#include "components/autofill/core/common/gaia_id_hash.h" #include "components/autofill/core/common/password_form.h" #include "components/password_manager/core/browser/mock_password_store.h" #include "components/password_manager/core/browser/stub_password_manager_client.h" @@ -14,6 +15,7 @@ #include "url/origin.h" #include "url/url_constants.h" +using autofill::GaiaIdHash; using autofill::PasswordForm; using base::ASCIIToUTF16; using testing::_; @@ -65,7 +67,7 @@ PasswordForm CreateHTMLForm(const std::string& origin_url, const std::string& username_value, const std::string& password_value, - base::Time date_last_used) { + base::Time date_last_used = base::Time::Now()) { PasswordForm form; form.scheme = PasswordForm::Scheme::kHtml; form.origin = GURL(origin_url); @@ -294,4 +296,49 @@ EXPECT_TRUE(form_fetcher_->IsBlacklisted()); } +TEST_F(MultiStoreFormFetcherTest, MovingToAccountStoreIsBlocked) { + Fetch(); + const GaiaIdHash kUser = GaiaIdHash::FromGaiaId("user"); + const GaiaIdHash kAnotherUser = GaiaIdHash::FromGaiaId("another_user"); + + // Form that's blocked for |kUser| for "username1". + PasswordForm blocked_form = + CreateHTMLForm("www.url.com", "username1", "pass"); + blocked_form.in_store = PasswordForm::Store::kProfileStore; + blocked_form.moving_blocked_for_list.push_back(kUser); + + // Form that not blocked for "username2". + PasswordForm unblocked_form = + CreateHTMLForm("www.url.com", "username2", "pass"); + unblocked_form.in_store = PasswordForm::Store::kProfileStore; + + // PSL form that's blocked for |kUser| for "psl_username". + PasswordForm psl_form = CreateHTMLForm("psl.url.com", "psl_username", "pass"); + psl_form.is_public_suffix_match = true; + psl_form.in_store = PasswordForm::Store::kProfileStore; + psl_form.moving_blocked_for_list.push_back(kUser); + + // Pass response from the local store. + std::vector<std::unique_ptr<PasswordForm>> results; + results.push_back(std::make_unique<PasswordForm>(blocked_form)); + results.push_back(std::make_unique<PasswordForm>(unblocked_form)); + results.push_back(std::make_unique<PasswordForm>(psl_form)); + form_fetcher_->OnGetPasswordStoreResults(std::move(results)); + // Pass empty response from the account store. + form_fetcher_->OnGetPasswordStoreResults({}); + + // Moving should be blocked for |kUser| and |form1|. + EXPECT_TRUE( + form_fetcher_->IsMovingBlocked(kUser, blocked_form.username_value)); + // Moving shouldn't be blocked for other usernames. + EXPECT_FALSE( + form_fetcher_->IsMovingBlocked(kUser, unblocked_form.username_value)); + // Moving shouldn't be blocked for other users. + EXPECT_FALSE(form_fetcher_->IsMovingBlocked(kAnotherUser, + blocked_form.username_value)); + // PSL match entries should be ignored when computing the moving blacklist + // entries. + EXPECT_FALSE(form_fetcher_->IsMovingBlocked(kUser, psl_form.username_value)); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/multi_store_password_save_manager.cc b/components/password_manager/core/browser/multi_store_password_save_manager.cc index 7b26a77..61b19b43 100644 --- a/components/password_manager/core/browser/multi_store_password_save_manager.cc +++ b/components/password_manager/core/browser/multi_store_password_save_manager.cc
@@ -237,7 +237,9 @@ // store, 1) to avoid unnecessary sync cycles, 2) to avoid potential // last_used_date update. if (!AccountStoreMatchesContainForm(account_store_matches, *match)) { - account_store_form_saver_->Save(*match, account_store_matches, + PasswordForm match_copy = *match; + match_copy.moving_blocked_for_list.clear(); + account_store_form_saver_->Save(match_copy, account_store_matches, /*old_password=*/base::string16()); } form_saver_->Remove(*match);
diff --git a/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc b/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc index 02c590ec..0d93490 100644 --- a/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc +++ b/components/password_manager/core/browser/multi_store_password_save_manager_unittest.cc
@@ -670,6 +670,8 @@ MoveCredentialsFromProfileToAccountStoreWhenExistsOnlyInProfileStore) { PasswordForm saved_match_in_profile_store(saved_match_); saved_match_in_profile_store.in_store = PasswordForm::Store::kProfileStore; + saved_match_in_profile_store.moving_blocked_for_list.push_back( + autofill::GaiaIdHash::FromGaiaId("user@gmail.com")); SetNonFederatedAndNotifyFetchCompleted({&saved_match_in_profile_store}); password_save_manager()->CreatePendingCredentials( @@ -677,9 +679,13 @@ /*is_http_auth=*/false, /*is_credential_api_save=*/false); + PasswordForm saved_match_without_moving_blocked_list( + saved_match_in_profile_store); + saved_match_without_moving_blocked_list.moving_blocked_for_list.clear(); + EXPECT_CALL(*mock_profile_form_saver(), Remove(saved_match_in_profile_store)); EXPECT_CALL(*mock_account_form_saver(), - Save(saved_match_in_profile_store, _, _)); + Save(saved_match_without_moving_blocked_list, _, _)); password_save_manager()->MoveCredentialsToAccountStore(); }
diff --git a/components/permissions/permission_manager.cc b/components/permissions/permission_manager.cc index 0cc63be..12e749e 100644 --- a/components/permissions/permission_manager.cc +++ b/components/permissions/permission_manager.cc
@@ -124,6 +124,8 @@ return ContentSettingsType::AR; case PermissionType::STORAGE_ACCESS_GRANT: return ContentSettingsType::STORAGE_ACCESS; + case PermissionType::CAMERA_PAN_TILT_ZOOM: + return ContentSettingsType::CAMERA_PAN_TILT_ZOOM; case PermissionType::NUM: break; }
diff --git a/components/permissions/permission_request.h b/components/permissions/permission_request.h index 35beab0..688c902 100644 --- a/components/permissions/permission_request.h +++ b/components/permissions/permission_request.h
@@ -54,6 +54,7 @@ PERMISSION_VR = 21, PERMISSION_AR = 22, PERMISSION_STORAGE_ACCESS = 23, + PERMISSION_CAMERA_PAN_TILT_ZOOM = 24, // NUM must be the last value in the enum. NUM };
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc index 6388d4e0c..64fe0789 100644 --- a/components/permissions/permission_uma_util.cc +++ b/components/permissions/permission_uma_util.cc
@@ -101,6 +101,8 @@ return "AR"; case PermissionRequestType::PERMISSION_STORAGE_ACCESS: return "StorageAccess"; + case PermissionRequestType::PERMISSION_CAMERA_PAN_TILT_ZOOM: + return "CameraPanTiltZoom"; default: NOTREACHED(); return "";
diff --git a/components/permissions/permission_util.cc b/components/permissions/permission_util.cc index df3ea21..97c25800 100644 --- a/components/permissions/permission_util.cc +++ b/components/permissions/permission_util.cc
@@ -65,6 +65,8 @@ return "AR"; case ContentSettingsType::STORAGE_ACCESS: return "StorageAccess"; + case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: + return "CameraPanTiltZoom"; default: break; } @@ -102,6 +104,8 @@ return PermissionRequestType::PERMISSION_AR; case ContentSettingsType::STORAGE_ACCESS: return PermissionRequestType::PERMISSION_STORAGE_ACCESS; + case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: + return PermissionRequestType::PERMISSION_CAMERA_PAN_TILT_ZOOM; default: NOTREACHED(); return PermissionRequestType::UNKNOWN; @@ -161,6 +165,8 @@ *out = PermissionType::AR; } else if (type == ContentSettingsType::STORAGE_ACCESS) { *out = PermissionType::STORAGE_ACCESS_GRANT; + } else if (type == ContentSettingsType::CAMERA_PAN_TILT_ZOOM) { + *out = PermissionType::CAMERA_PAN_TILT_ZOOM; } else { return false; } @@ -192,6 +198,7 @@ case ContentSettingsType::VR: case ContentSettingsType::AR: case ContentSettingsType::STORAGE_ACCESS: + case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: return true; default: return false;
diff --git a/components/policy/core/browser/configuration_policy_handler.cc b/components/policy/core/browser/configuration_policy_handler.cc index d170260..1dfd112 100644 --- a/components/policy/core/browser/configuration_policy_handler.cc +++ b/components/policy/core/browser/configuration_policy_handler.cc
@@ -564,7 +564,7 @@ base::JSONReader::ValueWithError value_with_error = base::JSONReader::ReadAndReturnValueWithError( json_string, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); - if (value_with_error.error_code != base::JSONReader::JSON_NO_ERROR) { + if (!value_with_error.value) { if (errors) { errors->AddError(policy_name_, ErrorPath(index, ""), IDS_POLICY_INVALID_JSON_ERROR,
diff --git a/components/policy/core/common/cloud/component_cloud_policy_store.cc b/components/policy/core/common/cloud/component_cloud_policy_store.cc index 288b89ab..1c39b22 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_store.cc +++ b/components/policy/core/common/cloud/component_cloud_policy_store.cc
@@ -398,7 +398,7 @@ base::JSONReader::ValueWithError value_with_error = base::JSONReader::ReadAndReturnValueWithError( data, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); - if (value_with_error.error_code != base::JSONReader::JSON_NO_ERROR) { + if (!value_with_error.value) { LOG(ERROR) << "Invalid JSON blob: " << value_with_error.error_message; return false; }
diff --git a/components/policy/core/common/policy_proto_decoders.cc b/components/policy/core/common/policy_proto_decoders.cc index 33715e0..f3239708 100644 --- a/components/policy/core/common/policy_proto_decoders.cc +++ b/components/policy/core/common/policy_proto_decoders.cc
@@ -89,7 +89,7 @@ base::JSONReader::ReadAndReturnValueWithError( json, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); - if (value_with_error.error_code != base::JSONReader::JSON_NO_ERROR) { + if (!value_with_error.value) { // Can't parse as JSON so return it as a string, and leave it to the handler // to validate. LOG(WARNING) << "Invalid JSON: " << json;
diff --git a/components/policy/core/common/schema.cc b/components/policy/core/common/schema.cc index 512ff70..49ad203 100644 --- a/components/policy/core/common/schema.cc +++ b/components/policy/core/common/schema.cc
@@ -1423,7 +1423,7 @@ schema, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); *error = value_with_error.error_message; - if (value_with_error.error_code != base::JSONReader::JSON_NO_ERROR) + if (!value_with_error.value) return base::nullopt; base::Value json = std::move(value_with_error.value.value()); if (!json.is_dict()) {
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index feb6533..ba1ed8b 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -19898,7 +19898,7 @@ 'owners': ['ydago@chromium.org', 'grt@chromium.org'], 'type': 'int', 'schema': { 'type': 'integer', 'minimum': 0 }, - 'supported_on': ['chrome.*:82-'], + 'supported_on': ['chrome.*:83-'], 'features': { 'dynamic_refresh': False, 'per_profile': False, @@ -20246,7 +20246,7 @@ 'device_only': True, 'type': 'main', 'schema': { 'type': 'boolean' }, - 'supported_on': ['chrome_os:82-'], + 'supported_on': ['chrome_os:83-'], 'features': { 'can_be_mandatory' : True, 'can_be_recommended': False, @@ -20272,7 +20272,7 @@ 'owners': ['lamzin@google.com', 'gildekel@chromium.org'], 'type': 'main', 'schema': { 'type': 'boolean' }, - 'supported_on': ['chrome_os:82-'], + 'supported_on': ['chrome_os:83-'], 'features': { 'can_be_mandatory' : True, 'can_be_recommended': False,
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index e83d257..f40bebe 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -295,12 +295,6 @@ <translation id="1427655258943162134">Adresse oder URL des Proxyservers</translation> <translation id="1435659902881071157">Netzwerkkonfiguration auf Geräteebene</translation> <translation id="1438739959477268107">Standardeinstellung für die Schlüsselgenerierung</translation> -<translation id="1455804070656338445">Mit dieser Richtlinie wird die URL zur Passwortänderung konfiguriert (nur HTTP- und HTTPS-Schemas). Nutzer, in deren Browser eine Warnung angezeigt wurde, werden vom Passwortschutzdienst an diese URL weitergeleitet, damit sie ihr Passwort ändern können. - Ihre Passwortänderungsseite muss den Richtlinien unter https://www.chromium.org/developers/design-documents/create-amazing-password-forms entsprechen, damit Fingerabdrücke zur Autorisierung in <ph name="PRODUCT_NAME" /> richtig erfasst werden können. - - Wenn diese Einstellung aktiviert ist, leitet der Passwortschutzdienst Nutzer, in deren Browser eine Warnung angezeigt wurde, an diese URL weiter, damit sie ihr Passwort ändern können. - Wenn diese Einstellung deaktiviert oder nicht konfiguriert ist, leitet der Passwortschutzdienst Nutzer an https://myaccount.google.com weiter, damit sie ihr Passwort ändern können. - Diese Richtlinie ist nur in Windows-Instanzen verfügbar, die mit einer <ph name="MS_AD_NAME" />-Domain verbunden sind, oder bei Windows 10 Pro- oder Enterprise-Instanzen, für die eine Geräteverwaltung eingerichtet ist.</translation> <translation id="1456822151187621582">Windows (<ph name="PRODUCT_OS_NAME" />-Clients):</translation> <translation id="1464848559468748897">Steuert das Nutzerverhalten in einer Sitzung mit mehreren Profilen auf Geräten mit <ph name="PRODUCT_OS_NAME" /> @@ -593,12 +587,6 @@ Ist die Richtlinie auf "false" festgelegt, ist das Senden solcher Berichte deaktiviert. Ist die Richtlinie nicht konfiguriert, ist das Senden solcher Berichte auf nicht verwalteten Geräten deaktiviert und auf verwalteten Geräten aktiviert.</translation> -<translation id="1907431809333268751">Hiermit wird die Liste der URLs für die Unternehmensanmeldung konfiguriert (nur HTTP- und HTTPS-Schemas). Der Fingerabdruck für die Autorisierung wird unter diesen URLs registriert und für die Prüfung der Wiederverwendung von Passwörtern genutzt. - Ihre Anmeldeseiten müssen den Richtlinien unter https://www.chromium.org/developers/design-documents/create-amazing-password-forms entsprechen, damit Fingerabdrücke zur Autorisierung in <ph name="PRODUCT_NAME" /> richtig erfasst werden können. - - Wenn diese Einstellung aktiviert ist, erfasst der Passwortschutzdienst den Fingerabdruck zur Autorisierung auf diesen URLs, der dann zur Prüfung der Wiederverwendung von Passwörtern genutzt wird. - Wenn diese Einstellung deaktiviert oder nicht konfiguriert ist, erfasst der Passwortschutzdienst den Fingerabdruck zur Autorisierung nur auf https://accounts.google.com. - Diese Richtlinie steht nur bei Windows-Instanzen zur Verfügung, die Teil einer <ph name="MS_AD_NAME" />-Domain sind, oder bei Windows 10 Pro- oder Enterprise-Instanzen, für die eine Geräteverwaltung eingerichtet ist.</translation> <translation id="1910704279188129272">Mit dieser Richtlinie können Sie Nutzungsbeschränkungen für Apps hinzufügen. Nutzungsbeschränkungen können für die unter <ph name="PRODUCT_OS_NAME" /> installierten Apps für den jeweiligen Nutzer angewendet werden. Die Beschränkungen sollten in die |app_limits|-Liste übernommen werden. Pro App ist nur ein Eintrag zulässig. Für Apps außerhalb der Liste gelten keine Beschränkungen. @@ -3965,13 +3953,6 @@ Wenn "U2F_EXTENDED" ausgewählt ist, sind durch die integrierte Hardware die U2F-Funktionen plus einige Erweiterungen zur individuellen Bestätigung verfügbar.</translation> <translation id="7003334574344702284">Diese Richtlinie erzwingt, sofern aktiv, den Import von gespeicherten Passwörtern aus dem vorherigen Standardbrowser. Bei einer Aktivierung wirkt sich die Richtlinie auch auf den Importdialog aus. Wenn sie deaktiviert ist, erfolgt kein Import der gespeicherten Passwörter. Sollte sie nicht konfiguriert sein, so wird der Nutzer möglicherweise gefragt, ob ein Import erfolgen soll, oder der Import findet automatisch statt.</translation> <translation id="7003746348783715221">Einstellungen für <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Konfiguriert das Verzeichnis, das von <ph name="PRODUCT_NAME" /> zur Speicherung von Nutzerdaten verwendet wird. - -Wenn Sie diese Richtlinie konfigurieren, wird das angegebene Verzeichnis auch dann von <ph name="PRODUCT_NAME" /> verwendet, wenn der Nutzer die Markierung "--user-data-dir" angibt. Um Datenverluste oder andere unerwartete Fehler zu vermeiden, darf diese Richtlinie nicht auf das Stammverzeichnis eines Datenträgers oder auf ein Verzeichnis, das für andere Zwecke verwendet wird, festgelegt werden, da <ph name="PRODUCT_NAME" /> die entsprechenden Inhalte verwaltet. - -Unter https://www.chromium.org/administrators/policy-list-3/user-data-directory-finden Sie eine Liste mit Variablen, die verwendet werden können. - -Wird diese Richtlinie nicht konfiguriert, wird der standardmäßige Profilpfad verwendet und der Nutzer kann ihn mit der Befehlszeilenmarkierung "--user-data-dir" ändern.</translation> <translation id="7008308728445338159">DNS-Abfangprüfungen aktiviert</translation> <translation id="7027785306666625591">Hiermit wird die Energieverwaltung in <ph name="PRODUCT_OS_NAME" /> konfiguriert. @@ -4875,7 +4856,6 @@ <translation id="8424255554404582727">Standarddrehung des Bildschirms festlegen, die bei jedem Neustart erneut angewendet wird</translation> <translation id="8426231401662877819">Bildschirm um 90 Grad im Uhrzeigersinn drehen</translation> <translation id="8433186206711564395">Netzwerkeinstellungen</translation> -<translation id="8433423491036718210">Hiermit wird die Liste der URLs für die Unternehmensanmeldung konfiguriert, für die der Passwortschutzdienst den Fingerabdruck für die Autorisierung registrieren soll.</translation> <translation id="8445576299806775661">Nach jedem größeren Versionsupdate erstellt Chrome für den Fall eines Notfall-Rollbacks einen Snapshot bestimmter Browserdaten des Nutzers. Falls ein Notfall-Rollback für eine Version durchgeführt wird, für die der Nutzer einen passenden Snapshot hat, werden die darin gespeicherten Daten wiederhergestellt. Hierdurch verliert der Nutzer seine Einstellungen wie beispielsweise Lesezeichen und AutoFill-Daten nicht. Ist diese Richtlinie nicht konfiguriert, wird der Standardwert "3" verwendet.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 15210ba..d99a7974 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -298,12 +298,6 @@ <translation id="1427655258943162134">Dirección o dirección URL del servidor proxy</translation> <translation id="1435659902881071157">Configuración de red de dispositivo</translation> <translation id="1438739959477268107">Configuración predeterminada de generación de claves</translation> -<translation id="1455804070656338445">Configura la URL de cambio de contraseña (solo esquemas HTTP y HTTPS). El servicio de protección de contraseñas enviará a los usuarios a esta URL para que cambien sus contraseñas en el caso de que vean una advertencia en el navegador. - Para que <ph name="PRODUCT_NAME" /> capture la nueva huella digital de contraseña correctamente en esta página de cambio de contraseña, asegúrate de que la página cumpla con los lineamientos que se indican en https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Si se habilita esta configuración, el servicio de protección de contraseñas enviará a los usuarios a esta URL para que cambien sus contraseñas en el caso de que vean una advertencia en el navegador. - Si se inhabilita esta configuración o no se establece, el servicio de protección de contraseñas enviará a los usuarios a https://myaccount.google.com para que cambien sus contraseñas. - 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="1456822151187621582">Windows (clientes de <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Controla el comportamiento del usuario durante una sesión de perfiles múltiples en dispositivos con <ph name="PRODUCT_OS_NAME" />. @@ -361,6 +355,7 @@ Si la política "EnableMediaRouter" se establece como falsa, el valor de esta política no tendrá efecto.</translation> <translation id="1509692106376861764">Esta política se eliminó a partir de la versión 29 de <ph name="PRODUCT_NAME" />.</translation> <translation id="1514888685242892912">Habilitar <ph name="PRODUCT_NAME" /></translation> +<translation id="1515230621229117540">Habilitar el menú de accesibilidad flotante</translation> <translation id="1515824657887788963">Permite que una página realice solicitudes XHR síncronas cuando el usuario la abandona</translation> <translation id="1522425503138261032">Permitir a los sitios que rastreen la ubicación física de los usuarios.</translation> <translation id="1523774894176285446">Navegador alternativo que se inicia para sitios web configurados</translation> @@ -595,12 +590,6 @@ Si el valor se establece como falso, se inhabilitará el envío de datos de diagnóstico y métricas. Si esta política no se configura, el envío de datos de diagnóstico y métricas se inhabilitará en los dispositivos no administrados y se habilitará en los dispositivos administrados.</translation> -<translation id="1907431809333268751">Configura la lista de las URL de acceso empresariales (solo en esquemas HTTP y HTTPS). Se capturará la huella digital de la contraseña en estas URL y se usará para detectar la reutilización de contraseñas. - Para que <ph name="PRODUCT_NAME" /> capture las huellas digitales de contraseñas correctamente, asegúrate de que tus páginas de acceso cumplan con los lineamientos que se indican en https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Si se habilita esta configuración, el servicio de protección de contraseñas capturará la huella digital de la contraseña en estas URL para detectar la reutilización de contraseñas. - Si se inhabilita esta configuración o no se establece, el servicio de protección de contraseñas solo capturará la huella digital de la contraseña en https://accounts.google.com. - 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="1910704279188129272">Permite establecer restricciones de uso según la app. Se pueden aplicar restricciones de uso a las apps instaladas en <ph name="PRODUCT_OS_NAME" /> para un usuario determinado. Las restricciones se deben especificar en la lista |app_limits|. Solo se permite una entrada por app. Las apps que no se incluyan en la lista no tendrán restricciones. @@ -1333,7 +1322,7 @@ <translation id="2872961005593481000">Cerrar</translation> <translation id="2873651257716068683">Anula el tamaño predeterminado para la página de impresión. Si el tamaño de la página no está disponible, se ignorará esta política.</translation> <translation id="2874209944580848064">Nota para dispositivos <ph name="PRODUCT_OS_NAME" /> compatibles con apps de Android:</translation> -<translation id="2874901846804525128">Impide que el usuario use apps de Android de fuentes no confiables.</translation> +<translation id="2874901846804525128">Impide que el usuario use apps para Android de fuentes no confiables.</translation> <translation id="2875192972412983412">Especifica el subconjunto de servidores de impresión que se consultará para las impresoras de servidor. Si se usa esta política, el usuario solo podrá acceder a las impresoras de servidor con ID que coincidan con los valores en esta política. @@ -2937,7 +2926,7 @@ Si está configurada en verdadero o si no está configurada, este usuario podrá crear y administrar usuarios supervisados.</translation> <translation id="5369937289900051171">Solo impresión a color</translation> <translation id="5370279767682621504">Habilitar la compatibilidad con HTTP/0.9 en puertos no predeterminados</translation> -<translation id="5377606826822211923">Controlar la forma en que el usuario usa las apps de Android de fuentes no confiables</translation> +<translation id="5377606826822211923">Controla la forma en que el usuario usa las apps para Android de fuentes no confiables</translation> <translation id="5378985487213287085">Te permite configurar si los sitios web pueden mostrar notificaciones de escritorio. Esto se puede permitir de manera predeterminada, se puede denegar de manera predeterminada o se le puede preguntar al usuario cada vez que un sitio web quiera mostrar notificaciones de escritorio. Si esta política no se configura, se usará "AskNotifications" y el usuario podrá cambiarlo.</translation> <translation id="5380329473151894945">Establece el estado predeterminado de la función de accesibilidad del cursor grande en la pantalla de acceso. @@ -3284,6 +3273,17 @@ Si no se ofrece ninguna configuración, <ph name="PRODUCT_NAME" /> recurrirá a un nombre de biblioteca predeterminado.</translation> <translation id="5783009211970309878">Imprimir encabezados y pies de página</translation> +<translation id="5783576706065107606">Habilita las mitigaciones de comprobación de <ph name="CORS" /> en la nueva implementación de <ph name="CORS" />, lo que permite que las extensiones mantengan su compatibilidad y que <ph name="PRODUCT_NAME" /> envíe encabezados específicos sin la necesidad de comprobaciones de <ph name="CORS" />. + + Si se establece esta lista como vacía, <ph name="PRODUCT_NAME" /> intentará ejecutar las extensiones de forma compatible y no introducirá cambios de <ph name="API" /> para <ph name="PRODUCT_NAME" /> 79, como se explica en el <ph name="WEB_REQUEST_API_MANUAL" />. + + Si se establece que en esta lista <ph name="HTTP" /> solicita nombres de encabezado, la inspección de <ph name="CORS" /> ignorará los encabezados enumerados y habilitará la mitigación para las extensiones. + + Si no se establece, no se aplicarán las mitigaciones que explicaron anteriormente. + + Para obtener más información sobre <ph name="CORS" />, visita la siguiente página web: <ph name="CORS_HELP_URL" />. + + Ten en cuenta que se había anunciado que esta política se quitaría en la versión 82 de <ph name="PRODUCT_NAME" />; sin embargo, se quitará en la versión 84, según la nueva planificación.</translation> <translation id="5790763087505467169">Reducir la cantidad de notificaciones de inicio automático de la sesión de invitado administrada</translation> <translation id="5806128552675651249">Habilitar la impresión solo sin los gráficos de fondo</translation> <translation id="5809210507920527553">Controla la configuración para el contenedor de Linux (Crostini).</translation> @@ -3347,6 +3347,17 @@ Si esta configuración está inhabilitada o no está establecida, el nombre de dominio de TalkGadget predeterminado ("chromoting-host.talkgadget.google.com") se utilizará para todos los hosts. La configuración de esta política no afecta a los clientes de acceso remoto. Ellos siempre utilizarán "chromoting-client.talkgadget.google.com" para acceder a TalkGadget.</translation> +<translation id="5888171512889380367">Utiliza la implementación heredada de <ph name="CORS" /> en lugar de la nueva implementación de <ph name="CORS" />. + + Si se establece esta configuración como verdadera, se utilizará la implementación heredada, la cual debe ser compatible con las versiones anteriores. + + Si se establece como falsa o no se establece, se utilizará la nueva implementación; es posible que esto genere problemas de compatibilidad específicos en empresas. + + Después de algunos hitos, se quitará esta política. + + Para obtener más información sobre <ph name="CORS" />, visita la siguiente página web: <ph name="CORS_HELP_URL" />. + + Ten en cuenta que se había anunciado que esta política se quitaría en la versión 82 de <ph name="PRODUCT_NAME" />; sin embargo, se quitará en la versión 84, según la nueva planificación.</translation> <translation id="5893553533827140852">Si esta opción está habilitada, las solicitudes de autenticación gnubby se representarán a través de una conexión de host remota. Si esta opción está inhabilitada o no está configurada, no se representarán solicitudes de autenticación gnubby.</translation> @@ -3634,6 +3645,11 @@ 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="6417265370957905582">Asistente de Google</translation> +<translation id="6422575351619065453">En el modo kiosko, esta política controla si se muestra el menú de accesibilidad flotante. + + Si esta política se configura como habilitada, siempre se mostrará el menú de accesibilidad flotante. + + Si esta política se configura como habilitada o no se configura, nunca se mostrará el menú de accesibilidad flotante.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">No puedes forzar las apps de Android a que usen un proxy. Las apps de Android tienen a su disposición un subgrupo de opciones de configuración de proxy que pueden respetar de forma voluntaria: @@ -3732,7 +3748,7 @@ Ten en cuenta que se puede anular esta política con las políticas EnabledPlugins y DisabledPluginsExceptions. Si no se configura esta política, el usuario podrá usar cualquier complemento instalado en el sistema, excepto aquellos que sean peligrosos, obsoletos o incompatibles por el código.</translation> -<translation id="6571871508154591774">Inhabilitar la cámara y la configuración del navegador y del SO</translation> +<translation id="6571871508154591774">Inhabilita la cámara y la configuración del navegador y del SO</translation> <translation id="6573305661369899995">Establece una fuente externa de restrcicciones de URL</translation> <translation id="6583851521569686409">Configura una lista de impresoras. @@ -3809,7 +3825,7 @@ <translation id="6731757988219967594">Aplicar filtros de contenido para adultos a los sitios principales (pero no a los iframes incorporados)</translation> <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="6737677282967014160">Permite que el usuario utilice apps de Android de fuentes no confiables.</translation> +<translation id="6737677282967014160">Permite que el usuario utilice apps para Android de fuentes no confiables.</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 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" />. @@ -3947,13 +3963,6 @@ Si se selecciona "U2F_EXTENDED", el segundo factor integrado proporcionará funciones de U2F además de algunas extensiones para la atestación individual.</translation> <translation id="7003334574344702284">Esta política, si se habilita, fuerza la importación de las contraseñas guardadas del navegador predeterminado anterior. Si se la habilita, esta política también afecta el cuadro de diálogo de importación. Si se la inhabilita, no se importan las contraseñas guardadas. Si no se configura, se le puede preguntar al usuario si desea importar las contraseñas guardadas o la importación puede realizarse de forma automática.</translation> <translation id="7003746348783715221">Preferencias de <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Configura el directorio que <ph name="PRODUCT_NAME" /> usará para almacenar datos del usuario. - - Si estableces esta política, <ph name="PRODUCT_NAME" /> usará el directorio proporcionado más allá de que el usuario haya especificado la marca '--user-data-dir' o no. Para evitar la pérdida de datos u otros errores inesperados, no debes configurar un directorio con otro uso o el directorio raíz de un volumen en esta política, porque <ph name="PRODUCT_NAME" /> administra su contenido. - - Consulta https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables para obtener una lista de las variables que se pueden usar. - - Si no estableces esta política, se usará la ruta de perfil predeterminada, y el usuario podrá anularlo con la marca '--user-data-dir' en la línea de comandos.</translation> <translation id="7008308728445338159">Revisiones habilitadas de la intercepción de DNS</translation> <translation id="7027785306666625591">Configura la administración de energía en <ph name="PRODUCT_OS_NAME" />. @@ -4338,7 +4347,7 @@ Los patrones de URL deben tener un formato conforme a lo especificado en la política "URLBlacklist", documentada en https://www.chromium.org/administrators/url-blacklist-filter-format. </translation> <translation id="7566878661979235378">Tipo de autenticación del acceso SAML</translation> -<translation id="7567373982693549834">Esta política controla la forma en cada usuario usa las apps de Android de fuentes no seguras (que no provienen de Google Play Store). +<translation id="7567373982693549834">Esta política controla la forma en que cada usuario usa las apps para Android de fuentes no seguras (que no provienen de Google Play Store). Si no se establece el valor para esta política, no se permitirá la funcionalidad. @@ -4868,7 +4877,6 @@ <translation id="8424255554404582727">Establecer la rotación predeterminada de la pantalla que se volverá a aplicar en cada reinicio</translation> <translation id="8426231401662877819">Rotar la pantalla hacia la derecha 90 grados</translation> <translation id="8433186206711564395">Opciones de red</translation> -<translation id="8433423491036718210">Configura la lista de las URL de acceso empresariales donde el servicio de protección de contraseñas debe capturar una huella digital de la contraseña.</translation> <translation id="8445576299806775661">Después de cada actualización importante de la versión, Chrome creará una instantánea de ciertas porciones de los datos de navegación del usuario en caso de tener que realizar una reversión de emergencia en el futuro. Si se realiza una reversión de emergencia a una versión para la cual el usuario tiene una instantánea correspondiente, se restablecerán los datos de esa instantánea. Esto permitirá que los usuarios conserven opciones de configuración como los favoritos y los datos de la función Autocompletar. Si no se establece esta política, se usará el valor predeterminado "3".
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 05b34543..26998f5b 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -296,12 +296,6 @@ <translation id="1427655258943162134">Dirección o URL de servidor proxy</translation> <translation id="1435659902881071157">Configuración de red de dispositivos</translation> <translation id="1438739959477268107">Configuración predeterminada de la generación de claves</translation> -<translation id="1455804070656338445">Configura la URL de cambio de contraseña (solo esquemas HTTP y HTTPS). El servicio de protección de contraseña enviará a los usuarios a esta URL para que cambien sus contraseñas cuando hayan visto una advertencia en el navegador. - Para que <ph name="PRODUCT_NAME" /> capture correctamente la nueva huella digital de la contraseña en esta página de cambio de contraseña, la página debe seguir las directrices incluidas en https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Si se habilita esta opción, el servicio de protección de contraseñas enviará a los usuarios a esta URL para que cambien su contraseña después de que se les haya mostrado una advertencia en el navegador. - Si se inhabilita esta opción o no se define, el servicio de protección de contraseñas enviará a los usuarios a la página https://myaccount.google.com para que cambien su contraseña. - Esta política solo está disponible en instancias de Windows que estén vinculadas a un dominio de <ph name="MS_AD_NAME" /> y en instancias de Windows 10 Pro o Enterprise que se hayan registrado para gestionar dispositivos.</translation> <translation id="1456822151187621582">Windows (clientes de <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Controla el comportamiento del usuario en una sesión de varios perfiles en dispositivos <ph name="PRODUCT_OS_NAME" />. @@ -356,6 +350,7 @@ Si se le asigna el valor "False" a la política "EnableMediaRouter", el valor de esta política no tendrá ningún efecto.</translation> <translation id="1509692106376861764">Esta política no está disponible desde la versión 29 de <ph name="PRODUCT_NAME" />.</translation> <translation id="1514888685242892912">Habilitar <ph name="PRODUCT_NAME" /></translation> +<translation id="1515230621229117540">Habilita el menú de accesibilidad flotante</translation> <translation id="1515824657887788963">Permite que las páginas realicen solicitudes XHR síncronas durante el cierre de la página.</translation> <translation id="1522425503138261032">Permitir que los sitios puedan hacer un seguimiento de la ubicación física de los usuarios</translation> <translation id="1523774894176285446">Navegador alternativo donde se abren los sitios web configurados.</translation> @@ -599,12 +594,6 @@ Si se le asigna el valor "False", se inhabilitará el envío de informes sobre métricas y datos de diagnóstico. Si no se configura, se inhabilitarán los informes sobre métricas y datos de diagnóstico en los dispositivos no administrados y se habilitará en los dispositivos administrados.</translation> -<translation id="1907431809333268751">Configura la lista de las URL de acceso de empresa (solo esquemas HTTP y HTTPS). En estas URL se capturará la huella digital de la contraseña, que se utilizará para detectar si se reutiliza la contraseña. - Para que <ph name="PRODUCT_NAME" /> pueda capturar correctamente las huellas digitales de las contraseñas, tus páginas de inicio de sesión deben seguir las directrices incluidas en https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Si se habilita esta opción, el servicio de protección de contraseñas capturará la huella digital de la contraseña en estas URL para detectar si la contraseña se reutiliza. - Si se inhabilita esta opción o no se configura, el servicio de protección de contraseñas solo capturará la huella digital en la página https://accounts.google.com. - Esta política solo está disponible en instancias de Windows que estén vinculadas a un dominio de <ph name="MS_AD_NAME" /> y en instancias de Windows 10 Pro o Enterprise que se hayan registrado para gestionar dispositivos.</translation> <translation id="1910704279188129272">Permite especificar restricciones de uso por aplicación. Se pueden aplicar restricciones de uso a las aplicaciones instaladas en <ph name="PRODUCT_OS_NAME" /> para un usuario determinado. Las restricciones se deben especificar en la lista |app_limits|. Solo se permite una entrada por aplicación. Las aplicaciones no incluidas en la lista no tienen restricciones. @@ -3371,6 +3360,17 @@ Si no se proporciona ningún parámetro, <ph name="PRODUCT_NAME" /> volverá a utilizar un nombre de biblioteca predeterminado.</translation> <translation id="5783009211970309878">Imprimir encabezados y pies de página</translation> +<translation id="5783576706065107606">Permite habilitar las mitigaciones de comprobación de <ph name="CORS" /> en la nueva implementación de <ph name="CORS" />. Así, las extensiones continúan siendo compatibles y <ph name="PRODUCT_NAME" /> puede enviar encabezados definidos sin comprobaciones de <ph name="CORS" />. + + Si esta lista se deja vacía, <ph name="PRODUCT_NAME" /> intentará ejecutar las extensiones de forma compatible y no introducirá cambios de <ph name="API" /> en <ph name="PRODUCT_NAME" /> 79, tal y como se explica en <ph name="WEB_REQUEST_API_MANUAL" />. + + Si la lista se configura para que tenga nombres de encabezado de solicitud <ph name="HTTP" />, la comprobación de <ph name="CORS" /> ignorará los encabezados de la lista y habilitará la mitigación en el caso de las extensiones. + + Si no se establece esta lista, no se aplicará ninguna de las dos mitigaciones explicadas arriba. + + Para consultar más información sobre <ph name="CORS" />, visita <ph name="CORS_HELP_URL" />. + + Ten en cuenta que se anunció que esta política se eliminaría en la versión 82 de <ph name="PRODUCT_NAME" />, pero el plan ha cambiado y se eliminará en la versión 84.</translation> <translation id="5790763087505467169">Reducir las notificaciones de inicio automático de las sesiones de invitado administradas</translation> <translation id="5806128552675651249">Permitir imprimir solo sin gráficos de fondo</translation> <translation id="5809210507920527553">Controla la configuración del contenedor de Linux (Crostini).</translation> @@ -3434,6 +3434,17 @@ Si se inhabilita o no se configura esta opción, se utilizará el nombre de dominio predeterminado de TalkGadget (chromoting-host.talkgadget.google.com) para todos los hosts. La configuración de esta política no afecta a los clientes de acceso remoto, ya que siempre utilizan "chromoting-client.talkgadget.google.com" para acceder a TalkGadget.</translation> +<translation id="5888171512889380367">Permite usar la implementación antigua de <ph name="CORS" /> en vez de la nueva implementación de <ph name="CORS" />. + + Si se asigna el valor True a esta política, se usará la implementación antigua, la cual debería ser compatible con las versiones anteriores. + + Si se le asigna el valor False o no se establece, se usará la nueva implementación, lo que podría causar distintos problemas de compatibilidad según la empresa. + + Esta política se eliminará después de dos hitos. + + Para consultar más información sobre <ph name="CORS" />, visita <ph name="CORS_HELP_URL" />. + + Ten en cuenta que se anunció que esta política se eliminaría en la versión 82 de <ph name="PRODUCT_NAME" />, pero el plan ha cambiado y se eliminará en la versión 84.</translation> <translation id="5893553533827140852">Si esta opción está habilitada, las solicitudes de autenticación gnubby se representarán a través de una conexión de host remota. Si esta opción está inhabilitada o no está configurada, no se representarán solicitudes de autenticación gnubby.</translation> @@ -3723,6 +3734,11 @@ Esta política solo está disponible en instancias de Windows que estén vinculadas a un dominio de <ph name="MS_AD_NAME" /> y en instancias de Windows 10 Pro o Enterprise que se hayan registrado para gestionar dispositivos.</translation> <translation id="6417265370957905582">Asistente de Google</translation> +<translation id="6422575351619065453">En modo kiosco, permite controlar si se muestra el menú de accesibilidad flotante. + + Si se habilita esta política, el menú de accesibilidad flotante se mostrará siempre. + + Si se inhabilita esta política o no se establece, el menú de accesibilidad flotante no se mostrará nunca.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">No puedes forzar a las aplicaciones de Android para que utilicen un proxy. Hay un subconjunto de opciones de proxy disponibles para las aplicaciones de Android y estas pueden aceptarlas voluntariamente: @@ -4040,13 +4056,6 @@ Si no se establece, es posible que se le pida al usuario que haga la importación o que las contraseñas guardadas se importen automáticamente.</translation> <translation id="7003746348783715221">Preferencias de <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Configura el directorio que <ph name="PRODUCT_NAME" /> utilizará para almacenar datos de usuario. - - Si se establece esta política, <ph name="PRODUCT_NAME" /> utilizará el directorio proporcionado, independientemente de que el usuario haya especificado el indicador "--user-data-dir". Para evitar la pérdida de datos u otros errores inesperados, esta política no debe establecerse en el directorio raíz del volumen o en un directorio utilizado para otros fines, ya que <ph name="PRODUCT_NAME" /> administra sus contenidos. - - Para consultar una lista de variables que se pueden utilizar, accede a la página https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables. - - Si no se establece esta política, se utilizará la ruta de perfil predeterminada y el usuario podrá anularla con el indicador de línea de comando "--user-data-dir".</translation> <translation id="7008308728445338159">Comprobaciones de interceptación de DNS habilitadas</translation> <translation id="7027785306666625591">Configura la administración de energía en <ph name="PRODUCT_OS_NAME" />. @@ -4968,7 +4977,6 @@ <translation id="8424255554404582727">Establecer rotación de pantalla predeterminada y volver a aplicarla cada vez que se reinicie el dispositivo</translation> <translation id="8426231401662877819">Rotar la pantalla 90 grados hacia la derecha</translation> <translation id="8433186206711564395">Configuración de red</translation> -<translation id="8433423491036718210">Configura la lista de las URL de acceso empresarial en las que el servicio de protección de contraseña debe capturar la huella digital de la contraseña.</translation> <translation id="8445576299806775661">Después de cada actualización importante de versión, Chrome creará una instantánea de algunos datos de navegación del usuario para usarla en caso de que se realice una restauración de versión de emergencia posteriormente. Si se realiza una restauración de emergencia y se instala una versión de la que el usuario tiene la instantánea correspondiente, se restaurarán los datos de dicha instantánea. Esto permite a los usuarios conservar ajustes como los marcadores y los datos de Autocompletar. Si no se establece esta política, se usará el valor predeterminado, que es "3".
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 7e99b19..676d532 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -299,12 +299,6 @@ <translation id="1427655258943162134">Adresse ou URL du serveur proxy</translation> <translation id="1435659902881071157">Configuration réseau au niveau de l'appareil</translation> <translation id="1438739959477268107">Paramètre de génération de clé par défaut</translation> -<translation id="1455804070656338445">Permet de configurer l'URL de modification de mot de passe (protocoles HTTP et HTTPS uniquement). Le service de protection par mot de passe dirige les utilisateurs vers cette URL afin que ces derniers modifient leur mot de passe après avoir lu l'avertissement affiché dans le navigateur. - Afin que <ph name="PRODUCT_NAME" /> enregistre correctement la nouvelle empreinte numérique du mot de passe sur la page de modification de ce dernier, vérifiez si cette page respecte bien les consignes indiquées à l'adresse https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Si ce paramètre est activé, le service de protection par mot de passe dirige les utilisateurs vers cette URL afin que ces derniers modifient leur mot de passe après avoir lu l'avertissement affiché dans le navigateur. - Si ce paramètre est désactivé ou n'est pas défini, le service de protection par mot de passe dirige les utilisateurs vers la page https://myaccount.google.com afin que ces derniers modifient leur mot de passe. - Cette règle n'est disponible que sur les instances Windows qui sont associées à un domaine <ph name="MS_AD_NAME" />, ou sur les instances Windows 10 Pro ou Windows 10 Entreprise qui sont enregistrées pour bénéficier de la gestion des appareils.</translation> <translation id="1456822151187621582">Windows (clients <ph name="PRODUCT_OS_NAME" />) :</translation> <translation id="1464848559468748897">Contrôle le comportement des utilisateurs dans une session multiprofil sur des appareils <ph name="PRODUCT_OS_NAME" />. @@ -363,6 +357,7 @@ Si la règle "EnableMediaRouter" est définie sur "False", la valeur de la règle "MediaRouterCastAllowAIIIPs" n'a aucune incidence.</translation> <translation id="1509692106376861764">Cette règle a été supprimée à partir de la version 29 de <ph name="PRODUCT_NAME" />.</translation> <translation id="1514888685242892912">Activer <ph name="PRODUCT_NAME" /></translation> +<translation id="1515230621229117540">Permet d'activer le menu d'accessibilité flottant</translation> <translation id="1515824657887788963">Autoriser une page à exécuter des requêtes XHR synchrones pendant sa fermeture.</translation> <translation id="1522425503138261032">Autoriser les sites à suivre la position géographique des utilisateurs</translation> <translation id="1523774894176285446">Navigateur secondaire à lancer pour les sites Web configurés.</translation> @@ -608,12 +603,6 @@ Si elle est définie sur "false", les rapports sur les statistiques et les données de diagnostic ne sont pas envoyés. Si cette règle n'est pas configurée, les rapports sur les statistiques et les données de diagnostic ne sont pas envoyés sur les appareils non gérés, mais sont transmis sur les appareils gérés.</translation> -<translation id="1907431809333268751">Permet de configurer la liste des URL de connexion d'entreprise (protocoles HTTP et HTTPS uniquement). L'empreinte numérique du mot de passe est enregistrée au niveau de ces URL et sert à détecter les mots de passe réutilisés. - Afin que <ph name="PRODUCT_NAME" /> enregistre correctement les empreintes numériques de vos mots de passe, vérifiez que vos pages de connexion respectent bien les consignes indiquées à l'adresse https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Si cette règle est activée, le service de protection par mot de passe enregistre l'empreinte numérique du mot de passe au niveau de ces URL afin de détecter les mots de passe réutilisés. - Si cette règle est désactivée ou n'est pas configurée, le service de protection par mot de passe n'enregistre l'empreinte numérique du mot de passe que sur https://accounts.google.com. - Cette règle n'est disponible que sur les instances Windows qui sont associées à un domaine <ph name="MS_AD_NAME" />, ou sur les instances Windows 10 Pro ou Windows Enterprise qui sont enregistrées pour bénéficier de la gestion des appareils.</translation> <translation id="1910704279188129272">Permet de configurer des restrictions d'utilisation spécifiques pour chaque application. Vous pouvez appliquer des restrictions d'utilisation aux applications installées sur <ph name="PRODUCT_OS_NAME" /> pour l'utilisateur concerné. Les restrictions doivent être saisies dans la liste |app_limits|. Seule une entrée par application est autorisée. Les applications ne figurant pas dans cette liste ne sont pas restreintes. @@ -3366,6 +3355,17 @@ Si vous ne fournissez aucun paramètre, <ph name="PRODUCT_NAME" /> utilisera un nom de bibliothèque par défaut.</translation> <translation id="5783009211970309878">Imprimer les en-têtes et les pieds de page</translation> +<translation id="5783576706065107606">Atténuer les vérifications <ph name="CORS" /> dans la nouvelle mise en œuvre de <ph name="CORS" />, ce qui permet aux extensions de conserver un comportement compatible, et à <ph name="PRODUCT_NAME" /> d'envoyer les en-têtes spécifiés sans vérifications <ph name="CORS" />. + + Si la liste est vide, <ph name="PRODUCT_NAME" /> essaie d'exécuter les extensions de manière compatible, et n'introduit pas de modifications de l'<ph name="API" /> pour <ph name="PRODUCT_NAME" /> 79 (comme indiqué à la page <ph name="WEB_REQUEST_API_MANUAL" />). + + Si la liste contient des en-têtes de requêtes <ph name="HTTP" />, ces en-têtes sont ignorés lors des contrôles <ph name="CORS" />. Les contrôles sont en outre atténués pour les extensions. + + Si cette liste n'est pas configurée, les deux mesures d'atténuation ci-dessous ne sont pas appliquées. + + Pour en savoir plus sur <ph name="CORS" />, consultez la page <ph name="CORS_HELP_URL" />. + + Notez que cette règle était programmée pour être supprimée dans la version 82 de<ph name="PRODUCT_NAME" />, mais que sa suppression a été finalement reportée à la version 84.</translation> <translation id="5790763087505467169">Réduire les notifications de lancement automatique des sessions Invité gérées</translation> <translation id="5806128552675651249">Autoriser l'impression uniquement sans images de fond</translation> <translation id="5809210507920527553">Contrôle les paramètres du conteneur Linux (Crostini).</translation> @@ -3429,6 +3429,17 @@ En cas de désactivation ou de non-configuration de ce paramètre, le nom de domaine TalkGadget par défaut ("chromoting-host.talkgadget.google.com") est utilisé pour tous les hôtes. Les clients d'accès à distance ne sont pas concernés par la configuration de cette règle. Ils utilisent toujours "chromoting-client.talkgadget.google.com" pour accéder à TalkGadget.</translation> +<translation id="5888171512889380367">Permet d'utiliser l'ancienne mise en œuvre de <ph name="CORS" /> plutôt que la nouvelle mise en œuvre de <ph name="CORS" />. + + Si cette règle est définie sur "True", l'ancienne mise en œuvre doit être compatible avec les versions précédentes. + + Si cette règle est définie sur "False" ou si elle n'est pas configurée, la nouvelle mise en œuvre utilisée peut causer des problèmes de compatibilité spécifiques à l'entreprise. + + Cette règle sera supprimée après quelques jalons. + + Pour en savoir plus sur <ph name="CORS" />, consultez la page <ph name="CORS_HELP_URL" />. + + Notez que cette règle était programmée pour être supprimée dans la version 82 de<ph name="PRODUCT_NAME" />, mais que sa suppression a été finalement reportée à la version 84.</translation> <translation id="5893553533827140852">Si ce paramètre est activé, les demandes d'authentification gnubby seront envoyées par un proxy via une connexion hôte à distance. S'il est désactivé ou n'est pas configuré, ces demandes ne seront pas envoyées par un proxy.</translation> @@ -3718,6 +3729,11 @@ Cette règle n'est disponible que sur les instances Windows qui sont associées à un domaine <ph name="MS_AD_NAME" />, ou sur les instances Windows 10 Pro ou Windows Enterprise qui sont enregistrées pour bénéficier de la gestion des appareils.</translation> <translation id="6417265370957905582">Assistant Google</translation> +<translation id="6422575351619065453">En mode Kiosque, cette règle permet de déterminer si le menu d'accessibilité flottant est affiché. + + Si cette règle est activée, le menu d'accessibilité flottant sera toujours affiché. + + Si elle est désactivée ou n'est pas définie, le menu d'accessibilité flottant ne sera jamais affiché.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" /> :</translation> <translation id="6426205278746959912">Vous ne pouvez pas forcer les applications Android à utiliser un proxy. Celles-ci disposent d'un sous-ensemble de paramètres proxy qu'elles peuvent choisir d'utiliser ou non : @@ -4030,13 +4046,6 @@ Si elle n'est pas configurée, l'utilisateur peut être invité à effectuer l'importation, ou celle-ci peut se faire automatiquement.</translation> <translation id="7003746348783715221">Préférences de <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Cette règle permet de configurer le répertoire utilisé par <ph name="PRODUCT_NAME" /> pour le stockage des données de l'utilisateur. - - Si vous définissez cette règle, <ph name="PRODUCT_NAME" /> utilisera le répertoire fourni, que l'utilisateur ait ou non spécifié l'indicateur "--user-data-dir". Pour éviter la perte de données ou d'autres erreurs inattendues, ne définissez pas cette règle sur le répertoire racine d'un volume ni sur un répertoire utilisé à d'autres fins, car <ph name="PRODUCT_NAME" /> pourra gérer son contenu. - - Consultez la page https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables pour obtenir la liste des variables pouvant être utilisées. - - Si cette règle n'est pas définie, le chemin de profil par défaut sera utilisé, et l'utilisateur pourra le remplacer avec l'indicateur de ligne de commande "--user-data-dir".</translation> <translation id="7008308728445338159">Contrôles d'interception des requêtes DNS activés</translation> <translation id="7027785306666625591">Configurer la gestion de l'alimentation dans <ph name="PRODUCT_OS_NAME" /> @@ -4959,7 +4968,6 @@ <translation id="8424255554404582727">Définir la rotation de l'écran par défaut (réappliquée à chaque redémarrage)</translation> <translation id="8426231401662877819">Faire pivoter l'écran vers la droite de 90 degrés</translation> <translation id="8433186206711564395">Paramètres réseau</translation> -<translation id="8433423491036718210">Configurez la liste des URL de connexion d'entreprise pour lesquelles le service de protection par mot de passe doit capturer l'empreinte numérique du mot de passe.</translation> <translation id="8445576299806775661">Après chaque mise à jour de version majeure, Chrome crée un instantané de certaines portions des données de navigation de l'utilisateur en prévision d'un éventuel rollback de version d'urgence. Si un rollback d'urgence a lieu et que Chrome dispose de l'instantané correspondant, les données de cet instantané sont restaurées. L'utilisateur récupérera ainsi ses favoris et ses données de saisie automatique, entre autres. Si la règle n'est pas définie, la valeur par défaut 3 est utilisée.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 141c383..57b898d 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -285,12 +285,6 @@ <translation id="1427655258943162134">Alamat atau URL server proxy</translation> <translation id="1435659902881071157">Konfigurasi jaringan tingkat perangkat</translation> <translation id="1438739959477268107">Setelan pembuatan kunci default</translation> -<translation id="1455804070656338445">Mengonfigurasi URL ubah sandi (khusus skema HTTP dan HTTPS). Layanan perlindungan sandi akan mengarahkan pengguna ke URL ini untuk mengubah sandinya setelah melihat peringatan di browser. - Agar <ph name="PRODUCT_NAME" /> dapat mengambil sidik jari sandi baru di halaman ubah sandi dengan benar, harap pastikan halaman ubah sandi Anda mengikuti pedoman di https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Jika setelan ini diaktifkan, layanan perlindungan sandi akan mengarahkan pengguna ke URL ini untuk mengubah sandinya setelah melihat peringatan di browser. - Jika setelan ini dinonaktifkan atau tidak disetel, layanan perlindungan sandi akan mengarahkan pengguna ke https://myaccount.google.com untuk mengubah sandinya. - Kebijakan ini hanya tersedia pada instance Windows yang dihubungkan ke domain <ph name="MS_AD_NAME" />, atau instance Windows 10 Pro atau Enterprise yang terdaftar untuk pengelolaan perangkat.</translation> <translation id="1456822151187621582">Windows (klien <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Mengontrol perilaku pengguna di sesi multi profil di perangkat <ph name="PRODUCT_OS_NAME" />. @@ -348,6 +342,7 @@ Jika kebijakan "EnableMediaRouter" disetel ke false, nilai kebijakan ini tidak akan berpengaruh.</translation> <translation id="1509692106376861764">Kebijakan ini tidak lagi digunakan mulai <ph name="PRODUCT_NAME" /> versi 29.</translation> <translation id="1514888685242892912">Aktifkan <ph name="PRODUCT_NAME" /></translation> +<translation id="1515230621229117540">Mengaktifkan menu aksesibilitas mengambang</translation> <translation id="1515824657887788963">Mengizinkan halaman untuk melakukan permintaan XHR sinkron saat menutup halaman.</translation> <translation id="1522425503138261032">Izinkan situs melacak lokasi fisik pengguna</translation> <translation id="1523774894176285446">Browser alternatif untuk membuka situs yang dikonfigurasi.</translation> @@ -586,12 +581,6 @@ Jika disetel ke false, pelaporan metrik dan data diagnostik akan dinonaktifkan. Jika tidak dikonfigurasi, pelaporan metrik dan data diagnostik akan dinonaktifkan di perangkat yang tidak dikelola dan diaktifkan di perangkat yang dikelola.</translation> -<translation id="1907431809333268751">Mengonfigurasi daftar URL login perusahaan (khusus skema HTTP dan HTTPS). Sidik jari sandi akan diambil di URL tersebut dan digunakan untuk mendeteksi penggunaan ulang sandi. - Agar <ph name="PRODUCT_NAME" /> dapat mengambil sidik jari sandi dengan benar, pastikan halaman login Anda mengikuti pedoman di https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Jika setelan ini diaktifkan, layanan perlindungan sandi akan mengambil sidik jari sandi di URL tersebut untuk tujuan deteksi penggunaan ulang sandi. - Jika setelan ini dinonaktifkan atau tidak disetel, layanan perlindungan sandi hanya akan mengambil sidik jari sandi di https://accounts.google.com. - Kebijakan ini hanya tersedia pada instance Windows yang dihubungkan ke domain <ph name="MS_AD_NAME" />, atau instance Windows 10 Pro atau Enterprise yang terdaftar untuk pengelolaan perangkat.</translation> <translation id="1910704279188129272">Memungkinkan untuk menetapkan pembatasan penggunaan per aplikasi. Pembatasan penggunaan dapat diterapkan ke aplikasi yang diinstal di <ph name="PRODUCT_OS_NAME" /> untuk pengguna tertentu. Pembatasan harus dimasukkan dalam daftar |app_limits|. Hanya diperbolehkan satu entri per aplikasi. Aplikasi yang tidak dimasukkan dalam daftar ini tidak dikenakan pembatasan. @@ -3295,6 +3284,17 @@ Jika tidak ada setelan yang diberikan, <ph name="PRODUCT_NAME" /> akan kembali menggunakan nama pustaka default.</translation> <translation id="5783009211970309878">Cetak Header dan Footer</translation> +<translation id="5783576706065107606">Mengaktifkan mitigasi pemeriksaan <ph name="CORS" /> dalam implementasi <ph name="CORS" /> baru, sehingga memungkinkan Ekstensi tetap kompatibel dan mengizinkan <ph name="PRODUCT_NAME" /> mengirim header tertentu tanpa pemeriksaan <ph name="CORS" />. + + Jika daftar ini dibiarkan kosong, <ph name="PRODUCT_NAME" /> akan mencoba menjalankan Ekstensi secara kompatibel, dan tidak menerapkan perubahan <ph name="API" /> untuk <ph name="PRODUCT_NAME" /> versi 79 seperti yang dijelaskan dalam <ph name="WEB_REQUEST_API_MANUAL" />. + + Jika daftar ini ditetapkan untuk memiliki nama header permintaan <ph name="HTTP" />, pemeriksaan <ph name="CORS" /> akan mengabaikan header yang tercantum dan mengaktifkan mitigasi untuk Ekstensi. + + Jika daftar ini tidak ditetapkan, kedua mitigasi yang dijelaskan di atas tidak akan diterapkan. + + Untuk mengetahui detail <ph name="CORS" />, buka: <ph name="CORS_HELP_URL" />. + + Perlu diketahui bahwa kebijakan ini diumumkan akan dihapus di <ph name="PRODUCT_NAME" /> versi 82, tetapi rencananya berubah dan akan dihapus di versi 84.</translation> <translation id="5790763087505467169">Mengurangi Notifikasi otomatis untuk sesi tamu terkelola</translation> <translation id="5806128552675651249">Izinkan pencetakan hanya tanpa grafis latar belakang</translation> <translation id="5809210507920527553">Mengontrol setelan untuk container Linux (Crostini).</translation> @@ -3358,6 +3358,17 @@ Jika setelan ini dinonaktifkan atau tidak disetel, maka nama domain TalkGadget default ('chromoting-host.talkgadget.google.com') akan digunakan untuk semua hosting. Klien akses jarak jauh tidak dipengaruhi oleh setelan kebijakan ini. Klien akses jarak jauh akan selalu menggunakan 'chromoting-client.talkgadget.google.com' untuk mengakses TalkGadget.</translation> +<translation id="5888171512889380367">Menggunakan implementasi <ph name="CORS" /> lama, bukan <ph name="CORS" /> baru. + + Jika setelan ini ditetapkan ke Benar, implementasi lama akan digunakan, yang seharusnya kompatibel dengan versi sebelumnya. + + Jika setelan ini ditetapkan ke Salah atau tidak ditetapkan, implementasi baru akan digunakan, yang dapat menyebabkan potensi masalah kompatibilitas khusus perusahaan. + + Kebijakan ini akan dihapus setelah beberapa versi. + + Untuk mengetahui detail <ph name="CORS" />, buka: <ph name="CORS_HELP_URL" />. + + Perlu diketahui bahwa kebijakan ini diumumkan akan dihapus di <ph name="PRODUCT_NAME" /> versi 82, tetapi rencananya berubah dan akan dihapus di versi 84.</translation> <translation id="5893553533827140852">Jika setelan ini diaktifkan, permintaan autentikasi gnubby akan dilakukan melalui proxy lewat sambungan hosting jarak jauh. Jika setelan ini dinonaktifkan atau tidak dikonfigurasi, permintaan autentikasi gnubby tidak akan dilakukan melalui proxy.</translation> @@ -3622,6 +3633,11 @@ Kebijakan ini hanya tersedia pada instance Windows yang dihubungkan ke domain <ph name="MS_AD_NAME" />, atau instance Windows 10 Pro atau Enterprise yang terdaftar untuk pengelolaan perangkat.</translation> <translation id="6417265370957905582">Asisten Google</translation> +<translation id="6422575351619065453">Dalam mode kios, kebijakan akan mengontrol apakah menu aksesibilitas mengambang akan ditampilkan. + + Jika kebijakan ini ditetapkan ke aktif, menu aksesibilitas mengambang akan selalu ditampilkan. + + Jika kebijakan ini ditetapkan ke nonaktif atau tidak ditetapkan, menu aksesibilitas mengambang tidak akan ditampilkan.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">Anda tidak dapat memaksa aplikasi Android untuk menggunakan proxy. Bagian setelan proxy disediakan untuk aplikasi Android, yang dapat dipilih untuk dipatuhi secara sukarela: @@ -3933,13 +3949,6 @@ Jika 'U2F_EXTENDED' dipilih, faktor kedua yang diintegrasikan akan memberikan fungsi U2F, ditambah beberapa ekstensi untuk masing-masing pengesahan.</translation> <translation id="7003334574344702284">Kebijakan ini memaksa sandi tersimpan untuk diimpor dari browser default sebelumnya, jika diaktifkan. Jika diaktifkan, kebijakan ini juga memengaruhi dialog impor. Jika dinonaktifkan, sandi yang disimpan tidak diimpor. Jika tidak disetel, pengguna mungkin ditanya apakah akan mengimpor, atau pengimporan dapat terjadi secara otomatis.</translation> <translation id="7003746348783715221">Preferensi <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Mengonfigurasi direktori yang akan digunakan oleh <ph name="PRODUCT_NAME" /> untuk menyimpan data pengguna. - - Jika Anda menyetel kebijakan ini, <ph name="PRODUCT_NAME" /> akan menggunakan direktori yang diberikan, terlepas apakah pengguna sudah menentukan tanda '--user-data-dir' atau belum. Untuk menghindari kehilangan data atau kesalahan tak terduga lain, kebijakan ini sebaiknya tidak disetel ke direktori akar volume atau ke direktori yang digunakan untuk tujuan lain, karena <ph name="PRODUCT_NAME" /> mengelola kontennya. - - Lihat https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables untuk mengetahui daftar variabel yang dapat digunakan. - - Jika kebijakan ini tidak disetel, jalur profil default akan digunakan dan pengguna dapat menggantinya dengan tanda baris perintah '--user-data-dir'.</translation> <translation id="7008308728445338159">Pemeriksaan intersepsi DNS diaktifkan</translation> <translation id="7027785306666625591">Mengonfigurasi pengelolaan daya di <ph name="PRODUCT_OS_NAME" />. @@ -4838,7 +4847,6 @@ <translation id="8424255554404582727">Setel pemutaran layar default, diterapkan kembali setiap kali melakukan boot ulang</translation> <translation id="8426231401662877819">Putar layar searah jarum jam sebesar 90 derajat</translation> <translation id="8433186206711564395">Setelan jaringan</translation> -<translation id="8433423491036718210">Konfigurasikan daftar URL login perusahaan ketika layanan perlindungan sandi harus menangkap sidik jari sandi.</translation> <translation id="8445576299806775661">Setelah masing-masing update versi utama, Chrome akan membuat rekaman bagian tertentu dari data penjelajahan pengguna untuk digunakan ketika terjadi rollback versi darurat nantinya. Jika rollback darurat dilakukan ke versi yang rekaman terkaitnya dimiliki pengguna, data di rekaman tersebut akan dipulihkan. Ini memungkinkan pengguna mempertahankan setelan seperti bookmark dan data isi otomatis. Jika kebijakan ini tidak ditetapkan, nilai default 3 akan digunakan
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 3d9d634..e4a4274 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -285,12 +285,6 @@ <translation id="1427655258943162134">Indirizzo o URL del server proxy</translation> <translation id="1435659902881071157">Configurazione di rete a livello di dispositivo</translation> <translation id="1438739959477268107">Impostazione generazione di chiavi predefinite</translation> -<translation id="1455804070656338445">Consente di configurare l'URL di modifica della password (solo schemi HTTP e HTTPS). Il servizio di protezione tramite password indirizzerà gli utenti a questo URL dopo la visualizzazione di un avviso nel browser per modificare la loro password. - Per consentire a <ph name="PRODUCT_NAME" /> di acquisire correttamente l'impronta digitale della nuova password in questa pagina di modifica della password, assicurati che tale pagina rispetti le linee guida disponibili all'indirizzo https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Se questa impostazione è attiva, il servizio di protezione tramite password indirizza gli utenti a questo URL per modificare la password, dopo la visualizzazione di un avviso nel browser. - Se questa impostazione è disattivata o non configurata, il servizio di protezione tramite password indirizzerà gli utenti alla pagina https://myaccount.google.com per modificare la loro password. - 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.</translation> <translation id="1456822151187621582">Windows (client <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Consente di controllare il comportamento degli utenti in una sessione multiprofilo su dispositivi <ph name="PRODUCT_OS_NAME" />. @@ -348,6 +342,7 @@ Se la norma "EnableMediaRouter" è impostata su False, allora il valore di questa norma non produrrà alcun effetto.</translation> <translation id="1509692106376861764">Questa norma non è più supportata a partire dalla versione 29 di <ph name="PRODUCT_NAME" />.</translation> <translation id="1514888685242892912">Attiva <ph name="PRODUCT_NAME" /></translation> +<translation id="1515230621229117540">Attiva il menu Accessibilità mobile</translation> <translation id="1515824657887788963">Consenti a una pagina di fare richieste XHR sincrone durante l'uscita dalla pagina</translation> <translation id="1522425503138261032">Consenti ai siti di monitorare la posizione fisica degli utenti</translation> <translation id="1523774894176285446">Browser alternativo da aprire per i siti web configurati.</translation> @@ -574,12 +569,6 @@ Se viene impostata su false, i rapporti sulle metriche e sui dati diagnostici verranno disattivati. Se non viene configurata, i rapporti sulle metriche e sui dati diagnostici verranno disattivati sui dispositivi non gestiti e attivati sui dispositivi gestiti.</translation> -<translation id="1907431809333268751">Consente di configurare l'elenco di URL di accesso aziendale (solo schemi HTTP e HTTPS). L'impronta digitale della password sarà acquisita su questi URL e utilizzata successivamente per il rilevamento del riutilizzo della password. - Affinché <ph name="PRODUCT_NAME" /> possa acquisire correttamente le impronte digitali delle password, assicurati che le pagine di accesso rispettino le linee guida all'indirizzo https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Se questa impostazione è attiva, il servizio di protezione tramite password acquisisce l'impronta della password su questi URL ai fini del rilevamento del riutilizzo della password. - Se questa impostazione è disattivata o non configurata, il servizio di protezione tramite password acquisirà l'impronta della password solo all'indirizzo https://accounts.google.com. - Questa norma è 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.</translation> <translation id="1910704279188129272">Consente di impostare limiti di utilizzo per app. I limiti di utilizzo possono essere applicati alle app installate su <ph name="PRODUCT_OS_NAME" /> per l'utente in questione. I limiti devono essere impostati tramite un elenco |app_limits|. È consentita una sola voce per app. Le app non incluse nell'elenco non hanno limiti. @@ -3256,6 +3245,17 @@ Se non viene fornita alcuna impostazione, <ph name="PRODUCT_NAME" /> dovrà ricorrere a un nome di libreria predefinito.</translation> <translation id="5783009211970309878">Stampa intestazioni e piè di pagina</translation> +<translation id="5783576706065107606">Consente di attivare le mitigazioni dei controlli <ph name="CORS" /> nella nuova implementazione <ph name="CORS" />, consentendo alle estensioni di mantenere un comportamento compatibile e a <ph name="PRODUCT_NAME" /> di inviare le intestazioni specificate senza controlli <ph name="CORS" />. + + Se questo elenco viene lasciato vuoto, <ph name="PRODUCT_NAME" /> prova a eseguire le estensioni in modalità compatibili e non introduce modifiche <ph name="API" /> per la versione 79 di <ph name="PRODUCT_NAME" />, come spiegato all'indirizzo <ph name="WEB_REQUEST_API_MANUAL" />. + + Se per questo elenco vengono impostati nomi di intestazioni di richieste <ph name="HTTP" />, il controllo <ph name="CORS" /> ignorerà le intestazioni elencate e attiverà la mitigazione per le estensioni. + + Se questo elenco non viene impostato, entrambe le mitigazioni spiegate sopra non vengono applicate. + + Per informazioni dettagliate su <ph name="CORS" />, visita la pagina <ph name="CORS_HELP_URL" />. + + Tieni presente che, nonostante sia stato annunciato che questo criterio sarebbe stato rimosso nella versione 82 di <ph name="PRODUCT_NAME" />, le cose sono cambiate e verrà rimosso nella versione 84.</translation> <translation id="5790763087505467169">Riduci notifiche sull'avvio automatico della sessione Ospite gestita</translation> <translation id="5806128552675651249">Consenti solo la stampa senza immagini di sfondo</translation> <translation id="5809210507920527553">Consente di gestire le impostazioni relative al container Linux (Crostini).</translation> @@ -3319,6 +3319,17 @@ Se questa impostazione è disabilitata o non è impostata, verrà utilizzato il nome di dominio predefinito di TalkGadget ("chromoting-host.talkgadget.google.com") per tutti gli host. I client di accesso remoto non sono interessati da questa impostazione e utilizzeranno sempre "chromoting-client.talkgadget.google.com" per accedere a TalkGadget.</translation> +<translation id="5888171512889380367">Consente di usare l'implementazione <ph name="CORS" /> legacy anziché la nuova implementazione <ph name="CORS" />. + + Se questo criterio è impostato su vero, viene usata l'implementazione legacy, che dovrebbe essere compatibile con le versioni precedenti. + + Se questo criterio è impostato su falso o non è impostato, viene usata la nuova implementazione, che potrebbe causare problemi di compatibilità per le aziende. + + Questo criterio verrà rimosso dopo un paio di aggiornamenti. + + Per informazioni dettagliate su <ph name="CORS" />, visita la pagina <ph name="CORS_HELP_URL" />. + + Tieni presente che, nonostante sia stato annunciato che questo criterio sarebbe stato rimosso nella versione 82 di <ph name="PRODUCT_NAME" />, le cose sono cambiate e verrà rimosso nella versione 84.</translation> <translation id="5893553533827140852">Se questa impostazione è attivata, le richieste di autenticazione Gnubby verranno trasferite al proxy attraverso una connessione host remota. Se questa impostazione è disattivata o non configurata, le richieste di autenticazione Gnubby non verranno trasferite al proxy.</translation> @@ -3600,6 +3611,11 @@ Questa norma è 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.</translation> <translation id="6417265370957905582">Assistente Google</translation> +<translation id="6422575351619065453">In modalità kiosk, consente di controllare se visualizzare o meno il menu Accessibilità mobile. + + Se il criterio è abilitato, il menu Accessibilità mobile verrà mostrato sempre. + + Se il criterio è disattivato o non è impostato, il menu Accessibilità mobile non verrà mai mostrato.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">Non è possibile imporre l'utilizzo di un proxy alle app Android. Viene messo a disposizione un sottoinsieme di impostazioni proxy che le app Android possono decidere se rispettare o meno. @@ -3912,13 +3928,6 @@ Se selezioni l'opzione "U2F_EXTENDED", l'autenticazione a due fattori integrata fornirà le funzioni U2F più alcune estensioni per la singola attestazione.</translation> <translation id="7003334574344702284">Se è attiva, questa norma impone l'importazione delle password salvate dal browser predefinito precedente. Se la norma è attiva incide anche sulla finestra di dialogo di importazione. Se non è attiva, le password salvate non vengono importate. Se non viene impostata, all'utente potrebbe essere chiesto se desidera effettuare l'importazione, oppure l'importazione potrebbe avvenire automaticamente.</translation> <translation id="7003746348783715221">Preferenze di <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Consente di configurare la directory che <ph name="PRODUCT_NAME" /> utilizza per memorizzare i dati utente. - - Se la norma viene impostata, <ph name="PRODUCT_NAME" /> utilizza la directory fornita, indipendentemente dal fatto che l'utente abbia specificato o meno il flag "--user-data-dir". Per evitare perdite di dati o altri errori imprevisti, la norma non deve essere impostata su una directory radice del volume o su una directory utilizzata per altri scopi, poiché <ph name="PRODUCT_NAME" /> gestisce i relativi contenuti. - - Vai alla pagina https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables per consultare un elenco delle variabili che possono essere utilizzate. - - Se la norma non viene impostata, viene utilizzato il percorso profilo predefinito e l'utente può ignorarla con il flag della riga di comando "--user-data-dir".</translation> <translation id="7008308728445338159">Controlli intercettazione DNS attivi</translation> <translation id="7027785306666625591">Configura la gestione dell'alimentazione in <ph name="PRODUCT_OS_NAME" />. @@ -4822,7 +4831,6 @@ <translation id="8424255554404582727">Imposta la rotazione predefinita dello schermo, riapplicata a ogni riavvio</translation> <translation id="8426231401662877819">Ruota lo schermo in senso orario di 90°</translation> <translation id="8433186206711564395">Impostazioni di rete</translation> -<translation id="8433423491036718210">Configura l'elenco di URL di accesso aziendale in cui il servizio di protezione tramite password deve acquisire l'impronta della password.</translation> <translation id="8445576299806775661">Dopo ogni importante aggiornamento della versione, Chrome crea un'istantanea di alcune parti dei dati di navigazione dell'utente da usare in caso di un successivo rollback di versione di emergenza. Se viene eseguito un rollback di emergenza a una versione di cui l'utente ha un'istantanea corrispondente, vengono ripristinati i dati nell'istantanea. In questo modo gli utenti possono mantenere impostazioni quali preferiti e dati di compilazione automatica. Se questo criterio non viene impostato, viene usato il valore predefinito 3.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 6fd58f2..8f31faf 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -297,12 +297,6 @@ <translation id="1427655258943162134">プロキシ サーバーのアドレスまたは URL</translation> <translation id="1435659902881071157">デバイス レベルのネットワーク設定</translation> <translation id="1438739959477268107">デフォルトのキー生成設定</translation> -<translation id="1455804070656338445">パスワード変更用の URL を設定します(HTTP と HTTPS スキームのみ)。ブラウザで警告が表示された後、ユーザーはパスワード保護サービスによってこの URL にリダイレクトされ、パスワードの変更を促されます。 - このパスワード変更ページで、新しい指紋によるパスワード認証が <ph name="PRODUCT_NAME" /> で正しく処理されるようにするには、パスワード変更ページが https://www.chromium.org/developers/design-documents/create-amazing-password-forms のガイドラインに沿っていることを確認してください。 - - この設定が有効な場合、ブラウザで警告が表示された後、ユーザーはパスワード保護サービスによってこの URL にリダイレクトされ、パスワードの変更を促されます。 - この設定が無効または未設定の場合、ユーザーはパスワード保護サービスによって https://myaccount.google.com にリダイレクトされ、パスワードの変更を促されます。 - このポリシーは、<ph name="MS_AD_NAME" /> ドメインに追加した Windows インスタンス、またはデバイスの管理対象として登録した Windows 10 Pro あるいは Enterprise インスタンスでのみ使用できます。</translation> <translation id="1456822151187621582">Windows(<ph name="PRODUCT_OS_NAME" /> クライアント):</translation> <translation id="1464848559468748897"><ph name="PRODUCT_OS_NAME" /> デバイス上のマルチプロフィール セッションでのユーザーの行動を制御します。 @@ -362,6 +356,7 @@ EnableMediaRouter ポリシーが false に設定されている場合、このポリシーの値は適用されません。</translation> <translation id="1509692106376861764">このポリシーは <ph name="PRODUCT_NAME" /> バージョン 29 で廃止されました。</translation> <translation id="1514888685242892912"><ph name="PRODUCT_NAME" /> を有効にする</translation> +<translation id="1515230621229117540">フローティング ユーザー補助機能メニューを有効にする</translation> <translation id="1515824657887788963">ページ終了中の同期 XHR リクエストの送信をページに許可する。</translation> <translation id="1522425503138261032">サイトに対してユーザーの物理的な現在地の追跡を許可する</translation> <translation id="1523774894176285446">設定したウェブサイトに対して起動する代替ブラウザ。</translation> @@ -595,12 +590,6 @@ このポリシーが false に設定されている場合、統計情報と診断データは送信されません。 このポリシーが未設定の場合、管理対象ではないデバイスでは統計情報と診断データは送信されません。管理対象のデバイスでは統計情報と診断データが送信されます。</translation> -<translation id="1907431809333268751">企業のログイン URL のリストを設定します(HTTP と HTTPS スキームのみ)。これらの URL では指紋によるパスワード認証が行われ、パスワードの再利用の検出に使用されます。 - 指紋によるパスワード認証が <ph name="PRODUCT_NAME" /> で正しく処理されるようにするには、ログインページが https://www.chromium.org/developers/design-documents/create-amazing-password-forms のガイドラインに沿っていることを確認してください。 - - この設定が有効な場合、リストにある URL では、パスワードの再利用を検出するために、パスワード保護サービスによる指紋パスワード認証が行われます。 - この設定が無効または未設定の場合、パスワード保護サービスでは https://accounts.google.com においてのみ、指紋によるパスワード認証を行います。 - このポリシーは、<ph name="MS_AD_NAME" /> ドメインに追加した Windows インスタンス、またはデバイスの管理対象として登録した Windows 10 Pro あるいは Enterprise インスタンスでのみ使用できます。</translation> <translation id="1910704279188129272">アプリごとの使用制限を設定できます。 使用制限は、ある 1 人のユーザーが <ph name="PRODUCT_OS_NAME" /> にインストールするアプリに対して適用できます。 制限は |app_limits| リストで渡します。アプリにつき 1 エントリのみの指定が可能で、リストにないアプリには制限は課されません。 @@ -3277,6 +3266,17 @@ 何も指定しないと、<ph name="PRODUCT_NAME" /> ではデフォルトのライブラリ名が使用されます。</translation> <translation id="5783009211970309878">ヘッダーとフッターを印刷</translation> +<translation id="5783576706065107606">新しい <ph name="CORS" /> の実装で <ph name="CORS" /> チェックの緩和措置を有効にして、拡張機能の互換性のある動作が保たれるように、また <ph name="PRODUCT_NAME" /> で <ph name="CORS" /> チェックなしに指定ヘッダーが送信されるようにします。 + + このリストを空に設定した場合、<ph name="PRODUCT_NAME" /> では拡張機能が互換性を保つように実行され、<ph name="PRODUCT_NAME" /> 79 での <ph name="API" /> の変更(<ph name="WEB_REQUEST_API_MANUAL" /> を参照)は適用されません。 + + このリストを <ph name="HTTP" /> リクエスト ヘッダー名を含めて設定した場合は、拡張機能向けの緩和措置が有効になることに加えて、リストにあるヘッダーが <ph name="CORS" /> チェックで無視されます。 + + このリストを設定しない場合、上記の緩和措置はいずれも適用されません。 + + <ph name="CORS" /> の詳細については、<ph name="CORS_HELP_URL" /> をご覧ください。 + + なお、このポリシーは <ph name="PRODUCT_NAME" /> バージョン 82 で削除されるとお伝えしましたが、予定が変更され、バージョン 84 で削除されることになりました。</translation> <translation id="5790763087505467169">管理対象のゲスト セッションの自動起動通知を減らす</translation> <translation id="5806128552675651249">背景のグラフィックなしの印刷のみを許可する</translation> <translation id="5809210507920527553">Linux コンテナ(Crostini)の設定を制御します。</translation> @@ -3340,6 +3340,17 @@ この設定を無効にするか、未設定にする場合、デフォルトの TalkGadget ドメイン名(「chromoting-host.talkgadget.google.com」)がすべてのホストで使用されます。 リモート アクセス クライアントが、このポリシーの設定によって影響を受けることはありません。TalkGadget へのアクセスには常に「chromoting-client.talkgadget.google.com」を使用します。</translation> +<translation id="5888171512889380367">新しい <ph name="CORS" /> の実装ではなく以前の <ph name="CORS" /> の実装を使用します。 + + True に設定した場合は、以前のバージョンと互換性のある以前の実装が使用されます。 + + False または未設定のままにした場合は新しい実装が使用されますが、互換性に関する企業特有の問題が発生する可能性があります。 + + このポリシーは数回のマイルストーンを経て削除される予定です。 + + <ph name="CORS" /> の詳細については、<ph name="CORS_HELP_URL" /> をご覧ください。 + + なお、このポリシーは <ph name="PRODUCT_NAME" /> バージョン 82 で削除されるとお伝えしましたが、予定が変更され、バージョン 84 で削除されることになりました。</translation> <translation id="5893553533827140852">この設定が有効になっている場合、gnubby 認証リクエストはリモート ホスト接続でプロキシ送信されます。 この設定が無効になっているか設定されていない場合、gnubby 認証リクエストはプロキシ送信されません。</translation> @@ -3624,6 +3635,11 @@ このポリシーは、<ph name="MS_AD_NAME" /> ドメインに追加した Windows インスタンス、またはデバイスの管理対象として登録した Windows 10 Pro あるいは Enterprise インスタンスでのみ使用できます。</translation> <translation id="6417265370957905582">Google アシスタント</translation> +<translation id="6422575351619065453">キオスクモードでフローティング ユーザー補助機能メニューを表示するかどうかを管理します。 + + このポリシーを有効に設定した場合、フローティング ユーザー補助機能メニューは常に表示されます。 + + このポリシーを無効に設定するか未設定のままにした場合、フローティング ユーザー補助機能メニューは常に非表示となります。</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">Android アプリにプロキシの使用を強制することはできません。一部のプロキシ設定は Android アプリで使用可能ですが、使用するかどうかは Android アプリ側の選択となります。 @@ -3936,13 +3952,6 @@ [U2F_EXTENDED] を選択した場合は、統合 2 段階認証プロセスで U2F の機能と個人認証用の拡張機能を使用できます。</translation> <translation id="7003334574344702284">このポリシーを有効にすると、以前の既定のブラウザで保存されたパスワードがインポートされます。有効にすると、このポリシーはインポート ダイアログにも影響します。無効にすると、保存されたパスワードはインポートされません。このポリシーが未設定の場合、インポートするかどうかをユーザーに尋ねるか、自動的にインポートされます。</translation> <translation id="7003746348783715221"><ph name="PRODUCT_NAME" /> の設定</translation> -<translation id="7007671350884342624"><ph name="PRODUCT_NAME" /> でユーザーデータを保存する際に使用するディレクトリを設定します。 - - このポリシーを設定した場合、<ph name="PRODUCT_NAME" /> では指定されたディレクトリを使用し、ユーザーが「--user-data-dir」フラグを指定しているかどうかは無視されます。データの消失やその他の予期しないエラーを避けるため、ボリュームのルート ディレクトリや他の用途で使用されているディレクトリは指定しないでください。これは、<ph name="PRODUCT_NAME" /> によってディレクトリのコンテンツが管理されるためです。 - - 使用できる変数のリストについては、https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables をご覧ください。 - - このポリシーが未設定の場合は、デフォルトのプロフィール パスを使用します。ユーザーは「--user-data-dir」コマンドライン フラグを使用して、この設定をオーバーライドできます。</translation> <translation id="7008308728445338159">DNS 傍受チェックを有効にする</translation> <translation id="7027785306666625591"><ph name="PRODUCT_OS_NAME" /> の電源管理を設定します。 @@ -4835,7 +4844,6 @@ <translation id="8424255554404582727">再起動のたびにデフォルトのディスプレイ回転方法を再適用する</translation> <translation id="8426231401662877819">画面を時計回りに 90 度回転</translation> <translation id="8433186206711564395">ネットワーク設定</translation> -<translation id="8433423491036718210">パスワード保護サービスでパスワードとして指紋による認証を行う対象となる、企業のログイン URL のリストを設定します。</translation> <translation id="8445576299806775661">Chrome ではバージョンのメジャー アップデートのたびに、後から緊急のバージョン ロールバックが必要となった場合に備えて、ユーザーの閲覧データの特定部分のスナップショットを作成します。緊急のロールバックが実行され、対応するスナップショットが存在するバージョンに戻された場合は、スナップショットのデータが復元されます。これにより、ブックマークや自動入力データなどの設定が失われないように保護できます。 このポリシーを設定しない場合は、デフォルト値の 3 が使用されます。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index ce52522..668555c 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -299,12 +299,6 @@ <translation id="1427655258943162134">프록시 서버의 주소 또는 URL</translation> <translation id="1435659902881071157">기기 수준 네트워크 설정</translation> <translation id="1438739959477268107">기본 키 생성 설정</translation> -<translation id="1455804070656338445">비밀번호 변경 URL(HTTP 및 HTTPS 체계만 해당)을 구성합니다. 브라우저에 경고가 표시된 후 사용자가 비밀번호를 변경하도록 비밀번호 보호 서비스에서 사용자를 이 URL로 안내합니다. - <ph name="PRODUCT_NAME" />이(가) 비밀번호 변경 페이지에서 새로운 비밀번호 지문을 제대로 캡처하게 하려면 비밀번호 변경 페이지가 다음 페이지의 가이드라인을 준수하는지 확인하세요. https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - 설정이 사용되면 브라우저에 경고가 표시된 후 사용자가 비밀번호를 변경하도록 비밀번호 보호 서비스에서 사용자를 이 URL로 안내합니다. - 설정이 사용 중지되거나 설정되지 않으면 사용자가 비밀번호를 변경하도록 비밀번호 보호 서비스에서 사용자를 https://myaccount.google.com 페이지로 안내합니다. - 이 정책은 <ph name="MS_AD_NAME" /> 도메인에 연결된 Windows 인스턴스 또는 기기 관리에 등록된 Windows 10 Pro/Enterprise 인스턴스에서만 사용할 수 있습니다.</translation> <translation id="1456822151187621582">Windows(<ph name="PRODUCT_OS_NAME" /> 클라이언트):</translation> <translation id="1464848559468748897"><ph name="PRODUCT_OS_NAME" /> 기기에서 멀티프로필 세션의 사용자 동작을 제어합니다. @@ -362,6 +356,7 @@ 'EnableMediaRouter' 정책이 False로 설정된 경우 이 정책의 값은 아무런 영향을 미치지 않습니다.</translation> <translation id="1509692106376861764">이 정책은 <ph name="PRODUCT_NAME" /> 버전 29를 기준으로 지원 중단되었습니다.</translation> <translation id="1514888685242892912"><ph name="PRODUCT_NAME" /> 사용</translation> +<translation id="1515230621229117540">플로팅 접근성 메뉴를 사용 설정합니다.</translation> <translation id="1515824657887788963">페이지를 닫는 중에 페이지에서 동기 XHR 요청을 실행하도록 허용합니다.</translation> <translation id="1522425503138261032">사이트에서 사용자 실제 위치를 추적하도록 허용</translation> <translation id="1523774894176285446">구성된 웹사이트를 실행하기 위한 대체 브라우저입니다.</translation> @@ -602,12 +597,6 @@ false로 설정하면 통계 및 진단 데이터 보고가 사용 중지됩니다. 설정하지 않으면 관리되지 않는 기기에서는 통계 및 진단 데이터 보고가 사용 중지되고 관리 기기에서는 사용 설정됩니다.</translation> -<translation id="1907431809333268751">엔터프라이즈 로그인 URL(HTTP 및 HTTPS 체계만 해당) 목록을 구성합니다. 이러한 URL에서 비밀번호 지문이 캡처되며 비밀번호 재사용 감지 시 사용됩니다. - <ph name="PRODUCT_NAME" />이(가) 비밀번호 지문을 제대로 캡처하게 하려면 로그인 페이지가 다음 페이지의 가이드라인을 준수하고 있는지 확인하세요. https://www.chromium.org/developers/design-documents/create-amazing-password-forms - - 이 설정이 사용되면 비밀번호 보호 서비스에서 비밀번호 재사용 감지 시 사용할 비밀번호 지문을 이러한 URL에서 캡처합니다. - 이 설정이 사용 중지되거나 설정되지 않으면 비밀번호 보호 서비스가 https://accounts.google.com에서만 비밀번호 지문을 캡처합니다. - 이 정책은 <ph name="MS_AD_NAME" /> 도메인에 참여하는 Windows 인스턴스 또는 기기 관리에 등록된 Windows 10 Pro/Enterprise 인스턴트에서만 사용할 수 있습니다.</translation> <translation id="1910704279188129272">앱별 사용 제한을 설정하도록 허용합니다. 사용 제한은 특정 사용자를 위해 <ph name="PRODUCT_OS_NAME" />에 설치된 앱에 적용될 수 있습니다. 제한은 |app_limits| 목록으로 전달되어야 합니다. 앱당 하나의 항목만 허용됩니다. 목록에 포함되지 않은 앱에는 제한이 없습니다. @@ -3366,6 +3355,17 @@ 설정하지 않으면 <ph name="PRODUCT_NAME" />이(가) 기본 라이브러리 이름을 다시 사용합니다.</translation> <translation id="5783009211970309878">인쇄 머리글 및 바닥글</translation> +<translation id="5783576706065107606">새로운 <ph name="CORS" /> 구현에서 <ph name="CORS" /> 확인 완화를 사용 설정하여 확장 프로그램이 호환되는 동작을 유지하도록 허용하고 <ph name="PRODUCT_NAME" />에서 <ph name="CORS" /> 확인 없이 지정된 헤더를 전송하도록 허용합니다. + + 목록이 빈 상태로 설정되어 있으면 <ph name="PRODUCT_NAME" />은(는) 호환되는 방식으로 확장 프로그램을 실행하도록 시도하고 <ph name="WEB_REQUEST_API_MANUAL" />에 설명된 것처럼 <ph name="PRODUCT_NAME" /> 79의 <ph name="API" /> 변경사항을 적용하지 않습니다. + + 목록이 <ph name="HTTP" /> 요청 헤더 이름을 가지도록 설정되어 있으면 <ph name="CORS" /> 검사에서 등록된 헤더를 무시하고 확장 프로그램의 완화를 사용 설정합니다. + + 목록이 설정되지 않으면 위에서 설명된 완화가 모두 적용되지 않습니다. + + <ph name="CORS" />의 세부사항을 확인하려면 <ph name="CORS_HELP_URL" /> 페이지를 참조하세요. + + 이 정책은 <ph name="PRODUCT_NAME" /> 버전 82에서 삭제될 예정이라고 발표되었으나, 버전 84에서 삭제되는 것으로 계획이 변경되었습니다.</translation> <translation id="5790763087505467169">관리되는 게스트 세션 자동 실행 알림 줄이기</translation> <translation id="5806128552675651249">배경 그래픽을 포함하지 않은 경우에만 인쇄 허용</translation> <translation id="5809210507920527553">Linux 컨테이너(Crostini) 관련 설정을 제어합니다.</translation> @@ -3429,6 +3429,17 @@ 이 설정을 사용 중지하거나 설정하지 않으면 모든 호스트에 대해 기본 TalkGadget 도메인 이름('chromoting-host.talkgadget.google.com')이 사용됩니다. 원격 액세스 클라이언트는 이 정책 설정의 영향을 받지 않으며 TalkGadget에 액세스할 때 항상 'chromoting-client.talkgadget.google.com'을 사용합니다.</translation> +<translation id="5888171512889380367">새 <ph name="CORS" /> 대신 기존 <ph name="CORS" /> 구현을 사용합니다. + + 설정이 True로 설정되어 있으면 이전 버전과 호환되어야 하는 기존 구현이 사용됩니다. + + 설정이 False로 설정되어 있거나 설정되어 있지 않으면 엔터프라이즈별 호환성 문제를 일으킬 수 있는 새 구현이 사용됩니다. + + 이 정책은 몇 번의 기능 출시를 거치고 나면 삭제됩니다. + + <ph name="CORS" />의 세부사항을 확인하려면 <ph name="CORS_HELP_URL" /> 페이지를 참조하세요. + + 이 정책은 <ph name="PRODUCT_NAME" /> 버전 82에서 삭제될 예정이라고 발표되었으나, 버전 84에서 삭제되는 것으로 계획이 변경되었습니다.</translation> <translation id="5893553533827140852">이 설정을 사용하도록 설정하면 gnubby 인증 요청이 원격 호스트 연결을 통해 프록시됩니다. 이 설정을 사용 중지하거나 구성하지 않으면 gnubby 인증 요청이 프록시되지 않습니다.</translation> @@ -3719,6 +3730,11 @@ 이 정책은 <ph name="MS_AD_NAME" /> 도메인에 참여하는 Windows 인스턴스 또는 기기 관리에 등록된 Windows 10 Pro/Enterprise 인스턴트에서만 사용할 수 있습니다.</translation> <translation id="6417265370957905582">Google 어시스턴트</translation> +<translation id="6422575351619065453">키오스크 모드에서 플로팅 접근성 메뉴를 표시할지 제어합니다. + + 정책이 사용 설정되면 플로팅 접근성 메뉴가 항상 표시됩니다. + + 정책이 사용 중지되거나 설정되지 않으면 플로팅 접근성 메뉴가 표시되지 않습니다.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">Android 앱에서 강제로 프록시를 사용하도록 할 수 없습니다. 프록시 설정 중 일부는 Android 앱에서 사용 가능하며, 이 경우 Android 앱은 자발적으로 다음 사항을 지킬 수 있습니다. @@ -4038,13 +4054,6 @@ 설정하지 않은 경우 저장된 비밀번호를 가져올지 여부를 사용자에게 확인하거나 자동으로 가져올 수 있습니다.</translation> <translation id="7003746348783715221"><ph name="PRODUCT_NAME" /> 환경설정</translation> -<translation id="7007671350884342624"><ph name="PRODUCT_NAME" />이(가) 사용자 데이터를 저장할 때 사용할 디렉터리를 설정합니다. - - 이 정책을 설정하면 사용자가 '--user-data-dir' 플래그를 지정했는지 여부와 상관없이 <ph name="PRODUCT_NAME" />이(가) 제공된 디렉터리를 사용합니다. 데이터 손실이나 예기치 못한 오류를 방지하려면 이 정책을 볼륨의 루트 디렉터리나 다른 목적으로 사용되는 디렉터리에 지정해서는 안 됩니다. <ph name="PRODUCT_NAME" />이(가) 디렉터리의 콘텐츠를 관리하기 때문입니다. - - https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables에서 사용 가능한 변수 목록을 참조하세요. - - 이 정책을 설정하지 않으면 기본 프로필 경로가 사용되며 사용자는 '--user-data-dir' 명령줄 플래그를 사용하여 이를 재정의할 수 있습니다.</translation> <translation id="7008308728445338159">DNS 가로채기 검사 사용 설정됨</translation> <translation id="7027785306666625591"><ph name="PRODUCT_OS_NAME" />에서 전원 관리를 설정합니다. @@ -4967,7 +4976,6 @@ <translation id="8424255554404582727">기본 디스플레이 회전 설정, 재부팅할 때마다 다시 적용됨</translation> <translation id="8426231401662877819">화면을 시계 방향으로 90도 회전</translation> <translation id="8433186206711564395">네트워크 설정</translation> -<translation id="8433423491036718210">비밀번호 보호 서비스로 비밀번호 지문을 캡처할 엔터프라이즈 로그인 URL 목록을 설정합니다.</translation> <translation id="8445576299806775661">각 주요 버전 업데이트 이후 Chrome에서는 향후 응급 버전 롤백 시 사용하기 위해 사용자의 인터넷 사용 기록 일부에 대한 스냅샷을 생성합니다. 스냅샷이 생성된 버전에 대해 응급 상황 롤백이 실행될 경우, 스냅샷 내 데이터가 복원됩니다. 그럼 사용자는 북마크 및 자동 완성 데이터와 같은 설정을 유지할 수 있습니다. 정책이 설정되지 않은 경우 기본값 3이 사용됩니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 57474f5..53cf088 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -298,12 +298,6 @@ <translation id="1427655258943162134">Adres of URL van proxyserver</translation> <translation id="1435659902881071157">Netwerkconfiguratie op apparaatniveau</translation> <translation id="1438739959477268107">Standaardinstelling voor het genereren van sleutels</translation> -<translation id="1455804070656338445">Stel de URL voor wachtwoordwijzigingen in (alleen HTTP en HTTPS). De wachtwoordbeveiligingsservice leidt gebruikers naar deze URL om hun wachtwoord te wijzigen nadat ze een waarschuwing in de browser hebben gezien. - Als je er zeker van wilt zijn dat <ph name="PRODUCT_NAME" /> vingerafdrukken van wachtwoorden correct vastlegt op de pagina voor wachtwoordwijzigingen, moet je ervoor zorgen dat je pagina voor wachtwoordwijzigingen de richtlijnen op https://www.chromium.org/developers/design-documents/create-amazing-password-forms volgt. - - Als deze instelling ingeschakeld is, leidt de wachtwoordbeveiligingsservice gebruikers naar deze URL om hun wachtwoord te wijzigen nadat ze een waarschuwing in hun browser hebben gezien. - Als deze instelling uitgeschakeld of niet ingesteld is, leidt de wachtwoordbeveiligingsservice gebruikers naar https://myaccount.google.com om hun wachtwoord te wijzigen. - 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="1456822151187621582">Windows (<ph name="PRODUCT_OS_NAME" />-clients):</translation> <translation id="1464848559468748897">Bepaal het gebruikersgedrag tijdens een sessie met meerdere profielen op <ph name="PRODUCT_OS_NAME" />-apparaten. @@ -598,12 +592,6 @@ Als dit beleid is ingesteld op 'False', wordt de rapportage van statistieken en diagnostische gegevens uitgeschakeld. Als dit beleid niet is ingesteld, wordt de rapportage van statistieken en diagnostische gegevens op niet-beheerde apparaten uitgeschakeld en op beheerde apparaten ingeschakeld.</translation> -<translation id="1907431809333268751">Configureer de lijst met zakelijke login-URL's (alleen HTTP- en HTTPS-schema's). De vingerafdruk van het wachtwoord wordt op deze URL's vastgelegd, zodat hergebruik van het wachtwoord kan worden gedetecteerd. - Als je er zeker van wilt zijn dat <ph name="PRODUCT_NAME" /> vingerafdrukken van wachtwoorden correct vastlegt, moet je ervoor zorgen dat je inlogpagina's voldoen aan de richtlijnen op https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Als deze instelling ingeschakeld is, legt de wachtwoordbeveiligingsservice de vingerafdruk van het wachtwoord vast op deze URL's om hergebruik van het wachtwoord te kunnen detecteren. - Als deze instelling uitgeschakeld of niet ingesteld is, legt de wachtwoordbeveiligingsservice de vingerafdruk van het wachtwoord alleen vast op https://accounts.google.com. - 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="1910704279188129272">Hiermee kun je per app gebruiksbeperkingen instellen. Gebruiksbeperkingen kunnen worden toegepast op de apps die voor de betreffende gebruiker in <ph name="PRODUCT_OS_NAME" /> zijn geïnstalleerd. Beperkingen moeten worden doorgegeven in de lijst |app_limits|. Er is slechts één item per app toegestaan. Apps die niet op de lijst voorkomen, hebben geen beperkingen. @@ -3807,7 +3795,7 @@ Dit beleid kan worden overschreven door EnabledPlugins en DisabledPluginsExceptions. Als dit beleid niet is ingesteld, kan de gebruiker elke op het systeem geïnstalleerde plug-in gebruiken, behalve hardgecodeerde ongeschikte, verouderde of gevaarlijke plug-ins.</translation> -<translation id="6571871508154591774">De functies van de camera, browserinstellingen en de OS-instellingen configureren die moeten worden uitgeschakeld</translation> +<translation id="6571871508154591774">De camera, browserinstellingen en de OS-instellingen uitschakelen</translation> <translation id="6573305661369899995">Een externe bron voor URL-beperkingen instellen</translation> <translation id="6583851521569686409">Hiermee wordt een lijst met printers geconfigureerd. @@ -4023,13 +4011,6 @@ Als dit beleid niet is ingesteld, kan de gebruiker worden gevraagd of deze wil importeren, of wordt er automatisch geïmporteerd.</translation> <translation id="7003746348783715221">Voorkeuren voor <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Hiermee wordt de directory geconfigureerd die <ph name="PRODUCT_NAME" /> gebruikt voor het opslaan van gebruikersgegevens. - - Als je dit beleid instelt, gebruikt <ph name="PRODUCT_NAME" /> deze directory, ongeacht of de gebruiker de optie voor '--user-data-dir' heeft ingesteld. Als je gegevensverlies of andere onverwachte fouten wilt voorkomen, moet dit beleid niet worden ingesteld op de hoofddirectory van een volume of op een directory die wordt gebruikt voor andere doeleinden, omdat <ph name="PRODUCT_NAME" /> de content ervan beheert. - - Raadpleeg https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables voor een lijst met variabelen die kunnen worden gebruikt. - - Als dit beleid niet wordt ingesteld, wordt de standaardcachedirectory gebruikt en kan de gebruiker deze overschrijven met de opdrachtregelmarkering '--user-data-dir'.</translation> <translation id="7008308728445338159">Controles voor DNS-onderschepping ingeschakeld</translation> <translation id="7027785306666625591">Energiebeheer in <ph name="PRODUCT_OS_NAME" /> configureren. @@ -4950,7 +4931,6 @@ <translation id="8424255554404582727">Standaard displayrotatie instellen, wordt telkens toegepast na opnieuw opstarten</translation> <translation id="8426231401662877819">Scherm 90 graden met de klok mee draaien</translation> <translation id="8433186206711564395">Netwerkinstellingen</translation> -<translation id="8433423491036718210">Configureer de lijst met zakelijke login-URL's waar de wachtwoordbeveiligingsservice de vingerafdruk van het wachtwoord moet vastleggen.</translation> <translation id="8445576299806775661">Na elke grote versie-update maakt Chrome een momentopname van bepaalde gedeelten van de browsergegevens van de gebruiker. Deze momentopname kan worden gebruikt voor een latere noodrollback van de versie. Als er een noodrollback wordt uitgevoerd naar een versie waarvoor een gebruiker een bijbehorende momentopname heeft, worden de gegevens in de momentopname hersteld. Zo kunnen gebruikers instellingen als bookmarks en gegevens voor automatisch aanvullen behouden. Als dit beleid niet is ingesteld, wordt de standaardwaarde 3 gebruikt.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index d1eeb61d..3517c3d 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -293,12 +293,6 @@ <translation id="1427655258943162134">Endereço ou URL do servidor proxy</translation> <translation id="1435659902881071157">Configuração de rede em nível de dispositivo</translation> <translation id="1438739959477268107">Configuração padrão de geração de chaves</translation> -<translation id="1455804070656338445">Configura o URL de alteração de senha (somente para esquemas HTTP e HTTPS). O serviço de proteção de senhas encaminhará os usuários a esse URL para que alterem a própria senha após receberem um aviso no navegador. - Para que o <ph name="PRODUCT_NAME" /> capture corretamente a nova impressão digital de senha na página de alteração de senha, essa página precisa seguir as diretrizes que constam em https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Se essa configuração estiver ativada, o serviço de proteção de senhas encaminhará os usuários a esse URL para que alterem a própria senha após receberem um aviso no navegador. - Se essa configuração estiver desativada ou não for definida, o serviço de proteção de senhas encaminhará os usuários para https://myaccount.google.com para a alteração da senha. - Esta política está disponível apenas em instâncias do Windows associadas a um domínio <ph name="MS_AD_NAME" /> ou instâncias do Windows 10 Pro ou Enterprise inscritas no gerenciamento de dispositivos.</translation> <translation id="1456822151187621582">Windows (clientes do <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Controla o comportamento do usuário em uma sessão de diversos perfis nos dispositivos com <ph name="PRODUCT_OS_NAME" />. @@ -591,12 +585,6 @@ Se configurada como falsa, os relatórios de métricas e dados de diagnóstico serão desativados. Se não for configurada, os relatórios de métricas e dados de diagnóstico serão desativados em dispositivos não gerenciados e ativados em dispositivos gerenciados.</translation> -<translation id="1907431809333268751">Configura a lista de URLs de login corporativo (somente para esquemas HTTP e HTTPS). A impressão digital da senha será capturada nesses URLs e usada para detecção de reutilização de senhas. - Para que as impressões digitais de senha sejam capturadas corretamente no <ph name="PRODUCT_NAME" />, suas páginas de login precisam seguir as diretrizes que constam em https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Se essa configuração estiver ativada, a impressão digital da senha será capturada nesses URLs pelo serviço de proteção de senhas para detecção de reutilização. - Se essa configuração estiver desativada ou não estiver definida, a impressão digital da senha será capturada pelo serviço de proteção de senhas apenas em https://accounts.google.com.br. - Esta política está disponível apenas em instâncias do Windows associadas a um domínio <ph name="MS_AD_NAME" /> ou instâncias do Windows 10 Pro ou Enterprise inscritas no gerenciamento de dispositivos.</translation> <translation id="1910704279188129272">Permite definir restrições de uso por app. As restrições de uso podem ser aplicadas aos apps instalados no <ph name="PRODUCT_OS_NAME" /> para um determinado usuário. As restrições precisam ser passadas na lista |app_limits|. É permitida apenas uma entrada por app. Os apps que não estão na lista não têm restrições. @@ -2921,7 +2909,7 @@ Se definida como verdadeira ou não configurada, este usuário poderá criar e gerenciar usuários supervisionados.</translation> <translation id="5369937289900051171">Apenas impressão colorida</translation> <translation id="5370279767682621504">Ativar suporte a HTTP/0.9 em portas não padrão</translation> -<translation id="5377606826822211923">Controla o uso de apps para Android de fontes em que o usuário não confia</translation> +<translation id="5377606826822211923">Controla, no lugar do usuário, o uso de apps para Android de fontes não confiáveis</translation> <translation id="5378985487213287085">Permite que você defina se os websites são autorizados a exibir notificações na área de trabalho. A exibição de notificações na área de trabalho pode ser autorizada ou recusada por padrão ou o usuário pode ser solicitado a autorizar todas as vezes em que um website quiser exibir notificações na área de trabalho. Se esta política for deixada sem definição, a política "AskNotifications" será utilizada, podendo ser modificada pelo usuário.</translation> <translation id="5380329473151894945">Definir o estado padrão do recurso de acessibilidade de cursor grande na tela de login. @@ -3947,13 +3935,6 @@ Se a opção U2F_EXTENDED for selecionada, o segundo fator integrado fornecerá as funções de U2F, além de algumas extensões para declaração individual.</translation> <translation id="7003334574344702284">Se ativada, esta política força a importação de senhas a partir do navegador padrão anterior. Se ativada, esta política também afeta a caixa de diálogo de importação. Se desativada, as senhas salvas não são importadas. Se não for definida, o usuário pode ser solicitado a responder se deseja importar ou permitir a importação automática.</translation> <translation id="7003746348783715221">Preferências do <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Configura o diretório que o <ph name="PRODUCT_NAME" /> usará para armazenar dados do usuário. - - Se você definir esta política, o <ph name="PRODUCT_NAME" /> usará o diretório fornecido independentemente de o usuário ter especificado a sinalização "--user-data-dir" ou não. Para evitar perda de dados ou outros erros inesperados, esta política não deve ser definida para um diretório raiz de volume ou um diretório usado para outros fins, pois o <ph name="PRODUCT_NAME" /> gerencia seus conteúdos. - - Consulte https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables para ver uma lista de variáveis que podem ser usadas. - - Se esta política for deixada sem definição, o caminho padrão de perfil será usado, e o usuário poderá substituí-lo pela sinalização de linha de comando "--user-data-dir".</translation> <translation id="7008308728445338159">Verificação de interceptações de DNS ativada</translation> <translation id="7027785306666625591">Configura o gerenciamento de energia no <ph name="PRODUCT_OS_NAME" />. @@ -4338,7 +4319,7 @@ Os padrões do URL têm o mesmo formato que a política "URLBlacklist", documentada em https://www.chromium.org/administrators/url-blacklist-filter-format (em inglês). </translation> <translation id="7566878661979235378">Tipo de autenticação de login SAML</translation> -<translation id="7567373982693549834">Esta política controla o uso de apps para Android de fontes em que o usuário não confia (diferentes do Google Play). +<translation id="7567373982693549834">Esta política controla, no lugar de cada usuário, o uso de apps para Android de fontes não confiáveis (diferentes do Google Play). Se o valor da política não for definido, a funcionalidade será tratada como não permitida. @@ -4855,7 +4836,6 @@ <translation id="8424255554404582727">Definir rotação padrão da tela, reaplicada em cada reinicialização</translation> <translation id="8426231401662877819">Girar tela no sentido horário em 90 graus</translation> <translation id="8433186206711564395">Configurações de rede</translation> -<translation id="8433423491036718210">Configure a lista de URLs de login corporativo em que o serviço de proteção de senha deve capturar a impressão digital da senha.</translation> <translation id="8445576299806775661">Depois de cada atualização importante de versão, o Chrome criará um snapshot de certas partes dos dados de navegação do usuário para uso em caso de reversão de emergência da versão. Se uma reversão de emergência for feita para uma versão da qual o usuário tem um snapshot correspondente, os dados serão restaurados. Isso permite que o usuário retenha essas configurações na forma de favoritos e dados de preenchimento automático. Se essa política não for definida, o valor padrão 3 será usado.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index b45f0d83..72eda3c 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -298,12 +298,6 @@ <translation id="1427655258943162134">Адрес или URL прокси-сервера</translation> <translation id="1435659902881071157">Конфигурации сети на уровне устройства</translation> <translation id="1438739959477268107">Настройки создания ключей по умолчанию</translation> -<translation id="1455804070656338445">Настраивает URL для смены пароля (только для протоколов HTTP и HTTPS). Служба защиты паролей перенаправляет пользователей на указанную страницу, чтобы изменить пароль после появления предупреждения в браузере. - Чтобы <ph name="PRODUCT_NAME" /> корректно сохранил новый цифровой отпечаток, страница смены пароля должна соответствовать требованиям, перечисленным на странице https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Если правило включено, служба защиты паролей перенаправляет пользователей на указанный URL, чтобы изменить пароль после появления предупреждения в браузере. - Если правило отключено или не настроено, служба защиты паролей перенаправляет пользователей на страницу https://myaccount.google.com. - Правило можно установить только на устройствах Windows, входящих в домен <ph name="MS_AD_NAME" />, а также на устройствах Windows 10 Pro или Enterprise, зарегистрированных в консоли администратора.</translation> <translation id="1456822151187621582">Windows (клиенты <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Управление действиями пользователей в многопрофильном режиме на устройствах <ph name="PRODUCT_OS_NAME" /> @@ -590,12 +584,6 @@ Когда правило включено, <ph name="PRODUCT_OS_NAME" /> отправляет соответствующие сведения. Когда правило отключено, данные не отправляются. Если значение не установлено, правило применяется к управляемым устройствам по умолчанию.</translation> -<translation id="1907431809333268751">Настраивает список URL для входа в корпоративный аккаунт (только для протоколов HTTP и HTTPS). На этих страницах будет регистрироваться цифровой отпечаток пароля для определения повторного ввода. - Чтобы цифровые отпечатки паролей корректно сохранялись в <ph name="PRODUCT_NAME" />, страницы входа должны соответствовать требованиям, перечисленным в инструкции по адресу https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Если правило включено, цифровой отпечаток будет сохранен в службе защиты паролей для определения повторного ввода пароля на странице входа. - Если значение не установлено или правило отключено, цифровые отпечатки будут сохраняться в службе защиты паролей только на странице https://accounts.google.com. - Правило можно установить только на устройствах Windows, входящих в домен <ph name="MS_AD_NAME" />, а также на устройствах Windows 10 Pro или Enterprise, зарегистрированных в консоли администратора.</translation> <translation id="1910704279188129272">Позволяет установить ограничения на использование определенных приложений. Эти ограничения можно задать в отношении приложений, которые установлены на компьютере с <ph name="PRODUCT_OS_NAME" />, для выбранных пользователей. Ограничения следует указывать в списке |app_limits|. В списке может содержаться не более одной записи для каждого приложения. Если приложение не включено в список, ограничения на него не действуют. @@ -3982,13 +3970,6 @@ Если выбран вариант U2F_EXTENDED, двухфакторная аутентификация обеспечивается с помощью технологии U2F и расширений для персонального подтверждения.</translation> <translation id="7003334574344702284">Это правило импортирует сохраненные пароли из предыдущего браузера по умолчанию, а также меняет поведение диалогового окна импорта. Если это правило отключено, сохраненные пароли не импортируются, а если оно не настроено, импорт может быть выполнен автоматически или пользователю может быть предложено выполнить его.</translation> <translation id="7003746348783715221">Настройки <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Определяет каталог, в котором <ph name="PRODUCT_NAME" /> будет хранить данные пользователей. - - Если политика задана, <ph name="PRODUCT_NAME" /> будет использовать указанный каталог независимо от того, установил пользователь флажок "--user-data-dir" или нет. Чтобы избежать потери данных или других ошибок, эта политика не должна указывать на корневой каталог тома или каталог, используемый для других целей, поскольку <ph name="PRODUCT_NAME" /> управляет его содержимым. - - Список поддерживаемых переменных приведен здесь: http://www.chromium.org/administrators/policy-list-3/user-data-directory-variables. - - Если не настраивать это правило, будет выбран путь для профиля по умолчанию, но пользователь сможет изменить его с помощью параметра командной строки "'--user-data-dir".</translation> <translation id="7008308728445338159">Включить проверку на перехват DNS</translation> <translation id="7027785306666625591">Настройка режима энергопотребления в <ph name="PRODUCT_OS_NAME" /> @@ -4893,7 +4874,6 @@ <translation id="8424255554404582727">Поворот изображения на экране по умолчанию (применяется при каждой перезагрузке)</translation> <translation id="8426231401662877819">Повернуть экран на 90 градусов по часовой стрелке</translation> <translation id="8433186206711564395">Настройки сети</translation> -<translation id="8433423491036718210">Настроить список веб-страниц для входа в корпоративный аккаунт, на которых сервис защиты паролей должен записывать цифровой отпечаток пароля</translation> <translation id="8445576299806775661">После крупных обновлений Chrome будет создавать снимок определенных данных о работе пользователя в браузере для выполнения вынужденного отката версии в случае необходимости. Если выполняется вынужденный откат к версии, для которой есть соответствующий снимок, данные восстанавливаются из него. Это позволяет сохранить пользовательские настройки, например закладки и данные автозаполнения. Если правило не настроено, используется значение по умолчанию (3 снимка).
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index c126089..79549a9 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -297,12 +297,6 @@ <translation id="1427655258943162134">ที่อยู่หรือ URL ของพร็อกซีเซิร์ฟเวอร์</translation> <translation id="1435659902881071157">การกำหนดค่าเครือข่ายระดับอุปกรณ์</translation> <translation id="1438739959477268107">การตั้งค่าการสร้างคีย์ที่เป็นค่าเริ่มต้น</translation> -<translation id="1455804070656338445">กำหนดค่า URL การเปลี่ยนรหัสผ่าน (รูปแบบ HTTP และ HTTPS เท่านั้น) บริการปกป้องรหัสผ่านจะส่งผู้ใช้มาที่ URL นี้เพื่อเปลี่ยนรหัสผ่านของตนหลังจากเห็นคำเตือนในเบราว์เซอร์ - โปรดตรวจสอบว่าหน้าเปลี่ยนรหัสผ่านของคุณเป็นไปตามหลักเกณฑ์ใน https://www.chromium.org/developers/design-documents/create-amazing-password-forms เพื่อให้ <ph name="PRODUCT_NAME" /> จับภาพลายนิ้วมือที่เป็นรหัสผ่านใหม่ได้อย่างถูกต้องในหน้าเปลี่ยนรหัสผ่านนี้ - - หากเปิดใช้การตั้งค่านี้ บริการปกป้องรหัสผ่านจะส่งผู้ใช้มาที่ URL นี้เพื่อเปลี่ยนรหัสผ่านของตนหลังจากเห็นคำเตือนในเบราว์เซอร์ - หากปิดใช้การตั้งค่านี้หรือไม่ได้ตั้งค่า บริการปกป้องรหัสผ่านจะส่งผู้ใช้ไปที่ https://myaccount.google.com เพื่อเปลี่ยนรหัสผ่าน - นโยบายนี้ใช้ได้เฉพาะในอินสแตนซ์ Windows ซึ่งเข้าร่วมโดเมน <ph name="MS_AD_NAME" /> หรืออินสแตนซ์ Windows 10 Pro หรือ Enterprise ที่เข้าร่วมการจัดการอุปกรณ์</translation> <translation id="1456822151187621582">Windows (ไคลเอ็นต์ของ <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">ควบคุมพฤติกรรมของผู้ใช้ในเซสชันหลายโปรไฟล์บนอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> @@ -590,12 +584,6 @@ หากตั้งค่าเป็น "เท็จ" จะมีการปิดใช้การรายงานเมตริกและข้อมูลการวินิจฉัย หากไม่กำหนดค่า จะมีการปิดใช้การรายงานเมตริกและข้อมูลการวินิจฉัยในอุปกรณ์ที่ไม่มีการจัดการ และเปิดใช้ในอุปกรณ์ที่มีการจัดการ</translation> -<translation id="1907431809333268751">กำหนดค่ารายการ URL สำหรับเข้าสู่ระบบขององค์กร (รูปแบบ HTTP และ HTTPS เท่านั้น) ระบบจะบันทึกลายนิ้วมือของรหัสผ่านใน URL เหล่านี้และใช้เพื่อตรวจหาการใช้รหัสผ่านซ้ำ - โปรดตรวจสอบว่าหน้าสำหรับเข้าสู่ระบบเป็นไปตามหลักเกณฑ์ใน https://www.chromium.org/developers/design-documents/create-amazing-password-forms เพื่อให้ <ph name="PRODUCT_NAME" /> บันทึกลายนิ้วมือของรหัสผ่านได้อย่างถูกต้อง - - หากเปิดใช้การตั้งค่านี้ บริการปกป้องรหัสผ่านก็จะบันทึกลายนิ้วมือของรหัสผ่านใน URL เหล่านี้เพื่อตรวจหาการใช้รหัสผ่านซ้ำ - หากปิดใช้หรือไม่ได้ตั้งค่า บริการปกป้องรหัสผ่านก็จะบันทึกลายนิ้วมือของรหัสผ่านใน https://accounts.google.com เท่านั้น - นโยบายนี้ใช้ได้เฉพาะในอินสแตนซ์ Windows ซึ่งเข้าร่วมโดเมน <ph name="MS_AD_NAME" /> หรืออินสแตนซ์ Windows 10 Pro หรือ Enterprise ที่เข้าร่วมการจัดการอุปกรณ์</translation> <translation id="1910704279188129272">อนุญาตให้กำหนดข้อจำกัดการใช้งานต่อแอป ข้อจำกัดการใช้งานนำไปใช้กับแอปที่ติดตั้งไว้ใน <ph name="PRODUCT_OS_NAME" /> สำหรับผู้ใช้นั้นๆ ได้ ข้อจำกัดควรส่งผ่านในรายการ |app_limits| มีข้อจำกัดได้ 1 รายการต่อแอปเท่านั้น แอปที่ไม่ได้อยู่ในรายการจะไม่มีข้อจำกัด @@ -3955,13 +3943,6 @@ หากเลือก "U2F_EXTENDED" ปัจจัยที่ 2 ที่รวมอยู่จะแจ้งฟังก์ชัน U2F พร้อมส่วนขยายบางอย่างสำหรับการรับรองแต่ละรายการ</translation> <translation id="7003334574344702284">นโยบายนี้บังคับให้นำเข้ารหัสผ่านที่บันทึกไว้จากเบราว์เซอร์เริ่มต้นก่อนหน้าหากเปิดใช้งาน หากเปิดใช้งาน นโยบายนี้ยังมีผลต่อข้อความโต้ตอบการนำเข้าอีกด้วย หากปิดใช้งาน จะไม่มีการนำเข้ารหัสผ่านที่บันทึกไว้ หากไม่มีการตั้งค่าไว้ ผู้ใช้อาจจะได้รับคำถามว่าจะนำเข้าหรือไม่ หรือการนำเข้าอาจเกิดขึ้นโดยอัตโนมัติ</translation> <translation id="7003746348783715221">ค่ากำหนดของ <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">กำหนดค่าไดเรกทอรีที่ <ph name="PRODUCT_NAME" /> จะใช้สำหรับการจัดเก็บข้อมูลผู้ใช้ - - หากคุณตั้งค่านโยบายนี้ <ph name="PRODUCT_NAME" /> จะใช้ไดเรกทอรีที่ให้มา โดยไม่คำนึงว่าผู้ใช้มีการระบุสถานะ "--user-data-dir" หรือไม่ คุณไม่ควรตั้งค่านโยบายนี้เป็นไดเรกทอรีรากของรุ่นหรือไดเรกทอรีที่ใช้สำหรับวัตถุประสงค์อื่นๆ เพื่อหลีกเลี่ยงการสูญเสียข้อมูลหรือข้อผิดพลาดที่ไม่คาดคิดอื่นๆ เพราะ <ph name="PRODUCT_NAME" /> จะจัดการเนื้อหาของตัวเอง - - ดูรายการตัวแปรที่สามารถนำมาใช้ได้ที่ https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables - - หากไม่มีการตั้งค่านโยบายนี้ ระบบจะใช้เส้นทางโปรไฟล์เริ่มต้นและผู้ใช้จะสามารถลบล้างเส้นทางนี้ได้ด้วยการตั้งสถานะโดยใช้บรรทัดคำสั่ง "--user-data-dir"</translation> <translation id="7008308728445338159">เปิดใช้การตรวจสอบการสกัดกั้น DNS แล้ว</translation> <translation id="7027785306666625591">กำหนดค่าการจัดการพลังงานใน <ph name="PRODUCT_OS_NAME" /> @@ -4872,7 +4853,6 @@ <translation id="8424255554404582727">ตั้งค่าการหมุนหน้าจอเริ่มต้น ใช้การตั้งค่านี้ซ้ำทุกครั้งที่เริ่มระบบใหม่</translation> <translation id="8426231401662877819">หมุนหน้าจอตามเข็มนาฬิกา 90 องศา</translation> <translation id="8433186206711564395">การตั้งค่าเครือข่าย</translation> -<translation id="8433423491036718210">กำหนดค่ารายการ URL สำหรับเข้าสู่ระบบขององค์กรที่บริการป้องกันด้วยรหัสผ่านควรจับภาพลายนิ้วมือของรหัสผ่าน</translation> <translation id="8445576299806775661">ในการอัปเดตเวอร์ชันครั้งใหญ่แต่ละครั้ง Chrome จะสร้างสแนปชอตของข้อมูลการท่องเว็บของผู้ใช้เอาไว้จำนวนหนึ่งสำหรับใช้ในกรณีที่ต้องทำการย้อนกลับเวอร์ชันฉุกเฉินในภายหลัง หากทำการย้อนกลับฉุกเฉินไปยังเวอร์ชันที่ผู้ใช้มีสแนปชอตที่ตรงกัน ข้อมูลในสแนปชอตจะได้รับการคืนค่า ซึ่งจะช่วยให้ผู้ใช้เก็บการตั้งค่าดังกล่าวเป็นบุ๊กมาร์กและข้อมูลสำหรับป้อนข้อความอัตโนมัติได้ หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นที่ 3
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index d38471d..2a027e33 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -287,12 +287,6 @@ <translation id="1427655258943162134">Proxy sunucunun adresi veya URL'si</translation> <translation id="1435659902881071157">Cihaz düzeyinde ağ yapılandırması</translation> <translation id="1438739959477268107">Varsayılan anahtar oluşturma ayarı</translation> -<translation id="1455804070656338445">Şifre değiştirme URL'sini yapılandırın (yalnızca HTTP ve HTTPS şemaları). Şifre koruma hizmeti, tarayıcıda bir uyarı gördükten sonra şifrelerini değiştirmeleri için kullanıcıları bu URL'ye gönderir. - <ph name="PRODUCT_NAME" /> ürününün bu şifre değiştirme sayfasında yeni şifre parmak izini doğru bir şekilde yakalayabilmesi için lütfen şifre değiştirme sayfanızın https://www.chromium.org/developers/design-documents/create-amazing-password-forms adresinde belirtilen yönergelere uygun olduğundan emin olun. - - Bu ayar etkinleştirilirse şifre koruma hizmeti, tarayıcıda bir uyarı gördükten sonra şifrelerini değiştirmeleri için kullanıcıları bu URL'ye gönderir. - Bu ayar devre dışı bırakılır veya ayarlanmazsa şifre koruma hizmeti, şifrelerini değiştirmeleri için kullanıcıları https://myaccount.google.com adresine gönderir. - Bu politika yalnızca bir <ph name="MS_AD_NAME" /> alan adına katılmış Windows örneklerinde veya cihaz yönetimine kaydolmuş Windows 10 Pro ya da Enterprise örneklerinde kullanılabilir.</translation> <translation id="1456822151187621582">Windows (<ph name="PRODUCT_OS_NAME" /> istemcileri):</translation> <translation id="1464848559468748897"><ph name="PRODUCT_OS_NAME" /> cihazlarda çoklu profil içeren oturumdaki kullanıcı davranışını denetle. @@ -597,12 +591,6 @@ Yanlış (false) değerine ayarlanırsa, ölçüm ve teşhis verilerini raporlama işlevi devre dışı olur. Yapılandırılmazsa, ölçüm ve teşhis verileri yönetilmeyen cihazlarda devre dışı bırakılır, yönetilen cihazlarda etkinleştirilir.</translation> -<translation id="1907431809333268751">Kurumsal giriş URL'lerinin listesini yapılandırır (yalnızca HTTP ve HTTPS şemaları). Bu URL'lerde şifrelerin dijital parmak izleri yakalanır ve şifrenin tekrar kullanımını algılamak için bu dijital parmak izlerinden yararlanılır. - <ph name="PRODUCT_NAME" /> ürününün şifrelerin dijital parmak izlerini doğru bir şekilde yakalayabilmesi için lütfen giriş sayfalarınızın https://www.chromium.org/developers/design-documents/create-amazing-password-forms adresinde belirtilen yönergelere uygun olduğundan emin olun. - - Bu ayar etkinleştirilirse şifre koruma hizmeti, şifre yeniden kullanımı algılaması için bu URL'lerdeki şifrelerin dijital parmak izlerini yakalar. - Bu ayar devre dışı bırakılırsa veya ayarlanmazsa, şifre koruma hizmeti yalnızca https://accounts.google.com adresindeki şifrelerin dijital parmak izlerini yakalar. - Bu politika yalnızca bir <ph name="MS_AD_NAME" /> alan adına katılmış Windows örneklerinde veya cihaz yönetimine kaydolmuş Windows 10 Pro ya da Enterprise örneklerinde kullanılabilir.</translation> <translation id="1910704279188129272">Uygulama başına kullanım kısıtlamaları ayarlamaya olanak tanır. Kullanım kısıtlamaları, belirtilen kullanıcı için <ph name="PRODUCT_OS_NAME" /> üzerinde yüklü uygulamalarda geçerli olabilir. Kısıtlamalar |app_limits| listesine dahil edilmelidir. Uygulama başına yalnızca bir girişe izin verilir. Listede bulunmayan uygulamaların kısıtlamaları yoktur. @@ -3355,13 +3343,13 @@ Bu liste boş değere ayarlanırsa <ph name="PRODUCT_NAME" />, Uzantıları uyumlu şekillerde çalıştırmayı dener ve <ph name="WEB_REQUEST_API_MANUAL" /> içinde açıklanan <ph name="PRODUCT_NAME" /> 79 için <ph name="API" /> değişikliklerini uygulamaz. - Bu liste <ph name="HTTP" /> istek üst bilgi adlarına sahip olacak şekilde ayarlanırsa <ph name="CORS" /> incelemesi, Uzantılar için çözüm sağlamaya ek olarak listelenen üst bilgileri de yoksayar. + Bu liste <ph name="HTTP" /> istek üstbilgi adlarına sahip olacak şekilde ayarlanırsa <ph name="CORS" /> incelemesi, Uzantılar için çözüm sağlamaya ek olarak listelenen üstbilgileri de yoksayar. Bu liste ayarlanmazsa yukarıda açıklanan çözümlerin ikisi de uygulanmaz. <ph name="CORS" /> ile ilgili ayrıntılar için şu adresi ziyaret edin: <ph name="CORS_HELP_URL" />. - Bu politikanın <ph name="PRODUCT_NAME" /> sürüm 82'de kaldırılacağı duyurulmuştu, ancak planlardaki değişiklik nedeniyle sürüm 84'de kaldırılacağını belirtmek isteriz.</translation> + Bu politikanın <ph name="PRODUCT_NAME" /> sürüm 82'de kaldırılacağı duyurulmuştu, ancak planlardaki değişiklik nedeniyle sürüm 84'te kaldırılacağını belirtmek isteriz.</translation> <translation id="5790763087505467169">Yönetilen misafir oturumu otomatik başlatma bildirimlerini azaltma</translation> <translation id="5806128552675651249">Yalnızca arka plan grafikleri olmadan yazdırmaya izin ver</translation> <translation id="5809210507920527553">Linux kapsayıcı (Crostini) ile ilgili ayarları kontrol eder.</translation> @@ -3435,7 +3423,7 @@ <ph name="CORS" /> ile ilgili ayrıntılar için şu adresi ziyaret edin: <ph name="CORS_HELP_URL" />. - Bu politikanın <ph name="PRODUCT_NAME" /> sürüm 82'de kaldırılacağı duyurulmuştu, ancak planlardaki değişiklik nedeniyle sürüm 84'de kaldırılacağını belirtmek isteriz.</translation> + Bu politikanın <ph name="PRODUCT_NAME" /> sürüm 82'de kaldırılacağı duyurulmuştu, ancak planlardaki değişiklik nedeniyle sürüm 84'te kaldırılacağını belirtmek isteriz.</translation> <translation id="5893553533827140852">Bu ayar etkinleştirilirse gnubby kimlik doğrulama isteklerinde uzaktan ana bilgisayar bağlantısı üzerinden proxy kullanılır. Bu ayar devre dışı bırakılır veya yapılandırılmazsa gnubby kimlik doğrulama isteklerinde proxy kullanılmaz.</translation> @@ -4031,13 +4019,6 @@ Ayarlanmazsa, kullanıcıdan içe aktarma işlemini gerçekleştirmesi istenebilir veya içe aktarma otomatik olarak gerçekleşir.</translation> <translation id="7003746348783715221"><ph name="PRODUCT_NAME" /> tercihleri</translation> -<translation id="7007671350884342624"><ph name="PRODUCT_NAME" /> uygulamasının kullanıcı verilerini depolamak için kullanacağı dizini yapılandırır. - - Bu politikayı ayarlarsanız <ph name="PRODUCT_NAME" />, kullanıcının "--user-data-dir" belirtmiş olup olmamasına bakmaksızın sağlanan dizini kullanır. Veri kaybını veya diğer beklenmeyen hataları önlemek için bu politika, bir birimin kök dizinine veya başka amaçlar için kullanılan bir dizine ayarlanmamalıdır; çünkü <ph name="PRODUCT_NAME" />, dizinin içeriğini yönetir. - - Kullanılabilecek değişkenlerin bir listesi için https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables adresine bakın. - - Bu politika ayarlanmadan bırakılırsa varsayılan profil yolu kullanılır ve kullanıcı, "--user-data-dir" komut satırı bayrağıyla bunu geçersiz kılabilir.</translation> <translation id="7008308728445338159">DNS müdahale kontrolü etkin</translation> <translation id="7027785306666625591"><ph name="PRODUCT_OS_NAME" /> sisteminde güç yönetimini yapılandırın. @@ -4959,7 +4940,6 @@ <translation id="8424255554404582727">Her yeniden başlatmada tekrar uygulanacak varsayılan ekran döndürmesini ayarla</translation> <translation id="8426231401662877819">Ekranı saat yönünde 90 derece döndür</translation> <translation id="8433186206711564395">Ağ ayarları</translation> -<translation id="8433423491036718210">Şifrenin parmak izinin şifre koruma hizmeti tarafından yakalanması gerektiği kurumsal giriş URL'lerinin listesini yapılandırın.</translation> <translation id="8445576299806775661">Her büyük sürüm güncellemesinin ardından Chrome, daha sonra bir acil sürüm geri alma durumunda kullanılmak üzere kullanıcının tarama verilerinin belirli bölümlerinin anlık görüntüsünü oluşturur. Kullanıcının karşılık gelen anlık görüntüsüne sahip olduğu bir sürümde acil durum geri alma gerçekleştirilirse anlık görüntüdeki veriler geri yüklenir. Bu, kullanıcıların yer işaretleri ve otomatik doldurma verileri gibi ayarları saklamasına olanak tanır. Bu politika ayarlanmazsa varsayılan değer olan 3 değeri kullanılır
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 599797c7..cddeed0 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -302,12 +302,6 @@ <translation id="1427655258943162134">Адреса або URL-адреса проксі-сервера</translation> <translation id="1435659902881071157">Налаштування мережі на рівні пристрою</translation> <translation id="1438739959477268107">Генерувати ключі за умовчанням</translation> -<translation id="1455804070656338445">Налаштовує URL-адресу, де можна змінити пароль (лише для схем HTTP та HTTPS). Після застереження у веб-переглядачі сервіс захисту паролів спрямовує користувачів на цю URL-адресу, де можна змінити пароль. - Щоб <ph name="PRODUCT_NAME" /> правильно зберігав новий відбиток пароля на цій сторінці, вона має відповідати наведеним тут правилам: https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Якщо це правило ввімкнено, після застереження у веб-переглядачі користувачі спрямовуються на цю URL-адресу, де можуть змінити пароль. - Якщо це правило вимкнено або не налаштовано, сервіс захисту паролів спрямовує користувачів на сторінку https://myaccount.google.com, де можна змінити пароль. - Це правило доступне лише у версіях Windows у домені <ph name="MS_AD_NAME" /> або Windows 10 Pro чи Enterprise, зареєстрованих для керування пристроями.</translation> <translation id="1456822151187621582">Windows (клієнти <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Керувати поведінкою користувача в багатопрофільному режимі на пристроях з <ph name="PRODUCT_OS_NAME" />. @@ -605,12 +599,6 @@ Якщо вибрано значення false, показники використання та діагностичні дані не надсилатимуться. Якщо це правило не налаштовано, надсилання показників використання та діагностичних даних буде вимкнено на некерованих пристроях і ввімкнено на керованих.</translation> -<translation id="1907431809333268751">Налаштовує список URL-адрес для входу підприємства (лише для схем HTTP та HTTPS). Для цих URL-адрес буде збережено відбиток пароля, який використовуватиметься, щоб виявляти його повторне використання. - Щоб у <ph name="PRODUCT_NAME" /> можна було правильно зберігати відбитки пароля, переконайтеся, що сторінки входу відповідають правилам на сайті https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Якщо цей параметр увімкнено, сервіс захисту паролів збереже відбиток пароля для цих URL-адрес, щоб виявляти його повторне введення. - Якщо його вимкнено або не налаштовано, сервіс захисту паролів збереже відбиток пароля лише на сторінці https://accounts.google.com. - Це правило доступне лише у версіях Windows, зареєстрованих у домені <ph name="MS_AD_NAME" />, або Windows 10 Pro чи Enterprise, зареєстрованих для керування пристроєм.</translation> <translation id="1910704279188129272">Дозволяє встановити обмеження щодо використання окремо для кожного додатка. Обмеження щодо використання можна застосовувати до додатків, встановлених на <ph name="PRODUCT_OS_NAME" />, для певного користувача. Обмеження потрібно ввести в список |app_limits|. Для кожного додатка можна додати лише один запис. Додатки, які не включено в список, не мають обмежень. @@ -4006,13 +3994,6 @@ Якщо вибрано опцію "U2F_EXTENDED", вбудований другий фактор забезпечує функції U2F і деякі розширення для особистого підтвердження.</translation> <translation id="7003334574344702284">Якщо це правило ввімкнено, збережені паролі імпортуються з попереднього веб-переглядача за умовчанням. Якщо його ввімкнено, це правило також впливає на діалогове вікно імпортування. Якщо вимкнено, збережені паролі не імпортуються. Якщо це правило не встановлено, користувач отримує запит на імпортування або імпортування розпочинається автоматично.</translation> <translation id="7003746348783715221">Налаштування <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Налаштовується каталог, у який <ph name="PRODUCT_NAME" /> зберігатиме дані користувача. - - Якщо встановити це правило, <ph name="PRODUCT_NAME" /> зберігатиме файли у вказаний каталог, навіть коли користувач не додав параметр "--user-data-dir". Щоб уникнути втрати даних або інших непередбачуваних помилок, це правило не можна налаштовувати для кореневого каталогу тому та каталогу, який використовується для інших цілей, оскільки <ph name="PRODUCT_NAME" /> керує його вмістом. - - Список можливих змінних можна переглянути на сторінці https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables. - - Якщо це правило не встановлено, використовується каталог за умовчанням. Користувач може змінити його, додавши параметр командного рядка "--user-data-dir".</translation> <translation id="7008308728445338159">Увімкнено перевірку перехоплення системи DNS</translation> <translation id="7027785306666625591">Налаштовувати керування живленням в <ph name="PRODUCT_OS_NAME" />. @@ -4918,7 +4899,6 @@ <translation id="8424255554404582727">Указати значення обертання дисплея за умовчанням, яке відновлюватиметься під час кожного перезапуску</translation> <translation id="8426231401662877819">Обернути екран на 90 градусів за годинниковою стрілкою</translation> <translation id="8433186206711564395">Налаштування мережі</translation> -<translation id="8433423491036718210">Налаштування списку URL-адрес для входу підприємства, де служба захисту паролів має запитувати відбиток пальця замість пароля.</translation> <translation id="8445576299806775661">Chrome робитиме знімок певних даних веб-перегляду користувача після кожного важливого оновлення версії на випадок її екстреного відкочування в майбутньому. Якщо система екстрено відкочується до версії, для якої користувач має відповідний знімок, дані відновлюються з нього. Завдяки цьому користувачі можуть зберігати налаштування, такі як закладки й дані автозаповнення. Якщо це правило не налаштовано, використовуватиметься значення за умовчанням – 3.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index b494402..ac176f2 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -300,12 +300,6 @@ <translation id="1427655258943162134">Địa chỉ hoặc URL của máy chủ proxy</translation> <translation id="1435659902881071157">Cấu hình mạng ở mức thiết bị</translation> <translation id="1438739959477268107">Cài đặt tạo khóa mặc định</translation> -<translation id="1455804070656338445">Định cấu hình URL thay đổi mật khẩu (chỉ dành cho giao thức HTTP và HTTPS). Dịch vụ bảo vệ mật khẩu sẽ chuyển hướng người dùng đến URL này để thay đổi mật khẩu của họ sau khi thấy cảnh báo trên trình duyệt. - Để <ph name="PRODUCT_NAME" /> ghi lại chính xác vân tay số của mật khẩu mới trên trang thay đổi mật khẩu này, hãy đảm bảo trang thay đổi mật khẩu của bạn tuân thủ các nguyên tắc trên https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Nếu bạn bật tùy chọn cài đặt này, thì dịch vụ bảo vệ mật khẩu sẽ chuyển hướng người dùng đến URL này để thay đổi mật khẩu của họ sau khi thấy cảnh báo trên trình duyệt. - Nếu bạn tắt hoặc không đặt tùy chọn cài đặt này, thì dịch vụ bảo vệ mật khẩu sẽ chuyển hướng người dùng đến trang web https://myaccount.google.com để thay đổi mật khẩu của họ. - Chính sách này chỉ có trên các phiên bản Windows liên kết với miền <ph name="MS_AD_NAME" /> hoặc phiên bản Windows 10 Pro hay Enterprise đã đăng ký quản lý thiết bị.</translation> <translation id="1456822151187621582">Windows (ứng dụng <ph name="PRODUCT_OS_NAME" />):</translation> <translation id="1464848559468748897">Kiểm soát hành vi người dùng trong phiên có nhiều cấu hình trên thiết bị <ph name="PRODUCT_OS_NAME" />. @@ -363,6 +357,7 @@ Nếu bạn đặt chính sách "EnableMediaRouter" thành false, thì khi đó giá trị của chính sách này sẽ không có hiệu lực.</translation> <translation id="1509692106376861764">Chính sách này đã chấm dứt kể từ phiên bản <ph name="PRODUCT_NAME" /> 29.</translation> <translation id="1514888685242892912">Bật <ph name="PRODUCT_NAME" /></translation> +<translation id="1515230621229117540">Bật trình đơn hỗ trợ tiếp cận nổi</translation> <translation id="1515824657887788963">Cho phép một trang thực hiện các yêu cầu XHR đồng bộ trong khi đóng trang.</translation> <translation id="1522425503138261032">Cho phép các trang web theo dõi vị trí thực của người dùng</translation> <translation id="1523774894176285446">Trình duyệt thay thế để chạy các trang web đã định cấu hình.</translation> @@ -394,6 +389,7 @@ <translation id="1561424797596341174">Chính sách ghi đè dành cho bản dựng Gỡ lỗi của máy chủ truy cập từ xa</translation> <translation id="1561967320164410511">Tiện ích U2F+ để chứng thực cá nhân</translation> <translation id="1583248206450240930">Sử dụng <ph name="PRODUCT_FRAME_NAME" /> theo mặc định</translation> +<translation id="1588240398285670601">Cài đặt của trình duyệt</translation> <translation id="1599424828227887013">Bật tính năng Cách ly trang web cho nguồn gốc đã chỉ định trên thiết bị Android</translation> <translation id="1608755754295374538">Các URL sẽ được cấp quyền truy cập thiết bị ghi âm mà không cần phải hiển thị lời nhắc</translation> <translation id="1615221548356595305">Cho phép hợp nhất các đường kết nối HTTP/2 đối với những máy chủ này kể cả khi sử dụng chứng chỉ ứng dụng khách</translation> @@ -600,12 +596,6 @@ Nếu bạn đặt thành false, thì tính năng báo cáo số liệu và dữ liệu chẩn đoán sẽ bị tắt. Nếu bạn không định cấu hình, thì tính năng báo cáo số liệu và dữ liệu chẩn đoán sẽ bị tắt trên các thiết bị không được quản lý và được bật trên các thiết bị được quản lý.</translation> -<translation id="1907431809333268751">Định cấu hình danh sách URL đăng nhập của doanh nghiệp (chỉ dành cho giao thức HTTP và HTTPS). Vân tay số của mật khẩu sẽ được ghi lại trên những URL này và dùng để phát hiện trường hợp sử dụng lại mật khẩu. - Để <ph name="PRODUCT_NAME" /> ghi lại chính xác vân tay số của mật khẩu, hãy đảm bảo trang đăng nhập của bạn tuân thủ các nguyên tắc trên https://www.chromium.org/developers/design-documents/create-amazing-password-forms. - - Nếu bạn bật tùy chọn cài đặt này, thì dịch vụ bảo vệ mật khẩu sẽ ghi lại vân tay số của mật khẩu trên các URL này cho mục đích phát hiện trường hợp sử dụng lại mật khẩu. - Nếu bạn tắt hoặc không đặt tùy chọn cài đặt này, thì dịch vụ bảo vệ mật khẩu sẽ ghi lại vân tay số của mật khẩu trên trang web https://accounts.google.com. - Chính sách này chỉ có trên các phiên bản Windows liên kết với miền <ph name="MS_AD_NAME" /> hoặc phiên bản Windows 10 Pro hay Enterprise đã đăng ký quản lý thiết bị.</translation> <translation id="1910704279188129272">Cho phép đặt giới hạn sử dụng cho mỗi ứng dụng. Bạn có thể áp dụng giới hạn sử dụng cho các ứng dụng đã cài đặt trên <ph name="PRODUCT_OS_NAME" /> đối với người dùng cụ thể. Các giới hạn phải được chỉ định trong danh sách |app_limits|. Chỉ được phép áp dụng một giới hạn cho mỗi ứng dụng. Các ứng dụng không có trong danh sách này sẽ không bị giới hạn. @@ -1363,6 +1353,7 @@ <translation id="2872961005593481000">Tắt</translation> <translation id="2873651257716068683">Ghi đè kích thước trang in mặc định. Nếu không có kích thước trang in này thì chính sách sẽ bị bỏ qua.</translation> <translation id="2874209944580848064">Lưu ý dành cho thiết bị <ph name="PRODUCT_OS_NAME" /> hỗ trợ ứng dụng Android:</translation> +<translation id="2874901846804525128">Không cho phép người dùng sử dụng ứng dụng Android từ các nguồn không tin cậy.</translation> <translation id="2875192972412983412">Chỉ định tập hợp con các máy chủ máy in sẽ được truy vấn khi hệ thống tìm máy chủ máy in. Nếu bạn sử dụng chính sách này, thì chỉ những máy chủ máy in có mã nhận dạng khớp với các giá trị trong chính sách này mới được cung cấp cho người dùng. @@ -3003,6 +2994,7 @@ Nếu đặt thành đúng hoặc không định cấu hình, người dùng này có thể tạo và quản lý tài khoản người dùng bị giám sát.</translation> <translation id="5369937289900051171">Chỉ in màu</translation> <translation id="5370279767682621504">Bật hỗ trợ HTTP/0.9 trên các cổng không phải là cổng mặc định</translation> +<translation id="5377606826822211923">Kiểm soát việc người dùng sử dụng ứng dụng Android từ những nguồn không tin cậy</translation> <translation id="5378985487213287085">Cho phép bạn đặt liệu các trang web có được phép hiển thị thông báo trên màn hình hay không. Việc hiển thị thông báo trên màn hình có thể được cho phép theo mặc định, từ chối theo mặc định hoặc người dùng có thể được hỏi mỗi lần trang web muốn hiển thị thông báo trên màn hình. Nếu không thiết lập chính sách này, 'AskNotifications' sẽ được sử dụng và người dùng có thể thay đổi cài đặt này.</translation> @@ -3364,6 +3356,17 @@ Nếu không có cài đặt nào được cung cấp, <ph name="PRODUCT_NAME" /> sẽ quay trở lại sử dụng tên thư viện mặc định.</translation> <translation id="5783009211970309878">In đầu trang và chân trang</translation> +<translation id="5783576706065107606">Bật tùy chọn giảm thiểu kiểm tra <ph name="CORS" /> trong quy trình triển khai <ph name="CORS" /> mới, cho phép Tiện ích duy trì hành vi tương thích và cho phép <ph name="PRODUCT_NAME" /> gửi các tiêu đề đã chỉ định mà không cần kiểm tra <ph name="CORS" />. + + Nếu bạn đặt danh sách này thành trống, thì <ph name="PRODUCT_NAME" /> sẽ cố chạy Tiện ích theo cách thức tương thích và không làm thay đổi <ph name="API" /> đối với <ph name="PRODUCT_NAME" /> 79 như giải thích tại <ph name="WEB_REQUEST_API_MANUAL" />. + + Nếu bạn đặt danh sách này thành có tên tiêu đề yêu cầu <ph name="HTTP" />, thì quá trình kiểm tra <ph name="CORS" /> sẽ bật tùy chọn giảm thiểu cho Tiện ích và bỏ qua các tiêu đề có trong danh sách. + + Nếu bạn không đặt danh sách này, thì cả hai tùy chọn giảm thiểu giải thích ở trên đều không áp dụng. + + Để biết thông tin chi tiết về <ph name="CORS" />, hãy truy cập vào: <ph name="CORS_HELP_URL" />. + + Xin lưu ý rằng chúng tôi đã thông báo là chính sách này sẽ bị loại bỏ trong <ph name="PRODUCT_NAME" /> phiên bản 82. Tuy nhiên, kế hoạch đã thay đổi, chính sách này sẽ bị loại bỏ trong phiên bản 84.</translation> <translation id="5790763087505467169">Hạn chế các thông báo tự động chạy phiên khách được quản lý</translation> <translation id="5806128552675651249">Chỉ cho phép in không có đồ họa nền</translation> <translation id="5809210507920527553">Kiểm soát các tùy chọn cài đặt cho vùng chứa Linux (Crostini).</translation> @@ -3427,6 +3430,17 @@ Nếu cài đặt này bị tắt hoặc không được đặt thì tên miền TalkGadget mặc định ('chromoting-host.talkgadget.google.com') sẽ được sử dụng cho tất cả máy chủ. Các ứng dụng khách truy cập từ xa không bị ảnh hưởng bởi cài đặt chính sách này. Chúng sẽ luôn sử dụng 'chromoting-client.talkgadget.google.com' để truy cập vào TalkGadget.</translation> +<translation id="5888171512889380367">Sử dụng quy trình triển khai <ph name="CORS" /> cũ thay vì <ph name="CORS" /> mới. + + Nếu bạn đặt tùy chọn cài đặt này thành True, thì quy trình triển khai cũ tương thích với các phiên bản trước sẽ được sử dụng. + + Nếu bạn đặt tùy chọn cài đặt này thành False hoặc không đặt, thì quy trình triển khai mới sẽ được sử dụng và có thể gây ra các sự cố tương thích cụ thể đối với doanh nghiệp. + + Chính sách này sẽ bị loại bỏ sau một số mốc thời gian. + + Để biết thông tin chi tiết về <ph name="CORS" />, hãy truy cập vào: <ph name="CORS_HELP_URL" />. + + Xin lưu ý rằng chúng tôi đã thông báo là chính sách này sẽ bị loại bỏ trong <ph name="PRODUCT_NAME" /> phiên bản 82. Tuy nhiên, kế hoạch đã thay đổi, chính sách này sẽ bị loại bỏ trong phiên bản 84.</translation> <translation id="5893553533827140852">Nếu cài đặt này được bật, yêu cầu xác thực gnubby sẽ được proxy qua kết nối máy chủ từ xa. Nếu cài đặt này bị tắt hoặc không được định cấu hình, yêu cầu xác thực gnubby sẽ không được proxy.</translation> @@ -3717,6 +3731,11 @@ Chính sách này chỉ có trên các phiên bản Windows liên kết với miền <ph name="MS_AD_NAME" /> hoặc phiên bản Windows 10 Pro hay Enterprise đã đăng ký quản lý thiết bị.</translation> <translation id="6417265370957905582">Trợ lý Google</translation> +<translation id="6422575351619065453">Trong chế độ kiosk, hãy kiểm soát xem trình đơn hỗ trợ tiếp cận nổi có đang hiển thị hay không. + + Nếu bạn đặt chính sách này thành bật, thì trình đơn hỗ trợ tiếp cận nổi sẽ luôn hiển thị. + + Nếu bạn không đặt hoặc đặt chính sách này thành tắt, thì trình đơn hỗ trợ tiếp cận nổi sẽ không hiển thị.</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">Bạn không thể buộc ứng dụng Android sử dụng proxy. Tập hợp con của cài đặt proxy được cung cấp cho ứng dụng Android. Cài đặt mà ứng dụng có thể tự nguyện chọn để thực hiện: @@ -3815,6 +3834,7 @@ Xin lưu ý rằng EnabledPlugins và DisabledPluginsExceptions có thể ghi đè chính sách này. Nếu bạn không đặt chính sách này, thì người dùng có thể sử dụng bất kỳ plugin nào được cài đặt trên hệ thống, ngoại trừ các plugin không tương thích, lỗi thời hoặc nguy hiểm đã được mã hóa cứng.</translation> +<translation id="6571871508154591774">Tắt máy ảnh, các tùy chọn cài đặt của trình duyệt và của hệ điều hành</translation> <translation id="6573305661369899995">Đặt nguồn bên ngoài cho hạn chế URL</translation> <translation id="6583851521569686409">Định cấu hình danh sách máy in. @@ -3890,6 +3910,7 @@ <translation id="6731757988219967594">Lọc các trang web cấp cao nhất (không phải iframe được nhúng) có nội dung người lớn</translation> <translation id="6734521799274931721">Kiểm soát khả năng sử dụng của ứng dụng Chia sẻ tệp trong mạng trên Chrome OS</translation> <translation id="6735701345096330595">Buộc bật tính năng kiểm tra chính tả ngôn ngữ</translation> +<translation id="6737677282967014160">Cho phép người dùng sử dụng ứng dụng Android từ các nguồn không tin cậy.</translation> <translation id="6757613329154374267">Đã bật dịch vụ sao lưu và khôi phục</translation> <translation id="6758659208493449452">Chính sách này kiểm soát việc người dùng đăng ký chương trình Bảo vệ nâng cao có nhận được các tính năng tăng cường bảo vệ hay không. Một số tính năng trong số này có thể chia sẻ dữ liệu với Google (ví dụ: người dùng chương trình Bảo vệ nâng cao có thể gửi các tệp đã tải xuống cho Google để quét tìm phần mềm độc hại). Nếu bạn không đặt hoặc đặt chính sách này thành True, thì người dùng đã đăng ký sẽ nhận được các tính năng tăng cường bảo vệ. Nếu bạn đặt chính sách này thành False, thì người dùng chương trình Bảo vệ nâng cao sẽ chỉ nhận được các tính năng dành cho người dùng thông thường.</translation> <translation id="6762235610019366960">Cho phép bạn kiểm soát việc trình bày nội dung giáo dục và/hoặc quảng cáo dưới dạng toàn bộ tab trong <ph name="PRODUCT_NAME" />. @@ -4033,13 +4054,6 @@ Nếu không thiết lập chính sách này, người dùng có thể được hỏi có nhập hay không hoặc quá trình nhập có thể diễn ra tự động.</translation> <translation id="7003746348783715221">Tùy chọn <ph name="PRODUCT_NAME" /></translation> -<translation id="7007671350884342624">Định cấu hình thư mục <ph name="PRODUCT_NAME" /> sẽ sử dụng để lưu trữ dữ liệu người dùng. - - Nếu bạn đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ sử dụng thư mục được cung cấp bất kể người dùng có chỉ định cờ '--user-data-dir' hay không. Để tránh mất dữ liệu hoặc các lỗi không mong đợi khác, không nên đặt chính sách này thành thư mục gốc của ổ đĩa hoặc thành thư mục cho các mục đích khác, vì <ph name="PRODUCT_NAME" /> quản lý các nội dung của nó. - - Xem https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables để biết danh sách các biến có thể được sử dụng. - - Nếu chính sách này không được đặt thì đường dẫn hồ sơ mặc định sẽ được sử dụng và người dùng có thể ghi đè bằng cờ dòng lệnh '--user-data-dir'.</translation> <translation id="7008308728445338159">Đã bật các tùy chọn kiểm tra chặn hệ thống tên miền (DNS)</translation> <translation id="7027785306666625591">Định cấu hình việc quản lý nguồn trong <ph name="PRODUCT_OS_NAME" />. @@ -4430,6 +4444,13 @@ Các mẫu URL có cùng định dạng với chính sách 'URLBlacklist' được nêu tại https://www.chromium.org/administrators/url-blacklist-filter-format. </translation> <translation id="7566878661979235378">Loại xác thực đăng nhập SAML</translation> +<translation id="7567373982693549834">Chính sách này kiểm soát việc sử dụng ứng dụng Android từ những nguồn không tin cậy (không phải là Cửa hàng Google Play) của từng người dùng. + + Nếu không được đặt, thì giá trị mặc định của chính sách này sẽ là không cho phép. + + Nếu người dùng sử dụng thiết bị được quản lý, thì khả năng đặt chính sách này sẽ còn phụ thuộc vào chính sách tương ứng của thiết bị. + + Nếu người dùng sử dụng thiết bị không được quản lý, thì khả năng đặt chính sách này sẽ còn phụ thuộc vào việc người dùng có phải là chủ sở hữu thiết bị hay không.</translation> <translation id="757395965347379751">Khi bạn bật cài đặt này, <ph name="PRODUCT_NAME" /> sẽ cho phép các chứng chỉ có chữ ký SHA-1 miễn là các chứng chỉ xác thực thành công và cung cấp đến chứng chỉ CA được cài đặt cục bộ. Hãy lưu ý rằng chính sách này phụ thuộc vào ngăn xếp xác minh chứng chỉ hệ điều hành cho phép chữ ký SHA-1. Nếu bản cập nhật HĐH thay đổi khả năng xử lý HĐH của chứng chỉ SHA-1 thì chính sách này có thể không còn hiệu lực nữa. Ngoài ra, theo dự kiến, chính sách này sẽ là giải pháp tạm thời nhằm cho các doanh nghiệp thêm thời gian để di chuyển khỏi SHA-1. Chính sách này sẽ bị xóa vào hoặc khoảng ngày 01 tháng 01 năm 2019. @@ -4616,6 +4637,7 @@ Lưu ý: <ph name="DEVICE_LOGIN_SCREEN_HIGH_CONTRAST_ENABLED_POLICY_NAME" /> (nếu đã được chỉ định) sẽ ghi đè chính sách này.</translation> <translation id="7846952520291088817">URL cho các IP cục bộ hiển thị trong các ứng viên WebRTC ICE</translation> +<translation id="7848641140449742406">Cài đặt hệ điều hành</translation> <translation id="7858404742201086014">Nếu bạn bật tùy chọn cài đặt này, các plugin lỗi thời sẽ được sử dụng như những plugin bình thường. Nếu bạn tắt tùy chọn cài đặt này, các plugin lỗi thời sẽ không được sử dụng và người dùng sẽ không được yêu cầu cấp quyền để chạy các plugin đó. @@ -4943,7 +4965,6 @@ <translation id="8424255554404582727">Đặt chế độ xoay màn hình mặc định, được áp dụng lại mỗi lần khởi động lại</translation> <translation id="8426231401662877819">Xoay màn hình 90 độ theo chiều kim đồng hồ</translation> <translation id="8433186206711564395">Cài đặt mạng</translation> -<translation id="8433423491036718210">Định cấu hình danh sách các URL đăng nhập của doanh nghiệp mà dịch vụ bảo vệ mật khẩu sẽ quét dấu vân tay của mật khẩu.</translation> <translation id="8445576299806775661">Sau mỗi lần cập nhật phiên bản trên quy mô lớn, Chrome sẽ chụp nhanh một số phần dữ liệu duyệt web của người dùng để sử dụng trong trường hợp khôi phục phiên bản khẩn cấp diễn ra sau đó. Nếu tiến hành khôi phục khẩn cấp đối với một phiên bản mà người dùng có ảnh chụp nhanh tương ứng, thì dữ liệu trong ảnh chụp nhanh đó sẽ được khôi phục. Điều này cho phép người dùng giữ lại những tùy chọn cài đặt như dấu trang và dữ liệu tự động điền. Nếu bạn không đặt chính sách này, thì giá trị mặc định là 3 sẽ được sử dụng
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 292c79a..437e70e 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -284,12 +284,6 @@ <translation id="1427655258943162134">代理服务器的地址或网址</translation> <translation id="1435659902881071157">设备级网络配置</translation> <translation id="1438739959477268107">默认的密钥生成设置</translation> -<translation id="1455804070656338445">配置用于更改密码的网址(仅限 HTTP 和 HTTPS 方案)。当浏览器显示警告后,密码保护服务即会将用户转到此网址,以便其更改密码。 - 为了使 <ph name="PRODUCT_NAME" /> 能够正确捕获这一用于更改密码的页面中的新密码指纹,请务必确保该页面遵循了 https://www.chromium.org/developers/design-documents/create-amazing-password-forms 上所述的准则。 - - 如果启用了此设置,当浏览器中显示了警告后,密码保护服务即会将用户转到此网址,以便其更改密码。 - 如果停用了或未配置此设置,则密码保护服务会将用户转到 https://myaccount.google.com,以便其更改密码。 - 此政策仅适用于已加入 <ph name="MS_AD_NAME" /> 网域的 Windows 实例,或者已加入设备管理服务的 Windows 10 专业版或企业版实例。</translation> <translation id="1456822151187621582">Windows(<ph name="PRODUCT_OS_NAME" />客户端):</translation> <translation id="1464848559468748897">控制<ph name="PRODUCT_OS_NAME" />设备上多个人资料会话中的用户行为。 @@ -343,6 +337,7 @@ 如果“EnableMediaRouter”政策设为 false,那么此政策的值将不会发挥任何作用。</translation> <translation id="1509692106376861764">此政策从 <ph name="PRODUCT_NAME" /> 版本 29 起开始弃用。</translation> <translation id="1514888685242892912">启用 <ph name="PRODUCT_NAME" /></translation> +<translation id="1515230621229117540">启用悬浮无障碍功能菜单</translation> <translation id="1515824657887788963">允许页面在关闭过程中执行同步 XHR 请求。</translation> <translation id="1522425503138261032">允许网站跟踪用户的地理位置</translation> <translation id="1523774894176285446">对于配置的网站要启动的替代浏览器。</translation> @@ -569,12 +564,6 @@ 如果此政策设为 false,指标和诊断数据报告功能便会被停用。 如果未配置此政策,指标和诊断数据报告功能将会在非托管设备上停用,但会在托管设备上启用。</translation> -<translation id="1907431809333268751">配置企业登录网址(仅限 HTTP 和 HTTPS 方案)列表。系统会在这些网址上捕获密码指纹,并使用指纹进行密码重用检测。 - 为了使 <ph name="PRODUCT_NAME" /> 能够正确捕获密码指纹,请务必确保您的登录页面遵循了 https://www.chromium.org/developers/design-documents/create-amazing-password-forms 上所述的准则。 - - 如果启用了此设置,密码保护服务就会在这些网址上捕获密码指纹,以用于密码重用检测。 - 如果停用了或未设定此设置,则密码保护服务会仅在 https://accounts.google.com 上捕获密码指纹。 - 此政策仅适用于已加入 <ph name="MS_AD_NAME" /> 网域的 Windows 实例,或者已注册设备管理服务的 Windows 10 Pro 或 Enterprise 实例。</translation> <translation id="1910704279188129272">让您能够设置应用级使用限制。 使用限制可以针对给定用户应用于 <ph name="PRODUCT_OS_NAME" />上安装的应用。 使用限制应在 |app_limits| 列表中传递。只能为每个应用添加 1 个限制条目。未包含在此列表中的应用没有任何限制。 @@ -3228,6 +3217,17 @@ 如果此设置未指定,<ph name="PRODUCT_NAME" /> 将使用默认的库名称。</translation> <translation id="5783009211970309878">打印页眉和页脚</translation> +<translation id="5783576706065107606">在新版 <ph name="CORS" /> 实现方案中启用 <ph name="CORS" /> 检查缓解功能,从而允许扩展程序保持兼容的行为,并允许 <ph name="PRODUCT_NAME" /> 无需进行 <ph name="CORS" /> 检查便可发送指定标头。 + + 如果此列表设为空,<ph name="PRODUCT_NAME" /> 会尝试以兼容的方式运行扩展程序,而不会激活 <ph name="PRODUCT_NAME" /> 79 中引入的 <ph name="API" /> 更改(如 <ph name="WEB_REQUEST_API_MANUAL" /> 所述)。 + + 如果此列表设为包含 <ph name="HTTP" /> 请求标头名称,则 <ph name="CORS" /> 检查将会忽略所列的标头,并会为扩展程序启用缓解功能。 + + 如果此列表未设置,系统将不会应用上文介绍的两项缓解功能。 + + 如需详细了解 <ph name="CORS" />,请访问:<ph name="CORS_HELP_URL" />。 + + 请注意,我们曾宣布将在 <ph name="PRODUCT_NAME" /> 版本 82 中移除此政策,但该计划已改为在版本 84 中移除此政策。</translation> <translation id="5790763087505467169">减少受管理访客会话的自动启动通知</translation> <translation id="5806128552675651249">仅允许在没有背景图片的情况下打印</translation> <translation id="5809210507920527553">控制 Linux 容器 (Crostini) 的设置。</translation> @@ -3291,6 +3291,17 @@ 如果停用或未设置该设置,那么所有主机都将使用默认的 TalkGadget 域名(“chromoting-host.talkgadget.google.com”)。 远程访问客户端不受此策略设置影响。它们将始终使用“chromoting-client.talkgadget.google.com”访问 TalkGadget。</translation> +<translation id="5888171512889380367">使用旧版 <ph name="CORS" /> 实现方案,而非新版 <ph name="CORS" />。 + + 如果此设置设为 True,系统会使用旧版实现方案(此版实现方案应该会与以往的版本兼容)。 + + 如果此设置设为 False 或未设置,系统会使用新版实现方案(此版实现方案可能会导致出现特定于企业的兼容性问题)。 + + 在几个里程碑后,此政策将被移除。 + + 如需详细了解 <ph name="CORS" />,请访问:<ph name="CORS_HELP_URL" />。 + + 请注意,我们曾宣布将在 <ph name="PRODUCT_NAME" /> 版本 82 中移除此政策,但该计划已改为在版本 84 中移除此政策。</translation> <translation id="5893553533827140852">如果启用此设置,系统将通过远程主机连接经由代理处理gnubby身份验证请求。 如果您已停用或未配置此设置,那么系统将不会经由代理处理gnubby身份验证请求。</translation> @@ -3560,6 +3571,11 @@ 此政策仅适用于已加入 <ph name="MS_AD_NAME" /> 网域的 Windows 实例,或者已注册设备管理服务的 Windows 10 Pro 或 Enterprise 实例。</translation> <translation id="6417265370957905582">Google 助理</translation> +<translation id="6422575351619065453">在自助服务终端模式中,用于控制是否显示悬浮无障碍功能菜单。 + + 如果启用了此政策,悬浮无障碍功能菜单将始终显示。 + + 如果停用了或未设置此政策,悬浮无障碍功能菜单将始终不显示。</translation> <translation id="6424485010103067949"><ph name="OMA_URI" />:</translation> <translation id="6426205278746959912">您无法强制 Android 应用使用代理。一小部分代理设置已可供 Android 应用使用,此类应用可能会主动选择使用这些设置: @@ -3869,13 +3885,6 @@ 如果选择“U2F_EXTENDED”,集成的双重身份验证将不仅会提供 U2F 功能,还会提供一些扩展功能以便进行个人验证。</translation> <translation id="7003334574344702284">如果启用此政策,就会强制从先前的默认浏览器导入已保存的密码,还会影响导入对话框。如果停用此政策,就不会导入已保存的密码。如果未设置此政策,系统就会询问用户是否导入已保存的密码,或者系统自动进行导入。</translation> <translation id="7003746348783715221">“<ph name="PRODUCT_NAME" />”偏好设置</translation> -<translation id="7007671350884342624">配置 <ph name="PRODUCT_NAME" /> 在存储用户数据时所使用的目录。 - - 如果您设置了此政策,那么无论用户是否已指定“--user-data-dir”标记,<ph name="PRODUCT_NAME" /> 都将使用本政策提供的目录。请勿将此政策设置为某个卷的根目录或用于其他用途的目录(因为 <ph name="PRODUCT_NAME" /> 会管理相关内容),以免丢失数据或发生其他意外错误。 - - 有关可用变量的列表,请访问 https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables。 - - 如果未设置此政策,则系统将使用默认个人资料路径,而且日后用户将可以通过“--disk-cache-dir”命令行标记来替换此目录。</translation> <translation id="7008308728445338159">启用 DNS 拦截检查功能</translation> <translation id="7027785306666625591">配置<ph name="PRODUCT_OS_NAME" />中的电源管理设置。 @@ -4780,7 +4789,6 @@ <translation id="8424255554404582727">设置显示屏默认旋转角度,每次重新启动后都重新应用设置的角度</translation> <translation id="8426231401662877819">将屏幕顺时针旋转 90 度</translation> <translation id="8433186206711564395">网络设置</translation> -<translation id="8433423491036718210">配置企业登录网址列表,以便密码保护服务从这些网址中捕获密码指纹。</translation> <translation id="8445576299806775661">每次实施完重大版本更新后,Chrome 都会为用户浏览数据的某些部分创建快照,以供日后执行紧急版本回滚时使用。如果对某个版本执行了紧急回滚,且用户拥有与此版本对应的快照,系统便会恢复相应快照中的数据。这就使得用户能够继续拥有自己的书签和自动填充数据等设置。 如果此政策未设置,系统将会使用默认值(即 3)
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index d437d8a..4a95802 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -289,12 +289,6 @@ <translation id="1427655258943162134">Proxy 伺服器的地址或網址</translation> <translation id="1435659902881071157">裝置層級網路設定</translation> <translation id="1438739959477268107">預設金鑰產生設定</translation> -<translation id="1455804070656338445">設定變更密碼網址 (僅限 HTTP 和 HTTPS 配置)。當密碼保護服務偵測到瀏覽器中出現警告訊息後,就會將使用者導向至這個網址,讓他們變更密碼。 - 為了讓 <ph name="PRODUCT_NAME" /> 能在這個變更密碼頁面中正確擷取新的密碼指紋,請確認變更密碼頁面符合以下網址所述的規範:https://www.chromium.org/developers/design-documents/create-amazing-password-forms.。 - - 如果啟用這項設定,當密碼保護服務偵測到瀏覽器中出現警告訊息後,就會將使用者導向至這個網址,讓他們變更密碼。 - 如果停用這項設定或不予設定,則密碼保護服務會將使用者導向至 https://myaccount.google.com,讓他們變更密碼。 - 這項政策僅適用於已加入 <ph name="MS_AD_NAME" /> 網域的 Windows 執行個體,或是已註冊裝置管理服務的 Windows 10 專業版或企業版執行個體。</translation> <translation id="1456822151187621582">Windows (<ph name="PRODUCT_OS_NAME" />用戶端):</translation> <translation id="1464848559468748897">針對使用者在 <ph name="PRODUCT_OS_NAME" /> 裝置多重設定檔工作階段中的行為進行控制。 @@ -587,11 +581,6 @@ 如果設為 false,指標和診斷資料回報功能就會停用。 如果未設定,指標和診斷資料回報功能會在未受管理的裝置上停用,並且在受管理的裝置上啟用。</translation> -<translation id="1907431809333268751">設定企業登入網址清單 (僅限 HTTP 和 HTTPS 配置)。系統會針對這些網址擷取密碼指紋,並使用這些指紋偵測密碼重複使用情形。 - 為了讓 <ph name="PRODUCT_NAME" /> 能正確擷取密碼指紋,請確認登入頁面符合相關規範,網址是:https://www.chromium.org/developers/design-documents/create-amazing-password-forms。 - 如果啟用這項設定,密碼保護服務會針對這些網址擷取密碼指紋,並使用這些指紋偵測密碼重複使用情形。 - 如果停用這項設定或不予設定,密碼保護服務就只會針對 https://accounts.google.com 擷取密碼指紋。 - 這項政策僅適用於已加入 <ph name="MS_AD_NAME" /> 網域的 Windows 執行個體,或是已註冊裝置管理服務的 Windows 10 專業版或企業版執行個體。</translation> <translation id="1910704279188129272">可讓你設定個別應用程式的使用限制。 使用限制可套用到指定使用者在 <ph name="PRODUCT_OS_NAME" />上安裝的應用程式。 你必須透過 |app_limits| 清單指定限制。每個應用程式只能設定一個項目。不在清單中的應用程式不會受到限制。 @@ -3928,13 +3917,6 @@ 如果選取 [U2F_EXTENDED],整合式雙重驗證會為個人認證提供 U2F 功能和一些擴充功能。</translation> <translation id="7003334574344702284">如果啟用這項政策,則會強制從之前的預設瀏覽器匯入儲存的密碼,並影響匯入對話方塊。如果停用這項政策,則不會匯入儲存的密碼。如果未設定這項政策,系統會自動匯入儲存的密碼,或詢問使用者是否要匯入儲存的密碼。</translation> <translation id="7003746348783715221"><ph name="PRODUCT_NAME" /> 偏好設定</translation> -<translation id="7007671350884342624">設定 <ph name="PRODUCT_NAME" /> 在儲存使用者資料時所使用的目錄。 - - 如果設定這項政策,無論使用者是否指定「--user-data-dir」標記,<ph name="PRODUCT_NAME" /> 都會使用您所提供的目錄。請勿將這項政策設為磁碟區的根目錄或用於其他用途的目錄 (因為 <ph name="PRODUCT_NAME" /> 會管理相關內容),以免遺失資料或發生其他未預期的錯誤。 - - 如需可使用的變數清單,請參閱 https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables。 - - 如果未設定這項政策,系統會使用預設的設定檔目錄,日後使用者可以自行透過「'--user-data-dir」命令列標記覆寫這個目錄。</translation> <translation id="7008308728445338159">已啟用 DNS 攔截檢查功能</translation> <translation id="7027785306666625591">設定 <ph name="PRODUCT_OS_NAME" /> 的電源管理。 @@ -4831,7 +4813,6 @@ <translation id="8424255554404582727">設定畫面旋轉預設值 (每次重新啟動皆重新套用)</translation> <translation id="8426231401662877819">將畫面以順時針方向旋轉 90 度</translation> <translation id="8433186206711564395">網路設定</translation> -<translation id="8433423491036718210">設定企業登入網址清單,以便密碼保護服務從這些網址擷取密碼指紋。</translation> <translation id="8445576299806775661">Chrome 會在每次更新主要版本時,為一部分的使用者瀏覽資料建立快照,以便日後需要執行緊急版本復原作業時使用。如果使用者要緊急復原的目標版本有相應快照,系統會復原快照中的資料。這種做法可讓使用者保留書籤和自動填入資料等設定。 如果不設定這項政策,系統會使用預設值 3
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index 214893c6..5fb51e7 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1289,10 +1289,6 @@ void PrintRenderFrameHelper::OnPrintPreviewDialogClosed() { ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr()); - // TODO(jschettler): Remove these CHECKs when finished investigating - // https://crbug.com/1019847. - CHECK(!render_frame_gone_); - CHECK(print_preview_context_.source_frame()); print_preview_context_.source_frame()->DispatchAfterPrintEvent(); } #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) @@ -2637,9 +2633,7 @@ blink::WebLocalFrame* PrintRenderFrameHelper::PrintPreviewContext::source_frame() { - // TODO(jschettler): Change this back to DCHECK when finished investigating - // https://crbug.com/1019847. - CHECK(state_ != UNINITIALIZED); + DCHECK(state_ != UNINITIALIZED); return source_frame_.GetFrame(); }
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.cc b/components/safe_browsing/core/common/safe_browsing_prefs.cc index 71928ff7..dda2451 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs.cc +++ b/components/safe_browsing/core/common/safe_browsing_prefs.cc
@@ -146,12 +146,14 @@ } bool IsSafeBrowsingEnabled(const PrefService& prefs) { - return prefs.GetBoolean(prefs::kSafeBrowsingEnabled) || - IsEnhancedProtectionEnabled(prefs); + return prefs.GetBoolean(prefs::kSafeBrowsingEnabled); } bool IsEnhancedProtectionEnabled(const PrefService& prefs) { + // SafeBrowsingEnabled is checked too due to devices being out + // of sync or not on a version that includes SafeBrowsingEnhanced pref. return prefs.GetBoolean(prefs::kSafeBrowsingEnhanced) && + IsSafeBrowsingEnabled(prefs) && base::FeatureList::IsEnabled(kEnhancedProtection); } @@ -251,6 +253,9 @@ } void SetEnhancedProtectionPref(PrefService* prefs, bool value) { + // SafeBrowsingEnabled pref needs to be turned on in order for enhanced + // protection pref to be turned on. This method is only used for tests. + prefs->SetBoolean(prefs::kSafeBrowsingEnabled, value); prefs->SetBoolean(prefs::kSafeBrowsingEnhanced, value); }
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs_unittest.cc b/components/safe_browsing/core/common/safe_browsing_prefs_unittest.cc index d64df45..59ee1f1 100644 --- a/components/safe_browsing/core/common/safe_browsing_prefs_unittest.cc +++ b/components/safe_browsing/core/common/safe_browsing_prefs_unittest.cc
@@ -135,6 +135,13 @@ safe_browsing::kEnhancedProtection); EXPECT_TRUE(IsEnhancedProtectionEnabled(prefs_)); } + { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + safe_browsing::kEnhancedProtection); + prefs_.SetBoolean(prefs::kSafeBrowsingEnabled, false); + EXPECT_FALSE(IsEnhancedProtectionEnabled(prefs_)); + } } TEST_F(SafeBrowsingPrefsTest, IsExtendedReportingPolicyManaged) {
diff --git a/components/schema_org/extractor.cc b/components/schema_org/extractor.cc index 3af88bd..46dd6818 100644 --- a/components/schema_org/extractor.cc +++ b/components/schema_org/extractor.cc
@@ -76,6 +76,12 @@ schema_org::property::PropertyConfiguration prop_config = schema_org::property::GetPropertyConfiguration(property_type); if (prop_config.number) { + int64_t l; + bool parsed_long = base::StringToInt64(value, &l); + if (parsed_long) { + values->long_values.push_back(l); + return true; + } double d; bool parsed_double = base::StringToDouble(value, &d); if (parsed_double) {
diff --git a/components/schema_org/extractor_unittest.cc b/components/schema_org/extractor_unittest.cc index 01d33c6f..d36e058 100644 --- a/components/schema_org/extractor_unittest.cc +++ b/components/schema_org/extractor_unittest.cc
@@ -200,6 +200,19 @@ EXPECT_EQ(expected, extracted); } +TEST_F(SchemaOrgExtractorTest, StringValueRepresentingLong) { + EntityPtr extracted = + Extract("{\"@type\": \"VideoObject\",\"copyrightYear\": \"1999\"}"); + + ASSERT_FALSE(extracted.is_null()); + + EntityPtr expected = Entity::New(); + expected->type = "VideoObject"; + expected->properties.push_back(CreateLongProperty("copyrightYear", 1999)); + + EXPECT_EQ(expected, extracted); +} + TEST_F(SchemaOrgExtractorTest, StringValueRepresentingDouble) { EntityPtr extracted = Extract("{\"@type\": \"VideoObject\",\"copyrightYear\": \"1999.5\"}");
diff --git a/components/search_engines/BUILD.gn b/components/search_engines/BUILD.gn index e67da17..c85c47b 100644 --- a/components/search_engines/BUILD.gn +++ b/components/search_engines/BUILD.gn
@@ -87,7 +87,10 @@ "android/template_url_service_android.h", ] - deps += [ "//components/search_engines/android:jni_headers" ] + deps += [ + "//components/search_engines/android:jni_headers", + "//url:gurl_android", + ] } if (!is_ios) {
diff --git a/components/search_engines/android/BUILD.gn b/components/search_engines/android/BUILD.gn index 2131e7b..9190524 100644 --- a/components/search_engines/android/BUILD.gn +++ b/components/search_engines/android/BUILD.gn
@@ -9,6 +9,7 @@ "//base:base_java", "//base:jni_java", "//content/public/android:content_java", + "//url:gurl_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
diff --git a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java index 2fd43dd..116645c7 100644 --- a/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java +++ b/components/search_engines/android/java/src/org/chromium/components/search_engines/TemplateUrlService.java
@@ -13,6 +13,7 @@ import org.chromium.base.annotations.NativeMethods; import org.chromium.base.task.PostTask; import org.chromium.content_public.browser.UiThreadTaskTraits; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -251,9 +252,19 @@ } /** + * See {@link #getSearchQueryForUrl(GURL)}. + * + * @deprecated Please use {@link #getSearchQueryForUrl(GURL)} instead. + */ + @Deprecated + public String getSearchQueryForUrl(String url) { + return getSearchQueryForUrl(new GURL(url)); + } + + /** * Finds the query in the url, if any. Returns empty if no query is present. */ - public String getSearchQueryForUrl(String url) { + public String getSearchQueryForUrl(GURL url) { return TemplateUrlServiceJni.get().getSearchQueryForUrl( mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, url); } @@ -266,7 +277,7 @@ * @return A {@link String} that contains the url of the default search engine with * {@code query} inserted as the search parameter and voice input source param set. */ - public String getUrlForVoiceSearchQuery(String query) { + public GURL getUrlForVoiceSearchQuery(String query) { return TemplateUrlServiceJni.get().getUrlForVoiceSearchQuery( mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, query); } @@ -282,7 +293,7 @@ * {@code query} and {@code alternateTerm} inserted as parameters and contextual * search and prefetch parameters conditionally set. */ - public String getUrlForContextualSearchQuery( + public GURL getUrlForContextualSearchQuery( String query, String alternateTerm, boolean shouldPrefetch, String protocolVersion) { return TemplateUrlServiceJni.get().getUrlForContextualSearchQuery( mNativeTemplateUrlServiceAndroid, TemplateUrlService.this, query, alternateTerm, @@ -357,10 +368,10 @@ String getUrlForSearchQuery( long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String query); String getSearchQueryForUrl( - long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String url); - String getUrlForVoiceSearchQuery( + long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, GURL url); + GURL getUrlForVoiceSearchQuery( long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String query); - String getUrlForContextualSearchQuery(long nativeTemplateUrlServiceAndroid, + GURL getUrlForContextualSearchQuery(long nativeTemplateUrlServiceAndroid, TemplateUrlService caller, String query, String alternateTerm, boolean shouldPrefetch, String protocolVersion); String getSearchEngineUrlFromTemplateUrl(
diff --git a/components/search_engines/android/template_url_service_android.cc b/components/search_engines/android/template_url_service_android.cc index 96d5107a..5a23825 100644 --- a/components/search_engines/android/template_url_service_android.cc +++ b/components/search_engines/android/template_url_service_android.cc
@@ -25,6 +25,8 @@ #include "components/search_engines/template_url_service.h" #include "components/search_engines/util.h" #include "net/base/url_util.h" +#include "url/android/gurl_android.h" +#include "url/gurl.h" using base::android::JavaParamRef; using base::android::ScopedJavaLocalRef; @@ -157,44 +159,44 @@ TemplateUrlServiceAndroid::GetSearchQueryForUrl( JNIEnv* env, const JavaParamRef<jobject>& obj, - const JavaParamRef<jstring>& jurl) { + const JavaParamRef<jobject>& jurl) { const TemplateURL* default_provider = template_url_service_->GetDefaultSearchProvider(); - GURL url(base::android::ConvertJavaStringToUTF8(env, jurl)); + std::unique_ptr<GURL> url = url::GURLAndroid::ToNativeGURL(env, jurl); + base::string16 query; if (default_provider && default_provider->url_ref().SupportsReplacement( template_url_service_->search_terms_data()) && template_url_service_->IsSearchResultsPageFromDefaultSearchProvider( - url)) { + *url)) { default_provider->ExtractSearchTermsFromURL( - url, template_url_service_->search_terms_data(), &query); + *url, template_url_service_->search_terms_data(), &query); } return base::android::ConvertUTF16ToJavaString(env, query); } -base::android::ScopedJavaLocalRef<jstring> +base::android::ScopedJavaLocalRef<jobject> TemplateUrlServiceAndroid::GetUrlForVoiceSearchQuery( JNIEnv* env, const JavaParamRef<jobject>& obj, const JavaParamRef<jstring>& jquery) { base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery)); - std::string url; if (!query.empty()) { GURL gurl(GetDefaultSearchURLForSearchTerms(template_url_service_, query)); if (google_util::IsGoogleSearchUrl(gurl)) gurl = net::AppendQueryParameter(gurl, "inm", "vs"); - url = gurl.spec(); + return url::GURLAndroid::FromNativeGURL(env, gurl); } - return base::android::ConvertUTF8ToJavaString(env, url); + return url::GURLAndroid::EmptyGURL(env); } -base::android::ScopedJavaLocalRef<jstring> +base::android::ScopedJavaLocalRef<jobject> TemplateUrlServiceAndroid::GetUrlForContextualSearchQuery( JNIEnv* env, const JavaParamRef<jobject>& obj, @@ -203,7 +205,6 @@ jboolean jshould_prefetch, const JavaParamRef<jstring>& jprotocol_version) { base::string16 query(base::android::ConvertJavaStringToUTF16(env, jquery)); - std::string url; if (!query.empty()) { GURL gurl(GetDefaultSearchURLForSearchTerms(template_url_service_, query)); @@ -225,10 +226,10 @@ } } } - url = gurl.spec(); + return url::GURLAndroid::FromNativeGURL(env, gurl); } - return base::android::ConvertUTF8ToJavaString(env, url); + return url::GURLAndroid::EmptyGURL(env); } base::android::ScopedJavaLocalRef<jstring>
diff --git a/components/search_engines/android/template_url_service_android.h b/components/search_engines/android/template_url_service_android.h index 1ec00c0..8b3b16ad 100644 --- a/components/search_engines/android/template_url_service_android.h +++ b/components/search_engines/android/template_url_service_android.h
@@ -48,12 +48,12 @@ base::android::ScopedJavaLocalRef<jstring> GetSearchQueryForUrl( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, - const base::android::JavaParamRef<jstring>& jurl); - base::android::ScopedJavaLocalRef<jstring> GetUrlForVoiceSearchQuery( + const base::android::JavaParamRef<jobject>& jurl); + base::android::ScopedJavaLocalRef<jobject> GetUrlForVoiceSearchQuery( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jstring>& jquery); - base::android::ScopedJavaLocalRef<jstring> GetUrlForContextualSearchQuery( + base::android::ScopedJavaLocalRef<jobject> GetUrlForContextualSearchQuery( JNIEnv* env, const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jstring>& jquery,
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 2dd4d55..fe159cf 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -119,7 +119,7 @@ <translation id="1430915738399379752">Imprimir</translation> <translation id="1442386063175183758">Plegado en ventana a la derecha</translation> <translation id="1442987760062738829">Perforar</translation> -<translation id="1455413310270022028">Borrador</translation> +<translation id="1455413310270022028">Goma de borrar</translation> <translation id="1462245070427461050">JIS B9</translation> <translation id="1463543813647160932">5x7</translation> <translation id="1467432559032391204">Izquierda</translation> @@ -1653,7 +1653,7 @@ <translation id="8025119109950072390">Es posible que los atacantes que se encuentren en este sitio web intenten engañarte para que realices una acción peligrosa, como instalar software o revelar tu información personal (por ejemplo, contraseñas, números de teléfono o tarjetas de crédito).</translation> <translation id="8028960012888758725">Recortar después de la tarea</translation> <translation id="8034522405403831421">Esta página está escrita en <ph name="SOURCE_LANGUAGE" />. ¿Quieres traducirla al <ph name="TARGET_LANGUAGE" />?</translation> -<translation id="8035152190676905274">Bolígrafo</translation> +<translation id="8035152190676905274">Pluma</translation> <translation id="8037117624646282037">Quién ha usado este dispositivo recientemente</translation> <translation id="8037357227543935929">Preguntar (predeterminado)</translation> <translation id="803771048473350947">Archivo</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 6dbd391..714525ab 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -52,7 +52,7 @@ <translation id="1197088940767939838">Oranža</translation> <translation id="1201402288615127009">Tālāk</translation> <translation id="1201895884277373915">Vairāk no šīs vietnes</translation> -<translation id="1205963431094182634">Pierakstieties, lai izmantotu jūsu Google kontā saglabātās paroles</translation> +<translation id="1205963431094182634">Pierakstieties, lai izmantotu savā Google kontā saglabātās paroles</translation> <translation id="1206967143813997005">Sākotnējais paraksts nav derīgs</translation> <translation id="1209206284964581585">Pagaidām slēpt</translation> <translation id="121201262018556460">Jūs centāties sasniegt <ph name="DOMAIN" />, bet servera uzrādītais sertifikāts satur vāju atslēgu. Iespējams, uzbrucējs ir uzlauzis privāto atslēgu un serveris var nebūt tas, ko centāties sasniegt (iespējams, jūs sazināties ar uzbrucēju).</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 28ff72d..e8ce01d 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">सुन्तला रङ</translation> <translation id="1201402288615127009">अर्को</translation> <translation id="1201895884277373915">यस साइटबाट थप</translation> +<translation id="1205963431094182634">आफ्नो Google खातामा भण्डारण गरिएका पासवर्डहरू प्रयोग गर्न साइन इन गर्नुहोस्</translation> <translation id="1206967143813997005">प्रारम्भिक हस्ताक्षर त्रुटिपूर्ण छ</translation> <translation id="1209206284964581585">अहिलेका लागि लुकाउनुहोस्</translation> <translation id="121201262018556460">तपाईंले <ph name="DOMAIN" /> मा पुग्ने प्रयत्न गर्नुभयो, तर सर्भरले एउटा कमजोर कुञ्जी भएको प्रमाणपत्र प्रस्तुत गर्यो। कुनै आक्रमणकारीले निजी कुञ्जीलाई तोडेको हुन सक्छ, र त्यो सर्भर तपाईंले अपेक्षा गर्नुभएको सर्भर नहुन सक्छ (तपाईं एउटा आक्रमणकारीसँग सञ्चारण गरिरहनुभएको हुन सक्छ)।</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 69c9f73..0d57aa5d 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -1351,7 +1351,7 @@ <translation id="6757797048963528358">Qurilma uyqu rejimiga o‘tib qoldi.</translation> <translation id="6768213884286397650">Hagaki (Postcard)</translation> <translation id="6775759552199460396">JIS B2</translation> -<translation id="67862343314499040">Binafsharang</translation> +<translation id="67862343314499040">Siyohrang</translation> <translation id="6786747875388722282">Kengaytmalar</translation> <translation id="6790428901817661496">Ijro etish</translation> <translation id="679355240208270552">E’tiborsiz qoldiriladi, chunki qoidada asosiy qidiruv tizimi berilmagan</translation> @@ -1428,7 +1428,7 @@ <translation id="714064300541049402">Tasvirning orqa tomondagi X oʻqidagi siljish</translation> <translation id="7152423860607593928">Number-14 (Envelope)</translation> <translation id="7153549335910886479">{PAYMENT_METHOD,plural, =0{<ph name="PAYMENT_METHOD_PREVIEW" />}=1{<ph name="PAYMENT_METHOD_PREVIEW" /> va yana <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ta}other{<ph name="PAYMENT_METHOD_PREVIEW" /> va yana <ph name="NUMBER_OF_ADDITIONAL_PAYMENT_METHODS" /> ta}}</translation> -<translation id="7153618581592392745">Och binafsharang</translation> +<translation id="7153618581592392745">Och siyohrang</translation> <translation id="7156870133441232244">Server TLS 1.2 yoki undan yuqori versiyaga yangilanishi lozim.</translation> <translation id="717330890047184534">Gaia ID:</translation> <translation id="7174545416324379297">Birlashtirildi</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index 5fa257f3..1f614d08 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -52,6 +52,7 @@ <translation id="1197088940767939838">Màu cam</translation> <translation id="1201402288615127009">Tiếp theo</translation> <translation id="1201895884277373915">Thêm từ trang web này</translation> +<translation id="1205963431094182634">Đăng nhập để sử dụng mật khẩu lưu trữ trong Tài khoản Google của bạn</translation> <translation id="1206967143813997005">Chữ ký ban đầu không hợp lệ</translation> <translation id="1209206284964581585">Ẩn ngay bây giờ</translation> <translation id="121201262018556460">Bạn đã cố truy cập vào <ph name="DOMAIN" /> nhưng máy chủ xuất trình chứng chỉ chứa khóa yếu. Kẻ tấn công có thể đã phá khóa cá nhân và máy chủ đó có thể không phải là máy chủ bạn mong đợi (bạn có thể đang giao tiếp với một kẻ tấn công).</translation>
diff --git a/components/test/data/password_manager/login_db_v27.sql b/components/test/data/password_manager/login_db_v27.sql new file mode 100644 index 0000000..2089baa --- /dev/null +++ b/components/test/data/password_manager/login_db_v27.sql
@@ -0,0 +1,127 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); +INSERT INTO "meta" VALUES('last_compatible_version','19'); +INSERT INTO "meta" VALUES('version','27'); +CREATE TABLE logins ( +origin_url VARCHAR NOT NULL, +action_url VARCHAR, +username_element VARCHAR, +username_value VARCHAR, +password_element VARCHAR, +password_value BLOB, +submit_element VARCHAR, +signon_realm VARCHAR NOT NULL, +preferred INTEGER NOT NULL, +date_created INTEGER NOT NULL, +blacklisted_by_user INTEGER NOT NULL, +scheme INTEGER NOT NULL, +password_type INTEGER, +times_used INTEGER, +form_data BLOB, +date_synced INTEGER, +display_name VARCHAR, +icon_url VARCHAR, +federation_url VARCHAR, +skip_zero_click INTEGER, +generation_upload_status INTEGER, +possible_username_pairs BLOB, +id INTEGER PRIMARY KEY AUTOINCREMENT, +date_last_used INTEGER, +moving_blocked_for BLOB, +UNIQUE (origin_url, username_element, username_value, password_element, signon_realm)); +INSERT INTO "logins" (origin_url,action_url,username_element,username_value,password_element,password_value,submit_element,signon_realm,preferred,date_created,blacklisted_by_user,scheme,password_type,times_used,form_data,date_synced,display_name,icon_url,federation_url,skip_zero_click,generation_upload_status,possible_username_pairs,date_last_used,moving_blocked_for) VALUES( +'https://accounts.google.com/ServiceLogin', /* origin_url */ +'https://accounts.google.com/ServiceLoginAuth', /* action_url */ +'Email', /* username_element */ +'theerikchen', /* username_value */ +'Passwd', /* password_element */ +X'', /* password_value */ +'', /* submit_element */ +'https://accounts.google.com/', /* signon_realm */ +1, /* preferred */ +13047429345000000, /* date_created */ +0, /* blacklisted_by_user */ +0, /* scheme */ +0, /* password_type */ +1, /* times_used */ +X'18000000020000000000000000000000000000000000000000000000', /* form_data */ +0, /* date_synced */ +'', /* display_name */ +'', /* icon_url */ +'', /* federation_url */ +1, /* skip_zero_click */ +0, /* generation_upload_status */ +X'00000000', /* possible_username_pairs */ +0, /* date_last_used */ +X'' /* moving_blocked_for */ +); +INSERT INTO "logins" (origin_url,action_url,username_element,username_value,password_element,password_value,submit_element,signon_realm,preferred,date_created,blacklisted_by_user,scheme,password_type,times_used,form_data,date_synced,display_name,icon_url,federation_url,skip_zero_click,generation_upload_status,possible_username_pairs,date_last_used,moving_blocked_for) VALUES( +'https://accounts.google.com/ServiceLogin', /* origin_url */ +'https://accounts.google.com/ServiceLoginAuth', /* action_url */ +'Email', /* username_element */ +'theerikchen2', /* username_value */ +'Passwd', /* password_element */ +X'', /* password_value */ +'non-empty', /* submit_element */ +'https://accounts.google.com/', /* signon_realm */ +1, /* preferred */ +13047423600000000, /* date_created */ +0, /* blacklisted_by_user */ +0, /* scheme */ +0, /* password_type */ +1, /* times_used */ +X'18000000020000000000000000000000000000000000000000000000', /* form_data */ +0, /* date_synced */ +'', /* display_name */ +'https://www.google.com/icon', /* icon_url */ +'', /* federation_url */ +1, /* skip_zero_click */ +0, /* generation_upload_status */ +X'00000000', /* possible_username_pairs */ +0, /* date_last_used */ +X'2400000020000000931DDD1C53CCD2CE11C30C3027798FF7E31CCFE83FB086F3A7797F404D647332' /* moving_blocked_for */ +); +INSERT INTO "logins" (origin_url,action_url,username_element,username_value,password_element,password_value,submit_element,signon_realm,preferred,date_created,blacklisted_by_user,scheme,password_type,times_used,form_data,date_synced,display_name,icon_url,federation_url,skip_zero_click,generation_upload_status,possible_username_pairs,date_last_used,moving_blocked_for) VALUES( +'http://example.com', /* origin_url */ +'http://example.com/landing', /* action_url */ +'', /* username_element */ +'user', /* username_value */ +'', /* password_element */ +X'', /* password_value */ +'non-empty', /* submit_element */ +'http://example.com', /* signon_realm */ +1, /* preferred */ +13047423600000000, /* date_created */ +0, /* blacklisted_by_user */ +1, /* scheme */ +0, /* password_type */ +1, /* times_used */ +X'18000000020000000000000000000000000000000000000000000000', /* form_data */ +0, /* date_synced */ +'', /* display_name */ +'https://www.google.com/icon', /* icon_url */ +'', /* federation_url */ +1, /* skip_zero_click */ +0, /* generation_upload_status */ +X'00000000', /* possible_username_pairs */ +0, /* date_last_used */ +X'' /* moving_blocked_for */ +); +CREATE INDEX logins_signon ON logins (signon_realm); +CREATE TABLE stats ( +origin_domain VARCHAR NOT NULL, +username_value VARCHAR, +dismissal_count INTEGER, +update_time INTEGER NOT NULL, +UNIQUE(origin_domain, username_value)); +CREATE INDEX stats_origin ON stats(origin_domain); +CREATE TABLE sync_entities_metadata ( + storage_key INTEGER PRIMARY KEY AUTOINCREMENT, + metadata VARCHAR NOT NULL +); +CREATE TABLE sync_model_metadata ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + metadata VARCHAR NOT NULL +); +COMMIT;
diff --git a/components/variations/service/variations_service_unittest.cc b/components/variations/service/variations_service_unittest.cc index 107879e8..175c344 100644 --- a/components/variations/service/variations_service_unittest.cc +++ b/components/variations/service/variations_service_unittest.cc
@@ -535,13 +535,13 @@ bool gzip_compressed; bool seed_stored; } cases[] = { - {"", false, false, true}, - {"IM:gzip", false, true, true}, - {"IM:x-bm", true, false, true}, - {"IM:x-bm,gzip", true, true, true}, - {"IM: x-bm, gzip", true, true, true}, - {"IM:gzip,x-bm", false, false, false}, - {"IM:deflate,x-bm,gzip", false, false, false}, + {"", false, false, true}, + {"gzip", false, true, true}, + {"x-bm", true, false, true}, + {"x-bm,gzip", true, true, true}, + {" x-bm, gzip", true, true, true}, + {"gzip,x-bm", false, false, false}, + {"deflate,x-bm,gzip", false, false, false}, }; std::string serialized_seed = SerializeSeed(CreateTestSeed()); @@ -558,7 +558,7 @@ head->headers = base::MakeRefCounted<net::HttpResponseHeaders>( net::HttpUtil::AssembleRawHeaders(headers)); if (!cases[i].im.empty()) - head->headers->AddHeader(cases[i].im); + head->headers->SetHeader("IM", cases[i].im); network::URLLoaderCompletionStatus status; status.decoded_body_length = serialized_seed.size(); service.test_url_loader_factory()->AddResponse( @@ -587,7 +587,7 @@ auto head = network::mojom::URLResponseHead::New(); head->headers = base::MakeRefCounted<net::HttpResponseHeaders>( net::HttpUtil::AssembleRawHeaders(headers)); - head->headers->AddHeader("X-Country: test"); + head->headers->SetHeader("X-Country", "test"); network::URLLoaderCompletionStatus status; status.decoded_body_length = serialized_seed.size(); service.test_url_loader_factory()->AddResponse( @@ -888,14 +888,12 @@ std::string response; ASSERT_TRUE(base::Base64Decode(kBase64SeedData, &response)); - const std::string seed_signature_header = - std::string("X-Seed-Signature:") + kBase64SeedSignature; std::string headers("HTTP/1.1 200 OK\n\n"); auto head = network::mojom::URLResponseHead::New(); head->headers = base::MakeRefCounted<net::HttpResponseHeaders>( net::HttpUtil::AssembleRawHeaders(headers)); - head->headers->AddHeader(seed_signature_header); + head->headers->SetHeader("X-Seed-Signature", kBase64SeedSignature); network::URLLoaderCompletionStatus status; status.decoded_body_length = response.size(); service.test_url_loader_factory()->AddResponse( @@ -1058,8 +1056,6 @@ std::string response; ASSERT_TRUE(base::Base64Decode(kBase64SeedData, &response)); - const std::string seed_signature_header = - std::string("X-Seed-Signature:") + kBase64SeedSignature; std::string headers("HTTP/1.1 200 OK\n\n"); auto head = network::mojom::URLResponseHead::New(); @@ -1067,7 +1063,7 @@ net::HttpUtil::AssembleRawHeaders(headers)); head->headers = http_response_headers; EXPECT_EQ(net::HTTP_OK, http_response_headers->response_code()); - http_response_headers->AddHeader(seed_signature_header); + http_response_headers->SetHeader("X-Seed-Signature", kBase64SeedSignature); // Set ERR_FAILED status code despite the 200 response code. network::URLLoaderCompletionStatus status(net::ERR_FAILED); status.decoded_body_length = response.size();
diff --git a/components/viz/service/display/gl_renderer.cc b/components/viz/service/display/gl_renderer.cc index ceb0c4ec..9dc031e8 100644 --- a/components/viz/service/display/gl_renderer.cc +++ b/components/viz/service/display/gl_renderer.cc
@@ -434,6 +434,7 @@ void GLRenderer::ReleaseRenderPassTextures() { render_pass_textures_.clear(); + render_pass_backdrop_textures_.clear(); } void GLRenderer::DiscardPixels() { @@ -970,6 +971,16 @@ const RenderPassDrawQuad* quad = params->quad; auto use_gr_context = ScopedUseGrContext::Create(this); + // Check if cached result can be used + auto bg_texture_it = + render_pass_backdrop_textures_.find(quad->render_pass_id); + if (bg_texture_it != render_pass_backdrop_textures_.end()) { + if (quad->can_use_backdrop_filter_cache) + return bg_texture_it->second; + else + render_pass_backdrop_textures_.erase(bg_texture_it); + } + gfx::Vector2d clipping_offset = (params->background_rect.top_right() - unclipped_rect.top_right()) + (params->background_rect.bottom_left() - unclipped_rect.bottom_left()); @@ -1099,7 +1110,12 @@ surface->getCanvas()->restore(); } - return FinalizeImage(surface); + sk_sp<SkImage> filtered_image_texture = FinalizeImage(surface); + if (quad->can_use_backdrop_filter_cache) { + render_pass_backdrop_textures_[params->quad->render_pass_id] = + filtered_image_texture; + } + return filtered_image_texture; } const DrawQuad* GLRenderer::CanPassBeDrawnDirectly(const RenderPass* pass) { @@ -4009,8 +4025,13 @@ } // Delete RenderPass textures from the previous frame that will not be used // again. - for (size_t i = 0; i < passes_to_delete.size(); ++i) - render_pass_textures_.erase(passes_to_delete[i]); + for (auto& pass_to_delete : passes_to_delete) { + auto rp_backdrop_texture_it = + render_pass_backdrop_textures_.find(pass_to_delete); + if (rp_backdrop_texture_it != render_pass_backdrop_textures_.end()) + render_pass_backdrop_textures_.erase(pass_to_delete); + render_pass_textures_.erase(pass_to_delete); + } } ResourceFormat GLRenderer::CurrentRenderPassResourceFormat() const {
diff --git a/components/viz/service/display/gl_renderer.h b/components/viz/service/display/gl_renderer.h index f3e1189..f4943ca 100644 --- a/components/viz/service/display/gl_renderer.h +++ b/components/viz/service/display/gl_renderer.h
@@ -359,6 +359,9 @@ // A map from RenderPass id to the texture used to draw the RenderPass from. base::flat_map<RenderPassId, ScopedRenderPassTexture> render_pass_textures_; + // A map from RenderPass id to backdrop filter cache texture. + base::flat_map<RenderPassId, sk_sp<SkImage>> render_pass_backdrop_textures_; + // OverlayTextures that are free to be used in the next frame. std::vector<std::unique_ptr<OverlayTexture>> available_overlay_textures_; // OverlayTextures that have been set up for use but are waiting for
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc index 442d7d34..9a580df 100644 --- a/components/viz/service/display/renderer_pixeltest.cc +++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -3103,14 +3103,15 @@ filter_pass.get(), gfx::RRectF()); auto* filter_pass_quad = root_pass->CreateAndAppendDrawQuad<RenderPassDrawQuad>(); - filter_pass_quad->SetNew( + filter_pass_quad->SetAll( shared_state, filter_pass_layer_rect_, filter_pass_layer_rect_, - filter_pass_id, 0, gfx::RectF(), gfx::Size(), + /*needs_blending=*/true, filter_pass_id, 0, gfx::RectF(), gfx::Size(), gfx::Vector2dF(1.0f, 1.0f), // filters_scale gfx::PointF(), // filters_origin gfx::RectF(), // tex_coord_rect false, // force_anti_aliasing_off - backdrop_filter_quality_); // backdrop_filter_quality + backdrop_filter_quality_, // backdrop_filter_quality + can_use_backdrop_filter_cache_); } const int kGridWidth = device_viewport_rect.width() / 3; @@ -3150,6 +3151,7 @@ cc::FilterOperations backdrop_filters_; base::Optional<gfx::RRectF> backdrop_filter_bounds_; float backdrop_filter_quality_ = 1.0f; + bool can_use_backdrop_filter_cache_ = false; gfx::Transform filter_pass_to_target_transform_; gfx::Rect filter_pass_layer_rect_; }; @@ -3163,13 +3165,60 @@ this->SetUpRenderPassList(); EXPECT_TRUE(this->RunPixelTest( &this->pass_list_, - base::FilePath(FILE_PATH_LITERAL("backdrop_filter_quality_1.png")), + base::FilePath(FILE_PATH_LITERAL("gl_backdrop_filter_1.png")), cc::FuzzyPixelOffByOneComparator(true))); this->backdrop_filter_quality_ = 0.33f; this->SetUpRenderPassList(); EXPECT_TRUE(this->RunPixelTest( &this->pass_list_, - base::FilePath(FILE_PATH_LITERAL("backdrop_filter_quality_2.png")), + base::FilePath(FILE_PATH_LITERAL("gl_backdrop_filter_2.png")), + cc::FuzzyPixelOffByOneComparator(true))); +} + +TEST_F(GLRendererPixelTestWithBackdropFilter, CachedResultOfBackdropFilter) { + this->backdrop_filters_.Append(cc::FilterOperation::CreateBlurFilter(2.0f)); + this->filter_pass_layer_rect_ = gfx::Rect(this->device_viewport_size_); + this->backdrop_filter_bounds_ = + gfx::RRectF(gfx::RectF(this->filter_pass_layer_rect_)); + // Set the flag to use cached backdrop filtered texture. This makes the + // GLRenderer cache backdrop filtered result. + this->can_use_backdrop_filter_cache_ = true; + this->SetUpRenderPassList(); + + EXPECT_TRUE(this->RunPixelTest( + &this->pass_list_, + base::FilePath(FILE_PATH_LITERAL("gl_backdrop_filter_1.png")), + cc::FuzzyPixelOffByOneComparator(true))); + + // Same render pass list makes the GLRenderer to skip backdrop filter + // calculation and use cached texture. This should correctly produce the + // same output image. + this->SetUpRenderPassList(); + EXPECT_TRUE(this->RunPixelTest( + &this->pass_list_, + base::FilePath(FILE_PATH_LITERAL("gl_backdrop_filter_1.png")), + cc::FuzzyPixelOffByOneComparator(true))); + + // To prove the cached texture is used, change a quad on the root pass which + // is beneath the backdrop filter. The output image should still be the same + // as before. + this->SetUpRenderPassList(); + DrawQuad* background_quad = *pass_list_.back()->quad_list.rbegin(); + static_cast<SolidColorDrawQuad*>(background_quad)->color = SK_ColorYELLOW; + EXPECT_TRUE(this->RunPixelTest( + &this->pass_list_, + base::FilePath(FILE_PATH_LITERAL("gl_backdrop_filter_1.png")), + cc::FuzzyPixelOffByOneComparator(true))); + + // Set|can_use_backdrop_filter_cache_| to false to make GLRenderer re-run the + // backdrop filter calculation + this->can_use_backdrop_filter_cache_ = false; + this->SetUpRenderPassList(); + background_quad = *pass_list_.back()->quad_list.rbegin(); + static_cast<SolidColorDrawQuad*>(background_quad)->color = SK_ColorYELLOW; + EXPECT_TRUE(this->RunPixelTest( + &this->pass_list_, + base::FilePath(FILE_PATH_LITERAL("gl_backdrop_filter_3.png")), cc::FuzzyPixelOffByOneComparator(true))); }
diff --git a/components/viz/test/data/backdrop_filter_quality_1.png b/components/viz/test/data/gl_backdrop_filter_1.png similarity index 100% rename from components/viz/test/data/backdrop_filter_quality_1.png rename to components/viz/test/data/gl_backdrop_filter_1.png Binary files differ
diff --git a/components/viz/test/data/backdrop_filter_quality_2.png b/components/viz/test/data/gl_backdrop_filter_2.png similarity index 100% rename from components/viz/test/data/backdrop_filter_quality_2.png rename to components/viz/test/data/gl_backdrop_filter_2.png Binary files differ
diff --git a/components/viz/test/data/gl_backdrop_filter_3.png b/components/viz/test/data/gl_backdrop_filter_3.png new file mode 100644 index 0000000..50535c54 --- /dev/null +++ b/components/viz/test/data/gl_backdrop_filter_3.png Binary files differ
diff --git a/content/browser/browsing_data/browsing_data_remover_impl.cc b/content/browser/browsing_data/browsing_data_remover_impl.cc index e828d201..d7d6349 100644 --- a/content/browser/browsing_data/browsing_data_remover_impl.cc +++ b/content/browser/browsing_data/browsing_data_remover_impl.cc
@@ -466,6 +466,23 @@ RenderFrameHostImpl::ClearAllPrefetchedSignedExchangeCache(); } + ////////////////////////////////////////////////////////////////////////////// + // Prototype Trust Token API (https://github.com/wicg/trust-token-api). + + // We don't support clearing data for specific time ranges because much Trust + // Tokens state (e.g. issuers associated with each top-level origin) has no + // notion of associated creation time. Consequently, like for reporting and + // network error logging below, a data removal request for certain + // sites/origins that has the Trust Tokens type in scope will clear all Trust + // Tokens data associated with the requested sites/origins. + if (remove_mask & DATA_TYPE_COOKIES) { + network::mojom::NetworkContext* network_context = + storage_partition->GetNetworkContext(); + network_context->ClearTrustTokenData( + filter_builder->BuildNetworkServiceFilter(), + CreateTaskCompletionClosureForMojo(TracingDataType::kTrustTokens)); + } + #if BUILDFLAG(ENABLE_REPORTING) ////////////////////////////////////////////////////////////////////////////// // Reporting cache.
diff --git a/content/browser/browsing_data/browsing_data_remover_impl.h b/content/browser/browsing_data/browsing_data_remover_impl.h index d610e54..5ad71f45 100644 --- a/content/browser/browsing_data/browsing_data_remover_impl.h +++ b/content/browser/browsing_data/browsing_data_remover_impl.h
@@ -107,7 +107,8 @@ kAuthCache = 9, kCodeCaches = 10, kNetworkErrorLogging = 11, - kMaxValue = kNetworkErrorLogging, + kTrustTokens = 12, + kMaxValue = kTrustTokens, }; // Represents a single removal task. Contains all parameters needed to execute
diff --git a/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc b/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc index 34e2c8e..a0bada5 100644 --- a/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc +++ b/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc
@@ -28,6 +28,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/cancelable_task_tracker.h" #include "base/task/post_task.h" +#include "base/test/gmock_callback_support.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "content/public/browser/browser_context.h" @@ -55,6 +56,7 @@ #include "ppapi/buildflags/buildflags.h" #include "services/network/cookie_manager.h" #include "services/network/public/cpp/features.h" +#include "services/network/public/mojom/network_context.mojom.h" #include "services/network/test/test_network_context.h" #include "storage/browser/test/mock_special_storage_policy.h" #include "testing/gmock/include/gmock/gmock.h" @@ -72,6 +74,7 @@ #include "net/reporting/reporting_test_util.h" #endif // BUILDFLAG(ENABLE_REPORTING) +using base::test::RunOnceClosure; using testing::_; using testing::ByRef; using testing::Eq; @@ -84,6 +87,8 @@ using testing::Not; using testing::Return; using testing::SizeIs; +using testing::StrictMock; +using testing::Truly; using testing::UnorderedElementsAre; using testing::WithArgs; using CookieDeletionFilterPtr = network::mojom::CookieDeletionFilterPtr; @@ -145,7 +150,9 @@ class StoragePartitionRemovalTestStoragePartition : public TestStoragePartition { public: - StoragePartitionRemovalTestStoragePartition() = default; + StoragePartitionRemovalTestStoragePartition() { + set_network_context(&network_context_); + } ~StoragePartitionRemovalTestStoragePartition() override = default; void ClearDataForOrigin(uint32_t remove_mask, @@ -206,6 +213,7 @@ private: StoragePartitionRemovalData storage_partition_removal_data_; + network::TestNetworkContext network_context_; DISALLOW_COPY_AND_ASSIGN(StoragePartitionRemovalTestStoragePartition); }; @@ -326,9 +334,13 @@ const base::Time& delete_end, int remove_mask, bool include_protected_origins) { + // TODO(msramek): Consider moving |storage_partition| to the test fixture. StoragePartitionRemovalTestStoragePartition storage_partition; - network::TestNetworkContext nop_network_context; - storage_partition.set_network_context(&nop_network_context); + + if (network_context_override_) { + storage_partition.set_network_context(network_context_override_); + } + remover_->OverrideStoragePartitionForTesting(&storage_partition); int origin_type_mask = BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB; @@ -351,6 +363,11 @@ int remove_mask, std::unique_ptr<BrowsingDataFilterBuilder> filter_builder) { StoragePartitionRemovalTestStoragePartition storage_partition; + + if (network_context_override_) { + storage_partition.set_network_context(network_context_override_); + } + remover_->OverrideStoragePartitionForTesting(&storage_partition); BrowsingDataRemoverCompletionObserver completion_observer(remover_); @@ -392,6 +409,10 @@ return mock_policy_.get(); } + void set_network_context_override(network::mojom::NetworkContext* context) { + network_context_override_ = context; + } + bool Match(const GURL& origin, int mask, storage::SpecialStoragePolicy* policy) { @@ -406,6 +427,8 @@ BrowserTaskEnvironment task_environment_; std::unique_ptr<BrowserContext> browser_context_; + network::mojom::NetworkContext* network_context_override_ = nullptr; + StoragePartitionRemovalData storage_partition_removal_data_; scoped_refptr<storage::MockSpecialStoragePolicy> mock_policy_; @@ -1479,4 +1502,97 @@ EXPECT_FALSE(remover->IsRemovingForTesting()); } +namespace { +class MockNetworkContext : public network::TestNetworkContext { + public: + MOCK_METHOD2( + ClearTrustTokenData, + void(network::mojom::ClearDataFilterPtr, + network::mojom::NetworkContext::ClearTrustTokenDataCallback)); +}; +} // namespace + +TEST_F(BrowsingDataRemoverImplTest, ClearsTrustTokens) { + MockNetworkContext context; + set_network_context_override(&context); + + EXPECT_CALL(context, ClearTrustTokenData(_, _)).WillOnce(RunOnceClosure<1>()); + + // Trust Tokens storage is cleared whenever cookies are cleared. + BlockUntilBrowsingDataRemoved(base::Time(), base::Time::Max(), + BrowsingDataRemover::DATA_TYPE_COOKIES, + /*include_protected_origins=*/false); +} + +TEST_F(BrowsingDataRemoverImplTest, PreservesTrustTokens) { + StrictMock<MockNetworkContext> context; + set_network_context_override(&context); + + // When cookies aren't cleared, Trust Tokens state shouldn't be. + BlockUntilBrowsingDataRemoved( + base::Time(), base::Time::Max(), + BrowsingDataRemover::DATA_TYPE_CACHE, // arbitrary non-cookie type + /*include_protected_origins=*/false); + + // (The strict mock will fail the test if its mocked method is called.) +} + +TEST_F(BrowsingDataRemoverImplTest, ClearsTrustTokensForSite) { + MockNetworkContext context; + set_network_context_override(&context); + + auto expected = network::mojom::ClearDataFilter::New(); + expected->domains = {"host1.com"}; + + EXPECT_CALL( + context, + ClearTrustTokenData( + Truly([&expected](const network::mojom::ClearDataFilterPtr& filter) { + return mojo::Equals(filter, expected); + }), + _)) + .WillOnce(RunOnceClosure<1>()); + + std::unique_ptr<BrowsingDataFilterBuilder> builder( + BrowsingDataFilterBuilder::Create(BrowsingDataFilterBuilder::WHITELIST)); + builder->AddRegisterableDomain("host1.com"); + + // Trust Tokens storage is cleared whenever cookies are cleared: when clearing + // cookies for a site, we should clear Trust Tokens state for the site. + BlockUntilOriginDataRemoved(base::Time(), base::Time::Max(), + BrowsingDataRemover::DATA_TYPE_COOKIES, + std::move(builder)); +} + +TEST_F(BrowsingDataRemoverImplTest, ClearsTrustTokensForSiteDespiteTimeRange) { + MockNetworkContext context; + set_network_context_override(&context); + + auto expected = network::mojom::ClearDataFilter::New(); + expected->domains = {"host1.com"}; + + EXPECT_CALL( + context, + ClearTrustTokenData( + Truly([&expected](const network::mojom::ClearDataFilterPtr& filter) { + return mojo::Equals(filter, expected); + }), + _)) + .WillOnce(RunOnceClosure<1>()); + + std::unique_ptr<BrowsingDataFilterBuilder> builder( + BrowsingDataFilterBuilder::Create(BrowsingDataFilterBuilder::WHITELIST)); + builder->AddRegisterableDomain("host1.com"); + + // Trust Tokens storage is cleared whenever cookies are cleared: when clearing + // cookies for a site, we should clear Trust Tokens state for the site. + // + // Since Trust Tokens data is not associated with particular timestamps, we + // should observe the same clearing behavior with a non-default time range as + // with the default time range. + BlockUntilOriginDataRemoved( + base::Time(), base::Time() + base::TimeDelta::FromSeconds(1), + BrowsingDataRemover::DATA_TYPE_COOKIES, std::move(builder)); +} + } // namespace content
diff --git a/content/browser/child_process_launcher_browsertest.cc b/content/browser/child_process_launcher_browsertest.cc index fd50b2c355..d3095969 100644 --- a/content/browser/child_process_launcher_browsertest.cc +++ b/content/browser/child_process_launcher_browsertest.cc
@@ -70,7 +70,7 @@ NavigationEntry* last_entry = shell()->web_contents()->GetController().GetLastCommittedEntry(); // Make sure we didn't navigate. - CHECK(!last_entry); + EXPECT_FALSE(last_entry); // Navigate again and let the process spawn correctly. TestNavigationObserver nav_observer2(window->web_contents(), 1); @@ -78,8 +78,9 @@ nav_observer2.Wait(); last_entry = shell()->web_contents()->GetController().GetLastCommittedEntry(); // Make sure that we navigated to the proper URL. - CHECK(last_entry && last_entry->GetPageType() == PAGE_TYPE_NORMAL); - CHECK(shell()->web_contents()->GetLastCommittedURL() == url); + ASSERT_TRUE(last_entry); + EXPECT_EQ(last_entry->GetPageType(), PAGE_TYPE_NORMAL); + EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), url); // Navigate again, using the same renderer. url = GURL("data:text/html,dataurl"); @@ -88,8 +89,9 @@ nav_observer3.Wait(); last_entry = shell()->web_contents()->GetController().GetLastCommittedEntry(); // Make sure that we navigated to the proper URL. - CHECK(last_entry && last_entry->GetPageType() == PAGE_TYPE_NORMAL); - CHECK(shell()->web_contents()->GetLastCommittedURL() == url); + ASSERT_TRUE(last_entry); + EXPECT_EQ(last_entry->GetPageType(), PAGE_TYPE_NORMAL); + EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), url); } } // namespace content
diff --git a/content/browser/conversions/conversion_host.cc b/content/browser/conversions/conversion_host.cc index e343742..729e37b1 100644 --- a/content/browser/conversions/conversion_host.cc +++ b/content/browser/conversions/conversion_host.cc
@@ -59,7 +59,10 @@ : WebContentsObserver(web_contents), conversion_manager_provider_( std::make_unique<ConversionManagerProviderImpl>()), - receiver_(web_contents, this) {} + receiver_(web_contents, this) { + // TODO(csharrison): When https://crbug.com/1051334 is resolved, add a DCHECK + // that the kConversionMeasurement feature is enabled. +} ConversionHost::~ConversionHost() = default;
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc index 9d11d43..c67c46f 100644 --- a/content/browser/devtools/protocol/browser_handler.cc +++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -329,9 +329,9 @@ } Response BrowserHandler::SetPermission( - Maybe<std::string> origin, std::unique_ptr<protocol::Browser::PermissionDescriptor> permission, const protocol::Browser::PermissionSetting& setting, + Maybe<std::string> origin, Maybe<std::string> browser_context_id) { BrowserContext* browser_context = nullptr; Response response = FindBrowserContext(browser_context_id, &browser_context); @@ -373,9 +373,9 @@ } Response BrowserHandler::GrantPermissions( - Maybe<std::string> origin, std::unique_ptr<protocol::Array<protocol::Browser::PermissionType>> permissions, + Maybe<std::string> origin, Maybe<std::string> browser_context_id) { BrowserContext* browser_context = nullptr; Response response = FindBrowserContext(browser_context_id, &browser_context);
diff --git a/content/browser/devtools/protocol/browser_handler.h b/content/browser/devtools/protocol/browser_handler.h index 01d57a7..e46f11d9 100644 --- a/content/browser/devtools/protocol/browser_handler.h +++ b/content/browser/devtools/protocol/browser_handler.h
@@ -50,15 +50,15 @@ std::unique_ptr<protocol::Array<std::string>>* arguments) override; Response SetPermission( - Maybe<std::string> origin, std::unique_ptr<protocol::Browser::PermissionDescriptor> permission, const protocol::Browser::PermissionSetting& setting, + Maybe<std::string> origin, Maybe<std::string> browser_context_id) override; Response GrantPermissions( - Maybe<std::string> origin, std::unique_ptr<protocol::Array<protocol::Browser::PermissionType>> permissions, + Maybe<std::string> origin, Maybe<std::string> browser_context_id) override; Response ResetPermissions(Maybe<std::string> browser_context_id) override;
diff --git a/content/browser/frame_host/back_forward_cache_impl.cc b/content/browser/frame_host/back_forward_cache_impl.cc index ff7a2122..9ce2816 100644 --- a/content/browser/frame_host/back_forward_cache_impl.cc +++ b/content/browser/frame_host/back_forward_cache_impl.cc
@@ -149,7 +149,8 @@ FeatureToBit(WebSchedulerTrackedFeature::kWakeLock) | FeatureToBit(WebSchedulerTrackedFeature::kWebShare) | FeatureToBit(WebSchedulerTrackedFeature::kWebFileSystem) | - FeatureToBit(WebSchedulerTrackedFeature::kAppBanner); + FeatureToBit(WebSchedulerTrackedFeature::kAppBanner) | + FeatureToBit(WebSchedulerTrackedFeature::kPrinting); uint64_t result = kAlwaysDisallowedFeatures;
diff --git a/content/browser/loader/prefetch_browsertest.cc b/content/browser/loader/prefetch_browsertest.cc index 5519a50..2a43744 100644 --- a/content/browser/loader/prefetch_browsertest.cc +++ b/content/browser/loader/prefetch_browsertest.cc
@@ -16,10 +16,13 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/content_browser_test.h" #include "content/public/test/content_browser_test_utils.h" +#include "content/public/test/url_loader_monitor.h" #include "content/shell/browser/shell.h" #include "net/base/features.h" +#include "net/base/network_isolation_key.h" #include "net/dns/mock_host_resolver.h" #include "services/network/public/cpp/features.h" +#include "services/network/public/cpp/resource_request.h" #include "third_party/blink/public/common/features.h" namespace content { @@ -153,6 +156,53 @@ } IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, + CrossOriginDocumentHasNoSameSiteCookies) { + const char* prefetch_path = "/prefetch.html"; + const char* target_path = "/target.html"; + RegisterResponse( + target_path, + ResponseEntry("<head><title>Prefetch Target</title></head>")); + + base::RunLoop prefetch_waiter; + auto request_counter = RequestCounter::CreateAndMonitor( + cross_origin_server_.get(), target_path, &prefetch_waiter); + RegisterRequestHandler(cross_origin_server_.get()); + ASSERT_TRUE(cross_origin_server_->Start()); + + const GURL cross_origin_target_url = + cross_origin_server_->GetURL("3p.example", target_path); + RegisterResponse( + prefetch_path, + ResponseEntry(base::StringPrintf( + "<body><link rel='prefetch' as='document' href='%s'></body>", + cross_origin_target_url.spec().c_str()))); + RegisterRequestHandler(embedded_test_server()); + ASSERT_TRUE(embedded_test_server()->Start()); + EXPECT_EQ(0, request_counter->GetRequestCount()); + EXPECT_EQ(0, GetPrefetchURLLoaderCallCount()); + + URLLoaderMonitor monitor({cross_origin_target_url}); + + // Loading a page that prefetches the target URL would increment the + // |request_counter|. + EXPECT_TRUE( + NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path))); + prefetch_waiter.Run(); + EXPECT_EQ(1, request_counter->GetRequestCount()); + EXPECT_EQ(1, GetPrefetchURLLoaderCallCount()); + + monitor.WaitForUrls(); + base::Optional<network::ResourceRequest> request = + monitor.GetRequestInfo(cross_origin_target_url); + ASSERT_TRUE(request); + ASSERT_TRUE(request->site_for_cookies.IsNull()); + ASSERT_TRUE(request->trusted_params); + url::Origin cross_origin = url::Origin::Create(cross_origin_target_url); + EXPECT_EQ(net::NetworkIsolationKey(cross_origin, cross_origin), + request->trusted_params->network_isolation_key); +} + +IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, CrossOriginDocumentReusedAsNavigation) { const char* prefetch_path = "/prefetch.html"; const char* target_path = "/target.html"; @@ -588,6 +638,69 @@ NavigateToURLAndWaitTitle(target_url, "done"); } +IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, + CrossOriginWithPreloadHasNoSameSiteCookies) { + const char* target_path = "/target.html"; + const char* preload_path = "/preload.js"; + RegisterResponse( + target_path, + ResponseEntry("<head><title>Prefetch Target</title><script " + "src=\"./preload.js\"></script></head>", + "text/html", + {{"link", "</preload.js>;rel=\"preload\";as=\"script\""}, + {"access-control-allow-origin", "*"}})); + RegisterResponse(preload_path, + ResponseEntry("document.title=\"done\";", "text/javascript", + {{"cache-control", "public, max-age=600"}})); + + base::RunLoop preload_waiter; + auto target_request_counter = + RequestCounter::CreateAndMonitor(cross_origin_server_.get(), target_path); + auto preload_request_counter = RequestCounter::CreateAndMonitor( + cross_origin_server_.get(), preload_path, &preload_waiter); + RegisterRequestHandler(cross_origin_server_.get()); + + ASSERT_TRUE(cross_origin_server_->Start()); + + const GURL cross_origin_target_url = + cross_origin_server_->GetURL("3p.example", target_path); + + const char* prefetch_path = "/prefetch.html"; + RegisterResponse(prefetch_path, + ResponseEntry(base::StringPrintf( + "<body><link rel='prefetch' href='%s' as='document' " + "crossorigin='anonymous'></body>", + cross_origin_target_url.spec().c_str()))); + RegisterRequestHandler(embedded_test_server()); + ASSERT_TRUE(embedded_test_server()->Start()); + EXPECT_EQ(0, GetPrefetchURLLoaderCallCount()); + + URLLoaderMonitor monitor({cross_origin_target_url}); + + // Loading a page that prefetches the target URL would increment both + // |target_request_counter| and |preload_request_counter|. + EXPECT_TRUE( + NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path))); + preload_waiter.Run(); + EXPECT_EQ(1, target_request_counter->GetRequestCount()); + EXPECT_EQ(1, preload_request_counter->GetRequestCount()); + EXPECT_EQ(2, GetPrefetchURLLoaderCallCount()); + + GURL cross_origin_preload_url = + cross_origin_server_->GetURL("3p.example", preload_path); + WaitUntilLoaded(cross_origin_preload_url); + + monitor.WaitForUrls(); + base::Optional<network::ResourceRequest> request = + monitor.GetRequestInfo(cross_origin_target_url); + ASSERT_TRUE(request); + ASSERT_TRUE(request->site_for_cookies.IsNull()); + ASSERT_TRUE(request->trusted_params); + url::Origin cross_origin = url::Origin::Create(cross_origin_target_url); + EXPECT_EQ(net::NetworkIsolationKey(cross_origin, cross_origin), + request->trusted_params->network_isolation_key); +} + IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, CrossOriginWithPreload) { const char* target_path = "/target.html"; const char* preload_path = "/preload.js"; @@ -728,8 +841,8 @@ MockSignedExchangeHandlerFactory factory({MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, GURL(embedded_test_server()->GetURL(target_path)), "text/html", - {base::StringPrintf("Link: <%s>;rel=\"preload\";as=\"script\"", - preload_url_in_sxg.spec().c_str())}, + {{"Link", base::StringPrintf("<%s>;rel=\"preload\";as=\"script\"", + preload_url_in_sxg.spec().c_str())}}, net::SHA256HashValue({{0x00}}))}); ScopedSignedExchangeHandlerFactory scoped_factory(&factory); @@ -804,8 +917,8 @@ target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, GURL(cross_origin_server_->GetURL("3p.example", target_path)), "text/html", - {base::StringPrintf("Link: <%s>;rel=\"preload\";as=\"script\"", - preload_url_in_sxg.spec().c_str())}, + {{"Link", base::StringPrintf("<%s>;rel=\"preload\";as=\"script\"", + preload_url_in_sxg.spec().c_str())}}, net::SHA256HashValue({{0x00}}))}); ScopedSignedExchangeHandlerFactory scoped_factory(&factory);
diff --git a/content/browser/loader/prefetch_url_loader_service.cc b/content/browser/loader/prefetch_url_loader_service.cc index 494d29c..b0fdafad 100644 --- a/content/browser/loader/prefetch_url_loader_service.cc +++ b/content/browser/loader/prefetch_url_loader_service.cc
@@ -151,6 +151,9 @@ return; } + // Cross-site prefetches shouldn't include SameSite cookies. + resource_request.site_for_cookies = net::SiteForCookies(); + // Use the trusted cross-origin prefetch loader factory, and set the // request's NetworkIsolationKey suitable for the cross-origin prefetch. network_loader_factory_to_use = current_context.cross_origin_factory; @@ -181,6 +184,9 @@ return; } + // Cross-site prefetches shouldn't include SameSite cookies. + resource_request.site_for_cookies = net::SiteForCookies(); + resource_request.trusted_params = network::ResourceRequest::TrustedParams(); resource_request.trusted_params->network_isolation_key = nik_iterator->second;
diff --git a/content/browser/permissions/permission_controller_impl.cc b/content/browser/permissions/permission_controller_impl.cc index a7cfeb85..f1b8638c 100644 --- a/content/browser/permissions/permission_controller_impl.cc +++ b/content/browser/permissions/permission_controller_impl.cc
@@ -64,6 +64,7 @@ case PermissionType::SENSORS: case PermissionType::AR: case PermissionType::VR: + case PermissionType::CAMERA_PAN_TILT_ZOOM: return base::nullopt; } }
diff --git a/content/browser/renderer_host/input/wheel_event_listener_browsertest.cc b/content/browser/renderer_host/input/wheel_event_listener_browsertest.cc index 3e51621..deb65d3 100644 --- a/content/browser/renderer_host/input/wheel_event_listener_browsertest.cc +++ b/content/browser/renderer_host/input/wheel_event_listener_browsertest.cc
@@ -50,11 +50,8 @@ class WheelEventListenerBrowserTest : public ContentBrowserTest { public: - WheelEventListenerBrowserTest() { - feature_list_.InitWithFeatures( - {features::kPassiveDocumentWheelEventListeners}, {}); - } - ~WheelEventListenerBrowserTest() override {} + WheelEventListenerBrowserTest() = default; + ~WheelEventListenerBrowserTest() override = default; protected: RenderWidgetHostImpl* GetWidgetHost() {
diff --git a/content/browser/service_worker/service_worker_storage_unittest.cc b/content/browser/service_worker/service_worker_storage_unittest.cc index e20e77f..1418c87b 100644 --- a/content/browser/service_worker/service_worker_storage_unittest.cc +++ b/content/browser/service_worker/service_worker_storage_unittest.cc
@@ -1884,7 +1884,7 @@ response_head.ssl_info->connection_status = 0x300039; const std::string kHTTPHeaderLine("HTTP/1.1 200 OK\n\n"); - const std::string kOriginTrial("Origin-Trial: "); + const std::string kOriginTrial("Origin-Trial"); // Token for Feature1 which expires 2033-05-18. // generate_token.py valid.example.com Feature1 --expire-timestamp=2000000000 // TODO(horo): Generate this sample token during the build. @@ -1913,10 +1913,10 @@ "ol2RFf+4Sdm1hQ4AAABYeyJvcmlnaW4iOiAiaHR0cHM6Ly92YWxpZC5leGFtcGxlLmNvbTo0" "NDMiLCAiZmVhdHVyZSI6ICJGZWF0dXJlMyIsICJleHBpcnkiOiAxMDAwMDAwMDAwfQ=="); response_head.headers = base::MakeRefCounted<net::HttpResponseHeaders>(""); - response_head.headers->AddHeader(kOriginTrial + kFeature1Token); - response_head.headers->AddHeader(kOriginTrial + kFeature2Token1); - response_head.headers->AddHeader(kOriginTrial + kFeature2Token2); - response_head.headers->AddHeader(kOriginTrial + kFeature3ExpiredToken); + response_head.headers->AddHeader(kOriginTrial, kFeature1Token); + response_head.headers->AddHeader(kOriginTrial, kFeature2Token1); + response_head.headers->AddHeader(kOriginTrial, kFeature2Token2); + response_head.headers->AddHeader(kOriginTrial, kFeature3ExpiredToken); version->SetMainScriptResponse( std::make_unique<ServiceWorkerVersion::MainScriptResponse>( response_head));
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc index f8a8c2b9..d6c57c48 100644 --- a/content/browser/service_worker/service_worker_test_utils.cc +++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -211,7 +211,7 @@ http_info->headers = base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.0 200 OK\0\0"); for (const auto& header : headers) - http_info->headers->AddHeader(header.first + ": " + header.second); + http_info->headers->AddHeader(header.first, header.second); scoped_refptr<HttpResponseInfoIOBuffer> info_buffer = base::MakeRefCounted<HttpResponseInfoIOBuffer>(std::move(http_info));
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index b93b364..15f09f2 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -624,7 +624,9 @@ // ConversionHost takes a weak ref on |this|, so it must be created outside of // the initializer list. - conversion_host_ = std::make_unique<ConversionHost>(this); + if (base::FeatureList::IsEnabled(features::kConversionMeasurement)) { + conversion_host_ = std::make_unique<ConversionHost>(this); + } } WebContentsImpl::~WebContentsImpl() {
diff --git a/content/browser/web_package/mock_signed_exchange_handler.cc b/content/browser/web_package/mock_signed_exchange_handler.cc index fbf2899f..2808e2a 100644 --- a/content/browser/web_package/mock_signed_exchange_handler.cc +++ b/content/browser/web_package/mock_signed_exchange_handler.cc
@@ -20,7 +20,7 @@ net::Error error, const GURL& inner_url, const std::string& mime_type, - std::vector<std::string> response_headers, + std::vector<std::pair<std::string, std::string>> response_headers, base::Optional<net::SHA256HashValue> header_integrity, const base::Time& signature_expire_time) : outer_url(outer_url), @@ -50,10 +50,9 @@ head->headers = base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK"); head->mime_type = params.mime_type; - head->headers->AddHeader( - base::StringPrintf("Content-type: %s", params.mime_type.c_str())); + head->headers->SetHeader("Content-type", params.mime_type); for (const auto& header : params.response_headers) - head->headers->AddHeader(header); + head->headers->AddHeader(header.first, header.second); head->is_signed_exchange_inner_response = true; head->content_length = head->headers->GetContentLength(); }
diff --git a/content/browser/web_package/mock_signed_exchange_handler.h b/content/browser/web_package/mock_signed_exchange_handler.h index ab71024..9fab6750f 100644 --- a/content/browser/web_package/mock_signed_exchange_handler.h +++ b/content/browser/web_package/mock_signed_exchange_handler.h
@@ -27,7 +27,7 @@ net::Error error, const GURL& inner_url, const std::string& mime_type, - std::vector<std::string> response_headers, + std::vector<std::pair<std::string, std::string>> response_headers, base::Optional<net::SHA256HashValue> header_integrity, const base::Time& signature_expire_time = base::Time()); MockSignedExchangeHandlerParams(const MockSignedExchangeHandlerParams& other); @@ -37,7 +37,7 @@ const net::Error error; const GURL inner_url; const std::string mime_type; - const std::vector<std::string> response_headers; + const std::vector<std::pair<std::string, std::string>> response_headers; const base::Optional<net::SHA256HashValue> header_integrity; const base::Time signature_expire_time; };
diff --git a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc index f5606d3a..974766b 100644 --- a/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc +++ b/content/browser/web_package/signed_exchange_cert_fetcher_unittest.cc
@@ -231,8 +231,8 @@ auto response_head = network::mojom::URLResponseHead::New(); response_head->headers = base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK"); - response_head->headers->AddHeader( - "Content-Type: application/cert-chain+cbor"); + response_head->headers->SetHeader("Content-Type", + "application/cert-chain+cbor"); response_head->mime_type = "application/cert-chain+cbor"; mock_loader_factory_.client_remote()->OnReceiveResponse( std::move(response_head)); @@ -482,7 +482,7 @@ auto response_head = network::mojom::URLResponseHead::New(); response_head->headers = base::MakeRefCounted<net::HttpResponseHeaders>("HTTP/1.1 200 OK"); - response_head->headers->AddHeader("Content-Type: application/octet-stream"); + response_head->headers->SetHeader("Content-Type", "application/octet-stream"); response_head->mime_type = "application/octet-stream"; mock_loader_factory_.client_remote()->OnReceiveResponse( std::move(response_head));
diff --git a/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc b/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc index bdf574d..c11c741 100644 --- a/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc +++ b/content/browser/web_package/signed_exchange_subresource_prefetch_browsertest.cc
@@ -365,7 +365,8 @@ const net::SHA256HashValue& header_integrity, const std::string& content, const std::vector<std::pair<std::string, std::string>>& sxg_outer_headers, - const std::vector<std::string>& sxg_inner_headers = {}, + const std::vector<std::pair<std::string, std::string>>& + sxg_inner_headers = {}, const base::Time& signature_expire_time = base::Time()) { auto sxg_request_counter = RequestCounter::CreateAndMonitor(embedded_test_server(), sxg_path); @@ -490,8 +491,9 @@ "/target.html" /* inner_url_path */, net::SHA256HashValue({{0x01}}) /* header_integrity */, content, {} /* sxg_outer_headers */, - {base::StringPrintf("content-length: %" PRIuS, - content.size())} /* sxg_inner_headers */); + {{"content-length", + base::StringPrintf("%" PRIuS, + content.size())}} /* sxg_inner_headers */); const auto cached_exchanges = GetCachedExchanges(shell()); // The content of prefetched SXG is larger than the Blob storage limit. // So the SXG should not be stored to the cache. @@ -789,7 +791,6 @@ const std::string outer_link_header = CreateAlternateLinkHeader(sxg_script_url, inner_url_script_url); const std::string inner_link_headers = - std::string("Link: ") + base::JoinString( {CreateAllowedAltSxgLinkHeader(inner_url_script_url, script_header_integrity), @@ -815,7 +816,7 @@ MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( sxg_page_url, SignedExchangeLoadResult::kSuccess, net::OK, - inner_url_page_url, "text/html", {inner_link_headers}, + inner_url_page_url, "text/html", {{"Link", inner_link_headers}}, page_header_integrity), MockSignedExchangeHandlerParams( sxg_script_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1044,6 +1045,7 @@ const std::string& script_inner_url_path, const std::vector<std::pair<std::string, std::string>>& script_sxg_outer_headers, + const std::string& additional_link_element_attributes, int64_t elapsed_time_after_prefetch, const std::string& expected_title, bool script_sxg_should_be_stored, @@ -1076,7 +1078,6 @@ const std::string outer_link_header = CreateAlternateLinkHeader(sxg_script_url, inner_url_script_url); const std::string inner_link_headers = - std::string("Link: ") + base::JoinString( {CreateAllowedAltSxgLinkHeader(inner_url_script_url, script_header_integrity), @@ -1085,8 +1086,9 @@ RegisterResponse(prefetch_page_path, ResponseEntry(base::StringPrintf( - "<body><link rel='prefetch' href='%s'></body>", - sxg_page_url.spec().c_str()))); + "<body><link rel='prefetch' href='%s' %s></body>", + sxg_page_url.spec().c_str(), + additional_link_element_attributes.c_str()))); RegisterResponse( script_inner_url_path, ResponseEntry("document.title=\"from server\";", "text/javascript", @@ -1106,7 +1108,7 @@ MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( sxg_page_url, SignedExchangeLoadResult::kSuccess, net::OK, - inner_url_page_url, "text/html", {inner_link_headers}, + inner_url_page_url, "text/html", {{"Link", inner_link_headers}}, page_header_integrity), MockSignedExchangeHandlerParams( sxg_script_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1213,7 +1215,6 @@ const std::string outer_link_header = CreateAlternateLinkHeader(script_sxg_url, script_url); const std::string inner_link_headers = - std::string("Link: ") + base::JoinString( {CreateAllowedAltSxgLinkHeader(script_url, script_header_integrity), CreatePreloadLinkHeader(script_url, "script")}, @@ -1234,15 +1235,16 @@ {{"link", outer_link_header}})); RegisterResponse(script_sxg_path, CreateSignedExchangeResponseEntry(content)); - std::vector<std::string> script_inner_response_headers; + std::vector<std::pair<std::string, std::string>> + script_inner_response_headers; if (has_nosniff) { - script_inner_response_headers.emplace_back( - "x-content-type-options: nosniff"); + script_inner_response_headers.emplace_back(std::make_pair( + std::string("x-content-type-options"), std::string("nosniff"))); } MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, + target_url, "text/html", {{"Link", inner_link_headers}}, target_header_integrity), MockSignedExchangeHandlerParams( script_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1292,8 +1294,10 @@ "example.com" /* inner_url_hostname */, "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, - {} /* script_sxg_outer_headers */, 0 /* elapsed_time_after_prefetch */, - "done" /* expected_title */, true /* script_sxg_should_be_stored */, + {} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, + 0 /* elapsed_time_after_prefetch */, "done" /* expected_title */, + true /* script_sxg_should_be_stored */, 0 /* expected_script_fetch_count */); } @@ -1310,8 +1314,10 @@ "example.com" /* inner_url_hostname */, "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, - {} /* script_sxg_outer_headers */, 0 /* elapsed_time_after_prefetch */, - "done" /* expected_title */, true /* script_sxg_should_be_stored */, + {} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, + 0 /* elapsed_time_after_prefetch */, "done" /* expected_title */, + true /* script_sxg_should_be_stored */, // Note that we don't check the script fetch count in this test. -1 /* expected_script_fetch_count */); } @@ -1332,8 +1338,38 @@ "publisher.example.com" /* inner_url_hostname */, "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, - {} /* script_sxg_outer_headers */, 0 /* elapsed_time_after_prefetch */, - "done" /* expected_title */, true /* script_sxg_should_be_stored */, + {} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, + 0 /* elapsed_time_after_prefetch */, "done" /* expected_title */, + true /* script_sxg_should_be_stored */, + 0 /* expected_script_fetch_count */); +} + +IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest, + MainResourceSXGAndScriptSXG_CrossOrigin_AsDocument) { + // This test is almost same as MainResourceSXGAndScriptSXG_CrossOrigin. The + // only difference is that the <link rel=prefetch> element has "as=document" + // attribute which was introduced to support cross origin prefetch with + // SplitCacheByNetworkIsolationKey feature. Note that even if + // SplitCacheByNetworkIsolationKey feature is enabled, current Chromium + // implementation doesn't require as=document for prefetching main resource + // signed exchanges when SignedExchangePrefetchCacheForNavigations feature is + // enabled, and for prefetching main resource and subresource signed exchanges + // when SignedExchangeSubresourcePrefetch is enabled. + RunPrefetchMainResourceSXGAndScriptSXGTest( + "aggregator.example.com" /* prefetch_page_hostname */, + "/prefetch.html" /* prefetch_page_path */, + "distoributor.example.com" /* page_sxg_hostname */, + "/target.sxg" /* page_sxg_path */, + "distoributor.example.com" /* script_sxg_hostname */, + "/script.sxg" /* script_sxg_path */, + "publisher.example.com" /* inner_url_hostname */, + "/target.html" /* page_inner_url_path */, + "/script.js" /* script_inner_url_path */, + {} /* script_sxg_outer_headers */, + "as='document'" /* additional_link_element_attributes */, + 0 /* elapsed_time_after_prefetch */, "done" /* expected_title */, + true /* script_sxg_should_be_stored */, 0 /* expected_script_fetch_count */); } @@ -1351,8 +1387,9 @@ "publisher.example.com" /* inner_url_hostname */, "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, - {} /* script_sxg_outer_headers */, 0 /* elapsed_time_after_prefetch */, - "from server" /* expected_title */, + {} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, + 0 /* elapsed_time_after_prefetch */, "from server" /* expected_title */, true /* script_sxg_should_be_stored */, 1 /* expected_script_fetch_count */); } @@ -1369,6 +1406,7 @@ "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, {{"cache-control", "no-store"}} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, 0 /* elapsed_time_after_prefetch */, "from server" /* expected_title */, false /* script_sxg_should_be_stored */, 1 /* expected_script_fetch_count */); @@ -1386,6 +1424,7 @@ "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, {{"vary", "*"}} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, 0 /* elapsed_time_after_prefetch */, "from server" /* expected_title */, false /* script_sxg_should_be_stored */, 1 /* expected_script_fetch_count */); @@ -1403,6 +1442,7 @@ "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, {{"vary", "accept-encoding"}} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, 0 /* elapsed_time_after_prefetch */, "done" /* expected_title */, true /* script_sxg_should_be_stored */, 0 /* expected_script_fetch_count */); @@ -1420,6 +1460,7 @@ "/target.html" /* page_inner_url_path */, "/script.js" /* script_inner_url_path */, {} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, net::HttpCache::kPrefetchReuseMins * 60 + 1 /* elapsed_time_after_prefetch */, "from server" /* expected_title */, @@ -1442,6 +1483,7 @@ base::StringPrintf("public, max-age=%d", net::HttpCache::kPrefetchReuseMins * 3 * 60)}} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, net::HttpCache::kPrefetchReuseMins * 2 * 60 /* elapsed_time_after_prefetch */, "done" /* expected_title */, true /* script_sxg_should_be_stored */, @@ -1463,6 +1505,7 @@ base::StringPrintf("public, max-age=%d", net::HttpCache::kPrefetchReuseMins * 3 * 60)}} /* script_sxg_outer_headers */, + "" /* additional_link_element_attributes */, net::HttpCache::kPrefetchReuseMins * 3 * 60 + 1 /* elapsed_time_after_prefetch */, "from server" /* expected_title */, @@ -1517,7 +1560,6 @@ CreateAlternateLinkHeader(image2_sxg_url, image2_url)}, ","); const std::string inner_link_headers = - std::string("Link: ") + base::JoinString( {CreateAllowedAltSxgLinkHeader(image1_url, image1_header_integrity), CreateAllowedAltSxgLinkHeader(image2_url, image2_header_integrity), @@ -1552,7 +1594,7 @@ MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, + target_url, "text/html", {{"Link", inner_link_headers}}, target_header_integrity), MockSignedExchangeHandlerParams( image1_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1633,7 +1675,6 @@ CreateAlternateLinkHeader(script2_sxg_url, script2_url)}, ","); const std::string inner_link_headers = - std::string("Link: ") + base::JoinString( {CreateAllowedAltSxgLinkHeader(script1_url, script1_header_integrity), CreateAllowedAltSxgLinkHeader(script2_url, script2_header_integrity), @@ -1662,7 +1703,7 @@ MockSignedExchangeHandlerFactory factory({ MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, + target_url, "text/html", {{"Link", inner_link_headers}}, target_header_integrity), MockSignedExchangeHandlerParams( script1_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1748,7 +1789,6 @@ // Use the wrong header integrity value for "allowed-alt-sxg" link header to // trigger the integrity mismatch fallback logic. const std::string inner_link_headers = - std::string("Link: ") + base::JoinString({CreateAllowedAltSxgLinkHeader( script_url, wrong_script_header_integrity), CreatePreloadLinkHeader(script_url, "script")}, @@ -1770,7 +1810,7 @@ MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, + target_url, "text/html", {{"Link", inner_link_headers}}, target_header_integrity), MockSignedExchangeHandlerParams( script_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -1836,7 +1876,6 @@ // Use the wrong header integrity value for "allowed-alt-sxg" link header for // script2 to trigger the integrity mismatch fallback logic. const std::string inner_link_headers = - std::string("Link: ") + base::JoinString( {CreateAllowedAltSxgLinkHeader(script1_url, script1_header_integrity), CreateAllowedAltSxgLinkHeader(script2_url, @@ -1867,7 +1906,7 @@ MockSignedExchangeHandlerFactory factory({ MockSignedExchangeHandlerParams( target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, - target_url, "text/html", {inner_link_headers}, + target_url, "text/html", {{"Link", inner_link_headers}}, target_header_integrity), MockSignedExchangeHandlerParams( script1_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, @@ -2011,7 +2050,7 @@ const net::SHA256HashValue target_header_integrity = {{0x01}}; std::string target_sxg_outer_link_header; - std::string target_sxg_inner_link_header("Link: "); + std::string target_sxg_inner_link_header; std::string requests_list_string; std::vector<MockSignedExchangeHandlerParams> mock_params; @@ -2047,27 +2086,27 @@ "server", "text/plain", {{"Access-Control-Allow-Origin", test_server_origin.c_str()}, {"Access-Control-Allow-Credentials", "true"}})); - std::vector<std::string> data_sxg_inner_headers; + std::vector<std::pair<std::string, std::string>> data_sxg_inner_headers; if (kTestCases[i].access_control_allow_origin_header) { - data_sxg_inner_headers.emplace_back( - base::StringPrintf("Access-Control-Allow-Origin: %s", - kTestCases[i].access_control_allow_origin_header)); + data_sxg_inner_headers.emplace_back(std::make_pair( + std::string("Access-Control-Allow-Origin"), + std::string(kTestCases[i].access_control_allow_origin_header))); } if (kTestCases[i].has_access_control_allow_credentials_true_header) { data_sxg_inner_headers.emplace_back( - "Access-Control-Allow-Credentials: true"); + std::make_pair(std::string("Access-Control-Allow-Credentials"), + std::string("true"))); } mock_params.emplace_back( data_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, data_url, "text/plain", std::move(data_sxg_inner_headers), data_header_integrity); } - std::vector<std::string> target_sxg_inner_headers = { - std::move(target_sxg_inner_link_header)}; + std::vector<std::pair<std::string, std::string>> target_sxg_inner_headers = { + {"Link", target_sxg_inner_link_header}}; mock_params.emplace_back(target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK, target_url, "text/html", - std::move(target_sxg_inner_headers), - target_header_integrity); + target_sxg_inner_headers, target_header_integrity); MockSignedExchangeHandlerFactory factory(std::move(mock_params)); RegisterResponse( @@ -2179,7 +2218,6 @@ const std::string outer_link_header = CreateAlternateLinkHeader(sxg_script_url, inner_url_script_url); const std::string inner_link_headers = - std::string("Link: ") + base::JoinString( {CreateAllowedAltSxgLinkHeader(inner_url_script_url, script_header_integrity), @@ -2201,14 +2239,15 @@ MockSignedExchangeHandlerFactory factory( {MockSignedExchangeHandlerParams( sxg_page_url, SignedExchangeLoadResult::kSuccess, net::OK, - inner_url_page_url, "text/html", {inner_link_headers}, + inner_url_page_url, "text/html", {{"Link", inner_link_headers}}, page_header_integrity), MockSignedExchangeHandlerParams( sxg_script_url, SignedExchangeLoadResult::kSuccess, net::OK, inner_url_script_url, "text/javascript", // Set "cache-control: public" to keep the script in the memory // cache. - {"cache-control: public, max-age=600"}, script_header_integrity)}); + {{"cache-control", "public, max-age=600"}}, + script_header_integrity)}); ScopedSignedExchangeHandlerFactory scoped_factory(&factory); EXPECT_EQ(0, GetPrefetchURLLoaderCallCount());
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index c91b5ae..e1e1cfb 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -218,8 +218,6 @@ features::kUserActivationSameOriginVisibility, kUseFeatureState}, {wf::EnablePassiveDocumentEventListeners, features::kPassiveDocumentEventListeners, kUseFeatureState}, - {wf::EnablePassiveDocumentWheelEventListeners, - features::kPassiveDocumentWheelEventListeners, kUseFeatureState}, {wf::EnableExpensiveBackgroundTimerThrottling, features::kExpensiveBackgroundTimerThrottling, kUseFeatureState}, {wf::EnableTimerThrottlingForHiddenFrames, @@ -351,7 +349,7 @@ kEnableOnly}, {"FeaturePolicyForClientHints", features::kFeaturePolicyForClientHints, kUseFeatureState}, - {"FlexNG", blink::features::kFlexNG, kEnableOnly}, + {"LayoutNGFlexBox", blink::features::kFlexNG, kEnableOnly}, {"FontAccess", blink::features::kFontAccess, kUseFeatureState}, {"FontSrcLocalMatching", features::kFontSrcLocalMatching, kUseFeatureState},
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index f9782ed..fb98b18 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn
@@ -344,17 +344,6 @@ libs += [ "android" ] } - if (is_chromeos) { - sources += [ - "//chromeos/system/core_scheduling.cc", - "//chromeos/system/core_scheduling.h", - ] - deps += [ - "//chromeos:chromeos_export", - "//chromeos/system", - ] - } - if (is_debug && !is_component_build && enable_plugins) { # Content depends on the PPAPI message logging stuff; if this isn't here, # some unit test binaries won't compile. This only worked in release mode
diff --git a/content/common/url_schemes.cc b/content/common/url_schemes.cc index d0a31f2..c00901a2 100644 --- a/content/common/url_schemes.cc +++ b/content/common/url_schemes.cc
@@ -69,6 +69,7 @@ for (auto& scheme : schemes.referrer_schemes) url::AddReferrerScheme(scheme.c_str(), url::SCHEME_WITH_HOST); + schemes.secure_schemes.push_back(kChromeDevToolsScheme); schemes.secure_schemes.push_back(kChromeUIScheme); schemes.secure_schemes.push_back(kChromeUIUntrustedScheme); schemes.secure_schemes.push_back(kChromeErrorScheme);
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index c048536..a483f93 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -539,8 +539,9 @@ if (action == ACTION_IME_ENTER && ACTION_IME_ENTER != 0) { if (mWebContents != null) { if (ImeAdapterImpl.fromWebContents(mWebContents) != null) { + // We send an unspecified action to ensure Enter key is hit return ImeAdapterImpl.fromWebContents(mWebContents) - .performEditorAction(EditorInfo.IME_ACTION_NEXT); + .performEditorAction(EditorInfo.IME_ACTION_UNSPECIFIED); } } return false;
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java index e5ca6cec..ccc40e4 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -352,8 +352,7 @@ } // True if action mode is initialized to a working (not a no-op) mode. - @VisibleForTesting - public boolean isActionModeSupported() { + private boolean isActionModeSupported() { return mCallback != EMPTY_CALLBACK; }
diff --git a/content/public/browser/permission_type.cc b/content/public/browser/permission_type.cc index 53d17c2..51e5563 100644 --- a/content/public/browser/permission_type.cc +++ b/content/public/browser/permission_type.cc
@@ -57,7 +57,12 @@ case PermissionName::AUDIO_CAPTURE: return PermissionType::AUDIO_CAPTURE; case PermissionName::VIDEO_CAPTURE: - return PermissionType::VIDEO_CAPTURE; + if (descriptor->extension && descriptor->extension->is_camera_device() && + descriptor->extension->get_camera_device()->panTiltZoom) { + return PermissionType::CAMERA_PAN_TILT_ZOOM; + } else { + return PermissionType::VIDEO_CAPTURE; + } case PermissionName::BACKGROUND_SYNC: return PermissionType::BACKGROUND_SYNC; case PermissionName::SENSORS:
diff --git a/content/public/browser/permission_type.h b/content/public/browser/permission_type.h index 2082109c..55a7ad04 100644 --- a/content/public/browser/permission_type.h +++ b/content/public/browser/permission_type.h
@@ -47,6 +47,7 @@ VR = 25, AR = 26, STORAGE_ACCESS_GRANT = 27, + CAMERA_PAN_TILT_ZOOM = 28, // Always keep this at the end. NUM,
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index b926215a..9887453 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -395,11 +395,6 @@ const base::Feature kPassiveDocumentEventListeners{ "PassiveDocumentEventListeners", base::FEATURE_ENABLED_BY_DEFAULT}; -// Whether document level wheel and mousewheel event listeners should default -// 'passive' to true. -const base::Feature kPassiveDocumentWheelEventListeners{ - "PassiveDocumentWheelEventListeners", base::FEATURE_ENABLED_BY_DEFAULT}; - // Whether we should force a touchstart and first touchmove per scroll event // listeners to be non-blocking during fling. const base::Feature kPassiveEventListenersDueToFling{
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index 28d31be8..e2b64335 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -91,7 +91,6 @@ CONTENT_EXPORT extern const base::Feature kOriginPolicy; CONTENT_EXPORT extern const base::Feature kOverscrollHistoryNavigation; CONTENT_EXPORT extern const base::Feature kPassiveDocumentEventListeners; -CONTENT_EXPORT extern const base::Feature kPassiveDocumentWheelEventListeners; CONTENT_EXPORT extern const base::Feature kPassiveEventListenersDueToFling; CONTENT_EXPORT extern const base::Feature kPeriodicBackgroundSync; CONTENT_EXPORT extern const base::Feature kPepper3DImageChromium;
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/WebContentsUtils.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/WebContentsUtils.java index 19453e3..26d026e 100644 --- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/WebContentsUtils.java +++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/WebContentsUtils.java
@@ -122,18 +122,6 @@ return SelectionPopupControllerImpl.createForTesting(webContents); } - /** - * Checks if the given WebContents has a valid {@link ActionMode.Callback} set in place. - * @return {@code true} if WebContents (its SelectionPopupController) has a valid - * action mode callback object. - */ - public static boolean isActionModeSupported(WebContents webContents) { - SelectionPopupControllerImpl controller = - ((SelectionPopupControllerImpl) SelectionPopupController.fromWebContents( - webContents)); - return controller.isActionModeSupported(); - } - private static native void nativeReportAllFrameSubmissions( WebContents webContents, boolean enabled); private static native RenderFrameHost nativeGetFocusedFrame(WebContents webContents);
diff --git a/content/public/test/web_test_support_renderer.h b/content/public/test/web_test_support_renderer.h index 4f07eb83..b3e1802 100644 --- a/content/public/test/web_test_support_renderer.h +++ b/content/public/test/web_test_support_renderer.h
@@ -13,7 +13,6 @@ #include "base/callback_forward.h" namespace blink { -class WebInputEvent; struct WebSize; class WebURL; } // namespace blink @@ -52,14 +51,6 @@ // Set the device scale factor and force the compositor to resize. void SetDeviceScaleFactor(RenderView* render_view, float factor); -// Converts |event| from screen coordinates to coordinates used by the widget -// associated with the |web_widget_test_proxy|. Returns nullptr if no -// transformation was necessary (e.g. for a keyboard event OR if widget requires -// no scaling and has coordinates starting at (0,0)). -std::unique_ptr<blink::WebInputEvent> TransformScreenToWidgetCoordinates( - WebWidgetTestProxy* web_widget_test_proxy, - const blink::WebInputEvent& event); - // Set the device color space. void SetDeviceColorSpace(RenderView* render_view, const gfx::ColorSpace& color_space);
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 09031343..4ab582e4 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -667,6 +667,13 @@ deps += [ "//sandbox:sandbox_buildflags" ] } + if (is_chromeos) { + deps += [ + "//chromeos:chromeos_export", + "//chromeos/system:system", + ] + } + if (use_ozone) { deps += [ "//ui/ozone" ] }
diff --git a/content/renderer/loader/url_loader_client_impl.cc b/content/renderer/loader/url_loader_client_impl.cc index 44fe52b2a..85f07e6f 100644 --- a/content/renderer/loader/url_loader_client_impl.cc +++ b/content/renderer/loader/url_loader_client_impl.cc
@@ -238,6 +238,9 @@ void URLLoaderClientImpl::OnReceiveResponse( network::mojom::URLResponseHeadPtr response_head) { has_received_response_head_ = true; + TRACE_EVENT1("loading", "URLLoaderClientImpl::OnReceiveResponse", "url", + last_loaded_url_.possibly_invalid_spec()); + if (NeedsStoringMessage()) { StoreAndDispatch( std::make_unique<DeferredOnReceiveResponse>(std::move(response_head)));
diff --git a/content/renderer/loader/web_url_loader_impl.cc b/content/renderer/loader/web_url_loader_impl.cc index 0ef62c4..7f6d76ad 100644 --- a/content/renderer/loader/web_url_loader_impl.cc +++ b/content/renderer/loader/web_url_loader_impl.cc
@@ -773,6 +773,10 @@ mojo::ScopedDataPipeConsumerHandle body) { if (client_) client_->DidStartLoadingResponseBody(std::move(body)); + + TRACE_EVENT_WITH_FLOW0( + "loading", "WebURLLoaderImpl::Context::OnStartLoadingResponseBody", this, + TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); } void WebURLLoaderImpl::Context::OnTransferSizeUpdated(int transfer_size_diff) {
diff --git a/content/shell/browser/shell_permission_manager.cc b/content/shell/browser/shell_permission_manager.cc index 1782f3be..ee0b01c 100644 --- a/content/shell/browser/shell_permission_manager.cc +++ b/content/shell/browser/shell_permission_manager.cc
@@ -52,6 +52,7 @@ case PermissionType::NFC: case PermissionType::VR: case PermissionType::AR: + case PermissionType::CAMERA_PAN_TILT_ZOOM: return false; }
diff --git a/content/shell/renderer/web_test/blink_test_runner.cc b/content/shell/renderer/web_test/blink_test_runner.cc index 6ceaf8d0..22e8df3f 100644 --- a/content/shell/renderer/web_test/blink_test_runner.cc +++ b/content/shell/renderer/web_test/blink_test_runner.cc
@@ -278,23 +278,6 @@ content::SetDeviceScaleFactor(render_view(), factor); } -std::unique_ptr<blink::WebInputEvent> -BlinkTestRunner::TransformScreenToWidgetCoordinates( - WebWidgetTestProxy* web_widget_test_proxy, - const blink::WebInputEvent& event) { - return content::TransformScreenToWidgetCoordinates(web_widget_test_proxy, - event); -} - -void BlinkTestRunner::EnableUseZoomForDSF() { - base::CommandLine::ForCurrentProcess()->AppendSwitch( - switches::kEnableUseZoomForDSF); -} - -bool BlinkTestRunner::IsUseZoomForDSFEnabled() { - return content::IsUseZoomForDSFEnabled(); -} - void BlinkTestRunner::SetDeviceColorSpace(const std::string& name) { content::SetDeviceColorSpace(render_view(), GetWebTestColorSpace(name)); }
diff --git a/content/shell/renderer/web_test/blink_test_runner.h b/content/shell/renderer/web_test/blink_test_runner.h index 86e0bf8..7048b3a0 100644 --- a/content/shell/renderer/web_test/blink_test_runner.h +++ b/content/shell/renderer/web_test/blink_test_runner.h
@@ -84,11 +84,6 @@ void SimulateWebContentIndexDelete(const std::string& id) override; void SetDeviceScaleFactor(float factor) override; void SetDeviceColorSpace(const std::string& name) override; - std::unique_ptr<blink::WebInputEvent> TransformScreenToWidgetCoordinates( - WebWidgetTestProxy* web_widget_test_proxy, - const blink::WebInputEvent& event) override; - void EnableUseZoomForDSF() override; - bool IsUseZoomForDSFEnabled() override; void SetBluetoothFakeAdapter(const std::string& adapter_name, base::OnceClosure callback) override; void SetBluetoothManualChooser(bool enable) override;
diff --git a/content/shell/renderer/web_test/web_test_content_renderer_client.cc b/content/shell/renderer/web_test/web_test_content_renderer_client.cc index 3002582..a180addb8 100644 --- a/content/shell/renderer/web_test/web_test_content_renderer_client.cc +++ b/content/shell/renderer/web_test/web_test_content_renderer_client.cc
@@ -67,7 +67,8 @@ void WebTestContentRendererClient::RenderThreadStarted() { ShellContentRendererClient::RenderThreadStarted(); - shell_observer_ = std::make_unique<WebTestRenderThreadObserver>(); + + render_thread_observer_ = std::make_unique<WebTestRenderThreadObserver>(); #if defined(OS_FUCHSIA) || defined(OS_MACOSX) // On these platforms, fonts are set up in the renderer process. Other
diff --git a/content/shell/renderer/web_test/web_test_content_renderer_client.h b/content/shell/renderer/web_test/web_test_content_renderer_client.h index b154d10..f561981 100644 --- a/content/shell/renderer/web_test/web_test_content_renderer_client.h +++ b/content/shell/renderer/web_test/web_test_content_renderer_client.h
@@ -29,7 +29,7 @@ bool IsIdleMediaSuspendEnabled() override; private: - std::unique_ptr<WebTestRenderThreadObserver> shell_observer_; + std::unique_ptr<WebTestRenderThreadObserver> render_thread_observer_; }; } // namespace content
diff --git a/content/shell/test_runner/event_sender.cc b/content/shell/test_runner/event_sender.cc index e943e516c..c9735cc62 100644 --- a/content/shell/test_runner/event_sender.cc +++ b/content/shell/test_runner/event_sender.cc
@@ -23,6 +23,7 @@ #include "base/time/time.h" #include "build/build_config.h" #include "content/common/input/web_mouse_wheel_event_traits.h" +#include "content/renderer/compositor/compositor_dependencies.h" #include "content/renderer/render_frame_impl.h" #include "content/renderer/render_widget.h" #include "content/shell/test_runner/mock_spell_check.h" @@ -240,7 +241,7 @@ void InitMouseEventGeneric(WebMouseEvent::Button b, int current_buttons, - const gfx::Point& pos, + const gfx::PointF& pos, int click_count, WebPointerProperties::PointerType pointerType, int pointerId, @@ -249,8 +250,8 @@ int tiltY, WebMouseEvent* e) { e->button = b; - e->SetPositionInWidget(gfx::PointF(pos)); - e->SetPositionInScreen(gfx::PointF(pos)); + e->SetPositionInWidget(pos); + e->SetPositionInScreen(pos); e->pointer_type = pointerType; e->id = pointerId; e->force = pressure; @@ -261,7 +262,7 @@ void InitMouseEvent(WebMouseEvent::Button b, int current_buttons, - const gfx::Point& pos, + const gfx::PointF& pos, int click_count, WebMouseEvent* e) { InitMouseEventGeneric(b, current_buttons, pos, click_count, @@ -404,10 +405,18 @@ const char kDisabledIdentifier[] = "#"; const char kCheckedIdentifier[] = "*"; -bool OutsideMultiClickRadius(const gfx::Point& a, const gfx::Point& b) { +// Web tests are written to be dsf-independent. This scale should be applied to +// coordinates provided from js, to convert them to physical pixels when +// UseZoomForDSF is enabled. +float DeviceScaleFactorForEvents(WebWidgetTestProxy* widget) { + if (!widget->compositor_deps()->IsUseZoomForDSFEnabled()) + return 1; + return widget->GetOriginalScreenInfo().device_scale_factor; +} + +bool OutsideRadius(const gfx::PointF& a, const gfx::PointF& b, float radius) { return ((a.x() - b.x()) * (a.x() - b.x()) + - (a.y() - b.y()) * (a.y() - b.y())) > - kMultipleClickRadiusPixels * kMultipleClickRadiusPixels; + (a.y() - b.y()) * (a.y() - b.y())) > radius * radius; } void PopulateCustomItems(const WebVector<WebMenuItemInfo>& customItems, @@ -580,7 +589,8 @@ blink::WebLocalFrame* frame); private: - explicit EventSenderBindings(base::WeakPtr<EventSender> sender); + explicit EventSenderBindings(base::WeakPtr<EventSender> sender, + blink::WebLocalFrame* frame); ~EventSenderBindings() override; // gin::Wrappable: @@ -681,16 +691,18 @@ #endif base::WeakPtr<EventSender> sender_; + blink::WebLocalFrame* const frame_; DISALLOW_COPY_AND_ASSIGN(EventSenderBindings); }; gin::WrapperInfo EventSenderBindings::kWrapperInfo = {gin::kEmbedderNativeGin}; -EventSenderBindings::EventSenderBindings(base::WeakPtr<EventSender> sender) - : sender_(sender) {} +EventSenderBindings::EventSenderBindings(base::WeakPtr<EventSender> sender, + blink::WebLocalFrame* frame) + : sender_(sender), frame_(frame) {} -EventSenderBindings::~EventSenderBindings() {} +EventSenderBindings::~EventSenderBindings() = default; // static void EventSenderBindings::Install(base::WeakPtr<EventSender> sender, @@ -704,7 +716,7 @@ v8::Context::Scope context_scope(context); gin::Handle<EventSenderBindings> bindings = - gin::CreateHandle(isolate, new EventSenderBindings(sender)); + gin::CreateHandle(isolate, new EventSenderBindings(sender, frame)); if (bindings.IsEmpty()) return; v8::Local<v8::Object> global = context->Global(); @@ -951,52 +963,52 @@ void EventSenderBindings::GestureScrollBegin(gin::Arguments* args) { if (sender_) - sender_->GestureScrollBegin(args); + sender_->GestureScrollBegin(frame_, args); } void EventSenderBindings::GestureScrollEnd(gin::Arguments* args) { if (sender_) - sender_->GestureScrollEnd(args); + sender_->GestureScrollEnd(frame_, args); } void EventSenderBindings::GestureScrollUpdate(gin::Arguments* args) { if (sender_) - sender_->GestureScrollUpdate(args); + sender_->GestureScrollUpdate(frame_, args); } void EventSenderBindings::GestureTap(gin::Arguments* args) { if (sender_) - sender_->GestureTap(args); + sender_->GestureTap(frame_, args); } void EventSenderBindings::GestureTapDown(gin::Arguments* args) { if (sender_) - sender_->GestureTapDown(args); + sender_->GestureTapDown(frame_, args); } void EventSenderBindings::GestureShowPress(gin::Arguments* args) { if (sender_) - sender_->GestureShowPress(args); + sender_->GestureShowPress(frame_, args); } void EventSenderBindings::GestureTapCancel(gin::Arguments* args) { if (sender_) - sender_->GestureTapCancel(args); + sender_->GestureTapCancel(frame_, args); } void EventSenderBindings::GestureLongPress(gin::Arguments* args) { if (sender_) - sender_->GestureLongPress(args); + sender_->GestureLongPress(frame_, args); } void EventSenderBindings::GestureLongTap(gin::Arguments* args) { if (sender_) - sender_->GestureLongTap(args); + sender_->GestureLongTap(frame_, args); } void EventSenderBindings::GestureTwoFingerTap(gin::Arguments* args) { if (sender_) - sender_->GestureTwoFingerTap(args); + sender_->GestureTwoFingerTap(frame_, args); } void EventSenderBindings::ContinuousMouseScrollBy(gin::Arguments* args) { @@ -1006,7 +1018,7 @@ void EventSenderBindings::MouseMoveTo(gin::Arguments* args) { if (sender_) - sender_->MouseMoveTo(args); + sender_->MouseMoveTo(frame_, args); } void EventSenderBindings::MouseLeave(gin::Arguments* args) { @@ -1302,7 +1314,6 @@ EventSender::~EventSender() {} void EventSender::Reset() { - DCHECK(current_drag_data_.IsNull()); current_drag_data_.Reset(); current_drag_effect_ = blink::kWebDragOperationNone; current_drag_effects_allowed_ = blink::kWebDragOperationNone; @@ -1330,7 +1341,7 @@ #endif last_click_time_ = base::TimeTicks(); - last_click_pos_ = gfx::Point(); + last_click_pos_ = gfx::PointF(); last_button_type_ = WebMouseEvent::Button::kNoButton; touch_points_.clear(); last_context_menu_data_.reset(); @@ -1362,27 +1373,21 @@ void EventSender::DoDragDrop(const WebDragData& drag_data, WebDragOperationsMask mask) { - if (!mainFrameWidget()) + if (!MainFrameWidget()) return; - WebMouseEvent raw_event(WebInputEvent::kMouseDown, - ModifiersForPointer(kRawMousePointerId), - GetCurrentEventTime()); + WebMouseEvent event(WebInputEvent::kMouseDown, + ModifiersForPointer(kRawMousePointerId), + GetCurrentEventTime()); InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_, current_pointer_state_[kRawMousePointerId].current_buttons_, current_pointer_state_[kRawMousePointerId].last_pos_, - click_count_, &raw_event); - - std::unique_ptr<WebInputEvent> widget_event = - TransformScreenToWidgetCoordinates(raw_event); - const WebMouseEvent* event = - widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) - : &raw_event; + click_count_, &event); current_drag_data_ = drag_data; current_drag_effects_allowed_ = mask; - current_drag_effect_ = mainFrameWidget()->DragTargetDragEnter( - drag_data, event->PositionInWidget(), event->PositionInScreen(), + current_drag_effect_ = MainFrameWidget()->DragTargetDragEnter( + drag_data, event.PositionInWidget(), event.PositionInScreen(), current_drag_effects_allowed_, modifiersWithButtons( current_pointer_state_[kRawMousePointerId].modifiers_, @@ -2009,21 +2014,11 @@ } current_drag_effects_allowed_ = blink::kWebDragOperationCopy; - const gfx::Point& last_pos = + const gfx::PointF& last_pos = current_pointer_state_[kRawMousePointerId].last_pos_; - // Compute the scale from window (dsf-independent) to blink (dsf-dependent - // under UseZoomForDSF). - blink::WebFloatRect rect(0, 0, 1.0f, 0.0); - web_widget_test_proxy_->ConvertWindowToViewport(&rect); - float scale_to_blink_coords = rect.width; - - gfx::PointF last_pos_for_blink(last_pos.x() * scale_to_blink_coords, - last_pos.y() * scale_to_blink_coords); - // Provide a drag source. - mainFrameWidget()->DragTargetDragEnter(current_drag_data_, last_pos_for_blink, - last_pos_for_blink, + MainFrameWidget()->DragTargetDragEnter(current_drag_data_, last_pos, last_pos, current_drag_effects_allowed_, 0); // |is_drag_mode_| saves events and then replays them later. We don't // need/want that. @@ -2089,44 +2084,54 @@ touch_points_.push_back(touch_point); } -void EventSender::GestureScrollBegin(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureScrollBegin, args); +void EventSender::GestureScrollBegin(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureScrollBegin, frame, args); } -void EventSender::GestureScrollEnd(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureScrollEnd, args); +void EventSender::GestureScrollEnd(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureScrollEnd, frame, args); } -void EventSender::GestureScrollUpdate(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureScrollUpdate, args); +void EventSender::GestureScrollUpdate(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureScrollUpdate, frame, args); } -void EventSender::GestureTap(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureTap, args); +void EventSender::GestureTap(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureTap, frame, args); } -void EventSender::GestureTapDown(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureTapDown, args); +void EventSender::GestureTapDown(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureTapDown, frame, args); } -void EventSender::GestureShowPress(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureShowPress, args); +void EventSender::GestureShowPress(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureShowPress, frame, args); } -void EventSender::GestureTapCancel(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureTapCancel, args); +void EventSender::GestureTapCancel(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureTapCancel, frame, args); } -void EventSender::GestureLongPress(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureLongPress, args); +void EventSender::GestureLongPress(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureLongPress, frame, args); } -void EventSender::GestureLongTap(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureLongTap, args); +void EventSender::GestureLongTap(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureLongTap, frame, args); } -void EventSender::GestureTwoFingerTap(gin::Arguments* args) { - GestureEvent(WebInputEvent::kGestureTwoFingerTap, args); +void EventSender::GestureTwoFingerTap(blink::WebLocalFrame* frame, + gin::Arguments* args) { + GestureEvent(WebInputEvent::kGestureTwoFingerTap, frame, args); } void EventSender::MouseScrollBy(gin::Arguments* args, @@ -2145,7 +2150,8 @@ } } -void EventSender::MouseMoveTo(gin::Arguments* args) { +void EventSender::MouseMoveTo(blink::WebLocalFrame* frame, + gin::Arguments* args) { if (force_layout_on_events_) UpdateLifecycleToPrePaint(); @@ -2155,7 +2161,23 @@ args->ThrowError(); return; } - gfx::Point mouse_pos(x, y); + DCHECK(!std::isnan(x)); + DCHECK(!std::isnan(y)); + + // Web tests provide inputs in device-scale independent values, and need to be + // adjusted to physical pixels when blink is working in physical pixels as + // determined by UseZoomForDSF. + float dsf = DeviceScaleFactorForEvents(web_widget_test_proxy_); + x *= dsf; + y *= dsf; + + // The x and y coordinates here are relative to the |frame|, but will be + // dispatched to the widget, so they need to be translated to find the same + // position relative to the widget's origin. + // The frame's viewport rect is already in physical pixels when UseZoomForDSF + // is enabled. + x += frame->GetPositionInViewportForTesting().x(); + y += frame->GetPositionInViewportForTesting().y(); int modifiers = 0; if (!args->PeekNext().IsEmpty()) { @@ -2179,11 +2201,11 @@ WebMouseEvent::Button::kLeft) { SavedEvent saved_event; saved_event.type = SavedEvent::TYPE_MOUSE_MOVE; - saved_event.pos = mouse_pos; + saved_event.pos = gfx::PointF(x, y); saved_event.modifiers = modifiers; mouse_event_queue_.push_back(saved_event); } else { - current_pointer_state_[pointerId].last_pos_ = mouse_pos; + current_pointer_state_[pointerId].last_pos_ = gfx::PointF(x, y); current_pointer_state_[pointerId].modifiers_ = modifiers; WebMouseEvent event(WebInputEvent::kMouseMove, ModifiersForPointer(pointerId), GetCurrentEventTime()); @@ -2192,8 +2214,9 @@ : 0; InitMouseEventGeneric( current_pointer_state_[kRawMousePointerId].pressed_button_, - current_pointer_state_[kRawMousePointerId].current_buttons_, mouse_pos, - click_count, pointerType, pointerId, pressure, tiltX, tiltY, &event); + current_pointer_state_[kRawMousePointerId].current_buttons_, + gfx::PointF(x, y), click_count, pointerType, pointerId, pressure, tiltX, + tiltY, &event); HandleInputEventOnViewOrPopup(event); if (pointerType == WebPointerProperties::PointerType::kMouse) DoDragAfterMouseMove(event); @@ -2305,7 +2328,9 @@ } } -void EventSender::GestureEvent(WebInputEvent::Type type, gin::Arguments* args) { +void EventSender::GestureEvent(WebInputEvent::Type type, + blink::WebLocalFrame* frame, + gin::Arguments* args) { WebGestureEvent event(type, WebInputEvent::kNoModifiers, GetCurrentEventTime(), blink::WebGestureDevice::kTouchscreen); @@ -2335,14 +2360,31 @@ args->ThrowError(); return; } + DCHECK(!std::isnan(x)); + DCHECK(!std::isnan(y)); + + // Web tests provide inputs in device-scale independent values, and need to be + // adjusted to physical pixels when blink is working in physical pixels as + // determined by UseZoomForDSF. + float dsf = DeviceScaleFactorForEvents(web_widget_test_proxy_); + x *= dsf; + y *= dsf; + + // The x and y coordinates here are relative to the |frame|, but will be + // dispatched to the widget, so they need to be translated to find the same + // position relative to the widget's origin. + // The frame's viewport rect is already in physical pixels when UseZoomForDSF + // is enabled. + x += frame->GetPositionInViewportForTesting().x(); + y += frame->GetPositionInViewportForTesting().y(); switch (type) { case WebInputEvent::kGestureScrollUpdate: { if (!GetScrollUnits(args, &event.data.scroll_update.delta_units)) return; - event.data.scroll_update.delta_x = static_cast<float>(x); - event.data.scroll_update.delta_y = static_cast<float>(y); + event.data.scroll_update.delta_x = x; + event.data.scroll_update.delta_y = y; event.SetPositionInWidget(current_gesture_location_); current_gesture_location_.Offset(event.data.scroll_update.delta_x, event.data.scroll_update.delta_y); @@ -2503,7 +2545,7 @@ InitMouseEvent(current_pointer_state_[kRawMousePointerId].pressed_button_, current_pointer_state_[kRawMousePointerId].current_buttons_, - gfx::Point(x, y), click_count_, &mouse_event); + gfx::PointF(x, y), click_count_, &mouse_event); FinishDragAndDrop(mouse_event, blink::kWebDragOperationNone); } @@ -2511,11 +2553,19 @@ } void EventSender::UpdateClickCountForButton(WebMouseEvent::Button button_type) { - if ((GetCurrentEventTime() - last_click_time_ < kMultipleClickTime) && - (!OutsideMultiClickRadius( - current_pointer_state_[kRawMousePointerId].last_pos_, - last_click_pos_)) && - (button_type == last_button_type_)) { + // The radius constant is dsf-independent, but events are in physical pixels. + // Convert the radius to physical pixels to compare to the event position. + float radius = kMultipleClickRadiusPixels * + DeviceScaleFactorForEvents(web_widget_test_proxy_); + + bool fast_enough = + GetCurrentEventTime() - last_click_time_ < kMultipleClickTime; + bool nearby_enough = + !OutsideRadius(current_pointer_state_[kRawMousePointerId].last_pos_, + last_click_pos_, radius); + bool same_button = button_type == last_button_type_; + + if (fast_enough && nearby_enough && same_button) { ++click_count_; } else { click_count_ = 1; @@ -2538,6 +2588,18 @@ args->ThrowError(); return WebMouseWheelEvent(); } + DCHECK(!std::isnan(horizontal)); + DCHECK(!std::isnan(vertical)); + + // Web tests provide inputs in device-scale independent values, and need to be + // adjusted to physical pixels. + // While events have floating point positions, blink still expects them to be + // integers (see MouseEvent::screenX() for example). If the web test provides + // a non-whole number (including after device scale factor is applied) we drop + // the fractional part. + float dsf = DeviceScaleFactorForEvents(web_widget_test_proxy_); + horizontal *= dsf; + vertical *= dsf; bool paged = false; bool has_precise_scrolling_deltas = false; @@ -2643,72 +2705,53 @@ return; } -void EventSender::FinishDragAndDrop(const WebMouseEvent& raw_event, +void EventSender::FinishDragAndDrop(const WebMouseEvent& event, blink::WebDragOperation drag_effect) { - std::unique_ptr<WebInputEvent> widget_event = - TransformScreenToWidgetCoordinates(raw_event); - const WebMouseEvent* event = - widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) - : &raw_event; - current_drag_effect_ = drag_effect; if (current_drag_effect_) { // Specifically pass any keyboard modifiers to the drop method. This allows // tests to control the drop type (i.e. copy or move). - mainFrameWidget()->DragTargetDrop( - current_drag_data_, event->PositionInWidget(), - event->PositionInScreen(), event->GetModifiers()); + MainFrameWidget()->DragTargetDrop( + current_drag_data_, event.PositionInWidget(), event.PositionInScreen(), + event.GetModifiers()); } else { - mainFrameWidget()->DragTargetDragLeave(gfx::PointF(), gfx::PointF()); + MainFrameWidget()->DragTargetDragLeave(gfx::PointF(), gfx::PointF()); } current_drag_data_.Reset(); - mainFrameWidget()->DragSourceEndedAt(event->PositionInWidget(), - event->PositionInScreen(), - current_drag_effect_); - mainFrameWidget()->DragSourceSystemDragEnded(); + MainFrameWidget()->DragSourceEndedAt( + event.PositionInWidget(), event.PositionInScreen(), current_drag_effect_); + MainFrameWidget()->DragSourceSystemDragEnded(); } -void EventSender::DoDragAfterMouseUp(const WebMouseEvent& raw_event) { - std::unique_ptr<WebInputEvent> widget_event = - TransformScreenToWidgetCoordinates(raw_event); - const WebMouseEvent* event = - widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) - : &raw_event; - - last_click_time_ = event->TimeStamp(); +void EventSender::DoDragAfterMouseUp(const WebMouseEvent& event) { + last_click_time_ = event.TimeStamp(); last_click_pos_ = current_pointer_state_[kRawMousePointerId].last_pos_; // If we're in a drag operation, complete it. if (current_drag_data_.IsNull()) return; - blink::WebDragOperation drag_effect = mainFrameWidget()->DragTargetDragOver( - event->PositionInWidget(), event->PositionInScreen(), - current_drag_effects_allowed_, event->GetModifiers()); + blink::WebDragOperation drag_effect = MainFrameWidget()->DragTargetDragOver( + event.PositionInWidget(), event.PositionInScreen(), + current_drag_effects_allowed_, event.GetModifiers()); // Bail if dragover caused cancellation. if (current_drag_data_.IsNull()) return; - FinishDragAndDrop(raw_event, drag_effect); + FinishDragAndDrop(event, drag_effect); } -void EventSender::DoDragAfterMouseMove(const WebMouseEvent& raw_event) { +void EventSender::DoDragAfterMouseMove(const WebMouseEvent& event) { if (current_pointer_state_[kRawMousePointerId].pressed_button_ == WebMouseEvent::Button::kNoButton || current_drag_data_.IsNull()) { return; } - std::unique_ptr<WebInputEvent> widget_event = - TransformScreenToWidgetCoordinates(raw_event); - const WebMouseEvent* event = - widget_event.get() ? static_cast<WebMouseEvent*>(widget_event.get()) - : &raw_event; - - current_drag_effect_ = mainFrameWidget()->DragTargetDragOver( - event->PositionInWidget(), event->PositionInScreen(), - current_drag_effects_allowed_, event->GetModifiers()); + current_drag_effect_ = MainFrameWidget()->DragTargetDragOver( + event.PositionInWidget(), event.PositionInScreen(), + current_drag_effects_allowed_, event.GetModifiers()); } void EventSender::ReplaySavedEvents() { @@ -2728,7 +2771,7 @@ current_pointer_state_[kRawMousePointerId].current_buttons_, e.pos, click_count_, &event); current_pointer_state_[kRawMousePointerId].last_pos_ = - gfx::ToFlooredPoint(event.PositionInWidget()); + event.PositionInWidget(); HandleInputEventOnViewOrPopup(event); DoDragAfterMouseMove(event); break; @@ -2764,33 +2807,14 @@ } WebInputEventResult EventSender::HandleInputEventOnViewOrPopup( - const WebInputEvent& raw_event) { - last_event_timestamp_ = raw_event.TimeStamp(); + const WebInputEvent& event) { + last_event_timestamp_ = event.TimeStamp(); WebPagePopup* popup = view()->GetPagePopup(); - if (popup && !WebInputEvent::IsKeyboardEventType(raw_event.GetType())) { - // Compute the scale from window (dsf-independent) to blink (dsf-dependent - // under UseZoomForDSF). - blink::WebFloatRect rect(0, 0, 1.0f, 0.0); - web_widget_test_proxy_->ConvertWindowToViewport(&rect); - float scale_to_blink_coords = rect.width; + if (popup && !WebInputEvent::IsKeyboardEventType(event.GetType())) + return popup->HandleInputEvent(blink::WebCoalescedInputEvent(event)); - // ui::ScaleWebInputEvent returns nullptr when the scale is 1.0f as the - // event does not have to be converted. - std::unique_ptr<WebInputEvent> scaled_event = - ui::ScaleWebInputEvent(raw_event, scale_to_blink_coords); - const WebInputEvent* popup_friendly_event = - scaled_event.get() ? scaled_event.get() : &raw_event; - return popup->HandleInputEvent( - blink::WebCoalescedInputEvent(*popup_friendly_event)); - } - - std::unique_ptr<WebInputEvent> widget_event = - TransformScreenToWidgetCoordinates(raw_event); - const WebInputEvent* event = - widget_event.get() ? static_cast<WebInputEvent*>(widget_event.get()) - : &raw_event; - return widget()->HandleInputEvent(blink::WebCoalescedInputEvent(*event)); + return widget()->HandleInputEvent(blink::WebCoalescedInputEvent(event)); } void EventSender::SendGesturesForMouseWheelEvent( @@ -2865,19 +2889,18 @@ return web_widget_test_proxy_->GetWebWidget(); } -blink::WebFrameWidget* EventSender::mainFrameWidget() { +blink::WebFrameWidget* EventSender::MainFrameWidget() { if (!view() || !view()->MainFrame()) return nullptr; + DCHECK(view()->MainFrame()->IsWebLocalFrame()) << "Event Sender doesn't support being run in a remote frame for this " "operation."; - return view()->MainFrame()->ToWebLocalFrame()->FrameWidget(); -} -std::unique_ptr<WebInputEvent> EventSender::TransformScreenToWidgetCoordinates( - const WebInputEvent& event) { - return delegate()->TransformScreenToWidgetCoordinates(web_widget_test_proxy_, - event); + if (!view()->MainFrame()->ToWebLocalFrame()) + return nullptr; + + return view()->MainFrame()->ToWebLocalFrame()->FrameWidget(); } void EventSender::UpdateLifecycleToPrePaint() {
diff --git a/content/shell/test_runner/event_sender.h b/content/shell/test_runner/event_sender.h index b345459..602c2517 100644 --- a/content/shell/test_runner/event_sender.h +++ b/content/shell/test_runner/event_sender.h
@@ -101,7 +101,7 @@ SavedEventType type; blink::WebMouseEvent::Button button_type; // For MouseUp. - gfx::Point pos; // For MouseMove. + gfx::PointF pos; // For MouseMove. int milliseconds; // For LeapForward. int modifiers; }; @@ -149,19 +149,19 @@ void AddTouchPoint(float x, float y, gin::Arguments* args); - void GestureScrollBegin(gin::Arguments* args); - void GestureScrollEnd(gin::Arguments* args); - void GestureScrollUpdate(gin::Arguments* args); - void GestureTap(gin::Arguments* args); - void GestureTapDown(gin::Arguments* args); - void GestureShowPress(gin::Arguments* args); - void GestureTapCancel(gin::Arguments* args); - void GestureLongPress(gin::Arguments* args); - void GestureLongTap(gin::Arguments* args); - void GestureTwoFingerTap(gin::Arguments* args); + void GestureScrollBegin(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureScrollEnd(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureScrollUpdate(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureTap(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureTapDown(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureShowPress(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureTapCancel(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureLongPress(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureLongTap(blink::WebLocalFrame* frame, gin::Arguments* args); + void GestureTwoFingerTap(blink::WebLocalFrame* frame, gin::Arguments* args); void MouseScrollBy(gin::Arguments* args, MouseScrollType scroll_type); - void MouseMoveTo(gin::Arguments* args); + void MouseMoveTo(blink::WebLocalFrame* frame, gin::Arguments* args); void MouseLeave(blink::WebPointerProperties::PointerType, int pointerId); void ScheduleAsynchronousClick(int button_number, int modifiers); void ScheduleAsynchronousKeyDown(const std::string& code_str, @@ -178,7 +178,9 @@ uint32_t GetUniqueTouchEventId(gin::Arguments* args); void SendCurrentTouchEvent(blink::WebInputEvent::Type, gin::Arguments* args); - void GestureEvent(blink::WebInputEvent::Type, gin::Arguments*); + void GestureEvent(blink::WebInputEvent::Type, + blink::WebLocalFrame* frame, + gin::Arguments* args); void UpdateClickCountForButton(blink::WebMouseEvent::Button); @@ -202,9 +204,6 @@ void SendGesturesForMouseWheelEvent( const blink::WebMouseWheelEvent wheel_event); - std::unique_ptr<blink::WebInputEvent> TransformScreenToWidgetCoordinates( - const blink::WebInputEvent& event); - void UpdateLifecycleToPrePaint(); base::TimeTicks last_event_timestamp() const { return last_event_timestamp_; } @@ -260,7 +259,7 @@ const blink::WebView* view() const; blink::WebView* view(); blink::WebWidget* widget(); - blink::WebFrameWidget* mainFrameWidget(); + blink::WebFrameWidget* MainFrameWidget(); bool force_layout_on_events_; @@ -289,7 +288,7 @@ int current_buttons_; // Location of last mouseMoveTo event of this pointer. - gfx::Point last_pos_; + gfx::PointF last_pos_; int modifiers_; @@ -309,7 +308,7 @@ // Time and place of the last mouse up event. base::TimeTicks last_click_time_; - gfx::Point last_click_pos_; + gfx::PointF last_click_pos_; // The last button number passed to mouseDown and mouseUp. // Used to determine whether the click count continues to increment or not.
diff --git a/content/shell/test_runner/test_runner.cc b/content/shell/test_runner/test_runner.cc index c9b2df3..8041d7e 100644 --- a/content/shell/test_runner/test_runner.cc +++ b/content/shell/test_runner/test_runner.cc
@@ -181,7 +181,6 @@ void DumpSpellCheckCallbacks(); void DumpTitleChanges(); void DumpUserGestureInFrameLoadCallbacks(); - void EnableUseZoomForDSF(v8::Local<v8::Function> callback); void EvaluateScriptInIsolatedWorld(int world_id, const std::string& script); void ExecCommand(gin::Arguments* args); void TriggerTestInspectorIssue(gin::Arguments* args); @@ -454,8 +453,6 @@ &TestRunnerBindings::DumpUserGestureInFrameLoadCallbacks) .SetMethod("enableAutoResizeMode", &TestRunnerBindings::EnableAutoResizeMode) - .SetMethod("enableUseZoomForDSF", - &TestRunnerBindings::EnableUseZoomForDSF) .SetMethod("evaluateScriptInIsolatedWorld", &TestRunnerBindings::EvaluateScriptInIsolatedWorld) .SetMethod( @@ -1215,11 +1212,6 @@ view_runner_->SetBackingScaleFactor(limited_value, callback); } -void TestRunnerBindings::EnableUseZoomForDSF(v8::Local<v8::Function> callback) { - if (view_runner_) - view_runner_->EnableUseZoomForDSF(callback); -} - void TestRunnerBindings::SetColorProfile(const std::string& name, v8::Local<v8::Function> callback) { if (view_runner_)
diff --git a/content/shell/test_runner/test_runner_for_specific_view.cc b/content/shell/test_runner/test_runner_for_specific_view.cc index a0197871..8344814 100644 --- a/content/shell/test_runner/test_runner_for_specific_view.cc +++ b/content/shell/test_runner/test_runner_for_specific_view.cc
@@ -18,6 +18,7 @@ #include "cc/paint/paint_canvas.h" #include "content/common/widget_messages.h" #include "content/public/common/isolated_world_ids.h" +#include "content/public/common/use_zoom_for_dsf_policy.h" #include "content/shell/common/web_test/web_test_string_util.h" #include "content/shell/test_runner/layout_dump.h" #include "content/shell/test_runner/mock_content_settings_client.h" @@ -399,16 +400,10 @@ v8::UniquePersistent<v8::Function> global_callback(blink::MainThreadIsolate(), callback); v8::Local<v8::Value> arg = v8::Boolean::New( - blink::MainThreadIsolate(), delegate()->IsUseZoomForDSFEnabled()); + blink::MainThreadIsolate(), content::IsUseZoomForDSFEnabled()); PostV8CallbackWithArgs(std::move(global_callback), 1, &arg); } -void TestRunnerForSpecificView::EnableUseZoomForDSF( - v8::Local<v8::Function> callback) { - delegate()->EnableUseZoomForDSF(); - PostV8Callback(callback); -} - void TestRunnerForSpecificView::SetColorProfile( const std::string& name, v8::Local<v8::Function> callback) {
diff --git a/content/shell/test_runner/test_runner_for_specific_view.h b/content/shell/test_runner/test_runner_for_specific_view.h index 6abe2d5..263bafe 100644 --- a/content/shell/test_runner/test_runner_for_specific_view.h +++ b/content/shell/test_runner/test_runner_for_specific_view.h
@@ -131,10 +131,6 @@ // Used to set the device scale factor. void SetBackingScaleFactor(double value, v8::Local<v8::Function> callback); - // Enable zoom-for-dsf option. - // TODO(oshima): Remove this once all platforms migrated. - void EnableUseZoomForDSF(v8::Local<v8::Function> callback); - // Change the device color profile while running a web test. void SetColorProfile(const std::string& name, v8::Local<v8::Function> callback);
diff --git a/content/shell/test_runner/web_test_delegate.h b/content/shell/test_runner/web_test_delegate.h index a2e0dd8..c2b4d2ed 100644 --- a/content/shell/test_runner/web_test_delegate.h +++ b/content/shell/test_runner/web_test_delegate.h
@@ -26,7 +26,6 @@ } // namespace base namespace blink { -class WebInputEvent; class WebLocalFrame; class WebPlugin; struct WebPluginParams; @@ -35,8 +34,6 @@ } // namespace blink namespace content { - -class WebWidgetTestProxy; struct TestPreferences; class WebTestDelegate { @@ -106,21 +103,6 @@ // Controls the device scale factor of the main WebView for hidpi tests. virtual void SetDeviceScaleFactor(float factor) = 0; - // Converts |event| from screen coordinates used by EventSender - // into coordinates that are understood by the widget associated with - // |web_widget_test_proxy|. Returns nullptr if no transformation was - // necessary (e.g. for a keyboard event OR if widget requires no scaling - // and has coordinates starting at (0,0)). - virtual std::unique_ptr<blink::WebInputEvent> - TransformScreenToWidgetCoordinates(WebWidgetTestProxy* web_widget_test_proxy, - const blink::WebInputEvent& event) = 0; - - // Enable zoom-for-dsf option. - virtual void EnableUseZoomForDSF() = 0; - - // Returns whether or not the use-zoom-for-dsf flag is enabled. - virtual bool IsUseZoomForDSFEnabled() = 0; - // Change the device color space while running a web test. virtual void SetDeviceColorSpace(const std::string& name) = 0;
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index b90d655..169f8122 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -267,6 +267,8 @@ crbug.com/angleproject/2930 [ win nvidia vulkan passthrough ] conformance/textures/misc/texture-size-cube-maps.html [ Failure ] crbug.com/angleproject/3481 [ win nvidia vulkan passthrough ] conformance/textures/misc/texture-sub-image-cube-maps.html [ Failure ] crbug.com/angleproject/2926 [ win nvidia vulkan passthrough ] deqp/data/gles2/shaders/conversions.html [ Failure ] +crbug.com/angleproject/4569 [ win nvidia vulkan passthrough ] conformance/textures/misc/default-texture.html [ Failure ] + # Flaky since crbug.com/1017162 crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/extensions/angle-instanced-arrays.html [ Failure ] crbug.com/1017162 [ win nvidia vulkan passthrough ] conformance/ogles/GL/* [ Failure ]
diff --git a/content/test/web_test_support_renderer.cc b/content/test/web_test_support_renderer.cc index 11cd2bf..fdf2f8ed 100644 --- a/content/test/web_test_support_renderer.cc +++ b/content/test/web_test_support_renderer.cc
@@ -128,42 +128,6 @@ render_widget->SetDeviceScaleFactorForTesting(factor); } -std::unique_ptr<blink::WebInputEvent> TransformScreenToWidgetCoordinates( - WebWidgetTestProxy* web_widget_test_proxy, - const blink::WebInputEvent& event) { - DCHECK(web_widget_test_proxy); - - // Compute the scale from window (dsf-independent) to blink (dsf-dependent - // under UseZoomForDSF). - blink::WebFloatRect rect(0, 0, 1.0f, 0.0); - web_widget_test_proxy->ConvertWindowToViewport(&rect); - float scale = rect.width; - - blink::WebRect view_rect = web_widget_test_proxy->ViewRect(); - gfx::Vector2d delta(-view_rect.x, -view_rect.y); - - // The coordinates are given in terms of the root widget, so adjust for the - // position of the main frame. - // TODO(sgilhuly): This doesn't work for events sent to OOPIFs because the - // main frame is remote, and doesn't have a corresponding RenderWidget. - // Currently none of those tests are run out of headless mode. - // TODO(danakj): In a frame, the ViewRect is the same in every local root - // and this would just remove and add it back, so this should be fine in - // OOPIFs, we should only do the ViewRect() translation for popup widgets, - // just as RenderWidget does. - RenderFrameImpl* main_frame = - web_widget_test_proxy->GetWebViewTestProxy()->GetMainRenderFrame(); - if (main_frame) { - RenderWidget* root_widget = main_frame->GetLocalRootRenderWidget(); - - blink::WebRect root_rect = root_widget->ViewRect(); - gfx::Vector2d root_delta(root_rect.x, root_rect.y); - delta.Add(root_delta); - } - - return ui::TranslateAndScaleWebInputEvent(event, delta, scale); -} - void SetDeviceColorSpace(RenderView* render_view, const gfx::ColorSpace& color_space) { RenderViewImpl* render_view_impl = static_cast<RenderViewImpl*>(render_view);
diff --git a/extensions/browser/sandboxed_unpacker.cc b/extensions/browser/sandboxed_unpacker.cc index a8e70ca..c53f4c29 100644 --- a/extensions/browser/sandboxed_unpacker.cc +++ b/extensions/browser/sandboxed_unpacker.cc
@@ -57,15 +57,6 @@ using base::ASCIIToUTF16; using content::BrowserThread; -// The following macro makes histograms that record the length of paths -// in this file much easier to read. -// Windows has a short max path length. If the path length to a -// file being unpacked from a CRX exceeds the max length, we might -// fail to install. To see if this is happening, see how long the -// path to the temp unpack directory is. See crbug.com/69693 . -#define PATH_LENGTH_HISTOGRAM(name, path) \ - UMA_HISTOGRAM_CUSTOM_COUNTS(name, path.value().length(), 1, 500, 100) - // Record a rate (kB per second) at which extensions are unpacked. // Range from 1kB/s to 100mB/s. #define UNPACK_RATE_HISTOGRAM(name, rate) \ @@ -79,15 +70,11 @@ const int64_t kBytesPerKb = 1024; const int64_t kBytesPerMb = 1024 * 1024; - UMA_HISTOGRAM_TIMES("Extensions.SandboxUnpackSuccessTime", unpack_time); - // To get a sense of how CRX size impacts unpack time, record unpack // time for several increments of CRX size. int64_t crx_file_size; - if (!base::GetFileSize(crx_path, &crx_file_size)) { - UMA_HISTOGRAM_COUNTS_1M("Extensions.SandboxUnpackSuccessCantGetCrxSize", 1); + if (!base::GetFileSize(crx_path, &crx_file_size)) return; - } // Cast is safe as long as the number of bytes in the CRX is less than // 2^31 * 2^10. @@ -300,15 +287,11 @@ expected_hash = base::ToLowerASCII(crx_info.expected_hash); } - PATH_LENGTH_HISTOGRAM("Extensions.SandboxUnpackInitialCrxPathLength", - crx_info.path); if (!CreateTempDirectory()) return; // ReportFailure() already called. // Initialize the path that will eventually contain the unpacked extension. extension_root_ = temp_dir_.GetPath().AppendASCII(kTempExtensionName); - PATH_LENGTH_HISTOGRAM("Extensions.SandboxUnpackUnpackedCrxPathLength", - extension_root_); // Extract the public key and validate the package. if (!ValidateSignature(crx_info.path, expected_hash, @@ -319,8 +302,6 @@ // Copy the crx file into our working directory. base::FilePath temp_crx_path = temp_dir_.GetPath().Append(crx_info.path.BaseName()); - PATH_LENGTH_HISTOGRAM("Extensions.SandboxUnpackTempCrxPathLength", - temp_crx_path); if (!base::CopyFile(crx_info.path, temp_crx_path)) { // Failed to copy extension file to temporary directory. @@ -348,9 +329,6 @@ return; } - PATH_LENGTH_HISTOGRAM("Extensions.SandboxUnpackLinkFreeCrxPathLength", - link_free_crx_path); - // Make sure to create the directory where the extension will be unzipped, as // the unzipper service requires it. base::FilePath unzipped_dir = @@ -951,9 +929,6 @@ UMA_HISTOGRAM_ENUMERATION( "Extensions.SandboxUnpackFailureReason", reason, SandboxedUnpackerFailureReason::NUM_FAILURE_REASONS); - if (!crx_unpack_start_time_.is_null()) - UMA_HISTOGRAM_TIMES("Extensions.SandboxUnpackFailureTime", - base::TimeTicks::Now() - crx_unpack_start_time_); Cleanup(); client_->OnUnpackFailure(CrxInstallError(reason, error));
diff --git a/extensions/common/api/API_OWNERS b/extensions/common/api/API_OWNERS index 526c980a..9579185 100644 --- a/extensions/common/api/API_OWNERS +++ b/extensions/common/api/API_OWNERS
@@ -14,6 +14,8 @@ karandeepb@chromium.org # For Chrome OS apps APIs. -benwells@chromium.org -stevenjb@chromium.org tbarzic@chromium.org +mukai@chromium.org +xiyuan@chromium.org +stevenjb@chromium.org +benwells@chromium.org
diff --git a/fuchsia/OWNERS b/fuchsia/OWNERS index 205c2d5..be9eafe0 100644 --- a/fuchsia/OWNERS +++ b/fuchsia/OWNERS
@@ -1,5 +1,8 @@ file://build/fuchsia/OWNERS +per-file SECURITY_OWNERS=set noparent +per-file SECURITY_OWNERS=file://fuchsia/SECURITY_OWNERS + # COMPONENT: Fuchsia # OS: Fuchsia # TEAM: cr-fuchsia@chromium.org
diff --git a/fuchsia/SECURITY_OWNERS b/fuchsia/SECURITY_OWNERS new file mode 100644 index 0000000..17e8b7c6 --- /dev/null +++ b/fuchsia/SECURITY_OWNERS
@@ -0,0 +1,16 @@ +# Changes to integration with the Fuchsia platform, or peer components, require +# security review to avoid introducing sandbox escapes. These include: +# - Critical platform integrations (e.g. shared memory, process launching). +# - Changes to Chromium-defined Fuchsia IPC (aka FIDL) protocols. +# - Addition of new FIDL services to child process sandboxes. +# - Addition of new FIDL clients and implementations. +# +# Security team: If you are uncomfortable reviewing a particular bit of code +# yourself, don't hesitate to seek help from another security team member! +# Nobody knows everything, and the only way to learn is from experience. + +# Please keep reviewers ordered alphabetically by LDAP. +ajgo@chromium.org +rsesek@chromium.org +tsepez@chromium.org +wez@chromium.org
diff --git a/fuchsia/base/legacymetrics_client.cc b/fuchsia/base/legacymetrics_client.cc index 5ce0539..a2d45a83 100644 --- a/fuchsia/base/legacymetrics_client.cc +++ b/fuchsia/base/legacymetrics_client.cc
@@ -6,6 +6,7 @@ #include <lib/fit/function.h> #include <lib/sys/cpp/component_context.h> +#include <algorithm> #include <memory> #include <utility> #include <vector> @@ -19,6 +20,8 @@ namespace cr_fuchsia { +constexpr size_t LegacyMetricsClient::kMaxBatchSize; + LegacyMetricsClient::LegacyMetricsClient() = default; LegacyMetricsClient::~LegacyMetricsClient() { @@ -54,18 +57,23 @@ void LegacyMetricsClient::ScheduleNextReport() { DVLOG(1) << "Scheduling next report in " << report_interval_.InSeconds() << "seconds."; - timer_.Start(FROM_HERE, report_interval_, this, &LegacyMetricsClient::Report); + timer_.Start(FROM_HERE, report_interval_, this, + &LegacyMetricsClient::StartReport); } -void LegacyMetricsClient::Report() { +void LegacyMetricsClient::StartReport() { + if (!report_additional_callback_) { + Report({}); + return; + } + report_additional_callback_.Run( + base::BindOnce(&LegacyMetricsClient::Report, weak_factory_.GetWeakPtr())); +} + +void LegacyMetricsClient::Report( + std::vector<fuchsia::legacymetrics::Event> events) { DCHECK(metrics_recorder_); - DVLOG(1) << __func__ << "called."; - - std::vector<fuchsia::legacymetrics::Event> events; - - // Add events from the additional metrics callback, if set. - if (report_additional_callback_) - report_additional_callback_.Run(&events); + DVLOG(1) << __func__ << " called."; // Include histograms. for (auto& histogram : GetLegacyMetricsDeltas()) { @@ -88,10 +96,30 @@ return; } - metrics_recorder_->Record(std::move(events), [this]() { - VLOG(1) << "Report finished."; + DrainBuffer(std::move(events)); +} + +void LegacyMetricsClient::DrainBuffer( + std::vector<fuchsia::legacymetrics::Event> buffer) { + if (buffer.empty()) { + DVLOG(1) << "Buffer drained."; ScheduleNextReport(); - }); + return; + } + + // Since ordering doesn't matter, we can efficiently drain |buffer| by + // repeatedly sending and truncating its tail. + const size_t batch_size = std::min(buffer.size(), kMaxBatchSize); + const size_t batch_start_idx = buffer.size() - batch_size; + std::vector<fuchsia::legacymetrics::Event> batch; + batch.resize(batch_size); + std::move(buffer.begin() + batch_start_idx, buffer.end(), batch.begin()); + buffer.resize(buffer.size() - batch_size); + + metrics_recorder_->Record(std::move(batch), + [this, buffer = std::move(buffer)]() mutable { + DrainBuffer(std::move(buffer)); + }); } void LegacyMetricsClient::OnMetricsRecorderDisconnected(zx_status_t status) {
diff --git a/fuchsia/base/legacymetrics_client.h b/fuchsia/base/legacymetrics_client.h index 1d0dc332..98576a1 100644 --- a/fuchsia/base/legacymetrics_client.h +++ b/fuchsia/base/legacymetrics_client.h
@@ -25,11 +25,14 @@ // Must be constructed, used, and destroyed on the same sequence. class LegacyMetricsClient { public: + // Maximum number of Events to send to Record() at a time, so as to not exceed + // the 64KB FIDL maximum message size. + static constexpr size_t kMaxBatchSize = 50; + using ReportAdditionalMetricsCallback = base::RepeatingCallback<void( - std::vector<fuchsia::legacymetrics::Event>*)>; + base::OnceCallback<void(std::vector<fuchsia::legacymetrics::Event>)>)>; LegacyMetricsClient(); - ~LegacyMetricsClient(); explicit LegacyMetricsClient(const LegacyMetricsClient&) = delete; @@ -39,17 +42,24 @@ // |report_interval|. void Start(base::TimeDelta report_interval); - // Sets a |callback| to be invoked just prior to reporting, allowing users to - // report additional custom metrics. - // Must be called before Start(). + // Sets an asynchronous |callback| to be invoked just prior to reporting, + // allowing users to asynchronously gather and provide additional custom + // metrics. |callback| will receive the list of metrics when they are ready. + // Reporting is paused until |callback| is fulfilled. + // If used, then this method must be called before calling Start(). void SetReportAdditionalMetricsCallback( ReportAdditionalMetricsCallback callback); private: void ScheduleNextReport(); - void Report(); + void StartReport(); + void Report(std::vector<fuchsia::legacymetrics::Event> additional_metrics); void OnMetricsRecorderDisconnected(zx_status_t status); + // Incrementally sends the contents of |buffer| to |metrics_recorder|, and + // invokes |done_cb| when finished. + void DrainBuffer(std::vector<fuchsia::legacymetrics::Event> buffer); + base::TimeDelta report_interval_; ReportAdditionalMetricsCallback report_additional_callback_; std::unique_ptr<LegacyMetricsUserActionRecorder> user_events_recorder_; @@ -57,6 +67,10 @@ fuchsia::legacymetrics::MetricsRecorderPtr metrics_recorder_; base::RetainingOneShotTimer timer_; SEQUENCE_CHECKER(sequence_checker_); + + // Prevents use-after-free if |report_additional_callback_| is invoked after + // |this| is destroyed. + base::WeakPtrFactory<LegacyMetricsClient> weak_factory_{this}; }; } // namespace cr_fuchsia
diff --git a/fuchsia/base/legacymetrics_client_unittest.cc b/fuchsia/base/legacymetrics_client_unittest.cc index 49ecb3c..8c735bbb 100644 --- a/fuchsia/base/legacymetrics_client_unittest.cc +++ b/fuchsia/base/legacymetrics_client_unittest.cc
@@ -102,14 +102,17 @@ } void PopulateAdditionalEvents( - std::vector<fuchsia::legacymetrics::Event>* events) { + base::OnceCallback<void(std::vector<fuchsia::legacymetrics::Event>)> + callback) { fuchsia::legacymetrics::ImplementationDefinedEvent impl_event; impl_event.set_name("baz"); fuchsia::legacymetrics::Event event; event.set_impl_defined_event(std::move(impl_event)); - events->emplace_back(std::move(event)); + std::vector<fuchsia::legacymetrics::Event> events; + events.push_back(std::move(event)); + std::move(callback).Run(std::move(events)); } TEST_F(LegacyMetricsClientTest, AllTypes) { @@ -184,5 +187,34 @@ task_environment_.FastForwardBy(kReportInterval); } +TEST_F(LegacyMetricsClientTest, Batching) { + client_.Start(kReportInterval); + + // Log enough actions that the list will be split across multiple batches. + // Batches are read out in reverse order, so even though it is being logged + // first, it will be emitted in the final batch. + base::RecordComputedAction("batch2"); + + for (size_t i = 0; i < LegacyMetricsClient::kMaxBatchSize; ++i) + base::RecordComputedAction("batch1"); + + task_environment_.FastForwardBy(kReportInterval); + EXPECT_TRUE(test_recorder_.IsRecordInFlight()); + + // First batch. + auto events = test_recorder_.WaitForEvents(); + EXPECT_EQ(LegacyMetricsClient::kMaxBatchSize, events.size()); + for (const auto& event : events) + EXPECT_EQ(event.user_action_event().name(), "batch1"); + test_recorder_.SendAck(); + + // Second batch (remainder). + events = test_recorder_.WaitForEvents(); + EXPECT_EQ(1u, events.size()); + for (const auto& event : events) + EXPECT_EQ(event.user_action_event().name(), "batch2"); + test_recorder_.SendAck(); +} + } // namespace } // namespace cr_fuchsia
diff --git a/fuchsia/engine/OWNERS b/fuchsia/engine/OWNERS index a76b25273..7b7d0cfb 100644 --- a/fuchsia/engine/OWNERS +++ b/fuchsia/engine/OWNERS
@@ -3,6 +3,10 @@ per-file *_type_converter*.*=set noparent per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS -# For security review. +# For Mojo/IPC security review. per-file web_engine_browser_interface_binders.*=set noparent per-file web_engine_browser_interface_binders.*=file://ipc/SECURITY_OWNERS + +# For sandbox security review. +per-file context_provider_impl.*=set noparent +per-file context_provider_impl.*=file://fuchsia/SECURITY_OWNERS
diff --git a/fuchsia/engine/browser/web_engine_browser_main_parts.cc b/fuchsia/engine/browser/web_engine_browser_main_parts.cc index a9a588a7..4c6684b 100644 --- a/fuchsia/engine/browser/web_engine_browser_main_parts.cc +++ b/fuchsia/engine/browser/web_engine_browser_main_parts.cc
@@ -5,12 +5,15 @@ #include "fuchsia/engine/browser/web_engine_browser_main_parts.h" #include <utility> +#include <vector> #include "base/bind_helpers.h" #include "base/command_line.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/logging.h" +#include "base/threading/thread_task_runner_handle.h" #include "content/public/browser/gpu_data_manager.h" +#include "content/public/browser/histogram_fetcher.h" #include "content/public/browser/render_frame_host.h" #include "content/public/common/main_function_params.h" #include "fuchsia/base/legacymetrics_client.h" @@ -29,6 +32,20 @@ constexpr base::TimeDelta kMetricsReportingInterval = base::TimeDelta::FromMinutes(1); +constexpr base::TimeDelta kChildProcessHistogramFetchTimeout = + base::TimeDelta::FromSeconds(10); + +// Merge child process' histogram deltas into the browser process' histograms. +void FetchHistogramsFromChildProcesses( + base::OnceCallback<void(std::vector<fuchsia::legacymetrics::Event>)> + done_cb) { + content::FetchHistogramsAsynchronously( + base::ThreadTaskRunnerHandle::Get(), + base::BindOnce(std::move(done_cb), + std::vector<fuchsia::legacymetrics::Event>()), + kChildProcessHistogramFetchTimeout); +} + } // namespace WebEngineBrowserMainParts::WebEngineBrowserMainParts( @@ -74,6 +91,12 @@ switches::kUseLegacyMetricsService)) { legacy_metrics_client_ = std::make_unique<cr_fuchsia::LegacyMetricsClient>(); + + // Add a hook to asynchronously pull metrics from child processes just prior + // to uploading. + legacy_metrics_client_->SetReportAdditionalMetricsCallback( + base::BindRepeating(&FetchHistogramsFromChildProcesses)); + legacy_metrics_client_->Start(kMetricsReportingInterval); }
diff --git a/gpu/command_buffer/service/context_state.cc b/gpu/command_buffer/service/context_state.cc index 166fc02..11a9fdc 100644 --- a/gpu/command_buffer/service/context_state.cc +++ b/gpu/command_buffer/service/context_state.cc
@@ -9,6 +9,7 @@ #include <cmath> #include "base/numerics/ranges.h" +#include "base/optional.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/service/buffer_manager.h" #include "gpu/command_buffer/service/framebuffer_manager.h" @@ -333,18 +334,26 @@ const ContextState* prev_state) const { if (!feature_info_->IsES3Capable()) return; - const scoped_refptr<Sampler>& cur_sampler = sampler_units[unit]; - GLuint cur_id = cur_sampler ? cur_sampler->service_id() : 0; - GLuint prev_id = 0; - if (prev_state && prev_state->track_texture_and_sampler_units) { - const scoped_refptr<Sampler>& prev_sampler = - prev_state->sampler_units[unit]; - prev_id = prev_sampler ? prev_sampler->service_id() : 0; + DCHECK(track_texture_and_sampler_units || unit == 0); + + GLuint cur_id = 0u; + if (track_texture_and_sampler_units) { + if (const auto& cur_sampler = sampler_units[unit]) + cur_id = cur_sampler->service_id(); } - if (!prev_state || !prev_state->sampler_units_in_ground_state || - cur_id != prev_id) { + + base::Optional<GLuint> prev_id; + if (prev_state) { + if (prev_state->track_texture_and_sampler_units) { + const auto& prev_sampler = prev_state->sampler_units[unit]; + prev_id.emplace(prev_sampler ? prev_sampler->service_id() : 0); + } else if (prev_state->sampler_units_in_ground_state) { + prev_id.emplace(0); + } + } + + if (!prev_id || cur_id != *prev_id) api()->glBindSamplerFn(unit, cur_id); - } } void ContextState::PushTextureUnpackState() const { @@ -462,15 +471,10 @@ break; } } - - // If the current gl texture units are not in ground state, then we do - // need reset texture unit 0. - if (texture_units_in_ground_state) - RestoreTextureUnitBindings(0, prev_state); - sampler_units_in_ground_state = true; - for (auto& sampler : prev_state->sampler_units) { - if (sampler) { + for (size_t i = 1; i < prev_state->sampler_units.size(); ++i) { + const auto& sampler = prev_state->sampler_units[i]; + if (sampler && sampler->service_id() != 0) { sampler_units_in_ground_state = false; break; } @@ -479,6 +483,10 @@ texture_units_in_ground_state = false; sampler_units_in_ground_state = false; } + // Even if |track_texture_and_sampler_units| is false, we still need to + // reset texture unit 0 and sampler unit 0 to ground state. + RestoreTextureUnitBindings(0, prev_state); + RestoreSamplerBinding(0, prev_state); } else { // Restore Texture state. for (size_t i = 0; i < texture_units.size(); ++i) {
diff --git a/gpu/command_buffer/service/external_vk_image_skia_representation.cc b/gpu/command_buffer/service/external_vk_image_skia_representation.cc index fd1b9fb..d58fcd3c 100644 --- a/gpu/command_buffer/service/external_vk_image_skia_representation.cc +++ b/gpu/command_buffer/service/external_vk_image_skia_representation.cc
@@ -11,6 +11,7 @@ #include "gpu/vulkan/vulkan_fence_helper.h" #include "gpu/vulkan/vulkan_function_pointers.h" #include "gpu/vulkan/vulkan_util.h" +#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkPromiseImageTexture.h" #include "third_party/skia/include/gpu/GrBackendSemaphore.h" @@ -24,8 +25,9 @@ } ExternalVkImageSkiaRepresentation::~ExternalVkImageSkiaRepresentation() { - DCHECK_EQ(access_mode_, kNone) << "Previoud access hasn't end yet"; + DCHECK_EQ(access_mode_, kNone) << "Previoud access hasn't end yet."; DCHECK(end_access_semaphore_ == VK_NULL_HANDLE); + surface_ = nullptr; } sk_sp<SkSurface> ExternalVkImageSkiaRepresentation::BeginWriteAccess( @@ -33,31 +35,59 @@ const SkSurfaceProps& surface_props, std::vector<GrBackendSemaphore>* begin_semaphores, std::vector<GrBackendSemaphore>* end_semaphores) { - DCHECK_EQ(access_mode_, kNone) << "Previous access hasn't ended yet"; - DCHECK(!surface_); + auto* gr_context = backing_impl()->context_state()->gr_context(); + if (gr_context->abandoned()) { + LOG(ERROR) << "GrContext is abandonded."; + return nullptr; + } + + if (access_mode_ != kNone) { + LOG(DFATAL) << "Previous access hasn't ended yet. mode=" << access_mode_; + return nullptr; + } auto promise_texture = BeginAccess(false /* readonly */, begin_semaphores, end_semaphores); - if (!promise_texture) + if (!promise_texture) { + LOG(ERROR) << "BeginAccess failed"; return nullptr; - SkColorType sk_color_type = viz::ResourceFormatToClosestSkColorType( - true /* gpu_compositing */, format()); - surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( - backing_impl()->context_state()->gr_context(), - promise_texture->backendTexture(), kTopLeft_GrSurfaceOrigin, - final_msaa_count, sk_color_type, - backing_impl()->color_space().ToSkColorSpace(), &surface_props); + } + + // If surface properties are different from the last access, then we cannot + // reuse the cached SkSurface. + if (!surface_ || surface_props != surface_->props() || + final_msaa_count != surface_msaa_count_) { + SkColorType sk_color_type = viz::ResourceFormatToClosestSkColorType( + true /* gpu_compositing */, format()); + surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( + gr_context, promise_texture->backendTexture(), kTopLeft_GrSurfaceOrigin, + final_msaa_count, sk_color_type, + backing_impl()->color_space().ToSkColorSpace(), &surface_props); + if (!surface_) { + LOG(ERROR) << "MakeFromBackendTextureAsRenderTarget() failed."; + return nullptr; + } + surface_msaa_count_ = final_msaa_count; + } + + int count = surface_->getCanvas()->save(); + DCHECK_EQ(count, 1); + ALLOW_UNUSED_LOCAL(count); + access_mode_ = kWrite; return surface_; } void ExternalVkImageSkiaRepresentation::EndWriteAccess( sk_sp<SkSurface> surface) { - DCHECK_EQ(access_mode_, kWrite) - << "EndWriteAccess is called before BeginWriteAccess"; - DCHECK(surface_); + if (access_mode_ != kWrite) { + LOG(DFATAL) << "BeginWriteAccess is not called mode=" << access_mode_; + return; + } - surface_ = nullptr; + surface = nullptr; + DCHECK(surface_->unique()); + surface_->getCanvas()->restoreToCount(1); EndAccess(false /* readonly */); access_mode_ = kNone; } @@ -65,21 +95,26 @@ sk_sp<SkPromiseImageTexture> ExternalVkImageSkiaRepresentation::BeginReadAccess( std::vector<GrBackendSemaphore>* begin_semaphores, std::vector<GrBackendSemaphore>* end_semaphores) { - // TODO(penghuang): provide begin and end semaphores. - DCHECK_EQ(access_mode_, kNone) << "Previous access hasn't ended yet"; - DCHECK(!surface_); + if (access_mode_ != kNone) { + LOG(DFATAL) << "Previous access is not finished. mode=" << access_mode_; + return nullptr; + } auto promise_texture = BeginAccess(true /* readonly */, begin_semaphores, end_semaphores); - if (!promise_texture) + if (!promise_texture) { + LOG(ERROR) << "BeginAccess failed"; return nullptr; + } access_mode_ = kRead; return promise_texture; } void ExternalVkImageSkiaRepresentation::EndReadAccess() { - DCHECK_EQ(access_mode_, kRead) - << "EndReadAccess is called before BeginReadAccess"; + if (access_mode_ != kRead) { + LOG(DFATAL) << "BeginReadAccess is not called. mode=" << access_mode_; + return; + } EndAccess(true /* readonly */); access_mode_ = kNone;
diff --git a/gpu/command_buffer/service/external_vk_image_skia_representation.h b/gpu/command_buffer/service/external_vk_image_skia_representation.h index dbc57d4..4daf3d9 100644 --- a/gpu/command_buffer/service/external_vk_image_skia_representation.h +++ b/gpu/command_buffer/service/external_vk_image_skia_representation.h
@@ -84,6 +84,7 @@ kWrite = 2, }; AccessMode access_mode_ = kNone; + int surface_msaa_count_ = 0; sk_sp<SkSurface> surface_; VkSemaphore end_access_semaphore_ = VK_NULL_HANDLE; };
diff --git a/gpu/command_buffer/service/shared_context_state.cc b/gpu/command_buffer/service/shared_context_state.cc index 8c96e516..a56f302 100644 --- a/gpu/command_buffer/service/shared_context_state.cc +++ b/gpu/command_buffer/service/shared_context_state.cc
@@ -190,18 +190,9 @@ if (GrContextIsGL()) { DCHECK(context_->IsCurrent(nullptr)); - - std::vector<const char*> blacklisted_extensions; - constexpr char kQualcommTiledRendering[] = "GL_QCOM_tiled_rendering"; - // We rely on |enable_threaded_texture_mailboxes| to limit the - // workaround to webview only. - if (workarounds.disable_qcomm_tiled_rendering && - gpu_preferences.enable_threaded_texture_mailboxes) { - blacklisted_extensions.push_back(kQualcommTiledRendering); - } sk_sp<GrGLInterface> interface(gl::init::CreateGrGLInterface( *context_->GetVersionInfo(), workarounds.use_es2_for_oopr, - progress_reporter, blacklisted_extensions)); + progress_reporter)); if (!interface) { LOG(ERROR) << "OOP raster support disabled: GrGLInterface creation " "failed.";
diff --git a/gpu/config/device_perf_info.h b/gpu/config/device_perf_info.h index 10cdaac4..e33874ba 100644 --- a/gpu/config/device_perf_info.h +++ b/gpu/config/device_perf_info.h
@@ -18,10 +18,15 @@ namespace gpu { +// These values are persistent to logs. Entries should not be renumbered and +// numeric values should never be reused. +// This should match enum IntelGpuGeneration in +// \tools\metrics\histograms\enums.xml enum class IntelGpuGeneration { kNonIntel = 0, kUnknownIntel = 1, // Intel GPU, but not one of the following generations. - // Don't care about Gen1 ~ Gen5. Detection code starts with Gen6. + kGen4 = 4, + kGen5 = 5, kGen6 = 6, kGen7 = 7, kGen8 = 8,
diff --git a/gpu/config/gpu_control_list.cc b/gpu/config/gpu_control_list.cc index b4ab820..f17e69a 100644 --- a/gpu/config/gpu_control_list.cc +++ b/gpu/config/gpu_control_list.cc
@@ -96,7 +96,7 @@ return 0; } -bool isOldIntelDriver(const std::vector<std::string>& version) { +bool IsOldIntelDriver(const std::vector<std::string>& version) { DCHECK_EQ(4u, version.size()); unsigned value = 0; bool valid = base::StringToUint(version[2], &value); @@ -264,20 +264,21 @@ valid = ProcessVersionString(driver_version.value2, '.', &ref_version2); DCHECK(valid); } - // If either of the two versions doesn't match the Intel driver version + // schema, or they belong to different generation of version schema, they + // If either of the two versions doesn't match the Intel driver version + // schema, or they belong to different generation of version schema, they // should not be compared. if (version.size() != 4 || ref_version.size() != 4) return false; - if (isOldIntelDriver(version) != isOldIntelDriver(ref_version)) + if (IsOldIntelDriver(version) != IsOldIntelDriver(ref_version)) return false; if (!ref_version2.empty()) { if (ref_version2.size() != 4 - || isOldIntelDriver(ref_version) != isOldIntelDriver(ref_version2)) + || IsOldIntelDriver(ref_version) != IsOldIntelDriver(ref_version2)) return false; } std::string build_num, ref_build_num, ref_build_num2; - if (isOldIntelDriver(version)) { + if (IsOldIntelDriver(version)) { build_num = version[3]; ref_build_num = ref_version[3]; if (!ref_version2.empty())
diff --git a/gpu/config/gpu_control_list_format.txt b/gpu/config/gpu_control_list_format.txt index 338910a..ceb1e87 100644 --- a/gpu/config/gpu_control_list_format.txt +++ b/gpu/config/gpu_control_list_format.txt
@@ -68,12 +68,12 @@ // to 0, which is Chrome's blacklist. Any entries with a non-zero test_group // ID will be appended on top of the default group entries if Chrome runs // with --gpu-blacklist-test-group=ID. -// 28. "gpu_series" is a list of gpu series names. Currently supported series -// include: "intel_sandybridge", "intel_valleyview", "intel_ivybridge", -// "intel_haswell", "intel_cherryview", "intel_broadwell", -// "intel_apollolake", "intel_skylake", "intel_geminilake", -// "intel_kabylake", "intel_coffeelake", "intel_whiskeylake", -// "intel_cometlake", "intel_cannonlake", "intel_icelake". +// 28. "intel_gpu_series" is a list of gpu series names. Currently supported +// series include: "broadwater", "eaglelake", "ironlake", "sandybridge", +// "baytrail", "ivybridge", "haswell", "cherrytrail", "broadwell", +// "apollolake", "skylake", "geminilake", "kabylake", "coffeelake", +// "whiskeylake", "cometlake", "cannonlake", "icelake", "elkhartlake", +// "jasperlake", "tigerlake". // 29. "hardware_overlay" is either "supported" or "unsupported". Currently it // only applies on Windows where hardware overlays may be supported on // certain Intel GPUs. By default it's "dont_care" and there is no need to
diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json index 7fee20a..34870b33 100644 --- a/gpu/config/gpu_driver_bug_list.json +++ b/gpu/config/gpu_driver_bug_list.json
@@ -3545,18 +3545,6 @@ ] }, { - "id": 333, - "cr_bugs": [1042615], - "description": "Disable Qcomm_tiled_rendering extension for webview", - "os": { - "type": "android" - }, - "gl_vendor": "Qualcomm.*", - "features": [ - "disable_qcomm_tiled_rendering" - ] - }, - { "id": 334, "description": "NVidia drivers seem corrupt memory when all siblings of eglImage are destroyed", "cr_bugs": [1052114],
diff --git a/gpu/config/gpu_info.h b/gpu/config/gpu_info.h index 50cec94..f981986 100644 --- a/gpu/config/gpu_info.h +++ b/gpu/config/gpu_info.h
@@ -29,10 +29,17 @@ namespace gpu { -// These values are persisted to logs. Entries should not be renumbered and +// These values are persistent to logs. Entries should not be renumbered and // numeric values should never be reused. +// This should match enum IntelGpuSeriesType in +// \tools\metrics\histograms\enums.xml enum class IntelGpuSeriesType { kUnknown = 0, + // Intel 4th gen + kBroadwater = 16, + kEaglelake = 17, + // Intel 5th gen + kIronlake = 18, // Intel 6th gen kSandybridge = 1, // Intel 7th gen @@ -54,8 +61,12 @@ kCannonlake = 14, // Intel 11th gen kIcelake = 15, + kElkhartlake = 19, + kJasperlake = 20, + // Intel 12th gen + kTigerlake = 21, // Please also update |gpu_series_map| in process_json.py. - kMaxValue = kIcelake, + kMaxValue = kTigerlake, }; // Video profile. This *must* match media::VideoCodecProfile.
diff --git a/gpu/config/gpu_util.cc b/gpu/config/gpu_util.cc index db6b3097..feb1241 100644 --- a/gpu/config/gpu_util.cc +++ b/gpu/config/gpu_util.cc
@@ -54,7 +54,7 @@ namespace { #if defined(OS_WIN) -// These values are persisted to logs. Entries should not be renumbered and +// These values are persistent to logs. Entries should not be renumbered and // numeric values should never be reused. // This should match enum D3D11FeatureLevel in // \tools\metrics\histograms\enums.xml @@ -790,36 +790,36 @@ // and we don't want to expose an extra bit other than the already recorded // vendor_id and device_id. if (vendor_id == 0x8086) { // Intel - // We only identify Intel 6th gen or newer. - // The device id can be referred to in the following locations: - // https://en.wikipedia.org/wiki/List_of_Intel_graphics_processing_units - // and the heade files in Mesa sources: - // include/pci_ids/i965_pci_ids.h + // The device IDs of Intel GPU are based on following Mesa source files: + // include/pci_ids/i965_pci_ids.h and iris_pci_ids.h uint32_t masked_device_id = device_id & 0xFF00; switch (masked_device_id) { - case 0x0100: - switch (device_id & 0xFFF0) { - case 0x0100: - case 0x0110: - case 0x0120: - return IntelGpuSeriesType::kSandybridge; - case 0x0150: - if (device_id == 0x0155 || device_id == 0x0157) - return IntelGpuSeriesType::kBaytrail; - if (device_id == 0x0152 || device_id == 0x015A - || device_id == 0x0156) - return IntelGpuSeriesType::kIvybridge; - break; - case 0x0160: - return IntelGpuSeriesType::kIvybridge; - default: - break; - } + case 0x2900: + return IntelGpuSeriesType::kBroadwater; + case 0x2A00: + if (device_id == 0x2A02 || device_id == 0x2A12) + return IntelGpuSeriesType::kBroadwater; + if (device_id == 0x2A42) + return IntelGpuSeriesType::kEaglelake; break; + case 0x2E00: + return IntelGpuSeriesType::kEaglelake; + case 0x0000: + return IntelGpuSeriesType::kIronlake; + case 0x0100: + if (device_id == 0x0152 || device_id == 0x0156 || device_id == 0x015A || + device_id == 0x0162 || device_id == 0x0166 || device_id == 0x016A) + return IntelGpuSeriesType::kIvybridge; + if (device_id == 0x0155 || device_id == 0x0157) + return IntelGpuSeriesType::kBaytrail; + return IntelGpuSeriesType::kSandybridge; case 0x0F00: return IntelGpuSeriesType::kBaytrail; - case 0x0400: case 0x0A00: + if (device_id == 0x0A84) + return IntelGpuSeriesType::kApollolake; + return IntelGpuSeriesType::kHaswell; + case 0x0400: case 0x0C00: case 0x0D00: return IntelGpuSeriesType::kHaswell; @@ -833,6 +833,8 @@ return IntelGpuSeriesType::kCannonlake; case 0x1900: return IntelGpuSeriesType::kSkylake; + case 0x1A00: + return IntelGpuSeriesType::kApollolake; case 0x3100: return IntelGpuSeriesType::kGeminilake; case 0x5900: @@ -852,6 +854,12 @@ return IntelGpuSeriesType::kCometlake; case 0x8A00: return IntelGpuSeriesType::kIcelake; + case 0x4500: + return IntelGpuSeriesType::kElkhartlake; + case 0x4E00: + return IntelGpuSeriesType::kJasperlake; + case 0x9A00: + return IntelGpuSeriesType::kTigerlake; default: break; } @@ -863,6 +871,11 @@ if (vendor_id == 0x8086) { IntelGpuSeriesType gpu_series = GetIntelGpuSeriesType(vendor_id, device_id); switch (gpu_series) { + case IntelGpuSeriesType::kBroadwater: + case IntelGpuSeriesType::kEaglelake: + return "4"; + case IntelGpuSeriesType::kIronlake: + return "5"; case IntelGpuSeriesType::kSandybridge: return "6"; case IntelGpuSeriesType::kBaytrail: @@ -883,7 +896,11 @@ case IntelGpuSeriesType::kCannonlake: return "10"; case IntelGpuSeriesType::kIcelake: + case IntelGpuSeriesType::kElkhartlake: + case IntelGpuSeriesType::kJasperlake: return "11"; + case IntelGpuSeriesType::kTigerlake: + return "12"; default: break; }
diff --git a/gpu/config/gpu_workaround_list.txt b/gpu/config/gpu_workaround_list.txt index 54637af..498d979b6 100644 --- a/gpu/config/gpu_workaround_list.txt +++ b/gpu/config/gpu_workaround_list.txt
@@ -41,7 +41,6 @@ disable_program_cache disable_program_caching_for_transform_feedback disable_program_disk_cache -disable_qcomm_tiled_rendering disable_software_to_accelerated_canvas_upgrade disable_texture_cube_map_seamless disable_texture_storage
diff --git a/gpu/config/process_json.py b/gpu/config/process_json.py index 15a5e4c..ab86159 100755 --- a/gpu/config/process_json.py +++ b/gpu/config/process_json.py
@@ -571,6 +571,9 @@ data_helper_file.write('const IntelGpuSeriesType %s[%d] = {\n' % (var_name, len(intel_gpu_series_list))) intel_gpu_series_map = { + 'broadwater': 'kBroadwater', + 'eaglelake': 'kEaglelake', + 'ironlake': 'kIronlake', 'sandybridge': 'kSandybridge', 'baytrail': 'kBaytrail', 'ivybridge': 'kIvybridge', @@ -585,7 +588,10 @@ 'whiskeylake': 'kWhiskeylake', 'cometlake': 'kCometlake', 'cannonlake': 'kCannonlake', - 'icelake': 'kIcelake' + 'icelake': 'kIcelake', + 'elkhartlake': 'kElkhartlake', + 'jasperlake': 'kJasperlake', + 'tigerlake': 'kTigerlake' } for series in intel_gpu_series_list: assert series in intel_gpu_series_map
diff --git a/infra/config/buckets/ci.star b/infra/config/buckets/ci.star index d762ce7..c7c77bc 100644 --- a/infra/config/buckets/ci.star +++ b/infra/config/buckets/ci.star
@@ -647,6 +647,14 @@ ) ci.android_fyi_builder( + name = 'android-weblayer-pie-x86-fyi-rel', + console_view_entry = ci.console_view_entry( + category = 'weblayer', + short_name = 'p-x86-rel', + ), +) + +ci.android_fyi_builder( name = 'Android WebView P Blink-CORS FYI (rel)', console_view_entry = ci.console_view_entry( category = 'webview', @@ -2015,9 +2023,11 @@ category = 'iOS|iOS13', short_name = 'sim', ), + caches = [xcode_cache.x11e146], executable = 'recipe:chromium', + os = os.MAC_10_15, properties = { - 'xcode_build_version': '11c29' + 'xcode_build_version': '11e146' } ) @@ -2989,6 +2999,9 @@ short_name = 'dev', ), executable = 'recipe:chromium', + # We don't have necessary capacity to run this configuration in CQ, but it + # is part of the main waterfall + main_console_view = 'main', ) ci.mac_ios_builder( @@ -2997,6 +3010,9 @@ category = 'ios|default', short_name = 'non', ), + # We don't have necessary capacity to run this configuration in CQ, but it + # is part of the main waterfall + main_console_view = 'main', )
diff --git a/infra/config/buckets/try.star b/infra/config/buckets/try.star index a452958..7ca84414 100644 --- a/infra/config/buckets/try.star +++ b/infra/config/buckets/try.star
@@ -1,4 +1,4 @@ -load('//lib/builders.star', 'cpu', 'goma', 'os') +load('//lib/builders.star', 'cpu', 'goma', 'os', 'xcode_cache') load('//lib/try.star', 'try_') # Defaults that apply to all branch versions of the bucket @@ -163,6 +163,10 @@ ) try_.chromium_android_builder( + name = 'android-weblayer-pie-x86-fyi-rel', +) + +try_.chromium_android_builder( name = 'android-webview-marshmallow-arm64-dbg', ) @@ -611,6 +615,11 @@ try_.chromium_mac_ios_builder( name = 'ios13-sdk-simulator', executable = 'recipe:chromium_trybot', + caches = [xcode_cache.x11e146], + os = os.MAC_10_15, + properties = { + 'xcode_build_version': '11e146' + } ) try_.chromium_win_builder(
diff --git a/infra/config/consoles/chromium.fyi.star b/infra/config/consoles/chromium.fyi.star deleted file mode 100644 index 2dd267dd..0000000 --- a/infra/config/consoles/chromium.fyi.star +++ /dev/null
@@ -1,291 +0,0 @@ -luci.console_view( - name = 'chromium.fyi', - header = '//consoles/chromium-header.textpb', - repo = 'https://chromium.googlesource.com/chromium/src', - entries = [ - luci.console_view_entry( - builder = 'ci/Closure Compilation Linux', - category = 'closure_compilation', - ), - luci.console_view_entry( - builder = 'ci/android-code-coverage', - category = 'code_coverage', - short_name = 'and', - ), - luci.console_view_entry( - builder = 'ci/android-code-coverage-native', - category = 'code_coverage', - short_name = 'ann', - ), - luci.console_view_entry( - builder = 'ci/linux-code-coverage', - category = 'code_coverage', - short_name = 'lnx', - ), - luci.console_view_entry( - builder = 'ci/linux-chromeos-code-coverage', - category = 'code_coverage', - short_name = 'lcr', - ), - luci.console_view_entry( - builder = 'ci/mac-code-coverage', - category = 'code_coverage', - short_name = 'mac', - ), - luci.console_view_entry( - builder = 'ci/ios-simulator-code-coverage', - category = 'code_coverage', - short_name = 'ios', - ), - luci.console_view_entry( - builder = 'ci/win10-code-coverage', - category = 'code_coverage', - short_name = 'win', - ), - luci.console_view_entry( - builder = 'ci/ios-simulator-cronet', - category = 'cronet', - ), - luci.console_view_entry( - builder = 'ci/Mac Builder Next', - category = 'mac', - short_name = 'bld', - ), - luci.console_view_entry( - builder = 'ci/Mac10.15 Tests', - category = 'mac', - short_name = '15', - ), - luci.console_view_entry( - builder = 'ci/mac-hermetic-upgrade-rel', - category = 'mac', - short_name = 'herm', - ), - luci.console_view_entry( - builder = 'ci/mac-osxbeta-rel', - category = 'mac', - short_name = 'beta', - ), - luci.console_view_entry( - builder = 'ci/Mac deterministic', - category = 'deterministic|mac', - short_name = 'rel', - ), - luci.console_view_entry( - builder = 'ci/Mac deterministic (dbg)', - category = 'deterministic|mac', - short_name = 'dbg', - ), - luci.console_view_entry( - builder = 'ci/fuchsia-fyi-arm64-rel', - category = 'fuchsia', - ), - luci.console_view_entry( - builder = 'ci/fuchsia-fyi-x64-dbg', - category = 'fuchsia', - ), - luci.console_view_entry( - builder = 'ci/fuchsia-fyi-x64-rel', - category = 'fuchsia', - ), - luci.console_view_entry( - builder = 'ci/chromeos-amd64-generic-rel-vm-tests', - category = 'chromeos', - ), - luci.console_view_entry( - builder = 'ci/chromeos-kevin-rel-hw-tests', - category = 'chromos', - ), - luci.console_view_entry( - builder = 'ci/ios-simulator-cr-recipe', - category = 'iOS', - short_name = 'chr', - ), - luci.console_view_entry( - builder = 'ci/ios-webkit-tot', - category = 'iOS', - short_name = 'wk', - ), - luci.console_view_entry( - builder = 'ci/ios13-sdk-device', - category = 'iOS|iOS13', - short_name = 'dev', - ), - luci.console_view_entry( - builder = 'ci/ios13-sdk-simulator', - category = 'iOS|iOS13', - short_name = 'sim', - ), - luci.console_view_entry( - builder = 'ci/ios13-beta-simulator', - category = 'iOS|iOS13', - short_name = 'ios13', - ), - luci.console_view_entry( - builder = 'ci/linux-blink-animation-use-time-delta', - category = 'linux|blink', - short_name = 'TD', - ), - luci.console_view_entry( - builder = 'ci/linux-blink-heap-concurrent-marking-tsan-rel', - category = 'linux|blink', - short_name = 'CM', - ), - luci.console_view_entry( - builder = 'ci/linux-blink-heap-verification', - category = 'linux|blink', - short_name = 'VF', - ), - luci.console_view_entry( - builder = 'ci/VR Linux', - category = 'linux', - ), - luci.console_view_entry( - builder = 'ci/linux-bfcache-rel', - category = 'linux', - ), - luci.console_view_entry( - builder = 'ci/linux-blink-cors-rel', - category = 'linux', - ), - luci.console_view_entry( - builder = 'ci/linux-fieldtrial-rel', - category = 'linux', - ), - luci.console_view_entry( - builder = 'ci/linux-wpt-fyi-rel', - category = 'linux', - ), - # Moved to the FYI console for being habitually flaky. - # https://crbug.com/1014673 - luci.console_view_entry( - builder = 'ci/Leak Detection Linux', - category = 'linux', - short_name = 'lk', - ), - luci.console_view_entry( - builder = 'ci/Linux Ozone Tester (Headless)', - category = 'linux', - short_name = 'loh', - ), - luci.console_view_entry( - builder = 'ci/Linux Ozone Tester (Wayland)', - category = 'linux', - short_name = 'low', - ), - luci.console_view_entry( - builder = 'ci/Linux Ozone Tester (X11)', - category = 'linux', - short_name = 'lox', - ), - luci.console_view_entry( - builder = 'ci/Mojo Android', - category = 'mojo', - short_name = 'and', - ), - luci.console_view_entry( - builder = 'ci/android-mojo-webview-rel', - category = 'mojo', - short_name = 'aw', - ), - luci.console_view_entry( - builder = 'ci/Mojo ChromiumOS', - category = 'mojo', - short_name = 'cr', - ), - luci.console_view_entry( - builder = 'ci/Mojo Linux', - category = 'mojo', - short_name = 'lnx', - ), - luci.console_view_entry( - builder = 'ci/mac-mojo-rel', - category = 'mojo', - short_name = 'mac', - ), - luci.console_view_entry( - builder = 'ci/Mojo Windows', - category = 'mojo', - short_name = 'win', - ), - luci.console_view_entry( - builder = 'ci/linux-chromium-tests-staging-builder', - category = 'recipe|staging|linux', - short_name = 'bld', - ), - luci.console_view_entry( - builder = 'ci/linux-chromium-tests-staging-tests', - category = 'recipe|staging|linux', - short_name = 'tst', - ), - luci.console_view_entry( - builder = 'ci/Linux remote_run Builder', - category = 'remote_run', - ), - luci.console_view_entry( - builder = 'ci/Linux remote_run Tester', - category = 'remote_run', - ), - luci.console_view_entry( - builder = 'ci/Site Isolation Android', - category = 'site_isolation', - ), - luci.console_view_entry( - builder = 'ci/linux-annotator-rel', - category = 'network|traffic|annotations', - short_name = 'lnx', - ), - luci.console_view_entry( - builder = 'ci/win-annotator-rel', - category = 'network|traffic|annotations', - short_name = 'win', - ), - luci.console_view_entry( - builder = 'ci/Linux Viz', - category = 'viz', - ), - luci.console_view_entry( - builder = 'ci/Win 10 Fast Ring', - category = 'win10', - ), - luci.console_view_entry( - builder = 'ci/win-pixel-builder-rel', - category = 'win10', - ), - luci.console_view_entry( - builder = 'ci/win-pixel-tester-rel', - category = 'win10', - ), - luci.console_view_entry( - builder = 'ci/Win10 Tests x64 1803', - category = 'win10|1803', - ), - luci.console_view_entry( - builder = 'ci/win32-arm64-rel', - category = 'win32|arm64', - ), - luci.console_view_entry( - builder = 'ci/win-celab-builder-rel', - category = 'celab', - ), - luci.console_view_entry( - builder = 'ci/win-celab-tester-rel', - category = 'celab', - ), - luci.console_view_entry( - builder = 'ci/linux-upload-perfetto', - category = 'perfetto', - short_name = 'lnx', - ), - luci.console_view_entry( - builder = 'ci/mac-upload-perfetto', - category = 'perfetto', - short_name = 'mac', - ), - luci.console_view_entry( - builder = 'ci/win-upload-perfetto', - category = 'perfetto', - short_name = 'win', - ), - ], -)
diff --git a/infra/config/generated/commit-queue.cfg b/infra/config/generated/commit-queue.cfg index bc2dc5c..d319f58 100644 --- a/infra/config/generated/commit-queue.cfg +++ b/infra/config/generated/commit-queue.cfg
@@ -161,6 +161,10 @@ includable_only: true > builders: < + name: "chromium/try/android-weblayer-pie-x86-fyi-rel" + includable_only: true + > + builders: < name: "chromium/try/android-webview-marshmallow-arm64-dbg" includable_only: true >
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg index b3a3f18e..e71c9e8 100644 --- a/infra/config/generated/cr-buildbucket.cfg +++ b/infra/config/generated/cr-buildbucket.cfg
@@ -38,6 +38,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ASAN Release" @@ -59,6 +62,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ASAN Release Media" @@ -80,6 +86,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ASan Debug (32-bit x86 with V8-ARM)" @@ -101,6 +110,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ASan Release (32-bit x86 with V8-ARM)" @@ -122,6 +134,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ASan Release Media (32-bit x86 with V8-ARM)" @@ -143,6 +158,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Afl Upload Linux ASan" @@ -164,6 +182,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android ASAN (dbg)" @@ -185,6 +206,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android CFI" @@ -206,6 +230,9 @@ execution_timeout_secs: 16200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI 32 Vk Release (Pixel 2)" @@ -227,6 +254,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI 32 dEQP Vk Release (Pixel 2)" @@ -248,6 +278,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI 64 Perf (Pixel 2)" @@ -269,6 +302,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI 64 Vk Release (Pixel 2)" @@ -290,6 +326,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI 64 dEQP Vk Release (Pixel 2)" @@ -311,6 +350,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI Release (NVIDIA Shield TV)" @@ -332,6 +374,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI Release (Nexus 5)" @@ -353,6 +398,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI Release (Nexus 5X)" @@ -374,6 +422,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI Release (Nexus 6)" @@ -395,6 +446,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI Release (Nexus 6P)" @@ -416,6 +470,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI Release (Nexus 9)" @@ -437,6 +494,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI Release (Pixel 2)" @@ -458,6 +518,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI SkiaRenderer GL (Nexus 5X)" @@ -479,6 +542,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI SkiaRenderer Vulkan (Pixel 2)" @@ -500,6 +566,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android FYI dEQP Release (Nexus 5X)" @@ -521,6 +590,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android Release (Nexus 5X)" @@ -543,6 +615,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebLayer P FYI (rel)" @@ -564,6 +639,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView L (dbg)" @@ -585,6 +663,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView M (dbg)" @@ -607,6 +688,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView N (dbg)" @@ -629,6 +713,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView O (dbg)" @@ -651,6 +738,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView P (dbg)" @@ -673,6 +763,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView P Blink-CORS FYI (rel)" @@ -694,6 +787,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView P FYI (rel)" @@ -715,6 +811,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android arm Builder (dbg)" @@ -737,6 +836,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android arm64 Builder (dbg)" @@ -759,6 +861,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android x64 Builder (dbg)" @@ -781,6 +886,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android x86 Builder (dbg)" @@ -803,6 +911,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "CFI Linux CF" @@ -825,6 +936,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "CFI Linux ToT" @@ -846,6 +960,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Cast Android (dbg)" @@ -868,6 +985,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Cast Audio Linux" @@ -889,6 +1009,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Cast Linux" @@ -911,6 +1034,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ChromiumOS ASAN Release" @@ -932,6 +1058,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Closure Compilation Linux" @@ -977,6 +1106,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "CrWinAsan(dll)" @@ -998,6 +1130,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 Builder" @@ -1019,6 +1154,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 DEPS Builder" @@ -1041,6 +1179,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 DEPS Release (Intel HD 630)" @@ -1063,6 +1204,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 DEPS Release (NVIDIA)" @@ -1085,6 +1229,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 Release (Intel HD 630)" @@ -1106,6 +1253,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 Release (NVIDIA)" @@ -1127,6 +1277,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 Builder" @@ -1146,6 +1299,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 DEPS Builder" @@ -1166,6 +1322,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 DEPS Release (AMD)" @@ -1188,6 +1347,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 DEPS Release (Intel)" @@ -1210,6 +1372,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 Release (AMD)" @@ -1231,6 +1396,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 Release (Intel)" @@ -1252,6 +1420,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 Builder" @@ -1273,6 +1444,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 DEPS Builder" @@ -1295,6 +1469,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 DEPS Release (Intel HD 630)" @@ -1317,6 +1494,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 DEPS Release (NVIDIA)" @@ -1339,6 +1519,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 Release (Intel HD 630)" @@ -1360,6 +1543,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 Release (NVIDIA)" @@ -1381,6 +1567,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 Builder" @@ -1402,6 +1591,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 DEPS Builder" @@ -1424,6 +1616,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 DEPS Release (Intel HD 630)" @@ -1446,6 +1641,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 DEPS Release (NVIDIA)" @@ -1468,6 +1666,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 Release (Intel HD 630)" @@ -1489,6 +1690,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 Release (NVIDIA)" @@ -1510,6 +1714,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Deterministic Android" @@ -1531,6 +1738,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Deterministic Android (dbg)" @@ -1552,6 +1762,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Deterministic Fuchsia (dbg)" @@ -1573,6 +1786,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Deterministic Linux" @@ -1594,6 +1810,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Deterministic Linux (dbg)" @@ -1615,6 +1834,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Fuchsia ARM64" @@ -1637,6 +1859,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Fuchsia x64" @@ -1659,6 +1884,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Linux Builder" @@ -1680,6 +1908,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Linux Builder (dbg)" @@ -1701,6 +1932,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Linux Ozone Builder" @@ -1722,6 +1956,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Linux dEQP Builder" @@ -1743,6 +1980,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Mac Builder" @@ -1763,6 +2003,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Mac Builder (dbg)" @@ -1783,6 +2026,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Mac dEQP Builder" @@ -1803,6 +2049,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Perf Android 64 Builder" @@ -1824,6 +2073,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win Builder" @@ -1845,6 +2097,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win Builder (dbg)" @@ -1866,6 +2121,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win dEQP Builder" @@ -1887,6 +2145,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win x64 Builder" @@ -1908,6 +2169,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win x64 Builder (dbg)" @@ -1929,6 +2193,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win x64 DX12 Vulkan Builder" @@ -1950,6 +2217,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win x64 DX12 Vulkan Builder (dbg)" @@ -1971,6 +2241,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI Win x64 dEQP Builder" @@ -1992,6 +2265,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU FYI XR Win x64 Builder" @@ -2013,6 +2289,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Linux Builder" @@ -2035,6 +2314,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Linux Builder (dbg)" @@ -2056,6 +2338,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Mac Builder" @@ -2076,6 +2361,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Mac Builder (dbg)" @@ -2095,6 +2383,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Win x64 Builder" @@ -2117,6 +2408,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Win x64 Builder (dbg)" @@ -2138,6 +2432,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "KitKat Phone Tester (dbg)" @@ -2159,6 +2456,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "KitKat Tablet Tester" @@ -2180,6 +2480,9 @@ execution_timeout_secs: 72000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Leak Detection Linux" @@ -2201,6 +2504,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Chrome OS ASan" @@ -2222,6 +2528,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux ASan" @@ -2243,6 +2552,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux ASan Debug" @@ -2264,6 +2576,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux MSan" @@ -2285,6 +2600,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux UBSan" @@ -2305,6 +2623,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux V8-ARM64 ASan" @@ -2326,6 +2647,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux V8-ARM64 ASan Debug" @@ -2347,6 +2671,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux32 ASan" @@ -2368,6 +2695,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux32 ASan Debug" @@ -2389,6 +2719,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux32 V8-ARM ASan" @@ -2410,6 +2743,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Linux32 V8-ARM ASan Debug" @@ -2431,6 +2767,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Mac ASan" @@ -2451,6 +2790,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Libfuzzer Upload Windows ASan" @@ -2471,6 +2813,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan LSan Builder" @@ -2493,6 +2838,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan LSan Tests (1)" @@ -2515,6 +2863,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan Tests (sandboxed)" @@ -2537,6 +2888,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Builder" @@ -2559,6 +2913,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Builder (dbg)" @@ -2581,6 +2938,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Builder (dbg)(32)" @@ -2602,6 +2962,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux CFI" @@ -2623,6 +2986,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Chromium OS ASan LSan Builder" @@ -2644,6 +3010,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Chromium OS ASan LSan Tests (1)" @@ -2665,6 +3034,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ChromiumOS Full" @@ -2686,6 +3058,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ChromiumOS MSan Builder" @@ -2707,6 +3082,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ChromiumOS MSan Tests" @@ -2728,6 +3106,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Debug (NVIDIA)" @@ -2749,6 +3130,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Debug (NVIDIA)" @@ -2769,6 +3153,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Experimental Release (Intel HD 630)" @@ -2789,6 +3176,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Experimental Release (NVIDIA)" @@ -2809,6 +3199,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI GPU TSAN Release" @@ -2830,6 +3223,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Ozone (Intel)" @@ -2850,6 +3246,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Release (AMD R7 240)" @@ -2870,6 +3269,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Release (Intel HD 630)" @@ -2890,6 +3292,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Release (Intel UHD 630)" @@ -2910,6 +3315,9 @@ execution_timeout_secs: 64800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI Release (NVIDIA)" @@ -2930,6 +3338,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)" @@ -2951,6 +3362,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI SkiaRenderer Vulkan (Intel HD 630)" @@ -2971,6 +3385,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI SkiaRenderer Vulkan (NVIDIA)" @@ -2991,6 +3408,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI dEQP Release (Intel HD 630)" @@ -3011,6 +3431,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux FYI dEQP Release (NVIDIA)" @@ -3031,6 +3454,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux MSan Builder" @@ -3052,6 +3478,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux MSan Tests" @@ -3073,6 +3502,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (Headless)" @@ -3095,6 +3527,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (Wayland)" @@ -3117,6 +3552,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (X11)" @@ -3139,6 +3577,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Release (NVIDIA)" @@ -3161,6 +3602,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux TSan Builder" @@ -3183,6 +3627,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux TSan Tests" @@ -3205,6 +3652,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Tests" @@ -3227,6 +3677,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Tests (dbg)(1)" @@ -3249,6 +3702,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Viz" @@ -3342,6 +3798,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Lollipop Tablet Tester" @@ -3363,6 +3822,9 @@ execution_timeout_secs: 72000 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "MSAN Release (chained origins)" @@ -3384,6 +3846,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "MSAN Release (no origins)" @@ -3405,6 +3870,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac ASAN Release" @@ -3425,6 +3893,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac ASAN Release Media" @@ -3445,6 +3916,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac ASan 64 Builder" @@ -3464,6 +3938,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac ASan 64 Tests (1)" @@ -3484,6 +3961,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Builder" @@ -3504,6 +3984,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Builder (dbg)" @@ -3524,6 +4007,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Builder Next" @@ -3566,6 +4052,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Debug (Intel)" @@ -3586,6 +4075,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Experimental Release (Intel)" @@ -3606,6 +4098,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Experimental Retina Release (AMD)" @@ -3626,6 +4121,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Experimental Retina Release (NVIDIA)" @@ -3646,6 +4144,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI GPU ASAN Release" @@ -3666,6 +4167,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Release (Intel)" @@ -3686,6 +4190,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Retina Debug (AMD)" @@ -3706,6 +4213,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Retina Debug (NVIDIA)" @@ -3726,6 +4236,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Retina Release (AMD)" @@ -3746,6 +4259,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI Retina Release (NVIDIA)" @@ -3766,6 +4282,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI dEQP Release AMD" @@ -3786,6 +4305,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac FYI dEQP Release Intel" @@ -3806,6 +4328,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Pro FYI Release (AMD)" @@ -3826,6 +4351,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Release (Intel)" @@ -3848,6 +4376,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Retina Debug (AMD)" @@ -3869,6 +4400,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Retina Release (AMD)" @@ -3891,6 +4425,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac deterministic" @@ -3955,6 +4492,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.11 Tests" @@ -3975,6 +4515,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.12 Tests" @@ -3995,6 +4538,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.13 Tests" @@ -4015,6 +4561,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.13 Tests (dbg)" @@ -4035,6 +4584,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.14 Tests" @@ -4055,6 +4607,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.15 Tests" @@ -4101,6 +4656,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Marshmallow Tablet Tester" @@ -4122,6 +4680,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mojo Android" @@ -4238,6 +4799,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Nougat Phone Tester" @@ -4260,6 +4824,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Oreo Phone Tester" @@ -4282,6 +4849,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Site Isolation Android" @@ -4327,6 +4897,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "TSAN Release" @@ -4348,6 +4921,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTAndroid" @@ -4369,6 +4945,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTAndroid (dbg)" @@ -4390,6 +4969,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTAndroid x64" @@ -4411,6 +4993,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTAndroid64" @@ -4432,6 +5017,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTAndroidASan" @@ -4453,6 +5041,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTAndroidCFI" @@ -4474,6 +5065,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTAndroidOfficial" @@ -4495,6 +5089,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinux" @@ -4516,6 +5113,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinux (dbg)" @@ -4537,6 +5137,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinuxASan" @@ -4558,6 +5161,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinuxASanLibfuzzer" @@ -4579,6 +5185,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinuxCoverage" @@ -4600,6 +5209,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinuxMSan" @@ -4621,6 +5233,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinuxTSan" @@ -4642,6 +5257,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinuxThinLTO" @@ -4663,6 +5281,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTLinuxUBSanVptr" @@ -4684,6 +5305,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTMac" @@ -4706,6 +5330,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTMac (dbg)" @@ -4728,6 +5355,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTMacASan" @@ -4750,6 +5380,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTMacCoverage" @@ -4772,6 +5405,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTWin(dbg)" @@ -4793,6 +5429,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTWin(dll)" @@ -4814,6 +5453,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTWin64(dbg)" @@ -4835,6 +5477,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTWin64(dll)" @@ -4856,6 +5501,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTWinASanLibfuzzer" @@ -4877,6 +5525,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTWinCFI" @@ -4898,6 +5549,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTWinCFI64" @@ -4919,6 +5573,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTiOS" @@ -4944,6 +5601,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ToTiOSDevice" @@ -4969,6 +5629,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "UBSan Release" @@ -4990,6 +5653,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "UBSan vptr Release" @@ -5011,6 +5677,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "UBSanVptr Linux" @@ -5033,6 +5702,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "VR Linux" @@ -5079,6 +5751,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "WebKit Linux Leak" @@ -5100,6 +5775,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "WebKit Linux MSAN" @@ -5121,6 +5799,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "WebKit Mac10.13 (retina)" @@ -5141,6 +5822,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "WebKit Win10" @@ -5161,6 +5845,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win 10 Fast Ring" @@ -5205,6 +5892,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win ASan Release" @@ -5225,6 +5915,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win ASan Release Media" @@ -5245,6 +5938,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win Builder" @@ -5265,6 +5961,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win Builder (dbg)" @@ -5286,6 +5985,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win x64 Builder" @@ -5307,6 +6009,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win x64 Builder (dbg)" @@ -5328,6 +6033,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)" @@ -5348,6 +6056,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 DX12 Vulkan Release (NVIDIA)" @@ -5368,6 +6079,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Debug (NVIDIA)" @@ -5388,6 +6102,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Exp Release (Intel HD 630)" @@ -5408,6 +6125,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Exp Release (NVIDIA)" @@ -5428,6 +6148,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Release (AMD RX 550)" @@ -5448,6 +6171,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Release (Intel HD 630)" @@ -5468,6 +6194,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Release (Intel UHD 630)" @@ -5488,6 +6217,9 @@ execution_timeout_secs: 64800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Release (NVIDIA GeForce GTX 1660)" @@ -5508,6 +6240,9 @@ execution_timeout_secs: 64800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Release (NVIDIA)" @@ -5528,6 +6263,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 Release XR Perf (NVIDIA)" @@ -5548,6 +6286,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)" @@ -5569,6 +6310,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 SkiaRenderer GL (NVIDIA)" @@ -5589,6 +6333,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 dEQP Release (Intel HD 630)" @@ -5609,6 +6356,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x64 dEQP Release (NVIDIA)" @@ -5629,6 +6379,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 FYI x86 Release (NVIDIA)" @@ -5649,6 +6402,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 Tests x64" @@ -5670,6 +6426,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 Tests x64 (dbg)" @@ -5690,6 +6449,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 Tests x64 1803" @@ -5734,6 +6496,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 x64 Release (NVIDIA)" @@ -5756,6 +6521,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 (32) Tests" @@ -5776,6 +6544,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 FYI Debug (AMD)" @@ -5796,6 +6567,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 FYI Release (AMD)" @@ -5816,6 +6590,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 FYI Release (NVIDIA)" @@ -5836,6 +6613,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 FYI dEQP Release (AMD)" @@ -5856,6 +6636,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 FYI x64 Release (NVIDIA)" @@ -5876,6 +6659,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 FYI x64 dEQP Release (NVIDIA)" @@ -5896,6 +6682,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 Tests (1)" @@ -5916,6 +6705,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 Tests (dbg)(1)" @@ -5937,6 +6729,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Windows deterministic" @@ -5957,6 +6752,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-10-arm64-rel" @@ -5978,6 +6776,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-archive-dbg" @@ -5999,6 +6800,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-archive-rel" @@ -6020,6 +6824,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-arm64-proguard-rel" @@ -6041,6 +6848,9 @@ execution_timeout_secs: 21600 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-asan" @@ -6062,6 +6872,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-avd-packager" @@ -6082,6 +6895,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-bfcache-rel" @@ -6103,6 +6919,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-code-coverage" @@ -6175,6 +6994,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-arm-rel" @@ -6197,6 +7019,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-arm64-dbg" @@ -6218,6 +7043,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-arm64-rel" @@ -6239,6 +7067,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-asan-arm-rel" @@ -6260,6 +7091,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-kitkat-arm-rel" @@ -6282,6 +7116,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-lollipop-arm-rel" @@ -6304,6 +7141,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-marshmallow-arm64-perf-rel" @@ -6322,6 +7162,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-marshmallow-arm64-rel" @@ -6343,6 +7186,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-x86-dbg" @@ -6364,6 +7210,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-x86-rel" @@ -6385,6 +7234,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-incremental-dbg" @@ -6406,6 +7258,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-kitkat-arm-rel" @@ -6428,6 +7283,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-lollipop-arm-rel" @@ -6449,6 +7307,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-marshmallow-arm64-rel" @@ -6471,6 +7332,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-marshmallow-x86-fyi-rel" @@ -6492,6 +7356,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-mojo-webview-rel" @@ -6538,6 +7405,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-pie-arm64-rel" @@ -6560,6 +7430,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-pie-x86-fyi-rel" @@ -6581,6 +7454,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-pie-x86-rel" @@ -6602,6 +7478,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-sdk-packager" @@ -6622,6 +7501,33 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > + > + builders: < + name: "android-weblayer-pie-x86-fyi-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "ssd:0" + recipe: < + name: "chromium" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"chromium.android.fyi\"" + > + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-asan-rel" @@ -6643,6 +7549,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-cfi-thin-lto-rel" @@ -6664,6 +7573,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-dbg" @@ -6686,6 +7598,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-rel" @@ -6708,6 +7623,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-rel-vm-tests" @@ -6753,6 +7671,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-arm-generic-rel" @@ -6775,6 +7696,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-kevin-rel" @@ -6797,6 +7721,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-kevin-rel-hw-tests" @@ -6844,6 +7771,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "fuchsia-fyi-arm64-rel" @@ -6938,6 +7868,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "fuchsia-x64-dbg" @@ -6959,6 +7892,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-device" @@ -6983,6 +7919,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-simulator" @@ -7008,6 +7947,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-simulator-code-coverage" @@ -7118,6 +8060,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-simulator-noncq" @@ -7142,6 +8087,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-webkit-tot" @@ -7230,7 +8178,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios13-sdk-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac" + dimensions: "os:Mac-10.15" recipe: < name: "chromium" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -7238,12 +8186,12 @@ properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"chromium.fyi\"" - properties_j: "xcode_build_version:\"11c29\"" + properties_j: "xcode_build_version:\"11e146\"" > execution_timeout_secs: 36000 caches: < - name: "xcode_ios_11c29" - path: "xcode_ios_11c29.app" + name: "xcode_ios_11e146" + path: "xcode_ios_11e146.app" > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" @@ -7295,6 +8243,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-archive-rel" @@ -7316,6 +8267,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-bfcache-rel" @@ -7483,6 +8437,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-chromeos-rel" @@ -7505,6 +8462,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-chromium-tests-staging-builder" @@ -7623,6 +8583,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-ozone-rel" @@ -7645,6 +8608,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-swangle-chromium-x64" @@ -7666,6 +8632,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-swangle-tot-angle-x64" @@ -7687,6 +8656,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-swangle-tot-angle-x86" @@ -7708,6 +8680,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-swangle-tot-swiftshader-x64" @@ -7729,6 +8704,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-swangle-tot-swiftshader-x86" @@ -7750,6 +8728,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-swangle-x64" @@ -7771,6 +8752,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-swangle-x86" @@ -7792,6 +8776,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-trusty-rel" @@ -7813,6 +8800,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-upload-perfetto" @@ -7858,6 +8848,9 @@ execution_timeout_secs: 43200 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-wpt-fyi-rel" @@ -7903,6 +8896,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "component-mapping-updater@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "mac-archive-dbg" @@ -7923,6 +8919,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "mac-archive-rel" @@ -7943,6 +8942,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "mac-code-coverage" @@ -8058,6 +9060,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "mac-upload-perfetto" @@ -8126,6 +9131,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-archive-rel" @@ -8146,6 +9154,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-asan" @@ -8167,6 +9178,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-celab-builder-rel" @@ -8191,6 +9205,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-celab-tester-rel" @@ -8215,6 +9232,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-pixel-builder-rel" @@ -8281,6 +9301,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-swangle-tot-angle-x64" @@ -8302,6 +9325,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-swangle-tot-angle-x86" @@ -8323,6 +9349,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-swangle-tot-swiftshader-x64" @@ -8344,6 +9373,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-swangle-tot-swiftshader-x86" @@ -8365,6 +9397,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-swangle-x64" @@ -8386,6 +9421,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-swangle-x86" @@ -8407,6 +9445,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win-upload-perfetto" @@ -8476,6 +9517,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win32-archive-rel" @@ -8496,6 +9540,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "win32-arm64-rel" @@ -8558,6 +9605,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android arm Builder (dbg)" @@ -8581,6 +9631,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Cast Android (dbg)" @@ -8604,6 +9657,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Cast Linux" @@ -8627,6 +9683,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Fuchsia ARM64" @@ -8650,6 +9709,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Fuchsia x64" @@ -8673,6 +9735,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Linux Builder" @@ -8696,6 +9761,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Mac Builder" @@ -8717,6 +9785,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Win x64 Builder" @@ -8740,6 +9811,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan LSan Builder" @@ -8763,6 +9837,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan LSan Tests (1)" @@ -8786,6 +9863,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan Tests (sandboxed)" @@ -8809,6 +9889,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Builder" @@ -8832,6 +9915,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (Headless)" @@ -8855,6 +9941,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (Wayland)" @@ -8878,6 +9967,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (X11)" @@ -8901,6 +9993,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Release (NVIDIA)" @@ -8924,6 +10019,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Tests" @@ -8947,6 +10045,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Builder" @@ -8968,6 +10069,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Builder (dbg)" @@ -8989,6 +10093,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Release (Intel)" @@ -9012,6 +10119,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Retina Release (AMD)" @@ -9035,6 +10145,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.10 Tests" @@ -9056,6 +10169,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.11 Tests" @@ -9077,6 +10193,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.12 Tests" @@ -9098,6 +10217,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.13 Tests" @@ -9119,6 +10241,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.13 Tests (dbg)" @@ -9140,6 +10265,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.14 Tests" @@ -9161,6 +10289,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "WebKit Mac10.13 (retina)" @@ -9182,6 +10313,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win 7 Tests x64 (1)" @@ -9204,6 +10338,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win Builder (dbg)" @@ -9226,6 +10363,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win x64 Builder" @@ -9248,6 +10388,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 Tests x64" @@ -9270,6 +10413,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 Tests x64 1803" @@ -9317,6 +10463,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 Tests (dbg)(1)" @@ -9339,6 +10488,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-arm-rel" @@ -9362,6 +10514,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-kitkat-arm-rel" @@ -9385,6 +10540,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-lollipop-arm-rel" @@ -9408,6 +10566,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-kitkat-arm-rel" @@ -9431,6 +10592,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-marshmallow-arm64-rel" @@ -9454,6 +10618,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-rel" @@ -9477,6 +10644,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-arm-generic-rel" @@ -9500,6 +10670,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-simulator" @@ -9525,6 +10698,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-chromeos-dbg" @@ -9548,6 +10724,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-chromeos-rel" @@ -9571,6 +10750,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-ozone-rel" @@ -9594,6 +10776,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "mac-osxbeta-rel" @@ -9658,6 +10843,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView M (dbg)" @@ -9681,6 +10869,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView N (dbg)" @@ -9704,6 +10895,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView O (dbg)" @@ -9727,6 +10921,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android WebView P (dbg)" @@ -9750,6 +10947,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android arm Builder (dbg)" @@ -9773,6 +10973,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android arm64 Builder (dbg)" @@ -9796,6 +10999,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android x64 Builder (dbg)" @@ -9819,6 +11025,9 @@ execution_timeout_secs: 14400 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Android x86 Builder (dbg)" @@ -9842,6 +11051,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Cast Android (dbg)" @@ -9865,6 +11077,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Cast Linux" @@ -9888,6 +11103,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 DEPS Builder" @@ -9911,6 +11129,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 DEPS Release (Intel HD 630)" @@ -9934,6 +11155,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Linux x64 DEPS Release (NVIDIA)" @@ -9957,6 +11181,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 DEPS Builder" @@ -9978,6 +11205,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 DEPS Release (AMD)" @@ -10001,6 +11231,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Mac x64 DEPS Release (Intel)" @@ -10024,6 +11257,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 DEPS Builder" @@ -10047,6 +11283,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 DEPS Release (Intel HD 630)" @@ -10070,6 +11309,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x64 DEPS Release (NVIDIA)" @@ -10093,6 +11335,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 DEPS Builder" @@ -10116,6 +11361,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 DEPS Release (Intel HD 630)" @@ -10139,6 +11387,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Dawn Win10 x86 DEPS Release (NVIDIA)" @@ -10162,6 +11413,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Fuchsia ARM64" @@ -10185,6 +11439,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Fuchsia x64" @@ -10208,6 +11465,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Linux Builder" @@ -10231,6 +11491,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Mac Builder" @@ -10252,6 +11515,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "GPU Win x64 Builder" @@ -10275,6 +11541,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan LSan Builder" @@ -10298,6 +11567,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan LSan Tests (1)" @@ -10321,6 +11593,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux ASan Tests (sandboxed)" @@ -10344,6 +11619,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Builder" @@ -10367,6 +11645,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Builder (dbg)" @@ -10390,6 +11671,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (Headless)" @@ -10413,6 +11697,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (Wayland)" @@ -10436,6 +11723,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Ozone Tester (X11)" @@ -10459,6 +11749,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Release (NVIDIA)" @@ -10482,6 +11775,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux TSan Builder" @@ -10505,6 +11801,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux TSan Tests" @@ -10528,6 +11827,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Tests" @@ -10551,6 +11853,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Linux Tests (dbg)(1)" @@ -10574,6 +11879,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Builder" @@ -10595,6 +11903,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Builder (dbg)" @@ -10616,6 +11927,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Release (Intel)" @@ -10639,6 +11953,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac Retina Release (AMD)" @@ -10662,6 +11979,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.10 Tests" @@ -10683,6 +12003,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.11 Tests" @@ -10704,6 +12027,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.12 Tests" @@ -10725,6 +12051,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.13 Tests" @@ -10746,6 +12075,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.13 Tests (dbg)" @@ -10767,6 +12099,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Mac10.14 Tests" @@ -10788,6 +12123,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Marshmallow 64 bit Tester" @@ -10811,6 +12149,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Nougat Phone Tester" @@ -10834,6 +12175,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Oreo Phone Tester" @@ -10857,6 +12201,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "VR Linux" @@ -10904,6 +12251,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win 7 Tests x64 (1)" @@ -10926,6 +12276,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win Builder (dbg)" @@ -10948,6 +12301,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win x64 Builder" @@ -10970,6 +12326,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 Tests x64" @@ -10992,6 +12351,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win10 Tests x64 1803" @@ -11039,6 +12401,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "Win7 Tests (dbg)(1)" @@ -11061,6 +12426,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-arm-dbg" @@ -11084,6 +12452,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-arm-rel" @@ -11107,6 +12478,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-kitkat-arm-rel" @@ -11130,6 +12504,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-cronet-lollipop-arm-rel" @@ -11153,6 +12530,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-kitkat-arm-rel" @@ -11176,6 +12556,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-marshmallow-arm64-rel" @@ -11199,6 +12582,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-pie-arm64-dbg" @@ -11222,6 +12608,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "android-pie-arm64-rel" @@ -11245,6 +12634,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-dbg" @@ -11268,6 +12660,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-amd64-generic-rel" @@ -11291,6 +12686,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-arm-generic-rel" @@ -11314,6 +12712,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-kevin-rel" @@ -11337,6 +12738,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "chromeos-kevin-rel-hw-tests" @@ -11386,6 +12790,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "fuchsia-x64-cast" @@ -11409,6 +12816,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-simulator" @@ -11435,6 +12845,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "ios-simulator-cronet" @@ -11490,6 +12903,9 @@ > build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-chromeos-dbg" @@ -11513,6 +12929,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-chromeos-rel" @@ -11536,6 +12955,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "linux-ozone-rel" @@ -11559,6 +12981,9 @@ execution_timeout_secs: 10800 build_numbers: YES service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + resultdb: < + enable: true + > > builders: < name: "mac-osxbeta-rel" @@ -13793,6 +15218,35 @@ > > builders: < + name: "android-weblayer-pie-x86-fyi-rel" + swarming_host: "chromium-swarm.appspot.com" + swarming_tags: "vpython:native-python-wrapper" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-16.04" + dimensions: "ssd:0" + recipe: < + name: "chromium_trybot" + cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" + cipd_version: "refs/heads/master" + properties_j: "$build/goma:{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" + properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" + properties_j: "mastername:\"tryserver.chromium.android\"" + > + execution_timeout_secs: 14400 + expiration_secs: 7200 + caches: < + name: "win_toolchain" + path: "win_toolchain" + > + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + task_template_canary_percentage: < + value: 5 + > + > + builders: < name: "android-webview-marshmallow-arm64-dbg" swarming_host: "chromium-swarm.appspot.com" swarming_tags: "vpython:native-python-wrapper" @@ -17307,7 +18761,7 @@ swarming_tags: "vpython:native-python-wrapper" dimensions: "builder:ios13-sdk-simulator" dimensions: "cpu:x86-64" - dimensions: "os:Mac" + dimensions: "os:Mac-10.15" recipe: < name: "chromium_trybot" cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -17315,7 +18769,7 @@ properties_j: "$build/goma:{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"}" properties_j: "$kitchen:{\"devshell\":true,\"git_auth\":true}" properties_j: "mastername:\"tryserver.chromium.mac\"" - properties_j: "xcode_build_version:\"11c29\"" + properties_j: "xcode_build_version:\"11e146\"" > execution_timeout_secs: 14400 expiration_secs: 7200 @@ -17324,8 +18778,8 @@ path: "win_toolchain" > caches: < - name: "xcode_ios_11c29" - path: "xcode_ios_11c29.app" + name: "xcode_ios_11e146" + path: "xcode_ios_11e146.app" > build_numbers: YES service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/generated/luci-milo.cfg b/infra/config/generated/luci-milo.cfg index c13526f31..dfa4fed 100644 --- a/infra/config/generated/luci-milo.cfg +++ b/infra/config/generated/luci-milo.cfg
@@ -1103,6 +1103,11 @@ short_name: "p-rel" > builders: < + name: "buildbucket/luci.chromium.ci/android-weblayer-pie-x86-fyi-rel" + category: "weblayer" + short_name: "p-x86-rel" + > + builders: < name: "buildbucket/luci.chromium.ci/Android WebView P Blink-CORS FYI (rel)" category: "webview" short_name: "cors" @@ -10614,6 +10619,11 @@ short_name: "13" > builders: < + name: "buildbucket/luci.chromium.ci/ios-device" + category: "chromium.mac|ios|default" + short_name: "dev" + > + builders: < name: "buildbucket/luci.chromium.ci/ios-simulator" category: "chromium.mac|ios|default" short_name: "sim" @@ -10624,6 +10634,11 @@ short_name: "ful" > builders: < + name: "buildbucket/luci.chromium.ci/ios-simulator-noncq" + category: "chromium.mac|ios|default" + short_name: "non" + > + builders: < name: "buildbucket/luci.chromium.ci/Linux Builder" category: "chromium.linux|release" short_name: "bld" @@ -13265,6 +13280,9 @@ name: "buildbucket/luci.chromium.try/android-weblayer-pie-arm64-fyi-rel" > builders: < + name: "buildbucket/luci.chromium.try/android-weblayer-pie-x86-fyi-rel" + > + builders: < name: "buildbucket/luci.chromium.try/android-webview-marshmallow-arm64-dbg" > builders: <
diff --git a/infra/config/generated/luci-scheduler.cfg b/infra/config/generated/luci-scheduler.cfg index dd4a5116..a5683ff 100644 --- a/infra/config/generated/luci-scheduler.cfg +++ b/infra/config/generated/luci-scheduler.cfg
@@ -4151,6 +4151,15 @@ > > job: < + id: "android-weblayer-pie-x86-fyi-rel" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "android-weblayer-pie-x86-fyi-rel" + > +> +job: < id: "chromeos-amd64-generic-asan-rel" acl_sets: "ci" buildbucket: < @@ -7648,6 +7657,15 @@ > > job: < + id: "ci-android-weblayer-pie-x86-fyi-rel" + acl_sets: "ci" + buildbucket: < + server: "cr-buildbucket.appspot.com" + bucket: "luci.chromium.ci" + builder: "android-weblayer-pie-x86-fyi-rel" + > +> +job: < id: "ci-chromeos-amd64-generic-asan-rel" acl_sets: "ci" buildbucket: < @@ -11086,6 +11104,7 @@ triggers: "ci-android-pie-arm64-rel" triggers: "android-pie-x86-fyi-rel" triggers: "android-pie-x86-rel" + triggers: "android-weblayer-pie-x86-fyi-rel" triggers: "chromeos-amd64-generic-asan-rel" triggers: "chromeos-amd64-generic-cfi-thin-lto-rel" triggers: "ci-chromeos-amd64-generic-dbg"
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index e18d7fb..0ca236c 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -132,6 +132,7 @@ x11c505wk = xcode_enum('xcode_ios_11c505wk', 'xcode_ios_11c505wk.app'), x11c29 = xcode_enum('xcode_ios_11c29', 'xcode_ios_11c29.app'), x11m382q = xcode_enum('xcode_ios_11m382q', 'xcode_ios_11m382q.app'), + x11e146 = xcode_enum('xcode_ios_11e146', 'xcode_ios_11e146.app'), )
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star index e953dab..666be80 100644 --- a/infra/config/lib/ci.star +++ b/infra/config/lib/ci.star
@@ -357,6 +357,9 @@ # (e.g. bucket) occurs before we try to use it ret = builders.builder( name = name, + resultdb_settings = resultdb.settings( + enable = True, + ), **kwargs ) @@ -509,11 +512,6 @@ execution_timeout = execution_timeout, goma_backend = goma_backend, mastername = 'chromium.fyi', - # TODO(crbug.com/1027762): Move this kwarg to ci.builder(), after this is - # shown to work as expected for fyi builders. - resultdb_settings = resultdb.settings( - enable = True, - ), **kwargs ) @@ -557,6 +555,7 @@ caches = None, executable='recipe:ios/unified_builder_tester', goma_backend=builders.goma.backend.RBE_PROD, + os = builders.os.MAC_ANY, **kwargs): if not caches: @@ -567,7 +566,7 @@ caches = caches, cores = None, executable = executable, - os = builders.os.MAC_ANY, + os = os, **kwargs )
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star index e24ea406..ea2a40c 100644 --- a/infra/config/lib/try.star +++ b/infra/config/lib/try.star
@@ -266,22 +266,26 @@ def chromium_mac_ios_builder( *, name, + caches=None, executable='recipe:ios/try', goma_backend=builders.goma.backend.RBE_PROD, + os=builders.os.MAC_ANY, properties=None, **kwargs): + if not caches: + caches = [builders.xcode_cache.x11c29] if not properties: properties = { 'xcode_build_version': '11c29', } return try_builder( name = name, - caches = [builders.xcode_cache.x11c29], + caches = caches, cores = None, executable = executable, goma_backend = goma_backend, mastername = 'tryserver.chromium.mac', - os = builders.os.MAC_ANY, + os = os, properties = properties, **kwargs )
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index 6940028..ea10283 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="af"> <translation id="1005230401424685968">JJJJ</translation> <translation id="1016495303386450659">Item is opgedateer</translation> +<translation id="1044891598689252897">Werwe sal normaalweg werk</translation> <translation id="1047726139967079566">Boekmerk hierdie bladsy …</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="1063454504051558093">Gebruik ander wagwoord …</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> items</translation> <translation id="1491277525950327607">Dubbeltik om instelling te wissel</translation> <translation id="1509486075633541495">Meld by webwerf aan</translation> +<translation id="1509960214886564027">Kenmerke op baie werwe kan breek</translation> <translation id="152234381334907219">Nooit gestoor nie</translation> <translation id="1540800554400757039">Adres 1</translation> <translation id="1545749641540134597">Skandeer QR-kode</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nooit</translation> <translation id="7971521879845308059">Blokkeer opspringers</translation> <translation id="7982789257301363584">Netwerk</translation> +<translation id="7993619969781047893">Kenmerke op sommige werwe kan breek</translation> <translation id="800361585186029508">Maak die URL'e wat ingevoer is in Google Chrome oop.</translation> <translation id="8007420562015504427">Incognitosoektog</translation> <translation id="8019783059653722575">Dit laat jou foto's stoor en oplaai.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index f4be231..96bae9e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="am"> <translation id="1005230401424685968">ዓዓዓዓ</translation> <translation id="1016495303386450659">ንጥል ተዘምኗል</translation> +<translation id="1044891598689252897">ጣቢያዎች እንደተለመደው ሆነው ይሠራሉ</translation> <translation id="1047726139967079566">ለእዚህ ገጽ ዕልባት አዘጋጅ…</translation> <translation id="1049743911850919806">ማንነት የማያሳውቅ</translation> <translation id="1063454504051558093">ሌላ የይለፍ ቃል ይጠቀሙ...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ንጥሎች</translation> <translation id="1491277525950327607">ቅንብርን ለመቀያየር ሁለቴ መታ ያድርጉ</translation> <translation id="1509486075633541495">ወደ የድር ጣቢያ በመለያ ይግቡ</translation> +<translation id="1509960214886564027">በበርካታ ጣቢያዎች ላይ ያሉ ባሕሪያት ሊሰበሩ ይችላሉ</translation> <translation id="152234381334907219">በጭራሽ አልተቀመጠም</translation> <translation id="1540800554400757039">አድራሻ 1</translation> <translation id="1545749641540134597">የኪውአር ኮድ ይቃኙ</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">በፍጹም</translation> <translation id="7971521879845308059">ብቅ-ባዮችን አግድ</translation> <translation id="7982789257301363584">አውታረ መረብ</translation> +<translation id="7993619969781047893">በአንዳንድ ጣቢያዎች ላይ ያሉ ባህሪያት ሊሰበሩ ይችላሉ</translation> <translation id="800361585186029508">እንዲገቡ የተደረጉትን ዩአርኤሎች በGoogle Chrome ውስጥ ይከፍታል።</translation> <translation id="8007420562015504427">ማንነት የማያሳውቅ ፍለጋ</translation> <translation id="8019783059653722575">ይህ ፎቶዎችን እንዲያስቀምጡ እና እንዲሰቅሉ ያስችልዎታል።</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 2552fd8..6b6d53f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ar"> <translation id="1005230401424685968">سنة</translation> <translation id="1016495303386450659">تم تحديث العنصر</translation> +<translation id="1044891598689252897">ستعمل المواقع الإلكترونية بشكلٍ طبيعي.</translation> <translation id="1047726139967079566">وضع إشارة مرجعية على هذه الصفحة...</translation> <translation id="1049743911850919806">التصفح المتخفي</translation> <translation id="1063454504051558093">استخدام كلمة مرور أخرى...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> من العناصر</translation> <translation id="1491277525950327607">انقر مرّتين لتبديل الإعداد</translation> <translation id="1509486075633541495">تسجيل الدخول إلى الموقع الإلكتروني</translation> +<translation id="1509960214886564027">قد تتوقف الميزات عن العمل في العديد من المواقع الإلكترونية.</translation> <translation id="152234381334907219">المواقع التي لن تحفظ كلمات المرور أبدًا</translation> <translation id="1540800554400757039">العنوان 1</translation> <translation id="1545749641540134597">فحص رمز الاستجابة السريعة</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">مطلقًا</translation> <translation id="7971521879845308059">حظر النوافذ المنبثقة</translation> <translation id="7982789257301363584">الشبكة</translation> +<translation id="7993619969781047893">قد تتوقف الميزات عن العمل في بعض المواقع الإلكترونية.</translation> <translation id="800361585186029508">فتح عناوين URL التي تم إدخالها في Google Chrome</translation> <translation id="8007420562015504427">البحث في وضع التصفح المتخفي</translation> <translation id="8019783059653722575">هذا يتيح لك حفظ الصور وتحميلها.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index 62cbc4b..a8a20466 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="as"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">বস্তু আপডে’ট কৰা হ’ল</translation> +<translation id="1044891598689252897">ছাইটসমূহে স্বাভাৱিকভাৱে কাম কৰিব</translation> <translation id="1047726139967079566">এই পৃষ্ঠাটো বুকমার্ক কৰক…</translation> <translation id="1049743911850919806">ইনক’গনিট’</translation> <translation id="1063454504051558093">আন পাছৱৰ্ড মচক…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" />টা বস্তু</translation> <translation id="1491277525950327607">ছেটিং ট’গ’ল কৰিবলৈ দুবাৰ টিপক।</translation> <translation id="1509486075633541495">ৱেবছাইটত ছাইন ইন কৰক</translation> +<translation id="1509960214886564027">বহুতো ছাইটৰ সুবিধাসমূহ ব্যাহত হ’ব পাৰে</translation> <translation id="152234381334907219">কেতিয়াও ছেভ কৰা নহয়</translation> <translation id="1540800554400757039">ঠিকনা ১</translation> <translation id="1545749641540134597">কিউআৰ ক’ড স্কেন কৰক</translation> @@ -525,6 +527,7 @@ <translation id="7961015016161918242">কেতিয়াও নহয়</translation> <translation id="7971521879845308059">পপ-আপ অৱৰোধ কৰক</translation> <translation id="7982789257301363584">নেটৱৰ্ক</translation> +<translation id="7993619969781047893">কিছুমান ছাইটত সুবিধাসমূহ ব্যাহত হ’ব পাৰে</translation> <translation id="800361585186029508">ইনপুট কৰা URLসমূহ Google Chromeত খোলে।</translation> <translation id="8007420562015504427">ইনক’গনিট’ ম’ডত সন্ধান কৰক</translation> <translation id="8019783059653722575">ইয়াৰ জৰিয়তে আপুনি ফট’ ছেভ কৰিব পাৰে আৰু আপল’ড কৰিব পাৰে৷</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 21f189a..db1ee47 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="az"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Element yeniləndi</translation> +<translation id="1044891598689252897">Saytlar normal qaydada işləyəcək</translation> <translation id="1047726139967079566">Bu səhifəni əlfəcinləyin...</translation> <translation id="1049743911850919806">Gizli Rejim</translation> <translation id="1063454504051558093">Digər Paroldan İstifadə Edin...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> element</translation> <translation id="1491277525950327607">Ayarı dəyişmək üçün iki dəfə klikləyin</translation> <translation id="1509486075633541495">Veb sayta daxil olun</translation> +<translation id="1509960214886564027">Bir çox saytdakı xüsusiyyətlər işləməyə bilər</translation> <translation id="152234381334907219">Heç vaxt Saxlanılmır</translation> <translation id="1540800554400757039">Ünvan 1</translation> <translation id="1545749641540134597">QR Kodunu skan edin</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Heç vaxt</translation> <translation id="7971521879845308059">Popupları bloklayın</translation> <translation id="7982789257301363584">Şəbəkə</translation> +<translation id="7993619969781047893">Bəzi saytlardakı xüsusiyyətlər işləməyə bilər</translation> <translation id="800361585186029508">Google Chrome'da daxil edilən keçidləri açır.</translation> <translation id="8007420562015504427">Anonim Axtarış</translation> <translation id="8019783059653722575">Fotoları yadda saxlamağa və yükləməyə icazə verir.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index 080979e..9c1eca3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="be"> <translation id="1005230401424685968">ГГГГ</translation> <translation id="1016495303386450659">Элемент абноўлены</translation> +<translation id="1044891598689252897">Сайты будуць працаваць нармальна</translation> <translation id="1047726139967079566">Дадаць гэту старонку ў закладкі...</translation> <translation id="1049743911850919806">Інкогніта</translation> <translation id="1063454504051558093">Выкарыстаць стары пароль...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Элементаў: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Каб уключыць або выключыць наладу, двойчы дакраніцеся</translation> <translation id="1509486075633541495">Уваход на вэб-сайт</translation> +<translation id="1509960214886564027">Функцыі на многіх сайтах могуць перастаць працаваць</translation> <translation id="152234381334907219">Ніколі не захоўваліся</translation> <translation id="1540800554400757039">Радок адраса 1</translation> <translation id="1545749641540134597">Сканіраваць QR-код</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Ніколі</translation> <translation id="7971521879845308059">Блакіраваць усплывальныя вокны</translation> <translation id="7982789257301363584">Сетка</translation> +<translation id="7993619969781047893">Функцыі на некаторых сайтах могуць перастаць працаваць</translation> <translation id="800361585186029508">Адкрывае ўведзеныя URL-адрасы ў Google Chrome.</translation> <translation id="8007420562015504427">Пошук у рэжыме інкогніта</translation> <translation id="8019783059653722575">Гэта дазваляе захоўваць і запампоўваць фота.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index b4df45e..3febba6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="bg"> <translation id="1005230401424685968">ГГГГ</translation> <translation id="1016495303386450659">Елементът е актуализиран</translation> +<translation id="1044891598689252897">Сайтовете ще работят нормално</translation> <translation id="1047726139967079566">Запазване на отметка към тази страница...</translation> <translation id="1049743911850919806">„Инкогнито“</translation> <translation id="1063454504051558093">Използване на друга парола...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> елемента</translation> <translation id="1491277525950327607">Докоснете двукратно за превключване на настройката</translation> <translation id="1509486075633541495">Вход в уебсайта</translation> +<translation id="1509960214886564027">Функциите в много сайтове може да не работят правилно</translation> <translation id="152234381334907219">Незапазвани никога</translation> <translation id="1540800554400757039">Адрес 1</translation> <translation id="1545749641540134597">Сканирайте код за бърза реакция</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Никога</translation> <translation id="7971521879845308059">Изск. прозорци: Блокиране</translation> <translation id="7982789257301363584">Мрежа</translation> +<translation id="7993619969781047893">Функциите в някои сайтове може да не работят правилно</translation> <translation id="800361585186029508">Въведените URL адреси се отварят в Google Chrome.</translation> <translation id="8007420562015504427">Търсене в режим „инкогнито“</translation> <translation id="8019783059653722575">Това ви позволява да запазвате и качвате снимки.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 43f0b91c..364fd55db 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="bn"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">আইটেম আপডেট হয়েছে</translation> +<translation id="1044891598689252897">সাইট স্বাভাবিকভাবেই কাজ করবে</translation> <translation id="1047726139967079566">এই পৃষ্ঠাটি বুকমার্ক করুন...</translation> <translation id="1049743911850919806">ছদ্মবেশী</translation> <translation id="1063454504051558093">অন্য পাসওয়ার্ড ব্যবহার করুন...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" />টি আইটেম</translation> <translation id="1491277525950327607">সেটিং টগল করতে দুবার আলতো চাপুন</translation> <translation id="1509486075633541495">ওয়েবসাইটে সাইন-ইন করুন</translation> +<translation id="1509960214886564027">একাধিক সাইটের ফিচারগুলি কাজ নাও করতে পারে</translation> <translation id="152234381334907219">কখনও সংরক্ষিত হয়নি</translation> <translation id="1540800554400757039">ঠিকানা ১</translation> <translation id="1545749641540134597">QR কোড স্ক্যান করুন</translation> @@ -529,6 +531,7 @@ <translation id="7961015016161918242">কখনই নয়</translation> <translation id="7971521879845308059">পপ-আপগুলি অবরুদ্ধ করুন</translation> <translation id="7982789257301363584">নেটওয়ার্ক</translation> +<translation id="7993619969781047893">কিছু কিছু সাইটের ফিচারগুলি কাজ নাও করতে পারে</translation> <translation id="800361585186029508">Google Chrome-এ ইনপুট করা ইউআরএলগুলি খোলে।</translation> <translation id="8007420562015504427">নতুন ছদ্মবেশী ট্যাবে সার্চ করুন</translation> <translation id="8019783059653722575">এটি আপনাকে ফটো সংরক্ষণ এবং আপলোড করতে দেয়।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 809f3eac..834431f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="bs"> <translation id="1005230401424685968">GGGG</translation> <translation id="1016495303386450659">Stavka je ažurirana</translation> +<translation id="1044891598689252897">Web lokacije će normalno funkcionirati</translation> <translation id="1047726139967079566">Označi ovu stranicu...</translation> <translation id="1049743911850919806">Anonimno</translation> <translation id="1063454504051558093">Koristi druge lozinke…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Broj stavki: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Dodirnite dvaput da prebacite postavku</translation> <translation id="1509486075633541495">Prijava na web lokaciju</translation> +<translation id="1509960214886564027">Moguće je da će funkcije na mnogim web lokacijama prestati s radom</translation> <translation id="152234381334907219">Nikada nije sačuvano</translation> <translation id="1540800554400757039">Adresa 1</translation> <translation id="1545749641540134597">Skeniraj QR kôd</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nikada</translation> <translation id="7971521879845308059">Blokiranje skočnih prozora</translation> <translation id="7982789257301363584">Mreža</translation> +<translation id="7993619969781047893">Moguće je da će funkcije na nekim web lokacijama prestati s radom</translation> <translation id="800361585186029508">Otvara unesene URL-ove u Google Chromeu.</translation> <translation id="8007420562015504427">Pretraživanje u anonimnom načinu rada</translation> <translation id="8019783059653722575">Ovo vam omogućava da sačuvate i otpremite fotografije.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 003d2fa5..7a67417c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ca"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">S'ha actualitzat l'element.</translation> +<translation id="1044891598689252897">Els llocs web funcionaran amb normalitat</translation> <translation id="1047726139967079566">Afegeix aquesta pàgina a les adreces d'interès...</translation> <translation id="1049743911850919806">Incògnit</translation> <translation id="1063454504051558093">Utilitza una altra contrasenya...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elements</translation> <translation id="1491277525950327607">Fes doble toc per canviar la configuració</translation> <translation id="1509486075633541495">Inicia la sessió al lloc web</translation> +<translation id="1509960214886564027">Pot ser que les funcions de molts llocs web no funcionin</translation> <translation id="152234381334907219">Contrasenyes que no es desen mai</translation> <translation id="1540800554400757039">Adreça 1</translation> <translation id="1545749641540134597">Escaneja el codi QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Mai</translation> <translation id="7971521879845308059">Bloqueig de finestres emerg.</translation> <translation id="7982789257301363584">Xarxa</translation> +<translation id="7993619969781047893">Pot ser que les funcions d'alguns llocs web no funcionin</translation> <translation id="800361585186029508">Obre els URL introduïts a Google Chrome.</translation> <translation id="8007420562015504427">Cerca d'incògnit</translation> <translation id="8019783059653722575">Això et permet desar i penjar fotos.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 1a55cfb..d771e5e9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="cs"> <translation id="1005230401424685968">RRRR</translation> <translation id="1016495303386450659">Položka byla aktualizována</translation> +<translation id="1044891598689252897">Weby budou fungovat normálně</translation> <translation id="1047726139967079566">Přidat stránku do záložek...</translation> <translation id="1049743911850919806">Anonymní režim</translation> <translation id="1063454504051558093">Použit jiné heslo...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Počet položek: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Nastavení můžete přepnout dvojitým klepnutím</translation> <translation id="1509486075633541495">Přihlásit se k webu</translation> +<translation id="1509960214886564027">Mnoho webů může přestat fungovat</translation> <translation id="152234381334907219">Neuloženo</translation> <translation id="1540800554400757039">První řádek adresy</translation> <translation id="1545749641540134597">Naskenovat QR kód</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nikdy</translation> <translation id="7971521879845308059">Blokování oken</translation> <translation id="7982789257301363584">Síť</translation> +<translation id="7993619969781047893">Některé weby mohou přestat fungovat</translation> <translation id="800361585186029508">Otevře zadané adresy URL v prohlížeči Google Chrome.</translation> <translation id="8007420562015504427">Anonymní vyhledávání</translation> <translation id="8019783059653722575">Toto umožňuje ukládat a nahrávat fotky.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index e496e5a..7097f40 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="da"> <translation id="1005230401424685968">ÅÅÅÅ</translation> <translation id="1016495303386450659">Elementet blev opdateret</translation> +<translation id="1044891598689252897">Websites fungerer som normalt</translation> <translation id="1047726139967079566">Tilføj denne side som bogmærke...</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Brug en anden adgangskode...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elementer</translation> <translation id="1491277525950327607">Tryk to gange for at skifte indstilling</translation> <translation id="1509486075633541495">Log ind på website</translation> +<translation id="1509960214886564027">Funktioner på mange websites virker muligvis ikke</translation> <translation id="152234381334907219">Gemmes aldrig</translation> <translation id="1540800554400757039">Adresse 1</translation> <translation id="1545749641540134597">Scan QR-kode</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Aldrig</translation> <translation id="7971521879845308059">Bloker pop op-vinduer</translation> <translation id="7982789257301363584">Netværk</translation> +<translation id="7993619969781047893">Funktioner på visse websites fungerer muligvis ikke</translation> <translation id="800361585186029508">Åbner de angivne webadresser i Google Chrome.</translation> <translation id="8007420562015504427">Søgning i inkognitotilstand</translation> <translation id="8019783059653722575">Dette giver dig mulighed for at gemme og uploade billeder.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index e0fff52..2e2704d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="de"> <translation id="1005230401424685968">JJJJ</translation> <translation id="1016495303386450659">Element aktualisiert</translation> +<translation id="1044891598689252897">Websites funktionieren normal</translation> <translation id="1047726139967079566">Lesezeichen für diese Seite erstellen</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Anderes Passwort verwenden…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> Elemente</translation> <translation id="1491277525950327607">Zum Aktivieren bzw. Deaktivieren doppeltippen</translation> <translation id="1509486075633541495">Auf der Website anmelden</translation> +<translation id="1509960214886564027">Funktionen auf vielen Websites funktionieren möglicherweise nicht mehr</translation> <translation id="152234381334907219">Nie speichern für...</translation> <translation id="1540800554400757039">Adresse 1</translation> <translation id="1545749641540134597">QR-Code scannen</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nie</translation> <translation id="7971521879845308059">Pop-ups blockieren</translation> <translation id="7982789257301363584">Netzwerk</translation> +<translation id="7993619969781047893">Funktionen auf manchen Websites funktionieren möglicherweise nicht mehr</translation> <translation id="800361585186029508">Öffnet die eingegebenen URLs in Google Chrome.</translation> <translation id="8007420562015504427">Inkognitosuche</translation> <translation id="8019783059653722575">Dadurch können Sie Fotos speichern und hochladen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 5a57ac5..0337aef 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="el"> <translation id="1005230401424685968">ΕΕΕΕ</translation> <translation id="1016495303386450659">Το στοιχείο ενημερώθηκε</translation> +<translation id="1044891598689252897">Οι ιστότοποι θα λειτουργούν κανονικά</translation> <translation id="1047726139967079566">Τοποθέτηση Σελιδοδείκτη σε Αυτήν τη Σελίδα...</translation> <translation id="1049743911850919806">Ανώνυμη περιήγηση</translation> <translation id="1063454504051558093">Χρήση άλλου κωδικού πρόσβασης…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> στοιχεία</translation> <translation id="1491277525950327607">Πατήστε δύο φορές για εναλλαγή της ρύθμισης</translation> <translation id="1509486075633541495">Σύνδεση στον ιστότοπο</translation> +<translation id="1509960214886564027">Μπορεί να παρουσιαστούν προβλήματα στις λειτουργίες πολλών ιστοτόπων.</translation> <translation id="152234381334907219">Δεν έγινε ποτέ αποθήκευση</translation> <translation id="1540800554400757039">Διεύθυνση 1</translation> <translation id="1545749641540134597">Σάρωση κωδικού QR</translation> @@ -529,6 +531,7 @@ <translation id="7961015016161918242">Ποτέ</translation> <translation id="7971521879845308059">Αποκ. αναδυόμ.</translation> <translation id="7982789257301363584">Δίκτυο</translation> +<translation id="7993619969781047893">Μπορεί να παρουσιαστούν προβλήματα στις λειτουργίες ορισμένων ιστοτόπων.</translation> <translation id="800361585186029508">Άνοιγμα των εισαγόμενων URL στο Google Chrome.</translation> <translation id="8007420562015504427">Ανώνυμη αναζήτηση</translation> <translation id="8019783059653722575">Σας επιτρέπει να αποθηκεύετε και να ανεβάζετε φωτογραφίες.</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 f9b9faf..6b46963 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="en-GB"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Item updated</translation> +<translation id="1044891598689252897">Sites will work normally</translation> <translation id="1047726139967079566">Bookmark This Page...</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="1063454504051558093">Use other password...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> items</translation> <translation id="1491277525950327607">Double tap to toggle setting</translation> <translation id="1509486075633541495">Sign in to website</translation> +<translation id="1509960214886564027">Features on many sites may break</translation> <translation id="152234381334907219">Never Saved</translation> <translation id="1540800554400757039">Address 1</translation> <translation id="1545749641540134597">Scan QR Code</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Never</translation> <translation id="7971521879845308059">Block Pop-ups</translation> <translation id="7982789257301363584">Network</translation> +<translation id="7993619969781047893">Features on some sites may break</translation> <translation id="800361585186029508">Opens the inputted URLs in Google Chrome.</translation> <translation id="8007420562015504427">Incognito Search</translation> <translation id="8019783059653722575">This lets you save and upload photos.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index 319d99d..6e37489 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="es-419"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Elemento actualizado</translation> +<translation id="1044891598689252897">Los sitios funcionarán normalmente</translation> <translation id="1047726139967079566">Agregar esta página a favoritos...</translation> <translation id="1049743911850919806">Incógnito</translation> <translation id="1063454504051558093">Usar otra contraseña…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elementos</translation> <translation id="1491277525950327607">Presiona dos veces para activar o desactivar la configuración</translation> <translation id="1509486075633541495">Acceder al sitio web</translation> +<translation id="1509960214886564027">Es posible que las características de muchos sitios no funcionen de forma correcta</translation> <translation id="152234381334907219">Nunca guardado</translation> <translation id="1540800554400757039">Dirección 1</translation> <translation id="1545749641540134597">Escanear código QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nunca</translation> <translation id="7971521879845308059">Bloquear ventanas emergentes</translation> <translation id="7982789257301363584">Red</translation> +<translation id="7993619969781047893">Es posible que las características de algunos sitios no funcionen de forma correcta</translation> <translation id="800361585186029508">Abre las URL ingresadas en Google Chrome.</translation> <translation id="8007420562015504427">Búsqueda en el modo incógnito</translation> <translation id="8019783059653722575">Te permite guardar fotos y cargarlas.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index b1be089..3cdab183 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="es"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Elemento actualizado</translation> +<translation id="1044891598689252897">Los sitios web funcionarán con normalidad</translation> <translation id="1047726139967079566">Añadir esta página a marcadores...</translation> <translation id="1049743911850919806">Incógnito</translation> <translation id="1063454504051558093">Usar otra contraseña...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elementos</translation> <translation id="1491277525950327607">Toca dos veces para activar o desactivar esta opción</translation> <translation id="1509486075633541495">Inicia sesión en el sitio web</translation> +<translation id="1509960214886564027">Es posible que las funciones de muchos sitios web no funcionen correctamente.</translation> <translation id="152234381334907219">Contraseñas que nunca se guardan</translation> <translation id="1540800554400757039">Dirección 1</translation> <translation id="1545749641540134597">Escanea el código QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nunca</translation> <translation id="7971521879845308059">Bloquear pop-ups</translation> <translation id="7982789257301363584">Red</translation> +<translation id="7993619969781047893">Es posible que las funciones de algunos sitios web no funcionen correctamente</translation> <translation id="800361585186029508">Abre las URL introducidas en Google Chrome.</translation> <translation id="8007420562015504427">Búsqueda en modo de incógnito</translation> <translation id="8019783059653722575">Esto te permite guardar fotos y subirlas.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 3eb6560..00f90fd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="et"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Üksus on värskendatud</translation> +<translation id="1044891598689252897">Saidid töötavad tavapärasel moel</translation> <translation id="1047726139967079566">Lisa selle lehe järjehoidja...</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Kasuta muud parooli …</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> üksust</translation> <translation id="1491277525950327607">Seade vahetamiseks topeltpuudutage</translation> <translation id="1509486075633541495">Logi veebisaidile sisse</translation> +<translation id="1509960214886564027">Paljude saitide funktsioonid ei pruugi töötada</translation> <translation id="152234381334907219">Ei ole kunagi salvestatud</translation> <translation id="1540800554400757039">Aadress 1</translation> <translation id="1545749641540134597">QR-koodi skannimine</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Mitte kunagi</translation> <translation id="7971521879845308059">Hüpikute blok.</translation> <translation id="7982789257301363584">Võrk</translation> +<translation id="7993619969781047893">Mõne saidi funktsioonid ei pruugi töötada.</translation> <translation id="800361585186029508">Sisestatud URL-id avatakse Google Chrome'is.</translation> <translation id="8007420562015504427">Inkognito režiimis otsing</translation> <translation id="8019783059653722575">See võimaldab fotosid salvestada ja üles laadida.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 9ad8d7e..383b45c1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="eu"> <translation id="1005230401424685968">UUUU</translation> <translation id="1016495303386450659">Eguneratu da elementua</translation> +<translation id="1044891598689252897">Webguneek ohiko moduan funtzionatuko dute</translation> <translation id="1047726139967079566">Ezarri laster-marka orriari…</translation> <translation id="1049743911850919806">Ezkutuko modua</translation> <translation id="1063454504051558093">Erabili beste pasahitz bat…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elementu</translation> <translation id="1491277525950327607">Sakatu birritan ezarpena aldatzeko</translation> <translation id="1509486075633541495">Hasi saioa webgunean</translation> +<translation id="1509960214886564027">Baliteke webgune askotako eginbideek ez funtzionatzea</translation> <translation id="152234381334907219">Ez dira inoiz gordeko</translation> <translation id="1540800554400757039">Helbidea (1)</translation> <translation id="1545749641540134597">Eskaneatu QR kodea</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Inoiz ez</translation> <translation id="7971521879845308059">Blokeatu leihoak</translation> <translation id="7982789257301363584">Sarea</translation> +<translation id="7993619969781047893">Baliteke webgune batzuetako eginbideek ez funtzionatzea</translation> <translation id="800361585186029508">Idatzitako URLak Google Chrome-n irekitzen ditu.</translation> <translation id="8007420562015504427">Ezkutuko moduko bilaketa</translation> <translation id="8019783059653722575">Honi esker, argazkiak gorde eta kargatu ahal izango dituzu.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index ad13796..fce70b4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="fa"> <translation id="1005230401424685968">yyyy</translation> <translation id="1016495303386450659">مورد بهروز شد</translation> +<translation id="1044891598689252897">عملکرد سایتها عادی خواهد بود</translation> <translation id="1047726139967079566">نشانک گذاری این صفحه...</translation> <translation id="1049743911850919806">ناشناس</translation> <translation id="1063454504051558093">استفاده از سایر گذرواژهها…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> مورد</translation> <translation id="1491277525950327607">برای جابهجایی بین تنظیمات، دو ضربه سریع بزنید</translation> <translation id="1509486075633541495">ورود به سیستم وبسایت</translation> +<translation id="1509960214886564027">ویژگیهای بسیاری از سایتها ممکن است درست کار نکنند</translation> <translation id="152234381334907219">هرگز ذخیره نمیشود</translation> <translation id="1540800554400757039">آدرس ۱</translation> <translation id="1545749641540134597">اسکن کد QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">هرگز</translation> <translation id="7971521879845308059">انسداد پنجرههای بازشو</translation> <translation id="7982789257301363584">شبکه</translation> +<translation id="7993619969781047893">ویژگیهای بعضی از سایتها ممکن است درست کار نکنند</translation> <translation id="800361585186029508">نشانیهای وب واردشده در Google Chrome را باز میکند.</translation> <translation id="8007420562015504427">جستجوی ناشناس</translation> <translation id="8019783059653722575">این کار به شما اجازه میدهد عکسها را ذخیره و بارگذاری کنید.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index fdba7410..13cdf5d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="fi"> <translation id="1005230401424685968">VVVV</translation> <translation id="1016495303386450659">Kohde päivitettiin</translation> +<translation id="1044891598689252897">Sivustot toimivat normaalisti</translation> <translation id="1047726139967079566">Aseta tämä sivu kirjanmerkiksi...</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="1063454504051558093">Käytä toista salasanaa…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> kohdetta</translation> <translation id="1491277525950327607">Muuta asetusta kaksoisnapauttamalla.</translation> <translation id="1509486075633541495">Kirjaudu sisään verkkosivustolle</translation> +<translation id="1509960214886564027">Useiden sivustojen ominaisuudet saattavat lakata toimimasta</translation> <translation id="152234381334907219">Tallentamattomat</translation> <translation id="1540800554400757039">Osoite 1</translation> <translation id="1545749641540134597">Skannaa QR-koodi</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Ei koskaan</translation> <translation id="7971521879845308059">Estä ponn.ikk.</translation> <translation id="7982789257301363584">Verkko</translation> +<translation id="7993619969781047893">Joidenkin sivustojen ominaisuudet saattavat lakata toimimasta</translation> <translation id="800361585186029508">Avaa syötetyt URL-osoitteet Google Chromessa.</translation> <translation id="8007420562015504427">Incognito-haku</translation> <translation id="8019783059653722575">Tämän avulla voit tallentaa kuvia ja ladata niitä palvelimelle.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 2e0d0342..683e74d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="fil"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Na-update ang item</translation> +<translation id="1044891598689252897">Gagana nang normal ang mga site</translation> <translation id="1047726139967079566">Bookmark This Page...</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="1063454504051558093">Gumamit ng Ibang Password...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> (na) item</translation> <translation id="1491277525950327607">I-double tap upang i-toggle ang setting</translation> <translation id="1509486075633541495">Mag-sign in sa website</translation> +<translation id="1509960214886564027">Posibleng masira ang mga feature sa maraming site</translation> <translation id="152234381334907219">Hindi Kailanman Na-save</translation> <translation id="1540800554400757039">Address 1</translation> <translation id="1545749641540134597">I-scan ang QR Code</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Hindi Kailanman</translation> <translation id="7971521879845308059">I-block ang Mga Pop-up</translation> <translation id="7982789257301363584">Network</translation> +<translation id="7993619969781047893">Posibleng masira ang mga feature sa ilang site</translation> <translation id="800361585186029508">Binubuksan ang mga inilagay na URL sa Google Chrome.</translation> <translation id="8007420562015504427">Paghahanap sa Incognito</translation> <translation id="8019783059653722575">Binibigyang-daan ka nito upang makapag-save at makapag-upload ng mga larawan.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index 987fa15..91dc3273 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="fr-CA"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Élément mis à jour</translation> +<translation id="1044891598689252897">Les sites fonctionneront normalement</translation> <translation id="1047726139967079566">Ajouter cette page aux favoris...</translation> <translation id="1049743911850919806">Navigation privée</translation> <translation id="1063454504051558093">Utiliser un autre mot de passe…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> éléments</translation> <translation id="1491277525950327607">Touchez deux fois pour activer ou désactiver le paramètre</translation> <translation id="1509486075633541495">Connexion au site Web</translation> +<translation id="1509960214886564027">Des fonctionnalités sur de nombreux sites risquent de ne pas fonctionner</translation> <translation id="152234381334907219">Jamais enregistrés</translation> <translation id="1540800554400757039">Ligne adresse 1</translation> <translation id="1545749641540134597">Scannez le code QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Jamais</translation> <translation id="7971521879845308059">Bloq fen contex</translation> <translation id="7982789257301363584">Réseau</translation> +<translation id="7993619969781047893">Des fonctionnalités sur certains sites risquent de ne pas fonctionner</translation> <translation id="800361585186029508">Ouvre les URL entrées dans Google Chrome.</translation> <translation id="8007420562015504427">Recherche en mode de navigation privée</translation> <translation id="8019783059653722575">Ceci vous permet d'enregistrer et de téléverser des photos.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index da593ea..32bd14c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="fr"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Élément mis à jour</translation> +<translation id="1044891598689252897">Les sites fonctionneront normalement</translation> <translation id="1047726139967079566">Ajouter cette page aux favoris</translation> <translation id="1049743911850919806">Navigation privée</translation> <translation id="1063454504051558093">Utiliser un autre mot de passe…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> éléments</translation> <translation id="1491277525950327607">Appuyer deux fois pour activer/désactiver le paramètre</translation> <translation id="1509486075633541495">Connectez-vous au site Web</translation> +<translation id="1509960214886564027">Des fonctionnalités sur de nombreux sites risquent de ne pas fonctionner</translation> <translation id="152234381334907219">Jamais enregistrés</translation> <translation id="1540800554400757039">Adresse 1</translation> <translation id="1545749641540134597">Scanner le code QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Jamais</translation> <translation id="7971521879845308059">Bloquer les pop-ups</translation> <translation id="7982789257301363584">Réseau</translation> +<translation id="7993619969781047893">Des fonctionnalités sur certains sites risquent de ne pas fonctionner</translation> <translation id="800361585186029508">Ouvre les URL saisies dans Google Chrome.</translation> <translation id="8007420562015504427">Recherche en mode Navigation privée</translation> <translation id="8019783059653722575">Cela vous permet d'enregistrer et d'importer des photos.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index 7f7d2ff..2c9bb7a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="gl"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Actualizouse o elemento</translation> +<translation id="1044891598689252897">Os sitios funcionarán con normalidade</translation> <translation id="1047726139967079566">Engadir esta páxina aos marcadores...</translation> <translation id="1049743911850919806">Modo de incógnito</translation> <translation id="1063454504051558093">Utilizar outro contrasinal…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elementos</translation> <translation id="1491277525950327607">Toca dúas veces para activar ou desactivar a configuración</translation> <translation id="1509486075633541495">Iniciar sesión no sitio web</translation> +<translation id="1509960214886564027">As funcións de moitos sitios poden deixar de funcionar</translation> <translation id="152234381334907219">Contrasinais que non se gardan nunca</translation> <translation id="1540800554400757039">Enderezo 1</translation> <translation id="1545749641540134597">Escanear código QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nunca</translation> <translation id="7971521879845308059">Bloq. ventás em.</translation> <translation id="7982789257301363584">Rede</translation> +<translation id="7993619969781047893">As funcións dalgúns sitios poden deixar de funcionar</translation> <translation id="800361585186029508">Abre os URL introducidos en Google Chrome.</translation> <translation id="8007420562015504427">Busca do modo de incógnito</translation> <translation id="8019783059653722575">Permíteche gardar e cargar fotos.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 77a86aa..e6e723e8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="gu"> <translation id="1005230401424685968">yyyy</translation> <translation id="1016495303386450659">આઇટમ અપડેટ કરી</translation> +<translation id="1044891598689252897">સાઇટ સામાન્ય રીતે કાર્ય કરશે</translation> <translation id="1047726139967079566">આ પૃષ્ઠને બુકમાર્ક કરો...</translation> <translation id="1049743911850919806">છૂપી</translation> <translation id="1063454504051558093">અન્ય પાસવર્ડનો ઉપયોગ કરો...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> આઇટમ્સ</translation> <translation id="1491277525950327607">સેટિંગ ટૉગલ કરવા માટે બે વાર ટૅપ કરો</translation> <translation id="1509486075633541495">વેબસાઇટમાં સાઇન ઇન કરો</translation> +<translation id="1509960214886564027">ઘણી સાઇટ પરની સુવિધાઓને કદાચ બંધ કરવામાં આવી શકે</translation> <translation id="152234381334907219">ક્યારેય ન સચવાયેલું</translation> <translation id="1540800554400757039">સરનામું 1</translation> <translation id="1545749641540134597">QR કોડ સ્કેન કરો</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">ક્યારેય નહીં</translation> <translation id="7971521879845308059">પૉપ-અપ્સ અવરોધિત કરો</translation> <translation id="7982789257301363584">નેટવર્ક</translation> +<translation id="7993619969781047893">અમુક સાઇટ પરની સુવિધાઓને કદાચ બંધ કરવામાં આવી શકે</translation> <translation id="800361585186029508">ઇનપુટ કરેલા URLsને Google Chromeમાં ખોલે છે.</translation> <translation id="8007420562015504427">છૂપી શોધ</translation> <translation id="8019783059653722575">આ તમને ફોટો સાચવવા અને અપલોડ કરવા દે છે.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index ecda55e..9fdfd3b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="hi"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">आइटम अपडेट किया गया</translation> +<translation id="1044891598689252897">साइटें सामान्य रूप से काम करेंगी</translation> <translation id="1047726139967079566">इस पेज को बुकमार्क करें...</translation> <translation id="1049743911850919806">गुप्त</translation> <translation id="1063454504051558093">कोई और पासवर्ड इस्तेमाल करें...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> आइटम</translation> <translation id="1491277525950327607">सेटिंग को टॉगल करने के लिए दो बार टैप करें</translation> <translation id="1509486075633541495">वेबसाइट में साइन इन करें</translation> +<translation id="1509960214886564027">शायद कई साइटों पर सुविधाएं ठीक से काम न करें</translation> <translation id="152234381334907219">कभी नहीं सेव किया गया</translation> <translation id="1540800554400757039">पता 1</translation> <translation id="1545749641540134597">QR कोड स्कैन करें</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">कभी नहीं</translation> <translation id="7971521879845308059">पॉप-अप अवरोधित करें</translation> <translation id="7982789257301363584">नेटवर्क</translation> +<translation id="7993619969781047893">शायद कुछ साइटों पर सुविधाएं ठीक से काम न करें</translation> <translation id="800361585186029508">यह डाले गए यूआरएल को Google Chrome में खोलता है.</translation> <translation id="8007420562015504427">गुप्त मोड में खोज</translation> <translation id="8019783059653722575">इससे आप फ़ोटो सेव कर सकते हैं और अपलोड कर सकते हैं.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index e5d7110..21936ec 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="hr"> <translation id="1005230401424685968">GGGG</translation> <translation id="1016495303386450659">Stavka je ažurirana</translation> +<translation id="1044891598689252897">Web-lokacije će normalno raditi</translation> <translation id="1047726139967079566">Označi ovu stranicu...</translation> <translation id="1049743911850919806">Anonimno</translation> <translation id="1063454504051558093">Upotrijebi drugu zaporku...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Broj stavki: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Dodirnite dvaput da biste promijenili postavku</translation> <translation id="1509486075633541495">Prijavite se na web-lokaciju</translation> +<translation id="1509960214886564027">Značajke na mnogim web-lokacijama mogu prestati funkcionirati</translation> <translation id="152234381334907219">Nikad spremljeno</translation> <translation id="1540800554400757039">1. adresni redak</translation> <translation id="1545749641540134597">Skeniranje QR koda</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nikad</translation> <translation id="7971521879845308059">Blokiraj skočne</translation> <translation id="7982789257301363584">Mreža</translation> +<translation id="7993619969781047893">Značajke na nekim web-lokacijama mogu prestati funkcionirati</translation> <translation id="800361585186029508">Otvara URL-ove unesene u Google Chrome.</translation> <translation id="8007420562015504427">Anonimno pretraživanje</translation> <translation id="8019783059653722575">To vam omogućuje spremanje i prijenos fotografija.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index be69c80..b84daa6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="hu"> <translation id="1005230401424685968">ÉÉÉÉ</translation> <translation id="1016495303386450659">Elem frissítve</translation> +<translation id="1044891598689252897">A webhelyek a megszokott módon fognak működni</translation> <translation id="1047726139967079566">Könyvjelző hozzáadása ehhez az oldalhoz...</translation> <translation id="1049743911850919806">Inkognitómód</translation> <translation id="1063454504051558093">Másik jelszó használata…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elem</translation> <translation id="1491277525950327607">A beállítás módosításához koppintson duplán</translation> <translation id="1509486075633541495">Bejelentkezés a webhelyre</translation> +<translation id="1509960214886564027">Számos webhelyen nem működnek a funkciók</translation> <translation id="152234381334907219">Soha nem került mentésre</translation> <translation id="1540800554400757039">Cím 1. sora</translation> <translation id="1545749641540134597">QR-kód beolvasása</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Soha</translation> <translation id="7971521879845308059">Pop-upok tiltása</translation> <translation id="7982789257301363584">Hálózat</translation> +<translation id="7993619969781047893">Előfordulhat, hogy bizonyos webhelyek funkciói nem működnek megfelelően</translation> <translation id="800361585186029508">A megadott URL-eket a Google Chrome-ban nyitja meg.</translation> <translation id="8007420562015504427">Keresés inkognitómódban</translation> <translation id="8019783059653722575">Lehetővé teszi a fotók mentését és feltöltését.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 2f5e5627..f3b0ba0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="hy"> <translation id="1005230401424685968">ՏՏՏՏ</translation> <translation id="1016495303386450659">Տարրը թարմացվեց</translation> +<translation id="1044891598689252897">Կայքերը կաշխատեն սովորական ռեժիմով</translation> <translation id="1047726139967079566">Էջանշել այս էջը...</translation> <translation id="1049743911850919806">Ինկոգնիտո</translation> <translation id="1063454504051558093">Օգտագործել այլ գաղտնաբառ…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> տարր</translation> <translation id="1491277525950327607">Կրկնակի հպեք՝ կարգավորումը միացնելու/անջատելու համար</translation> <translation id="1509486075633541495">Մտեք հաշիվ</translation> +<translation id="1509960214886564027">Շատ կայքերում գործառույթները կարող են չաշխատել։</translation> <translation id="152234381334907219">Կայքեր, որոնց համար գաղտնաբառերը երբեք չեն պահվում</translation> <translation id="1540800554400757039">Հասցե 1</translation> <translation id="1545749641540134597">Սկանավորեք QR-կոդը</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Երբեք</translation> <translation id="7971521879845308059">Արգելափակել ելնող պատուհանները</translation> <translation id="7982789257301363584">Ցանց</translation> +<translation id="7993619969781047893">Որոշ կայքերում գործառույթները կարող են չաշխատել։</translation> <translation id="800361585186029508">Մուտքագրված URL-ները բացվում են Google Chrome-ում։</translation> <translation id="8007420562015504427">Որոնել ինկոգնիտո ռեժիմում</translation> <translation id="8019783059653722575">Թույլ է տալիս պահել և վերբեռնել լուսանկարները:</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 5301ba6..59a64a3b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="id"> <translation id="1005230401424685968">TTTT</translation> <translation id="1016495303386450659">Item diperbarui</translation> +<translation id="1044891598689252897">Situs akan berfungsi secara normal</translation> <translation id="1047726139967079566">Bookmark Halaman Ini...</translation> <translation id="1049743911850919806">Samaran</translation> <translation id="1063454504051558093">Gunakan Sandi Lain...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> item</translation> <translation id="1491277525950327607">Ketuk dua kali untuk beralih setelan</translation> <translation id="1509486075633541495">Login ke situs</translation> +<translation id="1509960214886564027">Fitur di banyak situs mungkin error</translation> <translation id="152234381334907219">Jangan Pernah Disimpan</translation> <translation id="1540800554400757039">Alamat 1</translation> <translation id="1545749641540134597">Pindai Kode QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Jangan pernah</translation> <translation id="7971521879845308059">Blokir Pop-up</translation> <translation id="7982789257301363584">Jaringan</translation> +<translation id="7993619969781047893">Fitur pada beberapa situs mungkin error</translation> <translation id="800361585186029508">Membuka URL yang dimasukkan di Google Chrome.</translation> <translation id="8007420562015504427">Penelusuran Rahasia</translation> <translation id="8019783059653722575">Hal ini memungkinkan Anda menyimpan dan mengupload foto.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index 4548ea0f..575f61fb1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="is"> <translation id="1005230401424685968">ÁÁÁÁ</translation> <translation id="1016495303386450659">Atriði uppfært</translation> +<translation id="1044891598689252897">Vefsvæði virka sem skyldi</translation> <translation id="1047726139967079566">Bókamerkja þessa síðu...</translation> <translation id="1049743911850919806">Fara huldu höfðu</translation> <translation id="1063454504051558093">Nota annað aðgangsorð...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> atriði</translation> <translation id="1491277525950327607">Ýttu tvisvar til að breyta stillingum</translation> <translation id="1509486075633541495">Skrá inn á vefsvæði</translation> +<translation id="1509960214886564027">Eiginleikar gætu bilað á mörgum vefsvæðum</translation> <translation id="152234381334907219">Aldrei vistað</translation> <translation id="1540800554400757039">Heimilisfang 1</translation> <translation id="1545749641540134597">Skanna QR-kóða</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Aldrei</translation> <translation id="7971521879845308059">Útiloka sprettiglugga</translation> <translation id="7982789257301363584">Símkerfi</translation> +<translation id="7993619969781047893">Ekki er víst að allir eiginleikar á öllum vefsvæðum virki</translation> <translation id="800361585186029508">Opnar innslegnar vefslóðir í Google Chrome.</translation> <translation id="8007420562015504427">Leit í huliðsstillingu</translation> <translation id="8019783059653722575">Með þessu móti geturðu vistað myndir og hlaðið þeim upp.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 10d475e..df05266 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="it"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Elemento aggiornato</translation> +<translation id="1044891598689252897">I siti funzioneranno normalmente</translation> <translation id="1047726139967079566">Aggiungi questa pagina ai Preferiti...</translation> <translation id="1049743911850919806">In incognito</translation> <translation id="1063454504051558093">Utilizza un'altra password…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elementi</translation> <translation id="1491277525950327607">Tocca due volte per attivare/disattivare l'impostazione</translation> <translation id="1509486075633541495">Accedi al sito web</translation> +<translation id="1509960214886564027">Le funzionalità su molti siti potrebbero non essere disponibili</translation> <translation id="152234381334907219">Mai salvate</translation> <translation id="1540800554400757039">Indirizzo 1</translation> <translation id="1545749641540134597">Scansiona codice QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Mai</translation> <translation id="7971521879845308059">Blocca popup</translation> <translation id="7982789257301363584">Rete</translation> +<translation id="7993619969781047893">Le funzionalità su alcuni siti potrebbero non essere disponibili</translation> <translation id="800361585186029508">Consente di aprire gli URL inseriti in Google Chrome.</translation> <translation id="8007420562015504427">Ricerca in incognito</translation> <translation id="8019783059653722575">In questo modo puoi salvare e caricare foto.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index b3a11a70..4d3cf0e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="iw"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">הפריט עודכן</translation> +<translation id="1044891598689252897">אתרים יפעלו כרגיל</translation> <translation id="1047726139967079566">הוסף דף זה לסימניות...</translation> <translation id="1049743911850919806">גלישה פרטית</translation> <translation id="1063454504051558093">שימוש בסיסמה אחרת...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> פריטים</translation> <translation id="1491277525950327607">הקש פעמיים כדי להחליף את מצב ההגדרה</translation> <translation id="1509486075633541495">כניסה לאתר</translation> +<translation id="1509960214886564027">ייתכן שהתכונות של חלק גדול מהאתרים לא יפעלו כראוי</translation> <translation id="152234381334907219">פריטים שאף פעם לא נשמרו</translation> <translation id="1540800554400757039">כתובת, שורה 1</translation> <translation id="1545749641540134597">סריקת קוד QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">אף פעם</translation> <translation id="7971521879845308059">חסום חלונות קופצים</translation> <translation id="7982789257301363584">רשת</translation> +<translation id="7993619969781047893">ייתכן שהתכונות של חלק מהאתרים לא יפעלו כראוי</translation> <translation id="800361585186029508">פתיחת כתובות ה-URL שהוזנו ב-Google Chrome.</translation> <translation id="8007420562015504427">חיפוש במצב גלישה בסתר</translation> <translation id="8019783059653722575">אישור זה מאפשר לך לשמור ולהעלות תמונות.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 6327c4f..bd163ea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ja"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">更新済みのアイテム</translation> +<translation id="1044891598689252897">サイトは通常どおり動作します</translation> <translation id="1047726139967079566">ブックマークに追加...</translation> <translation id="1049743911850919806">シークレット モード</translation> <translation id="1063454504051558093">他のパスワードを使用...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" />個のアイテム</translation> <translation id="1491277525950327607">設定を切り替えるにはダブルタップします</translation> <translation id="1509486075633541495">ウェブサイトにログイン</translation> +<translation id="1509960214886564027">多くサイトで機能を使用できなくなる可能性があります</translation> <translation id="152234381334907219">常に保存しない</translation> <translation id="1540800554400757039">住所1行目</translation> <translation id="1545749641540134597">QR コードをスキャンします</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">使用しない</translation> <translation id="7971521879845308059">ポップアップのブロック</translation> <translation id="7982789257301363584">ネットワーク</translation> +<translation id="7993619969781047893">一部のサイトで機能を使用できなくなる可能性があります</translation> <translation id="800361585186029508">入力された URL を Google Chrome で開きます。</translation> <translation id="8007420562015504427">シークレット検索</translation> <translation id="8019783059653722575">写真を保存してアップロードできます。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index c4085b8a..f0a50843 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ka"> <translation id="1005230401424685968">წწწწ</translation> <translation id="1016495303386450659">ელემენტი განახლებულია</translation> +<translation id="1044891598689252897">საიტები ჩვეულებრივად იმუშავებს</translation> <translation id="1047726139967079566">ამ გვერდის სანიშნეებში დამატება...</translation> <translation id="1049743911850919806">ინკოგნიტო</translation> <translation id="1063454504051558093">სხვა პაროლის გამოყენება...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ელემენტი</translation> <translation id="1491277525950327607">პარამეტრის გადასართავად, შეეხეთ ორმაგად</translation> <translation id="1509486075633541495">ვებსაიტში შესვლა</translation> +<translation id="1509960214886564027">მრავალი საიტის ფუნქციებმა შეიძლება არასათანადოდ იმუშაოს</translation> <translation id="152234381334907219">არასოდეს შენახულა</translation> <translation id="1540800554400757039">მისამართი 1</translation> <translation id="1545749641540134597">QR კოდის სკანირება</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">არასოდეს</translation> <translation id="7971521879845308059">კონტექსტური ფანჯრების დაბლოკვა</translation> <translation id="7982789257301363584">ქსელი</translation> +<translation id="7993619969781047893">ზოგიერთი საიტის ფუნქციებმა შეიძლება არასათანადოდ იმუშაოს</translation> <translation id="800361585186029508">მითითებულ URL-ებს Google Chrome-ში გახსნის.</translation> <translation id="8007420562015504427">ინკოგნიტო ძიება</translation> <translation id="8019783059653722575">საშუალებას გაძლევთ, შეინახოთ და ატვირთოთ ფოტოები.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index cb37f32e..0d9c3a5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="kk"> <translation id="1005230401424685968">ЖЖЖЖ</translation> <translation id="1016495303386450659">Элемент жаңартылды</translation> +<translation id="1044891598689252897">Сайттар қалыпты күйде жұмыс істейді.</translation> <translation id="1047726139967079566">Осы бетке бетбелгі қою…</translation> <translation id="1049743911850919806">Инкогнито</translation> <translation id="1063454504051558093">Басқа құпия сөз қолданыңыз...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> элемент</translation> <translation id="1491277525950327607">Параметрді ауыстыру үшін екі рет түртіңіз</translation> <translation id="1509486075633541495">Веб-сайтқа кіру</translation> +<translation id="1509960214886564027">Көптеген сайттағы функциялар дұрыс жұмыс істемеуі мүмкін.</translation> <translation id="152234381334907219">Ешқашан сақталмайды</translation> <translation id="1540800554400757039">1-мекенжай</translation> <translation id="1545749641540134597">QR кодын сканерлеу</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Ешқашан</translation> <translation id="7971521879845308059">Қалқымалы терезелерге тыйым салу</translation> <translation id="7982789257301363584">Желі</translation> +<translation id="7993619969781047893">Кейбір сайттағы функциялар дұрыс жұмыс істемеуі мүмкін.</translation> <translation id="800361585186029508">Google Chrome браузерінде енгізілген URL мекенжайларын ашады.</translation> <translation id="8007420562015504427">Инкогнито режимінде іздеу</translation> <translation id="8019783059653722575">Суреттерді сақтауға және жүктеп алуға мүмкіндік береді.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index 106f71a..b4863e2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="km"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">ធាតុត្រូវបានធ្វើបច្ចុប្បន្នភាព</translation> +<translation id="1044891598689252897">គេហទំព័រនឹងដំណើរការធម្មតា</translation> <translation id="1047726139967079566">ចំណាំទំព័រនេះ...</translation> <translation id="1049743911850919806">អនាមិក</translation> <translation id="1063454504051558093">ប្រើពាក្យសម្ងាត់ផ្សេងទៀត...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">ធាតុ <ph name="COUNT" /></translation> <translation id="1491277525950327607">ចុចពីរដងដើម្បីបិទបើកការកំណត់</translation> <translation id="1509486075633541495">ចូលទៅគេហទំព័រ</translation> +<translation id="1509960214886564027">មុខងារនៅលើគេហទំព័រជាច្រើនអាចដំណើរការមិនត្រឹមត្រូវ</translation> <translation id="152234381334907219">កុំរក្សាទុក</translation> <translation id="1540800554400757039">អាសយដ្ឋាន 1</translation> <translation id="1545749641540134597">ស្កេនកូដ QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">មិនដែល</translation> <translation id="7971521879845308059">រារាំងការលេចឡើង</translation> <translation id="7982789257301363584">បណ្តាញ</translation> +<translation id="7993619969781047893">មុខងារនៅលើគេហទំព័រមួយចំនួនអាចដំណើរការមិនត្រឹមត្រូវ</translation> <translation id="800361585186029508">បើក URL ដែលបានបញ្ចូលនៅក្នុង Google Chrome។</translation> <translation id="8007420562015504427">ការស្វែងរកលក្ខណៈឯកជន</translation> <translation id="8019783059653722575">វាអនុញ្ញាតឲ្យអ្នករក្សាទុក និងអាប់ឡូតរូបថត</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index d679a06..70a7263 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="kn"> <translation id="1005230401424685968">ವವವವ</translation> <translation id="1016495303386450659">ಐಟಂ ಅಪ್ಡೇಟ್ ಮಾಡಲಾಗಿದೆ</translation> +<translation id="1044891598689252897">ಸೈಟ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತವೆ</translation> <translation id="1047726139967079566">ಈ ಪುಟವನ್ನು ಬುಕ್ಮಾರ್ಕ್ ಮಾಡಿ...</translation> <translation id="1049743911850919806">ಅದೃಶ್ಯ</translation> <translation id="1063454504051558093">ಬೇರೆ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ಐಟಂಗಳು</translation> <translation id="1491277525950327607">ಸೆಟ್ಟಿಂಗ್ ಟಾಗಲ್ ಮಾಡಲು ಡಬಲ್ ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="1509486075633541495">ವೆಬ್ಸೈಟ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> +<translation id="1509960214886564027">ಹಲವು ಸೈಟ್ಗಳಲ್ಲಿನ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು</translation> <translation id="152234381334907219">ಎಂದಿಗೂ ಉಳಿಸಿಲ್ಲ</translation> <translation id="1540800554400757039">ವಿಳಾಸ 1</translation> <translation id="1545749641540134597">QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">ಎಂದಿಗೂ ಇಲ್ಲ</translation> <translation id="7971521879845308059">ಪಾಪ್-ಅಪ್ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation> <translation id="7982789257301363584">ನೆಟ್ವರ್ಕ್</translation> +<translation id="7993619969781047893">ಕೆಲವು ಸೈಟ್ಗಳಲ್ಲಿನ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು</translation> <translation id="800361585186029508">Google Chrome ನಲ್ಲಿ ಇನ್ಪುಟ್ ಮಾಡಿದ URL ಗಳನ್ನು ತೆರೆಯುತ್ತದೆ.</translation> <translation id="8007420562015504427">ಅದೃಶ್ಯ ಹುಡುಕಾಟ</translation> <translation id="8019783059653722575">ಇದು ಫೋಟೋಗಳನ್ನು ಉಳಿಸಲು ಮತ್ತು ಅಪ್ಲೋಡ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index b75230f..bfa7379 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ko"> <translation id="1005230401424685968">연도</translation> <translation id="1016495303386450659">북마크가 업데이트되었습니다.</translation> +<translation id="1044891598689252897">사이트가 정상적으로 작동합니다.</translation> <translation id="1047726139967079566">현재 페이지를 북마크에 추가...</translation> <translation id="1049743911850919806">시크릿</translation> <translation id="1063454504051558093">다른 비밀번호를 사용하세요...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">항목 <ph name="COUNT" />개</translation> <translation id="1491277525950327607">설정을 전환하려면 두 번 탭하세요.</translation> <translation id="1509486075633541495">웹사이트에 로그인</translation> +<translation id="1509960214886564027">다수의 사이트에서 기능이 작동하지 않을 수 있음</translation> <translation id="152234381334907219">저장하지 않음</translation> <translation id="1540800554400757039">주소 1</translation> <translation id="1545749641540134597">QR 코드 스캔</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">사용하지 않음</translation> <translation id="7971521879845308059">팝업 차단</translation> <translation id="7982789257301363584">네트워크</translation> +<translation id="7993619969781047893">일부 사이트에서는 기능이 작동하지 않을 수 있음</translation> <translation id="800361585186029508">입력된 URL을 Chrome에서 엽니다.</translation> <translation id="8007420562015504427">시크릿 검색</translation> <translation id="8019783059653722575">액세스를 허용하면 사진을 저장하고 업로드할 수 있습니다.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index f0a1343b..08b84830 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ky"> <translation id="1005230401424685968">ЖЖЖЖ</translation> <translation id="1016495303386450659">Нерсе жаңырды</translation> +<translation id="1044891598689252897">Сайттар кадимкидей иштейт</translation> <translation id="1047726139967079566">Бул баракты кыстарып коюу…</translation> <translation id="1049743911850919806">Жашыруун</translation> <translation id="1063454504051558093">Башка сырсөздү колдонуу…</translation> @@ -45,8 +46,9 @@ <translation id="1436290164580597469">Шайкештирип баштоо үчүн, өткөрүүчү сүйлөмдү киргизиңиз.</translation> <translation id="1449835205994625556">Сырсөздү жашыруу</translation> <translation id="145015347812617860"><ph name="COUNT" /> нерсе</translation> -<translation id="1491277525950327607">Жөндөөнү которуштуруу үчүн эки жолу таптаңыз</translation> +<translation id="1491277525950327607">Жөндөөнү которуштуруу үчүн, эки жолу таптаңыз</translation> <translation id="1509486075633541495">Вебсайтка кирүү</translation> +<translation id="1509960214886564027">Функциялар көпчүлүк сайттарда туура иштебеши мүмкүн.</translation> <translation id="152234381334907219">Эч качан сакталбайт</translation> <translation id="1540800554400757039">1-дарек</translation> <translation id="1545749641540134597">QR кодун скандоо</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Эч качан</translation> <translation id="7971521879845308059">Калк чыкмл бөгт</translation> <translation id="7982789257301363584">Тармак</translation> +<translation id="7993619969781047893">Функциялар айрым сайттарда туура иштебеши мүмкүн</translation> <translation id="800361585186029508">URL'дерди Google Chrome'до ачат.</translation> <translation id="8007420562015504427">Жашыруун издөө</translation> <translation id="8019783059653722575">Бул сүрөттөрдү сактап жана жүктөп берүүгө жол ачат.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index d94e371..c9fd06d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="lo"> <translation id="1005230401424685968">ປປປປ</translation> <translation id="1016495303386450659">ອັບເດດລາຍການແລ້ວ</translation> +<translation id="1044891598689252897">ເວັບໄຊຈະເຮັດວຽກໄດ້ປົກກະຕິ</translation> <translation id="1047726139967079566">ໃສ່ບຸກມາກສ໌ຫນ້ານີ້...</translation> <translation id="1049743911850919806">ບໍ່ເຜີຍຕົວຕົນ</translation> <translation id="1063454504051558093">ໃຊ້ລະຫັດຜ່ານອື່ນ...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ລາຍການ</translation> <translation id="1491277525950327607">ແຕະສອງຄັ້ງເພື່ອສັບປ່ຽນການຕັ້ງຄ່າ</translation> <translation id="1509486075633541495">ເຂົ້າສູ່ລະບົບເວັບໄຊ</translation> +<translation id="1509960214886564027">ຄຸນສົມບັດໃນຫຼາຍໆເວັບໄຊອາດຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="152234381334907219">ຢ່າບັນທຶກ</translation> <translation id="1540800554400757039">ທີ່ຢູ່ 1</translation> <translation id="1545749641540134597">ສະແກນລະຫັດ QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">ບໍ່ເລີຍ</translation> <translation id="7971521879845308059">ບລັອກປັອບອັບ</translation> <translation id="7982789257301363584">ເຄືອຂ່າຍ</translation> +<translation id="7993619969781047893">ຄຸນສົມບັດໃນບາງເວັບໄຊອາດຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="800361585186029508">ເປີດ URL ທີ່ປ້ອນໃນ Google Chrome.</translation> <translation id="8007420562015504427">ການຊອກຫາແບບບໍ່ເຜີຍຕົວຕົນ</translation> <translation id="8019783059653722575">ນີ້ອະນຸຍາດໃຫ້ທ່ານບັນທຶກ ແລະ ອັບໂຫຼດຮູບຖ່າຍ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 5a8ce8df..59f800f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="lt"> <translation id="1005230401424685968">MMMM</translation> <translation id="1016495303386450659">Elementas atnaujintas</translation> +<translation id="1044891598689252897">Svetainės veiks įprastai</translation> <translation id="1047726139967079566">Įtraukti šį puslapį į žymes...</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Naudoti kitą slaptažodį...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Elementų: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Dukart palieskite, kad perjungtumėte nustatymą</translation> <translation id="1509486075633541495">Prisijungti prie svetainės</translation> +<translation id="1509960214886564027">Funkcijos gali neveikti daugybėje svetainių.</translation> <translation id="152234381334907219">Niekada neišsaugota</translation> <translation id="1540800554400757039">1 adreso eil.</translation> <translation id="1545749641540134597">Nuskaitykite QR kodą</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Niekada</translation> <translation id="7971521879845308059">Blok. iššok. l.</translation> <translation id="7982789257301363584">Tinklas</translation> +<translation id="7993619969781047893">Funkcijos gali neveikti tam tikrose svetainėse</translation> <translation id="800361585186029508">Atidaromi įvesti URL naršyklėje „Google Chrome“.</translation> <translation id="8007420562015504427">Paieška inkognito režimu</translation> <translation id="8019783059653722575">Taip galite išsaugoti ir įkelti nuotraukas.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 3078305..3e58ad7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="lv"> <translation id="1005230401424685968">GGGG</translation> <translation id="1016495303386450659">Vienums atjaunināts</translation> +<translation id="1044891598689252897">Vietnes darbosies normāli</translation> <translation id="1047726139967079566">Saglabāt šo lapu kā grāmatzīmi...</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Izmantot citu paroli</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> vienumi</translation> <translation id="1491277525950327607">Veiciet dubultskārienu, lai pārslēgtu iestatījumu.</translation> <translation id="1509486075633541495">Pierakstieties tīmekļa vietnē</translation> +<translation id="1509960214886564027">Daudzās vietnēs funkcijas var nedarboties</translation> <translation id="152234381334907219">Jaunākie saglabātie</translation> <translation id="1540800554400757039">1. adrese</translation> <translation id="1545749641540134597">Skenējiet QR kodu</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nekad</translation> <translation id="7971521879845308059">Bl. uzn. logus</translation> <translation id="7982789257301363584">Tīkls</translation> +<translation id="7993619969781047893">Noteiktās vietnēs funkcijas var nedarboties</translation> <translation id="800361585186029508">Ievadītie vietrāži URL tiek atvērti pārlūkā Google Chrome.</translation> <translation id="8007420562015504427">Meklēt inkognito režīmā</translation> <translation id="8019783059653722575">Varat saglabāt un augšupielādēt fotoattēlus.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index dc69a50..1cdba1f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="mk"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Ставката е ажурирана</translation> +<translation id="1044891598689252897">Сајтовите ќе работат нормално</translation> <translation id="1047726139967079566">Обележи ја страницата...</translation> <translation id="1049743911850919806">Инкогнито</translation> <translation id="1063454504051558093">Употребете друга лозинка…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ставки</translation> <translation id="1491277525950327607">Допрете двапати за да ја измените поставката</translation> <translation id="1509486075633541495">Најавете се на веб-сајтот</translation> +<translation id="1509960214886564027">Функциите на многу сајтови може да не функционираат</translation> <translation id="152234381334907219">Никогаш не зачувувај лозинки</translation> <translation id="1540800554400757039">Адреса 1</translation> <translation id="1545749641540134597">Скенирајте QR код</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Никогаш</translation> <translation id="7971521879845308059">Блокирај појавни прозорци</translation> <translation id="7982789257301363584">Мрежа</translation> +<translation id="7993619969781047893">Функциите на некои сајтови може да не функционираат</translation> <translation id="800361585186029508">Ги отвора внесените URL-адреси во Google Chrome.</translation> <translation id="8007420562015504427">Инкогнито пребарување</translation> <translation id="8019783059653722575">Ова ви овозможува да зачувувате и да поставувате фотографии.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 16ee8b7..c50ca6d0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ml"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">ഇനം അപ്ഡേറ്റുചെയ്തു</translation> +<translation id="1044891598689252897">സൈറ്റുകൾ സാധാരണ രീതിയിൽ പ്രവർത്തിക്കും</translation> <translation id="1047726139967079566">ഈ പേജ് ബുക്ക്മാര്ക്ക് ചെയ്യുക...</translation> <translation id="1049743911850919806">ആള്മാറാട്ടം</translation> <translation id="1063454504051558093">മറ്റ് പാസ്വേഡ് ഉപയോഗിക്കുക...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ഇനങ്ങൾ</translation> <translation id="1491277525950327607">ക്രമീകരണം മാറ്റാൻ രണ്ടുതവണ ടാപ്പ് ചെയ്യുക</translation> <translation id="1509486075633541495">വെബ്സൈറ്റിലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation> +<translation id="1509960214886564027">നിരവധി സൈറ്റുകളിലെ ഫീച്ചറുകൾക്ക് പ്രവർത്തനം നടത്താനായേക്കില്ല</translation> <translation id="152234381334907219">ഒരിക്കലും സംരക്ഷിച്ചില്ല</translation> <translation id="1540800554400757039">വിലാസം 1</translation> <translation id="1545749641540134597">QR കോഡ് സ്കാൻ ചെയ്യുക</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">ഒരിക്കലും</translation> <translation id="7971521879845308059">പോപ്പ്-അപ്പുകൾ തടയുക</translation> <translation id="7982789257301363584">നെറ്റ്വർക്ക്</translation> +<translation id="7993619969781047893">ചില സൈറ്റുകളിലെ ഫീച്ചറുകൾക്ക് പ്രവർത്തനം നടത്താനായേക്കില്ല</translation> <translation id="800361585186029508">Google Chrome-ൽ നൽകിയിട്ടുള്ള URL-കൾ തുറക്കുന്നു.</translation> <translation id="8007420562015504427">അദൃശ്യ തിരയൽ</translation> <translation id="8019783059653722575">ഇത് ഫോട്ടോകൾ സംരക്ഷിച്ച്, അപ്ലോഡ് ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 72f0357..1ac9f444 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="mn"> <translation id="1005230401424685968">ЖЖЖЖ</translation> <translation id="1016495303386450659">Шинэчлэгдсэн зүйл</translation> +<translation id="1044891598689252897">Сайтууд хэвийн ажиллана</translation> <translation id="1047726139967079566">Энэ хуудсыг хадгал...</translation> <translation id="1049743911850919806">Нууцлал</translation> <translation id="1063454504051558093">Өөр нууц үг ашиглана уу...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> зүйлс</translation> <translation id="1491277525950327607">Унтраах/асаах тохиргоог хийхийн тулд хоёр удаа товшино уу</translation> <translation id="1509486075633541495">Вэб сайтад нэвтрэх</translation> +<translation id="1509960214886564027">Олон сайтын онцлогууд ажиллахгүй байж болзошгүй</translation> <translation id="152234381334907219">Огт хадгалаагүй</translation> <translation id="1540800554400757039">Хаяг 1</translation> <translation id="1545749641540134597">Хурдан хариу үйлдлийн кодыг скан хийх</translation> @@ -527,6 +529,7 @@ <translation id="7961015016161918242">Хэзээ ч</translation> <translation id="7971521879845308059">Зар сурталчилгааг хориглох</translation> <translation id="7982789257301363584">Сүлжээ</translation> +<translation id="7993619969781047893">Зарим сайтын онцлогууд ажиллахгүй байж болзошгүй</translation> <translation id="800361585186029508">Оруулсан URL-г Google Chrome дээр нээдэг.</translation> <translation id="8007420562015504427">Нууцлалтай хайлт</translation> <translation id="8019783059653722575">Энэ нь танд зураг хадгалах, байршуулах боломжийг олгодог.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 4379fe6..975f396 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="mr"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">आयटम अपडेट केला</translation> +<translation id="1044891598689252897">साइट सामान्यपणे काम करतील</translation> <translation id="1047726139967079566">हे पृष्ठ बुकमार्क करा...</translation> <translation id="1049743911850919806">गुप्त</translation> <translation id="1063454504051558093">दुसरा पासवर्ड वापरा...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> आयटम</translation> <translation id="1491277525950327607">सेटिंग टॉगल करण्यासाठी दोनदा टॅप करा</translation> <translation id="1509486075633541495">वेबसाइटवर साइन इन करा</translation> +<translation id="1509960214886564027">अनेक साइटवरील वैशिष्ट्यांमध्ये खंड पडू शकतो</translation> <translation id="152234381334907219">कधीही सेव्ह न केलेले</translation> <translation id="1540800554400757039">पत्ता 1</translation> <translation id="1545749641540134597">QR कोड स्कॅन करा</translation> @@ -529,6 +531,7 @@ <translation id="7961015016161918242">कधीही नाही</translation> <translation id="7971521879845308059">पॉप-अप अवरोधित करा</translation> <translation id="7982789257301363584">नेटवर्क</translation> +<translation id="7993619969781047893">काही साइटवरील वैशिष्ट्यांमध्ये खंड पडू शकतो</translation> <translation id="800361585186029508">Google Chrome मध्ये इनपुट केलेल्या URL उघडते.</translation> <translation id="8007420562015504427">गुप्त शोध</translation> <translation id="8019783059653722575">हे तुम्हाला फोटो सेव्ह आणि अपलोड करू देते.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index d6c4fd9..2c692cb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ms"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Item dikemas kini</translation> +<translation id="1044891598689252897">Tapak akan berfungsi seperti biasa</translation> <translation id="1047726139967079566">Tanda Halaman Ini...</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Gunakan Kata Laluan Lain...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> item</translation> <translation id="1491277525950327607">Dwiketik untuk togol tetapan</translation> <translation id="1509486075633541495">Log masuk ke tapak web</translation> +<translation id="1509960214886564027">Ciri pada banyak tapak mungkin rosak</translation> <translation id="152234381334907219">Tidak Pernah Disimpan</translation> <translation id="1540800554400757039">Alamat 1</translation> <translation id="1545749641540134597">Imbas Kod QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Tidak sama sekali</translation> <translation id="7971521879845308059">Sekat P/Timbul</translation> <translation id="7982789257301363584">Rangkaian</translation> +<translation id="7993619969781047893">Ciri pada sesetengah tapak mungkin rosak</translation> <translation id="800361585186029508">Membuka URL yang dimasukkan dalam Google Chrome.</translation> <translation id="8007420562015504427">Carian Inkognito</translation> <translation id="8019783059653722575">Langkah ini membolehkan anda menyimpan dan memuat naik foto.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index e998906..15fda834 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="my"> <translation id="1005230401424685968">နှစ်</translation> <translation id="1016495303386450659">အကောင်းအရာ မွမ်းမံပြီးပါပြီ</translation> +<translation id="1044891598689252897">ဝဘ်ဆိုက်များ ပုံမှန်အလုပ်လုပ်ပါမည်</translation> <translation id="1047726139967079566">ဒီစာမျက်နှာကို စာညှပ်ပေးရန်</translation> <translation id="1049743911850919806">ရုပ်ဖျက်</translation> <translation id="1063454504051558093">အခြားစကားဝှက်ကို သုံးပါ...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> အကြောင်းအရာများ</translation> <translation id="1491277525950327607">ဆက်တင်ကို ကစားကြည့်ရန် နှစ်ချက်တို့ပါ</translation> <translation id="1509486075633541495">ဝဘ်ဆိုက်သို့ လက်မှတ်ထိုးဝင်ရန်</translation> +<translation id="1509960214886564027">ဝဘ်ဆိုက်အတော်များများရှိ ဝန်ဆောင်မှုများ ရပ်သွားနိုင်သည်</translation> <translation id="152234381334907219">ဘယ်တော့မှ သိမ်းဆည်းခြင်းမပြုပါ</translation> <translation id="1540800554400757039">လိပ်စာ: 1</translation> <translation id="1545749641540134597">QR ကုဒ်ကို ဖတ်ပါ</translation> @@ -527,6 +529,7 @@ <translation id="7961015016161918242">ဘယ်သောအခါမှ</translation> <translation id="7971521879845308059">ပေါ့အာပ်များ ပိတ်ဆို့မည်</translation> <translation id="7982789257301363584">ကွန်ရက်</translation> +<translation id="7993619969781047893">အချို့ဝဘ်ဆိုက်များပေါ်ရှိ ဝန်ဆောင်မှုများ ရပ်သွားနိုင်ပါသည်</translation> <translation id="800361585186029508">ထည့်သွင်းလိုက်သော URL များကို Google Chrome တွင် ဖွင့်သည်။</translation> <translation id="8007420562015504427">ရုပ်ဖျက်မုဒ်ဖြင့် ရှာရန်</translation> <translation id="8019783059653722575">၎င်းသည် ဓာတ်ပုံသိမ်းဆည်းရန်နှင့် အပ်လုဒ်လုပ်ရန် ခွင့်ပြုပါသည်။</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index ffc4cec..63a901a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ne"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">वस्तु अद्यावधिक गरियो</translation> +<translation id="1044891598689252897">साइटहरू सामान्य रूपमा चल्ने छन्</translation> <translation id="1047726139967079566">यो पृष्ठलाई बुकमार्क गर्नुहोस्...</translation> <translation id="1049743911850919806">इन्कोग्निटो</translation> <translation id="1063454504051558093">अर्को पासवर्ड प्रयोग गर्नुहोस्...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> वस्तुहरू</translation> <translation id="1491277525950327607">सेटिङ टगल गर्न डबल ट्याप गर्नुहोस्</translation> <translation id="1509486075633541495">वेबसाइटमा साइन इन गर्नुहोस्</translation> +<translation id="1509960214886564027">कयौँ साइटका सुविधाहरूले काम नगर्न सक्छन्</translation> <translation id="152234381334907219">कहिल्यै सुरक्षित गरिँदैन</translation> <translation id="1540800554400757039">ठेगाना 1</translation> <translation id="1545749641540134597">QR कोड स्क्यान गर्नुहोस्</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">कहिल्यै पनि होइन</translation> <translation id="7971521879845308059">पप-अपहरूलाई रोक्नुहोस्</translation> <translation id="7982789257301363584">सञ्जाल</translation> +<translation id="7993619969781047893">कयौँ साइटका सुविधाहरूले काम नगर्न सक्छन्</translation> <translation id="800361585186029508">Google Chrome मा प्रविष्टि गरिएका URL हरू खोल्छ।</translation> <translation id="8007420562015504427">इन्कोग्निटो खोज</translation> <translation id="8019783059653722575">यसले तपाईँलाई तस्बिरहरू सुरक्षित र अपलोड गर्न दिन्छ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index ddc1554..35eb9e1f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="nl"> <translation id="1005230401424685968">JJJJ</translation> <translation id="1016495303386450659">Item geüpdated</translation> +<translation id="1044891598689252897">Sites werken naar behoren</translation> <translation id="1047726139967079566">Bladwijzer instellen voor deze pagina...</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="1063454504051558093">Ander wachtwoord gebruiken...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> items</translation> <translation id="1491277525950327607">Dubbeltik om de instelling in of uit te schakelen</translation> <translation id="1509486075633541495">Inloggen op website</translation> +<translation id="1509960214886564027">Functies op veel sites werken mogelijk niet meer</translation> <translation id="152234381334907219">Nooit opgeslagen</translation> <translation id="1540800554400757039">Adres 1</translation> <translation id="1545749641540134597">QR-code scannen</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nooit</translation> <translation id="7971521879845308059">Pop-ups blokkeren</translation> <translation id="7982789257301363584">Netwerk</translation> +<translation id="7993619969781047893">Functies op bepaalde sites werken mogelijk niet meer</translation> <translation id="800361585186029508">Hiermee worden de ingevoerde URL's geopend in Google Chrome.</translation> <translation id="8007420562015504427">Incognito zoeken</translation> <translation id="8019783059653722575">Hiermee kun je foto's opslaan en uploaden.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 077f70c1..9facbef 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="no"> <translation id="1005230401424685968">ÅÅÅÅ</translation> <translation id="1016495303386450659">Elementet er oppdatert</translation> +<translation id="1044891598689252897">Nettsteder kommer til å fungere som normalt</translation> <translation id="1047726139967079566">Legg til bokmerke for denne siden...</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Bruk et annet passord</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elementer</translation> <translation id="1491277525950327607">Dobbelttrykk for å slå innstillingen av/på</translation> <translation id="1509486075633541495">Logg på nettstedet</translation> +<translation id="1509960214886564027">Det kan hende at funksjoner på mange nettsteder slutter å fungere</translation> <translation id="152234381334907219">Aldri lagret</translation> <translation id="1540800554400757039">Adresse 1</translation> <translation id="1545749641540134597">Skann en QR-kode</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Aldri</translation> <translation id="7971521879845308059">Blokkér forgrunnsvinduer</translation> <translation id="7982789257301363584">Nettverk</translation> +<translation id="7993619969781047893">Det kan hende at funksjoner på enkelte nettsteder slutter å fungere</translation> <translation id="800361585186029508">Åpner de oppgitte nettadressene i Google Chrome.</translation> <translation id="8007420562015504427">Inkognitosøk</translation> <translation id="8019783059653722575">Dette gjør at du kan lagre og laste opp bilder.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 2240a972..387d3c2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="or"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">ଆଇଟମ୍ ଅପ୍ଡେଟ୍ କରାଗଲା</translation> +<translation id="1044891598689252897">ସାଇଟଗୁଡ଼ିକ ସାଧାରଣ ଭାବେ କାମ କରିବ</translation> <translation id="1047726139967079566">ଏହି ପୃଷ୍ଠାକୁ ବୁକ୍ମାର୍କ କରନ୍ତୁ...</translation> <translation id="1049743911850919806">ଇନ୍କଗ୍ନିଟୋ</translation> <translation id="1063454504051558093">ଅନ୍ୟ ଗୋଟିଏ ପାସ୍ୱାର୍ଡ ବ୍ୟବହାର କରନ୍ତୁ...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" />ଟି ଆଇଟମ୍</translation> <translation id="1491277525950327607">ସେଟିଂକୁ ଟୋଗଲ୍ କରିବାକୁ ଦୁଇଥର ଟାପ୍ କରନ୍ତୁ</translation> <translation id="1509486075633541495">ୱେବ୍ସାଇଟ୍ରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation> +<translation id="1509960214886564027">କିଛି ସାଇଟରେ ଫିଚରଗୁଡ଼ିକ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ</translation> <translation id="152234381334907219">ଆଦୌ ସେଭ୍ କରାଯାଇନାହିଁ</translation> <translation id="1540800554400757039">ଠିକଣା 1</translation> <translation id="1545749641540134597">QR କୋଡ୍ ସ୍କାନ୍ କରନ୍ତୁ</translation> @@ -526,6 +528,7 @@ <translation id="7961015016161918242">ଆଦୌ ନୁହେଁ</translation> <translation id="7971521879845308059">ପପ୍-ଅପ୍ଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation> <translation id="7982789257301363584">ନେଟୱାର୍କ</translation> +<translation id="7993619969781047893">କିଛି ସାଇଟରେ ଫିଚରଗୁଡ଼ିକ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ</translation> <translation id="800361585186029508">ଇନପୁଟ୍ କରାଯାଇଥିବା URLଗୁଡ଼ିକୁ Google Chromeରେ ଖୋଲା ଯାଇଥାଏ।</translation> <translation id="8007420562015504427">ଇନ୍କଗ୍ନିଟୋ ସର୍ଚ୍ଚ</translation> <translation id="8019783059653722575">ଏହା ଆପଣଙ୍କୁ ଫଟୋ ଅପ୍ଲୋଡ୍ ଏବଂ ସେଭ୍ କରିବାକୁ ଦିଏ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 65c81fb..fc3044cb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="pa"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">ਆਈਟਮ ਅੱਪਡੇਟ ਕੀਤੀ ਗਈ</translation> +<translation id="1044891598689252897">ਸਾਈਟਾਂ ਸਹੀ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਕਰਨਗੀਆਂ</translation> <translation id="1047726139967079566">ਇਸ ਪੰਨੇ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ...</translation> <translation id="1049743911850919806">ਗੁਮਨਾਮ</translation> <translation id="1063454504051558093">ਕੋਈ ਹੋਰ ਪਾਸਵਰਡ ਵਰਤੋ...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ਆਈਟਮਾਂ</translation> <translation id="1491277525950327607">ਸੈਟਿੰਗ ਨੂੰ ਟੌਗਲ ਕਰਨ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ</translation> <translation id="1509486075633541495">ਵੈੱਬਸਾਈਟ ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> +<translation id="1509960214886564027">ਸ਼ਾਇਦ ਕਈ ਸਾਈਟਾਂ 'ਤੇ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ</translation> <translation id="152234381334907219">ਕਦੇ ਵੀ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤੇ ਗਏ</translation> <translation id="1540800554400757039">ਪਤਾ 1</translation> <translation id="1545749641540134597">QR ਕੋਡ ਸਕੈਨ ਕਰੋ</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">ਕਦੇ ਨਹੀਂ</translation> <translation id="7971521879845308059">ਪੌਪ-ਅਪਸ ਬਲੌਕ ਕਰੋ</translation> <translation id="7982789257301363584">ਨੈੱਟਵਰਕ</translation> +<translation id="7993619969781047893">ਸ਼ਾਇਦ ਕੁਝ ਸਾਈਟਾਂ 'ਤੇ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਠੀਕ ਤਰੀਕੇ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ</translation> <translation id="800361585186029508">ਦਾਖਲ ਕੀਤੇ URL ਨੂੰ Google Chrome ਵਿੱਚ ਖੋਲ੍ਹਦਾ ਹੈ।</translation> <translation id="8007420562015504427">ਗੁਮਨਾਮ ਖੋਜ</translation> <translation id="8019783059653722575">ਇਹ ਤੁਹਾਨੂੰ ਫ਼ੋਟੋਆਂ ਨੂੰ ਰੱਖਿਅਤ ਅਤੇ ਅੱਪਲੋਡ ਕਰਨ ਦਿੰਦਾ ਹੈ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 522db7ab44..96f8c57 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="pl"> <translation id="1005230401424685968">RRRR</translation> <translation id="1016495303386450659">Zaktualizowano element</translation> +<translation id="1044891598689252897">Strony będą działać normalnie</translation> <translation id="1047726139967079566">Dodaj stronę do zakładek...</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="1063454504051558093">Użyj innego hasła…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Elementy: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Kliknij dwukrotnie, by zmienić ustawienie</translation> <translation id="1509486075633541495">Zaloguj się w witrynie</translation> +<translation id="1509960214886564027">Funkcje wielu stron mogą nie działać prawidłowo</translation> <translation id="152234381334907219">Nigdy nie zapisane</translation> <translation id="1540800554400757039">Adres 1</translation> <translation id="1545749641540134597">Zeskanuj kod QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nigdy</translation> <translation id="7971521879845308059">Blokuj wyskakujące okienka</translation> <translation id="7982789257301363584">Sieć</translation> +<translation id="7993619969781047893">Funkcje niektórych stron mogą nie działać prawidłowo</translation> <translation id="800361585186029508">Otwiera wpisane adresy URL w Google Chrome.</translation> <translation id="8007420562015504427">Wyszukiwanie incognito</translation> <translation id="8019783059653722575">Umożliwia zapisywanie i przesyłanie zdjęć.</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 77c45a6..f075e323 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="pt-BR"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Item atualizado</translation> +<translation id="1044891598689252897">Os sites funcionarão normalmente</translation> <translation id="1047726139967079566">Adicionar esta página aos favoritos...</translation> <translation id="1049743911850919806">Modo anônimo</translation> <translation id="1063454504051558093">Usar outra senha...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> itens</translation> <translation id="1491277525950327607">Toque duas vezes para alternar a configuração</translation> <translation id="1509486075633541495">Fazer login no site</translation> +<translation id="1509960214886564027">Os recursos de muitos sites podem apresentar falhas</translation> <translation id="152234381334907219">Nunca salvas</translation> <translation id="1540800554400757039">Endereço 1</translation> <translation id="1545749641540134597">Ler código QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nunca</translation> <translation id="7971521879845308059">Bloquear pop-ups</translation> <translation id="7982789257301363584">Rede</translation> +<translation id="7993619969781047893">Os recursos de alguns sites podem apresentar falhas</translation> <translation id="800361585186029508">Abre os URLs fornecidos no Google Chrome.</translation> <translation id="8007420562015504427">Pesquisa anônima</translation> <translation id="8019783059653722575">Isso permite que você salve fotos e faça upload delas.</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 46666d12..ec3cfdc5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="pt-PT"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Item atualizado</translation> +<translation id="1044891598689252897">Os sites funcionam normalmente.</translation> <translation id="1047726139967079566">Marcar esta página...</translation> <translation id="1049743911850919806">Navegação anónima</translation> <translation id="1063454504051558093">Utilizar outra palavra-passe…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> itens</translation> <translation id="1491277525950327607">Toque duas vezes para ativar ou desativar a definição</translation> <translation id="1509486075633541495">Inicie sessão no Website</translation> +<translation id="1509960214886564027">As funcionalidades em muitos sites podem falhar.</translation> <translation id="152234381334907219">Nunca guardado</translation> <translation id="1540800554400757039">Morada 1</translation> <translation id="1545749641540134597">Ler código QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nunca</translation> <translation id="7971521879845308059">Bloquear Pop-ups</translation> <translation id="7982789257301363584">Rede</translation> +<translation id="7993619969781047893">As funcionalidades em alguns sites podem falhar.</translation> <translation id="800361585186029508">Abre os URLs introduzidos no Google Chrome.</translation> <translation id="8007420562015504427">Pesquisa anónima</translation> <translation id="8019783059653722575">Isto permite-lhe guardar e carregar fotos.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 69b146d..1f6a8020 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ro"> <translation id="1005230401424685968">AAAA</translation> <translation id="1016495303386450659">Element actualizat</translation> +<translation id="1044891598689252897">Site-urile vor funcționa normal</translation> <translation id="1047726139967079566">Marcați această pagină...</translation> <translation id="1049743911850919806">Incognito</translation> <translation id="1063454504051558093">Folosește altă parolă...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> elemente</translation> <translation id="1491277525950327607">Atinge de două ori ca să comuți setarea</translation> <translation id="1509486075633541495">Conectează-te la site</translation> +<translation id="1509960214886564027">Este posibil ca funcțiile de pe mai multe site-uri să fie întrerupte</translation> <translation id="152234381334907219">Nu se salvează niciodată</translation> <translation id="1540800554400757039">Adresă 1</translation> <translation id="1545749641540134597">Scanează codul QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Niciodată</translation> <translation id="7971521879845308059">Blochează pop-upurile</translation> <translation id="7982789257301363584">Rețea</translation> +<translation id="7993619969781047893">Este posibil ca funcțiile de pe anumite site-uri să fie întrerupte</translation> <translation id="800361585186029508">Deschide adresele URL introduse în Google Chrome.</translation> <translation id="8007420562015504427">Căutare incognito</translation> <translation id="8019783059653722575">Astfel, poți să salvezi și să încarci fotografiile.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index e8af1988..a311e9b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ru"> <translation id="1005230401424685968">ГГГГ</translation> <translation id="1016495303386450659">Обновлено</translation> +<translation id="1044891598689252897">Сайты будут работать в нормальном режиме</translation> <translation id="1047726139967079566">Добавить страницу в закладки…</translation> <translation id="1049743911850919806">Инкогнито</translation> <translation id="1063454504051558093">Использовать другой пароль</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Закладок: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Для переключения нажмите дважды</translation> <translation id="1509486075633541495">Войдите в аккаунт</translation> +<translation id="1509960214886564027">Многие функции на сайтах могут работать некорректно</translation> <translation id="152234381334907219">Сайты, пароли для которых не сохраняются</translation> <translation id="1540800554400757039">Адрес, строка 1</translation> <translation id="1545749641540134597">Сканирование QR-кода</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Нет</translation> <translation id="7971521879845308059">Блок. вспл. окна</translation> <translation id="7982789257301363584">Сеть</translation> +<translation id="7993619969781047893">Некоторые функции на сайтах могут работать некорректно</translation> <translation id="800361585186029508">Введенные URL будут открываться в Google Chrome.</translation> <translation id="8007420562015504427">Поиск в режиме инкогнито</translation> <translation id="8019783059653722575">Это нужно, чтобы сохранять и загружать фотографии</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 34cae04..c455ea1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="si"> <translation id="1005230401424685968">ව.ව.ව.ව.</translation> <translation id="1016495303386450659">අයිතමය යාවත්කාලීන කරන ලදි</translation> +<translation id="1044891598689252897">වෙබ් අඩවි සාමාන්යයෙන් ක්රියා කරයි</translation> <translation id="1047726139967079566">මෙම පිටුව පිටු සලකුණු කරයි...</translation> <translation id="1049743911850919806">අප්රකට</translation> <translation id="1063454504051558093">වෙනත් මුරපද භාවිතා කරන්න...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">අයිතම <ph name="COUNT" /></translation> <translation id="1491277525950327607">සැකසීම ටොගල් කිරීමට දෙවරක් තට්ටු කරන්න</translation> <translation id="1509486075633541495">වෙබ් අඩවියට පුරන්න</translation> +<translation id="1509960214886564027">බොහෝ වෙබ් අඩවි මත විශේෂාංග කැඩී ගිය හැක</translation> <translation id="152234381334907219">කිසිදා නොසුරකින ලද</translation> <translation id="1540800554400757039">ලිපිනය 1</translation> <translation id="1545749641540134597">QR කේතය ස්කෑන් කරන්න</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">කිසිවිට එපා</translation> <translation id="7971521879845308059">උත්පතන අවහිර කරන්න</translation> <translation id="7982789257301363584">ජාලය</translation> +<translation id="7993619969781047893">සමහර වෙබ් අඩවි මත විශේෂාංග කැඩී ගිය හැක</translation> <translation id="800361585186029508">ආදාන කළ URL ටික Google Chrome තුළින් විවෘත කරයි.</translation> <translation id="8007420562015504427">අප්රසිද්ධ සෙවීම</translation> <translation id="8019783059653722575">මෙය ඔබට ඡායාරූප සුරැක උඩුගත කිරීමට ඉඩ දෙයි.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index d6fdb156..b6bde382 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sk"> <translation id="1005230401424685968">RRRR</translation> <translation id="1016495303386450659">Položka bola aktualizovaná</translation> +<translation id="1044891598689252897">Weby budú fungovať normálne</translation> <translation id="1047726139967079566">Pridať stránku medzi záložky…</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Použiť iné heslo…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Počet položiek: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Nastavenie môžete prepnúť dvojitým klepnutím</translation> <translation id="1509486075633541495">Prihláste sa na webe</translation> +<translation id="1509960214886564027">Funkcie na mnohých weboch môžu zlyhávať</translation> <translation id="152234381334907219">Nikdy neukladať</translation> <translation id="1540800554400757039">Adresa 1</translation> <translation id="1545749641540134597">Naskenovať kód QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nikdy</translation> <translation id="7971521879845308059">Blokov. okien</translation> <translation id="7982789257301363584">Sieť</translation> +<translation id="7993619969781047893">Funkcie na niektorých weboch môžu zlyhávať</translation> <translation id="800361585186029508">Otvorí zadané webové adresy v prehliadači Google Chrome.</translation> <translation id="8007420562015504427">Anonymné vyhľadávanie</translation> <translation id="8019783059653722575">Umožňuje uložiť a nahrať fotky.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index c1aed19..568d90cb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sl"> <translation id="1005230401424685968">LLLL</translation> <translation id="1016495303386450659">Item updated</translation> +<translation id="1044891598689252897">Spletna mesta bodo delovala normalno</translation> <translation id="1047726139967079566">Zaznamek za to stran ...</translation> <translation id="1049743911850919806">Način brez beleženja zgodovine</translation> <translation id="1063454504051558093">Uporaba drugega gesla …</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Št. elementov: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Dvakrat se dotaknite, da preklopite nastavitev</translation> <translation id="1509486075633541495">Prijavite se na spletnem mestu</translation> +<translation id="1509960214886564027">Funkcije na številnih spletnih mestih morda ne bodo delovale</translation> <translation id="152234381334907219">Nikoli shranjeno</translation> <translation id="1540800554400757039">Naslov 1</translation> <translation id="1545749641540134597">Scan QR Code</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nikoli</translation> <translation id="7971521879845308059">Blokiraj pojavna okna</translation> <translation id="7982789257301363584">Omrežje</translation> +<translation id="7993619969781047893">Funkcije na nekaterih spletnih mestih morda ne bodo delovale</translation> <translation id="800361585186029508">Odpre vnesene URL-je v Google Chromu.</translation> <translation id="8007420562015504427">Iskanje brez beleženja zgodovine</translation> <translation id="8019783059653722575">S tem je mogoče shranjevati in nalagati fotografije.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index f019f1c..7122a4d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sq"> <translation id="1005230401424685968">VVVV</translation> <translation id="1016495303386450659">Elementi u përditësua</translation> +<translation id="1044891598689252897">Sajtet do të punojnë normalisht</translation> <translation id="1047726139967079566">Regjistroje këtë faqe në faqeshënues...</translation> <translation id="1049743911850919806">I fshehtë</translation> <translation id="1063454504051558093">Përdor një fjalëkalim tjetër...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> artikuj</translation> <translation id="1491277525950327607">Trokit dy herë për të ndryshuar cilësimin</translation> <translation id="1509486075633541495">Identifikohu në sajtin e uebit</translation> +<translation id="1509960214886564027">Veçoritë në shumë sajte mund të ndalojnë së funksionuari</translation> <translation id="152234381334907219">Nuk u ruajt asnjëherë</translation> <translation id="1540800554400757039">Adresa 1</translation> <translation id="1545749641540134597">Skano kodin QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Asnjëherë</translation> <translation id="7971521879845308059">Blloko dritaret kërcyese</translation> <translation id="7982789257301363584">Rrjeti</translation> +<translation id="7993619969781047893">Veçoritë në disa sajte mund të ndalojnë së funksionuari</translation> <translation id="800361585186029508">Hap URL-të e futura në Google Chrome.</translation> <translation id="8007420562015504427">Kërkimi "i fshehtë"</translation> <translation id="8019783059653722575">Kjo të lejon të ruash dhe të ngarkosh fotografitë.</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 9fae7bfa..9bd108f7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sr-Latn"> <translation id="1005230401424685968">GGGG</translation> <translation id="1016495303386450659">Stavka je ažurirana</translation> +<translation id="1044891598689252897">Sajtovi će normalno raditi</translation> <translation id="1047726139967079566">Obeleži ovu stranicu...</translation> <translation id="1049743911850919806">Bez arhiviranja</translation> <translation id="1063454504051558093">Koristi drugu lozinku...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Stavki: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Dvaput dodirnite da biste uključili/isključili podešavanje</translation> <translation id="1509486075633541495">Prijavite se na veb-sajt</translation> +<translation id="1509960214886564027">Funkcije na mnogim sajtovima mogu da prestanu sa radom</translation> <translation id="152234381334907219">Nikada se ne čuva</translation> <translation id="1540800554400757039">1. red za adresu</translation> <translation id="1545749641540134597">Skenirajte QR kôd</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Nikad</translation> <translation id="7971521879845308059">Blokiraj iskačuće prozore</translation> <translation id="7982789257301363584">Mreža</translation> +<translation id="7993619969781047893">Funkcije na nekim sajtovima mogu da prestanu sa radom</translation> <translation id="800361585186029508">Otvara unete URL-ove u Google Chrome-u.</translation> <translation id="8007420562015504427">Pretraga bez arhiviranja</translation> <translation id="8019783059653722575">Ovo vam omogućava da čuvate i otpremate slike.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 493b3a50..e8a94ce 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sr"> <translation id="1005230401424685968">ГГГГ</translation> <translation id="1016495303386450659">Ставка је ажурирана</translation> +<translation id="1044891598689252897">Сајтови ће нормално радити</translation> <translation id="1047726139967079566">Обележи ову страницу...</translation> <translation id="1049743911850919806">Без архивирања</translation> <translation id="1063454504051558093">Користи другу лозинку...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Ставки: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Двапут додирните да бисте укључили/искључили подешавање</translation> <translation id="1509486075633541495">Пријавите се на веб-сајт</translation> +<translation id="1509960214886564027">Функције на многим сајтовима могу да престану са радом</translation> <translation id="152234381334907219">Никада се не чува</translation> <translation id="1540800554400757039">1. ред за адресу</translation> <translation id="1545749641540134597">Скенирајте QR кôд</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Никад</translation> <translation id="7971521879845308059">Блокирај искачуће прозоре</translation> <translation id="7982789257301363584">Мрежа</translation> +<translation id="7993619969781047893">Функције на неким сајтовима могу да престану са радом</translation> <translation id="800361585186029508">Отвара унете URL-ове у Google Chrome-у.</translation> <translation id="8007420562015504427">Претрага без архивирања</translation> <translation id="8019783059653722575">Ово вам омогућава да чувате и отпремате слике.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index a9b86da..3c22ba2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sv"> <translation id="1005230401424685968">ÅÅÅÅ</translation> <translation id="1016495303386450659">Bokmärket har uppdaterats</translation> +<translation id="1044891598689252897">Webbplatser fungerar som de ska</translation> <translation id="1047726139967079566">Skapa bokmärke för den här sidan...</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Använd ett annat lösenord …</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> objekt</translation> <translation id="1491277525950327607">Aktivera eller inaktivera inställningen genom att trycka snabbt två gånger</translation> <translation id="1509486075633541495">Logga in på webbplats</translation> +<translation id="1509960214886564027">Funktioner kan sluta att fungera på många webbplatser</translation> <translation id="152234381334907219">Aldrig sparat</translation> <translation id="1540800554400757039">Adressrad 1</translation> <translation id="1545749641540134597">Skanna QR-kod</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Aldrig</translation> <translation id="7971521879845308059">Blockera popup-fönster</translation> <translation id="7982789257301363584">Nätverk</translation> +<translation id="7993619969781047893">Funktioner kan sluta att fungera på vissa webbplatser</translation> <translation id="800361585186029508">Öppnar de angivna webbadresserna i Google Chrome.</translation> <translation id="8007420562015504427">Inkognitosökning</translation> <translation id="8019783059653722575">Det här gör att du kan spara foton och ladda upp dem.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index d46eb87..3554859 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="sw"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Umesasisha kipengee</translation> +<translation id="1044891598689252897">Tovuti zitafanya kazi kama kawaida</translation> <translation id="1047726139967079566">Alamisha Ukurasa Huu...</translation> <translation id="1049743911850919806">Kichupo fiche</translation> <translation id="1063454504051558093">Tumia Nenosiri Jingine...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Vipengee <ph name="COUNT" /></translation> <translation id="1491277525950327607">Gusa mara mbili ili ugeuze mipangilio</translation> <translation id="1509486075633541495">Ingia katika akaunti ya tovuti</translation> +<translation id="1509960214886564027">Huenda vipengele kwenye tovuti nyingi vikakosa kufanya kazi</translation> <translation id="152234381334907219">Hayatahifadhiwa Kamwe</translation> <translation id="1540800554400757039">Anwani ya 1</translation> <translation id="1545749641540134597">Changanua Msimbo wa QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Katu</translation> <translation id="7971521879845308059">Zuia Ibukizi</translation> <translation id="7982789257301363584">Mtandao</translation> +<translation id="7993619969781047893">Huenda vipengele kwenye baadhi ya tovuti vikakosa kufanya kazi</translation> <translation id="800361585186029508">Hufungua URL zilizowekwa katika Google Chrome.</translation> <translation id="8007420562015504427">Utafutaji Fiche</translation> <translation id="8019783059653722575">Hii hukuwezesha kuhifadhi na kupakia picha.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index cd409ad..5b6d8f30 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ta"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">புத்தகக்குறி புதுப்பிக்கப்பட்டது</translation> +<translation id="1044891598689252897">தளங்கள் இயல்பாகவே செயல்படும்</translation> <translation id="1047726139967079566">இந்தப் பக்கத்தை புக்மார்க் செய்க...</translation> <translation id="1049743911850919806">மறைநிலை</translation> <translation id="1063454504051558093">வேறொரு கடவுச்சொல்லைப் பயன்படுத்தவும்...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> உருப்படிகள்</translation> <translation id="1491277525950327607">அமைப்பை நிலைமாற்ற, இருமுறை தட்டவும்</translation> <translation id="1509486075633541495">இணையதளத்தில் உள்நுழையவும்</translation> +<translation id="1509960214886564027">பெரும்பாலான தளங்களிலுள்ள அம்சங்கள் செயல்படாமல் போகக்கூடும்</translation> <translation id="152234381334907219">எப்போதும் சேமிக்காதவை</translation> <translation id="1540800554400757039">முகவரி 1</translation> <translation id="1545749641540134597">QR குறியீட்டை ஸ்கேன் செய்க</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">எப்போதும் இல்லை</translation> <translation id="7971521879845308059">பாப்-அப்களைத் தடு</translation> <translation id="7982789257301363584">நெட்வொர்க்</translation> +<translation id="7993619969781047893">சில தளங்களிலுள்ள அம்சங்கள் செயல்படாமல் போகக்கூடும்</translation> <translation id="800361585186029508">உள்ளிடப்பட்ட URLகளை Google Chromeமில் திறக்கும்.</translation> <translation id="8007420562015504427">மறைநிலைத் தேடல்</translation> <translation id="8019783059653722575">இதன் மூலம் படங்களைச் சேமித்துப் பதிவேற்றலாம்.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 889cc9a..f5c20f74 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="te"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">అంశం నవీకరించబడింది</translation> +<translation id="1044891598689252897">సైట్లు సాధారణ రీతిలో పని చేస్తాయి</translation> <translation id="1047726139967079566">ఈ పేజీని బుక్మార్క్ చేయండి...</translation> <translation id="1049743911850919806">అజ్ఞాత మోడ్</translation> <translation id="1063454504051558093">వేరే పాస్వర్డ్ ఉపయోగించండి...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> అంశాలు</translation> <translation id="1491277525950327607">సెట్టింగ్ను టోగుల్ చేయడానికి రెండుసార్లు నొక్కండి</translation> <translation id="1509486075633541495">వెబ్సైట్కు సైన్ ఇన్ చేయండి</translation> +<translation id="1509960214886564027">చాలా సైట్లలోని ఫీచర్లు పని చేయకుండాపోవచ్చు</translation> <translation id="152234381334907219">ఎప్పటికి సేవ్ చెయ్యబడవు</translation> <translation id="1540800554400757039">చిరునామా 1</translation> <translation id="1545749641540134597">QR కోడ్ను స్కాన్ చేయండి</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">ఎప్పుడూ లేదు</translation> <translation id="7971521879845308059">పాప్-అప్లను బ్లాక్ చేయి</translation> <translation id="7982789257301363584">నెట్వర్క్</translation> +<translation id="7993619969781047893">కొన్ని సైట్లలోని ఫీచర్లు పని చేయకపోవచ్చు</translation> <translation id="800361585186029508">ఇన్పుట్ చేసిన URLలను Google Chromeలో తెరుస్తుంది.</translation> <translation id="8007420562015504427">అజ్ఞాత శోధన</translation> <translation id="8019783059653722575">దీని వలన మీరు ఫోటోలను సేవ్ చేసి, అప్లోడ్ చేయగలుగుతారు.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index b66e093..fe40ff2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="th"> <translation id="1005230401424685968">ปปปป</translation> <translation id="1016495303386450659">อัปเดตรายการแล้ว</translation> +<translation id="1044891598689252897">เว็บไซต์จะทำงานตามปกติ</translation> <translation id="1047726139967079566">บุ๊กมาร์กหน้านี้...</translation> <translation id="1049743911850919806">โหมดไม่ระบุตัวตน</translation> <translation id="1063454504051558093">ใช้รหัสผ่านอื่น...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> รายการ</translation> <translation id="1491277525950327607">แตะ 2 ครั้งเพื่อสลับการตั้งค่า</translation> <translation id="1509486075633541495">ลงชื่อเข้าใช้เว็บไซต์</translation> +<translation id="1509960214886564027">ฟีเจอร์ในหลายเว็บไซต์อาจใช้งานไม่ได้</translation> <translation id="152234381334907219">ไม่เคยบันทึก</translation> <translation id="1540800554400757039">ที่อยู่ 1</translation> <translation id="1545749641540134597">สแกนโค้ด QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">ไม่ต้องเลย</translation> <translation id="7971521879845308059">บล็อกป๊อปอัป</translation> <translation id="7982789257301363584">เครือข่าย</translation> +<translation id="7993619969781047893">ฟีเจอร์ในบางเว็บไซต์อาจใช้งานไม่ได้</translation> <translation id="800361585186029508">เปิด URL ที่ป้อนใน Google Chrome</translation> <translation id="8007420562015504427">ค้นหาในโหมดไม่ระบุตัวตน</translation> <translation id="8019783059653722575">ช่วยให้คุณบันทึกและอัปโหลดรูปภาพได้</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 15ae313..e869a7d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="tr"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Öğe güncellendi</translation> +<translation id="1044891598689252897">Siteler normal şekilde çalışır</translation> <translation id="1047726139967079566">Bu Sayfaya Yer İşareti Koy...</translation> <translation id="1049743911850919806">Gizli mod</translation> <translation id="1063454504051558093">Diğer Şifreyi Kullan...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> öğe</translation> <translation id="1491277525950327607">Ayarı açıp kapatmak için iki kez dokunun</translation> <translation id="1509486075633541495">Web sitesinde oturum açın</translation> +<translation id="1509960214886564027">Birçok sitedeki özellikler bozulabilir</translation> <translation id="152234381334907219">Hiç Kaydedilmeyenler</translation> <translation id="1540800554400757039">Adres 1</translation> <translation id="1545749641540134597">QR Kodunu Tara</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Hiçbir Zaman</translation> <translation id="7971521879845308059">Pop-up'ları Engelle</translation> <translation id="7982789257301363584">Ağ</translation> +<translation id="7993619969781047893">Bazı sitelerdeki özellikler bozulabilir</translation> <translation id="800361585186029508">Girilen URL'leri Google Chrome'da açar.</translation> <translation id="8007420562015504427">Gizli Arama</translation> <translation id="8019783059653722575">Böylece, fotoğrafları kaydedebilir ve yükleyebilirsiniz.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 557e7d8..90fe385 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="uk"> <translation id="1005230401424685968">РРРР</translation> <translation id="1016495303386450659">Закладку оновлено</translation> +<translation id="1044891598689252897">Сайти працюватимуть у звичному режимі</translation> <translation id="1047726139967079566">Додати цю сторінку до закладок...</translation> <translation id="1049743911850919806">Анонімний перегляд</translation> <translation id="1063454504051558093">Ввести інший пароль…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">Закладок: <ph name="COUNT" /></translation> <translation id="1491277525950327607">Двічі торкніться, щоб змінити налаштування</translation> <translation id="1509486075633541495">Увійдіть в обліковий запис на веб-сайті</translation> +<translation id="1509960214886564027">Функції на багатьох сайтах можуть не працювати</translation> <translation id="152234381334907219">Ніколи не зберігалося</translation> <translation id="1540800554400757039">Адреса 1</translation> <translation id="1545749641540134597">Сканувати QR-код</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Ніколи</translation> <translation id="7971521879845308059">Блок.сплив.вікна</translation> <translation id="7982789257301363584">Мережа</translation> +<translation id="7993619969781047893">Функції на деяких сайтах можуть не працювати</translation> <translation id="800361585186029508">Відкриває введені URL-адреси в Google Chrome.</translation> <translation id="8007420562015504427">Пошук у режимі інкогніто</translation> <translation id="8019783059653722575">Ви зможете зберігати й завантажувати фотографії.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 992836f..262f6eb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="ur"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">آئٹم اپ ڈيٹ ہوگیا</translation> +<translation id="1044891598689252897">سائٹس حسب معمول کام کریں گی</translation> <translation id="1047726139967079566">یہ صفحہ بُک مارک کریں…</translation> <translation id="1049743911850919806">پوشیدگی</translation> <translation id="1063454504051558093">دوسرا پاس ورڈ استعمال کریں…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> آئٹمز</translation> <translation id="1491277525950327607">ترتیبات کو ٹوگل کرنے کیلئے دو بار تھپتھپائیں</translation> <translation id="1509486075633541495">ویب سائٹ میں سائن ان کریں</translation> +<translation id="1509960214886564027">بہت سی سائٹس پر خصوصیات میں خلل ہو سکتا ہے</translation> <translation id="152234381334907219">کبھی محفوظ نہیں ہوئے</translation> <translation id="1540800554400757039">پتہ 1</translation> <translation id="1545749641540134597">QR کوڈ اسکین کریں</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">کبھی نہیں</translation> <translation id="7971521879845308059">پاپ اپس کو مسدود کریں</translation> <translation id="7982789257301363584">نیٹ ورک</translation> +<translation id="7993619969781047893">کچھ سائٹس پر خصوصیات میں خلل ہو سکتا ہے۔</translation> <translation id="800361585186029508">درج کردہ URLs کو Google Chrome میں کھولتا ہے۔</translation> <translation id="8007420562015504427">پوشیدگی وضع میں تلاش کریں</translation> <translation id="8019783059653722575">یہ آپ کو تصاویر محفوظ کرنے اور اپ لوڈ کرنے دیتا ہے۔</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index bb94d89e..038faef7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="uz"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Yangilandi</translation> +<translation id="1044891598689252897">Saytlar xatosiz ishlaydi</translation> <translation id="1047726139967079566">Bu sahifani xatcho‘plarga qo‘shish</translation> <translation id="1049743911850919806">Inkognito</translation> <translation id="1063454504051558093">Boshqa parol ishlatish...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> ta xatcho‘p</translation> <translation id="1491277525950327607">Almashtirish uchun ikki marta bosing</translation> <translation id="1509486075633541495">Saytga kirish</translation> +<translation id="1509960214886564027">Aksariyat saytlardagi funksiyalar ishalamay qolishi mumkin</translation> <translation id="152234381334907219">Parollar saqlanmaydigan saytlar</translation> <translation id="1540800554400757039">Manzil, 1-qator</translation> <translation id="1545749641540134597">QR kodni skanerlash</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Hech qachon</translation> <translation id="7971521879845308059">Qalqib chiquvchi oynalarni bloklash</translation> <translation id="7982789257301363584">Tarmoq</translation> +<translation id="7993619969781047893">Ayrim saytlardagi funksiyalar ishalamay qolishi mumkin</translation> <translation id="800361585186029508">Kiritiladigan URL manzillarni Google Chrome orqali ochadi.</translation> <translation id="8007420562015504427">Inkognito qidiruvi</translation> <translation id="8019783059653722575">Rasmlarni saqlash va internetga yuklash imkonini beradi.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index ba9a9b47..0fac3be 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="vi"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Đã cập nhật mục</translation> +<translation id="1044891598689252897">Các trang web vẫn hoạt động bình thường</translation> <translation id="1047726139967079566">Đánh dấu Trang Này...</translation> <translation id="1049743911850919806">Ẩn danh</translation> <translation id="1063454504051558093">Dùng mật khẩu khác...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> mục</translation> <translation id="1491277525950327607">Nhấn đúp để chuyển đổi cài đặt</translation> <translation id="1509486075633541495">Đăng nhập vào trang web</translation> +<translation id="1509960214886564027">Các tính năng trên nhiều trang web có thể hoạt động không đúng cách</translation> <translation id="152234381334907219">Không bao giờ lưu</translation> <translation id="1540800554400757039">Địa chỉ 1</translation> <translation id="1545749641540134597">Quét mã QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Không bao giờ</translation> <translation id="7971521879845308059">Chặn cửa sổ bật lên</translation> <translation id="7982789257301363584">Mạng</translation> +<translation id="7993619969781047893">Các tính năng trên một số trang web có thể hoạt động không đúng cách</translation> <translation id="800361585186029508">Mở URL đã nhập trong Google Chrome.</translation> <translation id="8007420562015504427">Tìm kiếm ẩn danh</translation> <translation id="8019783059653722575">Điều này cho phép bạn lưu và tải ảnh lên.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index fb1df0c..173031b4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="zh-CN"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">书签已更新</translation> +<translation id="1044891598689252897">网站将能够正常运行</translation> <translation id="1047726139967079566">为此页添加书签...</translation> <translation id="1049743911850919806">无痕</translation> <translation id="1063454504051558093">使用其他密码…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860">有<ph name="COUNT" />个书签</translation> <translation id="1491277525950327607">点按两次即可切换设置</translation> <translation id="1509486075633541495">登录网站</translation> +<translation id="1509960214886564027">很多网站上的功能可能会无法正常运作</translation> <translation id="152234381334907219">一律不保存</translation> <translation id="1540800554400757039">地址第1行</translation> <translation id="1545749641540134597">扫描 QR 码</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">一律不</translation> <translation id="7971521879845308059">拦截弹出式窗口</translation> <translation id="7982789257301363584">网络</translation> +<translation id="7993619969781047893">某些网站上的功能可能会无法正常运作</translation> <translation id="800361585186029508">在 Google Chrome 中打开输入的网址。</translation> <translation id="8007420562015504427">无痕搜索</translation> <translation id="8019783059653722575">这样,您就可以保存并上传照片。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 7e69a9a..67ac93b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="zh-HK"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">項目已更新</translation> +<translation id="1044891598689252897">網站將正常運作</translation> <translation id="1047726139967079566">將這個網頁加入書籤…</translation> <translation id="1049743911850919806">無痕模式</translation> <translation id="1063454504051558093">使用其他密碼…</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> 個項目</translation> <translation id="1491277525950327607">連扲兩下可以切換設定</translation> <translation id="1509486075633541495">登入網站</translation> +<translation id="1509960214886564027">很多網站的功能可能會無法正常運作</translation> <translation id="152234381334907219">永不儲存</translation> <translation id="1540800554400757039">地址 1</translation> <translation id="1545749641540134597">掃描二維條碼</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">從來沒有</translation> <translation id="7971521879845308059">封鎖彈出式視窗</translation> <translation id="7982789257301363584">網絡</translation> +<translation id="7993619969781047893">部分網站的功能可能會無法正常運作</translation> <translation id="800361585186029508">在 Google Chrome 中開啟已輸入的網址。</translation> <translation id="8007420562015504427">無痕搜尋</translation> <translation id="8019783059653722575">這樣您便可儲存並上載相片。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index c817ac39..2bd27cf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="zh-TW"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">項目已更新</translation> +<translation id="1044891598689252897">網站將正常運作</translation> <translation id="1047726139967079566">把此頁加入書籤...</translation> <translation id="1049743911850919806">無痕模式</translation> <translation id="1063454504051558093">使用其他密碼...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> 個項目</translation> <translation id="1491277525950327607">輕觸兩下即可切換設定</translation> <translation id="1509486075633541495">登入網站</translation> +<translation id="1509960214886564027">許多網站的功能可能無法正常運作</translation> <translation id="152234381334907219">永不儲存</translation> <translation id="1540800554400757039">地址 1</translation> <translation id="1545749641540134597">掃描 QR 圖碼</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">一律不要</translation> <translation id="7971521879845308059">封鎖彈出式視窗</translation> <translation id="7982789257301363584">網路</translation> +<translation id="7993619969781047893">某些網站的功能可能無法正常運作</translation> <translation id="800361585186029508">在 Google Chrome 中開啟輸入的網址。</translation> <translation id="8007420562015504427">無痕搜尋</translation> <translation id="8019783059653722575">可讓你儲存並上傳相片。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 1cb4769..43be9c82 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -3,6 +3,7 @@ <translationbundle lang="zu"> <translation id="1005230401424685968">YYYY</translation> <translation id="1016495303386450659">Into ibuyekeziwe</translation> +<translation id="1044891598689252897">Amasayithi azosebenza ngokuvamile</translation> <translation id="1047726139967079566">Beka uphawu lokubekisa leli khasi...</translation> <translation id="1049743911850919806">I-Incognito</translation> <translation id="1063454504051558093">Sebenzisa enye iphasiwedi...</translation> @@ -47,6 +48,7 @@ <translation id="145015347812617860"><ph name="COUNT" /> izinto</translation> <translation id="1491277525950327607">Thepha kabili ukuze ushintshe isilungiselelo</translation> <translation id="1509486075633541495">Ngena ngemvume kuwebhusayithi</translation> +<translation id="1509960214886564027">Izici ezikumasayithi amaningi zingase zinqamuke</translation> <translation id="152234381334907219">Ayikaze yalondolozwa</translation> <translation id="1540800554400757039">Ikheli 1</translation> <translation id="1545749641540134597">Skena ikhodi ye-QR</translation> @@ -528,6 +530,7 @@ <translation id="7961015016161918242">Ngeke</translation> <translation id="7971521879845308059">Vimba izigelekeqe</translation> <translation id="7982789257301363584">Inethiwekhi</translation> +<translation id="7993619969781047893">Izici ezikwamanye amasayithi zingase zinqamuke</translation> <translation id="800361585186029508">Ivula ama-URL afakiwe ku-Google Chrome.</translation> <translation id="8007420562015504427">Usesho i-Incognito</translation> <translation id="8019783059653722575">Lokhu kukuvumela ukuthi ulondoloze uphinde ulayishe izithombe.</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 7895ae6e..ff58eb260 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -596,6 +596,11 @@ {"managed-bookmarks-ios", flag_descriptions::kManagedBookmarksIOSName, flag_descriptions::kManagedBookmarksIOSDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kManagedBookmarksIOS)}, + {"enable-autofill-cache-server-card-info", + flag_descriptions::kEnableAutofillCacheServerCardInfoName, + flag_descriptions::kEnableAutofillCacheServerCardInfoDescription, + flags_ui::kOsIos, + FEATURE_VALUE_TYPE(autofill::features::kAutofillCacheServerCardInfo)}, }; // Add all switches from experimental flags to |command_line|.
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 86307e3..fcec463 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -191,6 +191,12 @@ const char kEmbedderBlockRestoreUrlDescription[] = "Embedders can prevent URLs from restoring."; +const char kEnableAutofillCacheServerCardInfoName[] = + "Enable Autofill to cache unmasked server card info"; +const char kEnableAutofillCacheServerCardInfoDescription[] = + "If enabled, when a server card is unmasked, its info will be cached until " + "page navigation to simplify consecutive fills on the same page."; + const char kEnableAutofillCreditCardUploadEditableCardholderNameName[] = "Make cardholder name editable in dialog during credit card upload"; const char kEnableAutofillCreditCardUploadEditableCardholderNameDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 5e68d1a..833178d 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -159,6 +159,11 @@ extern const char kEmbedderBlockRestoreUrlName[]; extern const char kEmbedderBlockRestoreUrlDescription[]; +// Title and description for the flag to enable caching of unmasked server +// cards until page navigation to simplify consecutive fills on the same page. +extern const char kEnableAutofillCacheServerCardInfoName[]; +extern const char kEnableAutofillCacheServerCardInfoDescription[]; + // Title and description for the flag to control if credit card upload can // display a cardholder name fix flow. extern const char kEnableAutofillCreditCardUploadEditableCardholderNameName[];
diff --git a/ios/chrome/browser/policy/BUILD.gn b/ios/chrome/browser/policy/BUILD.gn index b2537d6b..f248cb80 100644 --- a/ios/chrome/browser/policy/BUILD.gn +++ b/ios/chrome/browser/policy/BUILD.gn
@@ -99,13 +99,12 @@ testonly = true sources = [ - "policy_app_interface.h", - "policy_app_interface_stub.mm", "policy_egtest.mm", "policy_platform_provider_egtest.mm", ] deps = [ + ":eg_test_support+eg2", "//base", "//components/password_manager/core/common", "//components/policy:generated", @@ -141,3 +140,20 @@ ] libs = [ "Foundation.framework" ] } + +source_set("eg_test_support+eg2") { + defines = [ "CHROME_EARL_GREY_2" ] + configs += [ + "//build/config/compiler:enable_arc", + "//build/config/ios:xctest_config", + ] + testonly = true + sources = [ + "policy_app_interface.h", + "policy_app_interface_stub.mm", + ] + deps = [ + "//ios/testing/earl_grey:eg_test_support+eg2", + "//ios/third_party/earl_grey2:test_lib", + ] +}
diff --git a/ios/chrome/browser/tabs/closing_web_state_observer.mm b/ios/chrome/browser/tabs/closing_web_state_observer.mm index fce9ac5..ec1d947c 100644 --- a/ios/chrome/browser/tabs/closing_web_state_observer.mm +++ b/ios/chrome/browser/tabs/closing_web_state_observer.mm
@@ -67,8 +67,13 @@ web::NavigationManager* navigationManager = webState->GetNavigationManager(); if (navigationManager->IsRestoreSessionInProgress()) { - auto live_tab = std::make_unique<sessions::RestoreIOSLiveTab>( - webState->BuildSessionStorage()); + // TODO(crbug.com/1070852): RestoreIOSLiveTab is not compiled with ARC and + // therefore is not properly retaining the CRWSessionStorage* which it is + // passed. Temporarily work around this bug by keeping a strong pointer to + // the CRWSessionStorage* here, until RestoreIOSLiveTab can be fixed + // properly. + CRWSessionStorage* storage = webState->BuildSessionStorage(); + auto live_tab = std::make_unique<sessions::RestoreIOSLiveTab>(storage); _restoreService->CreateHistoricalTab(live_tab.get(), atIndex); return; }
diff --git a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm index f5cfbab..27e069e 100644 --- a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm
@@ -69,6 +69,11 @@ - (void)interruptWithAction:(SigninCoordinatorInterruptAction)action completion:(ProceduralBlock)completion { if (self.userSigninCoordinator) { + DCHECK(!self.identityInteractionManager); + // When interrupting |self.userSigninCoordinator|, + // |self.userSigninCoordinator.signinCompletion| is called. This callback + // is in charge to call |[self runCompletionCallbackWithSigninResult: + // identity:showAdvancedSettingsSignin:]. [self.userSigninCoordinator interruptWithAction:action completion:completion]; return; @@ -90,6 +95,9 @@ [self.identityInteractionManager cancelAndDismissAnimated:NO]; break; } + [self runCompletionCallbackWithSigninResult:SigninCoordinatorResultInterrupted + identity:nil + showAdvancedSettingsSignin:NO]; if (completion) { completion(); }
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn index 4966ec1..1ea07900 100644 --- a/ios/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -246,13 +246,17 @@ "bookmarks_folders_egtest.mm", "bookmarks_promo_egtest.mm", "bookmarks_search_egtest.mm", + "managed_bookmarks_egtest.mm", ] deps = [ ":bookmarks_ui", ":eg_test_support+eg2", "//base/test:test_support", + "//components/policy:generated", "//components/strings", "//ios/chrome/app/strings", + "//ios/chrome/browser:utils", + "//ios/chrome/browser/policy:eg_test_support+eg2", "//ios/chrome/browser/ui/authentication:eg_test_support+eg2", "//ios/chrome/browser/ui/popup_menu:constants", "//ios/chrome/browser/ui/table_view:feature_flags",
diff --git a/ios/chrome/browser/ui/bookmarks/managed_bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/managed_bookmarks_egtest.mm new file mode 100644 index 0000000..a3fc201 --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/managed_bookmarks_egtest.mm
@@ -0,0 +1,325 @@ +// 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 "base/ios/ios_util.h" +#include "base/strings/sys_string_conversions.h" +#import "components/policy/core/common/policy_loader_ios_constants.h" +#include "components/policy/policy_constants.h" +#include "ios/chrome/browser/chrome_switches.h" +#import "ios/chrome/browser/policy/policy_app_interface.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" +#import "ios/chrome/test/earl_grey/chrome_matchers.h" +#import "ios/chrome/test/earl_grey/chrome_test_case.h" +#include "ios/testing/earl_grey/app_launch_configuration.h" +#import "ios/testing/earl_grey/earl_grey_test.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using chrome_test_util::BookmarksDeleteSwipeButton; +using chrome_test_util::ButtonWithAccessibilityLabelId; +using chrome_test_util::ContextBarLeadingButtonWithLabel; +using chrome_test_util::ContextBarTrailingButtonWithLabel; +using chrome_test_util::TappableBookmarkNodeWithLabel; + +namespace { + +// Returns an AppLaunchConfiguration containing the given policy data. +// |policyData| must be in XML format. +AppLaunchConfiguration GenerateAppLaunchConfiguration(std::string policy_data) { + AppLaunchConfiguration config; + config.additional_args.push_back(std::string("--") + + switches::kEnableEnterprisePolicy); + config.additional_args.push_back(std::string("--") + + switches::kInstallManagedBookmarksHandler); + config.additional_args.push_back( + std::string("--enable-features=ManagedBookmarksIOS")); + + // Remove whitespace from the policy data, because the XML parser does not + // tolerate newlines. + base::RemoveChars(policy_data, base::kWhitespaceASCII, &policy_data); + + // Commandline flags that start with a single "-" are automatically added to + // the NSArgumentDomain in NSUserDefaults. Set fake policy data that can be + // read by the production platform policy provider. + config.additional_args.push_back( + "-" + base::SysNSStringToUTF8(kPolicyLoaderIOSConfigurationKey)); + config.additional_args.push_back(policy_data); + + config.relaunch_policy = NoForceRelaunchAndResetState; + return config; +} + +void VerifyBookmarkContextBarNewFolderButtonDisabled() { + [[EarlGrey selectElementWithMatcher:ContextBarLeadingButtonWithLabel( + [BookmarkEarlGreyUI + contextBarNewFolderString])] + assertWithMatcher:grey_accessibilityTrait( + UIAccessibilityTraitNotEnabled)]; +} + +void VerifyBookmarkContextBarEditButtonDisabled() { + [[EarlGrey + selectElementWithMatcher:ContextBarTrailingButtonWithLabel( + [BookmarkEarlGreyUI contextBarSelectString])] + assertWithMatcher:grey_accessibilityTrait( + UIAccessibilityTraitNotEnabled)]; +} + +void LongPressBookmarkNodeWithLabel(NSString* bookmark_node_label) { + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + bookmark_node_label)] + performAction:grey_longPress()]; +} + +void VerifyBookmarkContextMenuNil() { + [[EarlGrey + selectElementWithMatcher:grey_accessibilityID(@"bookmark_context_menu")] + assertWithMatcher:grey_nil()]; +} + +void VerifyBookmarkNodeWithLabelNotNil(NSString* bookmark_node_label) { + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + bookmark_node_label)] + assertWithMatcher:grey_notNil()]; +} + +void SwipeBookmarkNodeWithLabel(NSString* bookmark_node_label) { + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + bookmark_node_label)] + performAction:grey_swipeFastInDirection(kGREYDirectionLeft)]; +} + +void VerifyDeleteSwipeButtonNil() { + [[EarlGrey selectElementWithMatcher:BookmarksDeleteSwipeButton()] + assertWithMatcher:grey_nil()]; +} + +} // namespace + +// ManagedBookmarks test case with empty managed bookmarks. This can be +// sub-classed to provide non-empty managed bookmarks policy data. +@interface ManagedBookmarksTestCase : ChromeTestCase +@end + +@implementation ManagedBookmarksTestCase + +- (AppLaunchConfiguration)appConfigurationForTestCase { + const std::string loadPolicyKey = + base::SysNSStringToUTF8(kPolicyLoaderIOSLoadPolicyKey); + const std::string managedBookmarksData = [self managedBookmarksPolicyData]; + std::string policyData = "<dict>" + "<key>" + + loadPolicyKey + + "</key>" + "<true/>" + "<key>" + + std::string(policy::key::kManagedBookmarks) + + "</key>" + managedBookmarksData + "</dict>"; + return GenerateAppLaunchConfiguration(policyData); +} + +// Overridable by subclasses for custom managed bookmarks policy data. +- (std::string)managedBookmarksPolicyData { + return "<array></array>"; +} + +- (void)setUp { + [super setUp]; + [ChromeEarlGrey waitForBookmarksToFinishLoading]; +} + +// Tear down called once per test. +- (void)tearDown { + [super tearDown]; + [BookmarkEarlGrey clearBookmarksPositionCache]; +} + +@end + +// Tests ManagedBookmarks when the policy data is empty. +@interface ManagedBookmarksEmptyPolicyDataTestCase : ManagedBookmarksTestCase +@end + +@implementation ManagedBookmarksEmptyPolicyDataTestCase + +- (std::string)managedBookmarksPolicyData { + return "<array></array>"; +} + +// Tests that the managed bookmarks folder does not exist when the policy data +// is empty. +- (void)testEmptyManagedBookmarks { + [BookmarkEarlGreyUI openBookmarks]; + + // Mobile bookmarks exists. + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + @"Mobile Bookmarks")] + assertWithMatcher:grey_notNil()]; + + // Managed bookmarks folder does not exist. + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + @"Managed Bookmarks")] + assertWithMatcher:grey_nil()]; +} + +@end + +// Tests ManagedBookmarks when the policy is set with no top-level folder name. +@interface ManagedBookmarksDefaultFolderTestCase : ManagedBookmarksTestCase +@end + +@implementation ManagedBookmarksDefaultFolderTestCase + +- (std::string)managedBookmarksPolicyData { + // Note that this test removes all whitespace when setting the policy. + return R"( + <array> + <dict> + <key>url</key><string>firstURL.com</string> + <key>name</key><string>First_Managed_URL</string> + </dict> + </array> + )"; +} + +// Tests that the managed bookmarks folder exists with default name. +- (void)testDefaultFolderName { + [BookmarkEarlGreyUI openBookmarks]; + + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + @"Managed Bookmarks")] + performAction:grey_tap()]; + + VerifyBookmarkNodeWithLabelNotNil(@"First_Managed_URL"); +} + +@end + +// Tests ManagedBookmarks when the policy is set with an item in the top-level +// folder as well as an item in a sub-folder. +@interface ManagedBookmarksPolicyDataWithSubFolderTestCase + : ManagedBookmarksTestCase +@end + +@implementation ManagedBookmarksPolicyDataWithSubFolderTestCase + +#pragma mark - Overrides + +- (std::string)managedBookmarksPolicyData { + // Note that this test removes all whitespace when setting the policy. + return R"( + <array> + <dict> + <key>toplevel_name</key><string>Custom_Folder_Name</string> + </dict> + <dict> + <key>url</key><string>firstURL.com</string> + <key>name</key><string>First_Managed_URL</string> + </dict> + <dict> + <key>name</key><string>Managed_Sub_Folder</string> + <key>children</key> + <array> + <dict> + <key>url</key><string>subFolderFirstURL.org</string> + <key>name</key><string>Sub_Folder_First_URL</string> + </dict> + </array> + </dict> + </array> + )"; +} + +#pragma mark - Test Helpers + +- (void)openCustomManagedBookmarksFolder { + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + @"Custom_Folder_Name")] + performAction:grey_tap()]; +} + +- (void)openCustomManagedSubFolder { + [[EarlGrey selectElementWithMatcher:TappableBookmarkNodeWithLabel( + @"Managed_Sub_Folder")] + performAction:grey_tap()]; +} + +#pragma mark - Tests + +// Tests that the managed bookmarks folder exists with custom name and +// contents. +- (void)testManagedBookmarksFolderStructure { + [BookmarkEarlGreyUI openBookmarks]; + [self openCustomManagedBookmarksFolder]; + VerifyBookmarkNodeWithLabelNotNil(@"First_Managed_URL"); + + [self openCustomManagedSubFolder]; + VerifyBookmarkNodeWithLabelNotNil(@"Sub_Folder_First_URL"); +} + +// Tests that 'New Folder' and 'Edit' buttons are disabled inside top-level +// managed bookmarks folder and sub-folder. +- (void)testContextBarButtonsDisabled { + [BookmarkEarlGreyUI openBookmarks]; + [self openCustomManagedBookmarksFolder]; + + VerifyBookmarkContextBarNewFolderButtonDisabled(); + VerifyBookmarkContextBarEditButtonDisabled(); + + [self openCustomManagedSubFolder]; + + VerifyBookmarkContextBarNewFolderButtonDisabled(); + VerifyBookmarkContextBarEditButtonDisabled(); +} + +// Tests that long press is disabled while inside the top-level managed +// bookmarks folder and sub-folder. +- (void)testLongPressDisabled { + [BookmarkEarlGreyUI openBookmarks]; + [self openCustomManagedBookmarksFolder]; + + // Test long press on a bookmark URL. + LongPressBookmarkNodeWithLabel(@"First_Managed_URL"); + VerifyBookmarkContextMenuNil(); + + // Test long press on a folder. + LongPressBookmarkNodeWithLabel(@"Managed_Sub_Folder"); + VerifyBookmarkContextMenuNil(); + + [self openCustomManagedSubFolder]; + + // Test long press inside sub-folder. + LongPressBookmarkNodeWithLabel(@"Sub_Folder_First_URL"); + VerifyBookmarkContextMenuNil(); +} + +// Tests that swipe is disabled in managed bookmarks top-level folder and +// sub-folder. +- (void)testSwipeDisabled { + // TODO(crbug.com/1070676): Earl grey swipe fails on iOS 12. + if (!base::ios::IsRunningOnIOS13OrLater()) { + EARL_GREY_TEST_DISABLED(@"Fails on iOS 12."); + } + + [BookmarkEarlGreyUI openBookmarks]; + [self openCustomManagedBookmarksFolder]; + + SwipeBookmarkNodeWithLabel(@"First_Managed_URL"); + VerifyDeleteSwipeButtonNil(); + + SwipeBookmarkNodeWithLabel(@"Managed_Sub_Folder"); + VerifyDeleteSwipeButtonNil(); + + [self openCustomManagedSubFolder]; + + SwipeBookmarkNodeWithLabel(@"Sub_Folder_First_URL"); + VerifyDeleteSwipeButtonNil(); +} + +@end
diff --git a/ios/chrome/browser/ui/settings/privacy/BUILD.gn b/ios/chrome/browser/ui/settings/privacy/BUILD.gn index a8da73a4..6e58d8f 100644 --- a/ios/chrome/browser/ui/settings/privacy/BUILD.gn +++ b/ios/chrome/browser/ui/settings/privacy/BUILD.gn
@@ -2,17 +2,15 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("privacy") { +source_set("privacy_ui") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ - "cookies_coordinator.h", - "cookies_coordinator.mm", + "cookies_commands.h", + "cookies_consumer.h", "cookies_view_controller.h", "cookies_view_controller.mm", "handoff_table_view_controller.h", "handoff_table_view_controller.mm", - "privacy_coordinator.h", - "privacy_coordinator.mm", "privacy_navigation_commands.h", "privacy_table_view_controller.h", "privacy_table_view_controller.mm", @@ -31,12 +29,12 @@ "//ios/chrome/browser/ui:feature_flags", "//ios/chrome/browser/ui/colors", "//ios/chrome/browser/ui/commands", - "//ios/chrome/browser/ui/coordinators:chrome_coordinators", + "//ios/chrome/browser/ui/list_model", "//ios/chrome/browser/ui/page_info:features", "//ios/chrome/browser/ui/settings:constants", "//ios/chrome/browser/ui/settings:settings_root", "//ios/chrome/browser/ui/settings/cells", - "//ios/chrome/browser/ui/settings/clear_browsing_data:clear_browsing_data", + "//ios/chrome/browser/ui/settings/clear_browsing_data", "//ios/chrome/browser/ui/settings/sync/utils", "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/browser/ui/table_view", @@ -46,6 +44,27 @@ ] } +source_set("privacy") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "cookies_coordinator.h", + "cookies_coordinator.mm", + "cookies_mediator.h", + "cookies_mediator.mm", + "privacy_coordinator.h", + "privacy_coordinator.mm", + ] + deps = [ + ":privacy_ui", + "//ios/chrome/browser/main:public", + "//ios/chrome/browser/ui/commands", + "//ios/chrome/browser/ui/coordinators:chrome_coordinators", + "//ios/chrome/browser/ui/settings:settings_root", + "//ios/chrome/browser/ui/settings/clear_browsing_data", + ] + libs = [ "UIKit.framework" ] +} + source_set("unit_tests") { configs += [ "//build/config/compiler:enable_arc" ] testonly = true @@ -64,7 +83,7 @@ "//ios/chrome/browser/browsing_data:feature_flags", "//ios/chrome/browser/main:test_support", "//ios/chrome/browser/prefs:browser_prefs", - "//ios/chrome/browser/ui/settings/privacy", + "//ios/chrome/browser/ui/settings/privacy:privacy_ui", "//ios/chrome/browser/ui/table_view:test_support", "//ios/chrome/test:test_support", "//ios/web/public/test",
diff --git a/ios/chrome/browser/ui/settings/privacy/cookies_commands.h b/ios/chrome/browser/ui/settings/privacy/cookies_commands.h new file mode 100644 index 0000000..86a6c395 --- /dev/null +++ b/ios/chrome/browser/ui/settings/privacy/cookies_commands.h
@@ -0,0 +1,18 @@ +// 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 IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_COMMANDS_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_COMMANDS_H_ + +#import "ios/chrome/browser/ui/settings/privacy/cookies_consumer.h" + +// Commands related to the Cookies state. +@protocol PrivacyCookiesCommands + +// Updates Cookies settings with the given item type. +- (void)selectedCookiesSettingType:(CookiesSettingType)settingType; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_COMMANDS_H_
diff --git a/ios/chrome/browser/ui/settings/privacy/cookies_consumer.h b/ios/chrome/browser/ui/settings/privacy/cookies_consumer.h new file mode 100644 index 0000000..a2f085b --- /dev/null +++ b/ios/chrome/browser/ui/settings/privacy/cookies_consumer.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 IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_CONSUMER_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_CONSUMER_H_ + +#import "ios/chrome/browser/ui/list_model/list_model.h" + +typedef NS_ENUM(NSInteger, CookiesSettingType) { + SettingTypeAllowCookies, + SettingTypeBlockThirdPartyCookiesIncognito, + SettingTypeBlockThirdPartyCookies, + SettingTypeBlockAllCookies, +}; + +// A consumer for Cookies settings changes. +@protocol PrivacyCookiesConsumer + +// Called when a cookie setting option was selected. +- (void)cookiesSettingsOptionSelected:(CookiesSettingType)settingType; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/settings/privacy/cookies_coordinator.mm b/ios/chrome/browser/ui/settings/privacy/cookies_coordinator.mm index 85dcd64a..18948b49 100644 --- a/ios/chrome/browser/ui/settings/privacy/cookies_coordinator.mm +++ b/ios/chrome/browser/ui/settings/privacy/cookies_coordinator.mm
@@ -5,6 +5,11 @@ #import "ios/chrome/browser/ui/settings/privacy/cookies_coordinator.h" #include "base/logging.h" +#include "ios/chrome/browser/main/browser.h" +#import "ios/chrome/browser/ui/commands/browser_commands.h" +#import "ios/chrome/browser/ui/commands/command_dispatcher.h" +#import "ios/chrome/browser/ui/settings/privacy/cookies_commands.h" +#import "ios/chrome/browser/ui/settings/privacy/cookies_mediator.h" #import "ios/chrome/browser/ui/settings/privacy/cookies_view_controller.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -12,9 +17,11 @@ #endif @interface PrivacyCookiesCoordinator () < + PrivacyCookiesCommands, PrivacyCookiesViewControllerPresentationDelegate> @property(nonatomic, strong) PrivacyCookiesViewController* viewController; +@property(nonatomic, strong) PrivacyCookiesMediator* mediator; @end @@ -36,13 +43,26 @@ - (void)start { self.viewController = [[PrivacyCookiesViewController alloc] initWithStyle:UITableViewStylePlain]; + + DCHECK(self.baseNavigationController); [self.baseNavigationController pushViewController:self.viewController animated:YES]; self.viewController.presentationDelegate = self; + self.viewController.handler = self; + + self.mediator = [[PrivacyCookiesMediator alloc] init]; + self.mediator.consumer = self.viewController; } - (void)stop { self.viewController = nil; + self.mediator = nil; +} + +#pragma mark - PrivacyCookiesCommands + +- (void)selectedCookiesSettingType:(CookiesSettingType)settingType { + // TODO(crbug.com/1064961): Implement this. } #pragma mark - PrivacyCookiesViewControllerPresentationDelegate
diff --git a/ios/chrome/browser/ui/settings/privacy/cookies_mediator.h b/ios/chrome/browser/ui/settings/privacy/cookies_mediator.h new file mode 100644 index 0000000..e91000b --- /dev/null +++ b/ios/chrome/browser/ui/settings/privacy/cookies_mediator.h
@@ -0,0 +1,21 @@ +// 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 IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_MEDIATOR_H_ + +#import <Foundation/Foundation.h> + +@protocol PrivacyCookiesConsumer; + +// The mediator is pushing the data for the root of the Cookies screen to the +// consumer. +@interface PrivacyCookiesMediator : NSObject + +// The consumer for this mediator. +@property(nonatomic, weak) id<PrivacyCookiesConsumer> consumer; + +@end + +#endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/settings/privacy/cookies_mediator.mm b/ios/chrome/browser/ui/settings/privacy/cookies_mediator.mm new file mode 100644 index 0000000..0e214ca9 --- /dev/null +++ b/ios/chrome/browser/ui/settings/privacy/cookies_mediator.mm
@@ -0,0 +1,30 @@ +// 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 "ios/chrome/browser/ui/settings/privacy/cookies_mediator.h" + +#import "ios/chrome/browser/ui/settings/privacy/cookies_consumer.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation PrivacyCookiesMediator + +- (void)setConsumer:(id<PrivacyCookiesConsumer>)consumer { + if (_consumer == consumer) + return; + + _consumer = consumer; + [self updateConsumer]; +} + +#pragma mark - Private + +- (void)updateConsumer { + // TODO(crbug.com/1064961): Implement this. + [self.consumer cookiesSettingsOptionSelected:SettingTypeAllowCookies]; +} + +@end
diff --git a/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.h b/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.h index c34656d3..cd67051 100644 --- a/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.h +++ b/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.h
@@ -9,8 +9,12 @@ #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" +#import "ios/chrome/browser/ui/settings/privacy/cookies_consumer.h" + @class PrivacyCookiesViewController; +@protocol PrivacyCookiesCommands; + // Delegate for presentation events related to // PrivacyCookiesViewController. @protocol PrivacyCookiesViewControllerPresentationDelegate @@ -22,12 +26,16 @@ @end // View Controller for displaying the Cookies screen. -@interface PrivacyCookiesViewController : SettingsRootTableViewController +@interface PrivacyCookiesViewController + : SettingsRootTableViewController <PrivacyCookiesConsumer> // Presentation delegate. @property(nonatomic, weak) id<PrivacyCookiesViewControllerPresentationDelegate> presentationDelegate; +// Handler used to update Cookies settings. +@property(nonatomic, weak) id<PrivacyCookiesCommands> handler; + @end #endif // IOS_CHROME_BROWSER_UI_SETTINGS_PRIVACY_COOKIES_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.mm index 2f703a57..75fa21e 100644 --- a/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.mm +++ b/ios/chrome/browser/ui/settings/privacy/cookies_view_controller.mm
@@ -4,7 +4,9 @@ #import "ios/chrome/browser/ui/settings/privacy/cookies_view_controller.h" -#import "ios/chrome/browser/ui/table_view/cells/table_view_multi_detail_text_item.h" +#import "ios/chrome/browser/ui/settings/cells/settings_multiline_detail_item.h" +#import "ios/chrome/browser/ui/settings/privacy/cookies_commands.h" +#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #include "ios/chrome/grit/ios_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -14,10 +16,6 @@ namespace { -typedef NS_ENUM(NSInteger, SectionIdentifier) { - SectionIdentifierContent = kSectionIdentifierEnumZero, -}; - typedef NS_ENUM(NSInteger, ItemType) { ItemTypeAllowCookies = kItemTypeEnumZero, ItemTypeBlockThirdPartyCookiesIncognito, @@ -26,18 +24,32 @@ ItemTypeCookiesDescription, }; +typedef NS_ENUM(NSInteger, SectionIdentifier) { + SectionIdentifierContent = kSectionIdentifierEnumZero, +}; + } // namespace +@interface PrivacyCookiesViewController () + +@property(nonatomic, strong) TableViewItem* selectedCookiesItem; +@property(nonatomic, assign) ItemType selectedSetting; + +@end + @implementation PrivacyCookiesViewController #pragma mark - UIViewController - (void)viewDidLoad { [super viewDidLoad]; + self.title = l10n_util::GetNSString(IDS_IOS_OPTIONS_PRIVACY_COOKIES); [self loadModel]; - // TODO(crbug.com/1064961): Implement this. + NSIndexPath* indexPath = + [self.tableViewModel indexPathForItemType:self.selectedSetting]; + [self updateSelectedCookiesItemWithIndexPath:indexPath]; } - (void)didMoveToParentViewController:(UIViewController*)parent { @@ -53,44 +65,117 @@ [super loadModel]; [self.tableViewModel addSectionWithIdentifier:SectionIdentifierContent]; - TableViewMultiDetailTextItem* allowCookies = - [[TableViewMultiDetailTextItem alloc] initWithType:ItemTypeAllowCookies]; + SettingsMultilineDetailItem* allowCookies = + [[SettingsMultilineDetailItem alloc] initWithType:ItemTypeAllowCookies]; allowCookies.text = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_ALLOW_COOKIES_TITLE); - allowCookies.leadingDetailText = l10n_util::GetNSString( + allowCookies.detailText = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_ALLOW_COOKIES_DETAIL); [self.tableViewModel addItem:allowCookies toSectionWithIdentifier:SectionIdentifierContent]; - TableViewMultiDetailTextItem* blockThirdPartyCookiesIncognito = - [[TableViewMultiDetailTextItem alloc] + SettingsMultilineDetailItem* blockThirdPartyCookiesIncognito = + [[SettingsMultilineDetailItem alloc] initWithType:ItemTypeBlockThirdPartyCookiesIncognito]; blockThirdPartyCookiesIncognito.text = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_BLOCK_THIRD_PARTY_COOKIES_INCOGNITO_TITLE); - blockThirdPartyCookiesIncognito.leadingDetailText = l10n_util::GetNSString( + blockThirdPartyCookiesIncognito.detailText = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_BLOCK_THIRD_PARTY_COOKIES_DETAIL); [self.tableViewModel addItem:blockThirdPartyCookiesIncognito toSectionWithIdentifier:SectionIdentifierContent]; - TableViewMultiDetailTextItem* blockThirdPartyCookies = - [[TableViewMultiDetailTextItem alloc] + SettingsMultilineDetailItem* blockThirdPartyCookies = + [[SettingsMultilineDetailItem alloc] initWithType:ItemTypeBlockThirdPartyCookies]; blockThirdPartyCookies.text = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_BLOCK_THIRD_PARTY_COOKIES_TITLE); - blockThirdPartyCookies.leadingDetailText = l10n_util::GetNSString( + blockThirdPartyCookies.detailText = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_BLOCK_THIRD_PARTY_COOKIES_DETAIL); [self.tableViewModel addItem:blockThirdPartyCookies toSectionWithIdentifier:SectionIdentifierContent]; - TableViewMultiDetailTextItem* blockAllCookies = - [[TableViewMultiDetailTextItem alloc] + SettingsMultilineDetailItem* blockAllCookies = + [[SettingsMultilineDetailItem alloc] initWithType:ItemTypeBlockAllCookies]; blockAllCookies.text = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_BLOCK_ALL_COOKIES_TITLE); - blockAllCookies.leadingDetailText = l10n_util::GetNSString( + blockAllCookies.detailText = l10n_util::GetNSString( IDS_IOS_OPTIONS_PRIVACY_COOKIES_BLOCK_ALL_COOKIES_DETAIL); [self.tableViewModel addItem:blockAllCookies toSectionWithIdentifier:SectionIdentifierContent]; + // TODO(crbug.com/1064961): Implement this. +} + +#pragma mark - Private + +// Adds accessoryType to the selected item & cell. +// Removes the accessoryType of the prevous selected option item & cell. +- (void)updateSelectedCookiesItemWithIndexPath:(NSIndexPath*)indexPath { + UITableViewCell* selectedCookiesItemCell; + if (self.selectedCookiesItem) { + self.selectedCookiesItem.accessoryType = UITableViewCellAccessoryNone; + selectedCookiesItemCell = [self.tableView + cellForRowAtIndexPath:[self.tableViewModel + indexPathForItem:self.selectedCookiesItem]]; + selectedCookiesItemCell.accessoryType = UITableViewCellAccessoryNone; + } + self.selectedCookiesItem = [self.tableViewModel itemAtIndexPath:indexPath]; + self.selectedCookiesItem.accessoryType = UITableViewCellAccessoryCheckmark; + selectedCookiesItemCell = [self.tableView + cellForRowAtIndexPath:[self.tableViewModel + indexPathForItem:self.selectedCookiesItem]]; + selectedCookiesItemCell.accessoryType = UITableViewCellAccessoryCheckmark; +} + +// Returns the ItemType associated with the CookiesSettingType. +- (ItemType)itemTypeForCookiesSettingType:(CookiesSettingType)settingType { + switch (settingType) { + case SettingTypeBlockThirdPartyCookiesIncognito: + return ItemTypeBlockThirdPartyCookiesIncognito; + case SettingTypeBlockThirdPartyCookies: + return ItemTypeBlockThirdPartyCookies; + case SettingTypeBlockAllCookies: + return ItemTypeBlockAllCookies; + case SettingTypeAllowCookies: + return ItemTypeAllowCookies; + } +} + +// Returns the CookiesSettingType associated with the ItemType. +- (CookiesSettingType)SettingTypeForCookiesItemType:(ItemType)itemType { + switch (itemType) { + case ItemTypeBlockThirdPartyCookiesIncognito: + return SettingTypeBlockThirdPartyCookiesIncognito; + case ItemTypeBlockThirdPartyCookies: + return SettingTypeBlockThirdPartyCookies; + case ItemTypeBlockAllCookies: + return SettingTypeBlockAllCookies; + case ItemTypeAllowCookies: + return SettingTypeAllowCookies; + case ItemTypeCookiesDescription: + NOTREACHED(); + return SettingTypeAllowCookies; + } +} + +#pragma mark - UITableViewDelegate + +- (void)tableView:(UITableView*)tableView + didSelectRowAtIndexPath:(NSIndexPath*)indexPath { + // TODO(crbug.com/1064961): Implement this after adding new table view item. + [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; + [self updateSelectedCookiesItemWithIndexPath:indexPath]; + ItemType itemType = + (ItemType)[self.tableViewModel itemTypeForIndexPath:indexPath]; + CookiesSettingType settingType = + [self SettingTypeForCookiesItemType:itemType]; + [self.handler selectedCookiesSettingType:settingType]; +} + +#pragma mark - PrivacyCookiesConsumer + +- (void)cookiesSettingsOptionSelected:(CookiesSettingType)settingType { + self.selectedSetting = [self itemTypeForCookiesSettingType:settingType]; } @end
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm index b5798f4..431894f 100644 --- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -58,7 +58,6 @@ #import "ios/chrome/browser/ui/settings/language/language_settings_table_view_controller.h" #import "ios/chrome/browser/ui/settings/password/passwords_table_view_controller.h" #import "ios/chrome/browser/ui/settings/privacy/privacy_coordinator.h" -#import "ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.h" #import "ios/chrome/browser/ui/settings/search_engine_table_view_controller.h" #import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h" #import "ios/chrome/browser/ui/settings/sync/utils/sync_util.h"
diff --git a/ios/chrome/browser/web/restore_egtest.mm b/ios/chrome/browser/web/restore_egtest.mm index 1572d3e..ae6c24f 100644 --- a/ios/chrome/browser/web/restore_egtest.mm +++ b/ios/chrome/browser/web/restore_egtest.mm
@@ -243,7 +243,7 @@ [ChromeEarlGrey loadURL:chromePage]; // Load error page. - const GURL errorPage = GURL("http://ndtv1234.com"); + const GURL errorPage = GURL("http://invalid."); [ChromeEarlGrey loadURL:errorPage]; [ChromeEarlGrey waitForWebStateContainingText:"ERR_"]; [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; @@ -276,12 +276,12 @@ // Go back to error page. [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()]; - [[EarlGrey selectElementWithMatcher:OmniboxText("ndtv1234.com")] + [[EarlGrey selectElementWithMatcher:OmniboxText("invalid.")] assertWithMatcher:grey_notNil()]; [ChromeEarlGrey waitForWebStateContainingText:"ERR_"]; [[GREYUIThreadExecutor sharedInstance] drainUntilIdle]; [self triggerRestore]; - [[EarlGrey selectElementWithMatcher:OmniboxText("ndtv1234.com")] + [[EarlGrey selectElementWithMatcher:OmniboxText("invalid.")] assertWithMatcher:grey_notNil()]; [ChromeEarlGrey waitForWebStateContainingText:"ERR_"]; [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb index dc779cc..1899ab8 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_am.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="am"> <translation id="1211920912879022906">በቅርቡ ከGoogle መለያዎ ወጥተዋል፣ ይህም የሰመሩ ይለፍ ቃላትዎን አስወግዶታል። እነሱን እዚህ ለማየት በመለያ ወደ Chrome ይግቡና ስምረትን ያብሩ።</translation> +<translation id="2034355755416337795">ዩአርኤል ተቀድቷል</translation> <translation id="2488806977964805203">የይለፍ ኮድ ያዘጋጁ</translation> <translation id="2492201814011227831">ለመጀመር በChrome ውስጥ አንዳንድ የይለፍ ቃላትን ያስቀምጡ። በGoogle መለያዎ ላይ አስቀድመው የተመጡ የይለፍ ቃላት ካለዎት እነሱን እዚይ ለማየት ወደ Chrome ይግቡና ስምረትን ያብሩ።</translation> <translation id="3378542047369517508">በChrome ውስጥ ያስቀመጧቸው የሁሉም ይለፍ ቃላት መዳረሻ ያግኙ። በማንኛውም መተግበሪያ ውስጥ። በማንኛውም ጊዜ።</translation> <translation id="3660601625129812825">የChrome ይለፍ ቃላትን በራስ-ሙላ</translation> +<translation id="3890063218104739480">ዩአርኤል</translation> <translation id="4695654165345019650">የይለፍ ቃላትን መድረስ...</translation> +<translation id="5057732351953537135">ቅዳ</translation> <translation id="5178539339249989017">ምንም የፍለጋ ውጤቶች አልተገኙም</translation> <translation id="5313485577007399362">ራስ-ሙላን ያንቁ...</translation> +<translation id="6299043380422084998">የይለፍ ቃል</translation> <translation id="6494101196118320406">የChrome ይለፍ ቃላት የሉም</translation> +<translation id="6796761605222685491">የይለፍ ቃል ተቀድቷል</translation> <translation id="6846906712230932330">የይለፍ ቃላትን ለመጠቀም በመጀመሪያ በመሣሪያዎ ላይ የይለፍ ኮድ ማቀናበር አለብዎት።</translation> <translation id="6965382102122355670">እሺ</translation> <translation id="7870350829250847712">የChrome ይለፍ ቃላት የሉም</translation> <translation id="8208791657167738630">ሁሉም የይለፍ ቃላት</translation> +<translation id="8267303240703176873">የተጠቃሚ ስም</translation> <translation id="8602573493531049509">እንዴት እንደሆነ ይወቁ</translation> +<translation id="862630654532726387">የተጠቃሚ ስም ተቀድቷል</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_as.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_as.xtb index 178cd14..5120b33 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="as"> <translation id="1211920912879022906">আপুনি শেহতীয়াকৈ নিজৰ Google একাউণ্টৰ পৰা ছাইন আউট কৰিছে, যাৰ ফলত আপোনাৰ ছিংক হৈ থকা পাছৱৰ্ডসমূহ আঁতৰাই পেলোৱা হৈছে। সেইবোৰ ইয়াত দেখা পাবলৈ Chromeত ছাইন ইন কৰক আৰু ছিংক অন কৰক।</translation> +<translation id="2034355755416337795">URLটো প্ৰতিলিপি কৰা হ’ল</translation> <translation id="2488806977964805203">এটা পাছক’ড ছেট কৰক</translation> <translation id="2492201814011227831">আৰম্ভ কৰিবলৈ Chromeত কিছুমান পাছৱৰ্ড ছেভ কৰক। যদি ইতিমধ্যে আপোনাৰ Google একাউণ্টত ষ্ট’ৰ কৰি থোৱা পাছৱৰ্ড আছে, সেইবোৰ ইয়াত দেখা পাবলৈ Chromeত ছাইন ইন কৰক আৰু ছিংক অন কৰক।</translation> <translation id="3378542047369517508">আপুনি Chromeত ছেভ কৰা সকলো পাছৱৰ্ডৰ এক্সেছ পাওক। যিকোনো এপতে। যিকোনো সময়তে।</translation> <translation id="3660601625129812825">স্বয়ংক্রিয়ভাৱে পূৰ হোৱা Chromeৰ পাছৱৰ্ডসমূহ</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">পাছৱৰ্ডসমূহ এক্সেছ কৰক...</translation> +<translation id="5057732351953537135">প্ৰতিলিপি কৰক</translation> <translation id="5178539339249989017">সন্ধানৰ কোনো ফলাফল পোৱা নগ’ল</translation> <translation id="5313485577007399362">স্বয়ংক্রিয়ভাৱে পূৰ হোৱা সুবিধাটো সক্ষম কৰক...</translation> +<translation id="6299043380422084998">পাছৱৰ্ড</translation> <translation id="6494101196118320406">কোনো Chrome পাছৱৰ্ড নাই</translation> +<translation id="6796761605222685491">পাছৱৰ্ডটো প্ৰতিলিপি কৰা হ’ল</translation> <translation id="6846906712230932330">পাছৱৰ্ডসমূহ ব্যৱহাৰ কৰিবলৈ আপুনি প্ৰথমে নিজৰ ডিভাইচত এটা পাছক’ড ছেট কৰিবই লাগিব।</translation> <translation id="6965382102122355670">ঠিক আছে</translation> <translation id="7870350829250847712">কোনো Chrome পাছৱৰ্ড নাই</translation> <translation id="8208791657167738630">সকলো পাছৱৰ্ড</translation> +<translation id="8267303240703176873">ব্যৱহাৰকাৰীৰ নাম</translation> <translation id="8602573493531049509">কেনেকৈ কৰিব জানক</translation> +<translation id="862630654532726387">ব্যৱহাৰকাৰীৰ নামটো প্ৰতিলিপি কৰা হ’ল</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_az.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb index 0ae34fc..a32066b8 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_az.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="az"> <translation id="1211920912879022906">Bu yaxınlarda Google Hesabınızdan çıxmısınız və nəticədə sinxronlaşdırılmış parollarınız silinib. Onları burada görmək üçün Chrome'a daxil olun və sinxronlaşdırmanı aktiv edin.</translation> +<translation id="2034355755416337795">URL kopyalandı</translation> <translation id="2488806977964805203">Parol təyin edin</translation> <translation id="2492201814011227831">Başlamaq üçün bəzi parolları Chrome'da yadda saxlayın. Artıq Google Hesabınızda saxlanmış parollarınız varsa, onları burada görmək üçün Chrome'a daxil olun və sinxronlaşdırmanı aktiv edin.</translation> <translation id="3378542047369517508">Chrome'da saxladığınız bütün parollara giriş əldə edin. İstənilən tətbiqdə. İstənilən vaxt.</translation> <translation id="3660601625129812825">Chrome Parollarını Avtomatik Doldurun</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Parollara Giriş...</translation> +<translation id="5057732351953537135">Kopyalayın</translation> <translation id="5178539339249989017">Heç bir axtarış nəticəsi tapılmadı</translation> <translation id="5313485577007399362">Avtomatik doldurmanı aktivləşdirin...</translation> +<translation id="6299043380422084998">Parol</translation> <translation id="6494101196118320406">Chrome Parolu Yoxdur</translation> +<translation id="6796761605222685491">Parol kopyalandı</translation> <translation id="6846906712230932330">Parollardan istifadə etmək üçün əvvəlcə cihazınızda parol təyin etməlisiniz.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Chrome Parolu Yoxdur</translation> <translation id="8208791657167738630">Bütün parollar</translation> +<translation id="8267303240703176873">İstifadəçi adı</translation> <translation id="8602573493531049509">İstifadə qaydasını öyrənin</translation> +<translation id="862630654532726387">İstifadəçi adı kopyalandı</translation> <translation id="8982444110803529242">Təklif edilən parollar</translation> <translation id="9087836967653912639">Ləğv edin</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb index 8ad5baa..ea95f115 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_be.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="be"> <translation id="1211920912879022906">Вы нядаўна выйшлі са свайго Уліковага запісу Google, і таму вашы сінхранізаваныя паролі перасталі паказвацца. Каб зноў пабачыць іх тут, увайдзіце ў Chrome і ўключыце сінхранізацыю.</translation> +<translation id="2034355755416337795">URL-адрас скапіраваны</translation> <translation id="2488806977964805203">Задайце пароль</translation> <translation id="2492201814011227831">Для пачатку захавайце некалькі пароляў у Chrome. Калі ў вашым Уліковым запісе Google ужо ёсць захаваныя паролі, то, каб убачыць іх тут, увайдзіце ў Chrome і ўключыце сінхранізацыю.</translation> <translation id="3378542047369517508">Доступ да ўсіх пароляў, захаваных у браўзеры Chrome, – у любой праграме, у любы час.</translation> <translation id="3660601625129812825">Уключыце функцыю аўтазапаўнення для пароляў Chrome</translation> +<translation id="3890063218104739480">URL-адрас</translation> <translation id="4695654165345019650">Паролі доступу...</translation> +<translation id="5057732351953537135">Скапіраваць</translation> <translation id="5178539339249989017">Няма вынікаў пошуку</translation> <translation id="5313485577007399362">Уключыць Аўтазапаўненне...</translation> +<translation id="6299043380422084998">Пароль</translation> <translation id="6494101196118320406">Няма пароляў Chrome</translation> +<translation id="6796761605222685491">Пароль скапіраваны</translation> <translation id="6846906712230932330">Каб выкарыстоўваць паролі, на прыладзе трэба спачатку наладзіць блакіроўку экрана.</translation> <translation id="6965382102122355670">ОК</translation> <translation id="7870350829250847712">Няма пароляў Chrome</translation> <translation id="8208791657167738630">Усе паролі</translation> +<translation id="8267303240703176873">Імя карыстальніка</translation> <translation id="8602573493531049509">Даведацца больш</translation> +<translation id="862630654532726387">Імя карыстальніка скапіравана</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 c4ffb386..fe8181e2 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="bg"> <translation id="1211920912879022906">Наскоро излязохте от профила си в Google, при което синхронизираните ви пароли бяха премахнати. За да ги видите тук, влезте в профила си в Chrome и включете синхронизирането.</translation> +<translation id="2034355755416337795">URL адресът бе копиран</translation> <translation id="2488806977964805203">Задаване на код за достъп</translation> <translation id="2492201814011227831">За да започнете, запазете пароли в Chrome. Ако в профила ви в Google вече има запазени пароли, влезте в профила си в Chrome и включете синхронизирането, за да ги видите тук.</translation> <translation id="3378542047369517508">Получете достъп до всички пароли, които запазвате в Chrome. Във всяко приложение и по всяко време.</translation> <translation id="3660601625129812825">Автоматично попълване на пароли в Chrome</translation> +<translation id="3890063218104739480">URL адрес</translation> <translation id="4695654165345019650">Осъществяване на достъп до паролите...</translation> +<translation id="5057732351953537135">Копиране</translation> <translation id="5178539339249989017">Няма намерени резултати от търсенето</translation> <translation id="5313485577007399362">Активиране на автоматичното попълване...</translation> +<translation id="6299043380422084998">Парола</translation> <translation id="6494101196118320406">Няма пароли в Chrome</translation> +<translation id="6796761605222685491">Паролата бе копирана</translation> <translation id="6846906712230932330">За да използвате паролите, трябва първо да зададете код за достъп на устройството си.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Няма пароли в Chrome</translation> <translation id="8208791657167738630">Всички пароли</translation> +<translation id="8267303240703176873">Потребителско име</translation> <translation id="8602573493531049509">Научете как</translation> +<translation id="862630654532726387">Потребителското име бе копирано</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_el.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_el.xtb index ff9ef42..ba6beba 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="el"> <translation id="1211920912879022906">Κατά την πρόσφατη αποσύνδεσή σας από τον Λογαριασμό σας Google, καταργήθηκαν οι συγχρονισμένοι κωδικοί πρόσβασης. Συνδεθείτε στο Chrome και ενεργοποιήστε τον συγχρονισμό για να εμφανιστούν εδώ.</translation> +<translation id="2034355755416337795">Το URL αντιγράφηκε.</translation> <translation id="2488806977964805203">Ορισμός κωδικού πρόσβασης</translation> <translation id="2492201814011227831">Αποθηκεύστε ορισμένους κωδικούς πρόσβασης στο Chrome για να ξεκινήσετε. Εάν έχετε αποθηκεύσει ήδη κωδικούς πρόσβασης στον Λογαριασμό σας Google, συνδεθείτε στο Chrome και ενεργοποιήστε τον συγχρονισμό για να εμφανιστούν εδώ.</translation> <translation id="3378542047369517508">Αποκτήστε πρόσβαση σε όλους τους κωδικούς πρόσβασης που αποθηκεύετε στο Chrome. Σε οποιαδήποτε εφαρμογή ανά πάσα στιγμή.</translation> <translation id="3660601625129812825">Κωδικοί πρόσβασης αυτόματης συμπλήρωσης Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Πρόσβαση σε κωδικούς πρόσβασης…</translation> +<translation id="5057732351953537135">Αντιγραφή</translation> <translation id="5178539339249989017">Δεν βρέθηκαν αποτελέσματα αναζήτησης</translation> <translation id="5313485577007399362">Ενεργοποίηση Αυτόματης συμπλήρωσης…</translation> +<translation id="6299043380422084998">Κωδικός πρόσβασης</translation> <translation id="6494101196118320406">Δεν υπάρχουν κωδικοί πρόσβασης Chrome</translation> +<translation id="6796761605222685491">Ο κωδικός πρόσβασης αντιγράφηκε.</translation> <translation id="6846906712230932330">Για να χρησιμοποιήσετε κωδικούς πρόσβασης, θα πρέπει πρώτα να ορίσετε έναν κωδικό πρόσβασης στη συσκευή σας.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Δεν υπάρχουν κωδικοί πρόσβασης Chrome</translation> <translation id="8208791657167738630">Όλοι οι κωδικοί πρόσβασης</translation> +<translation id="8267303240703176873">Όνομα χρήστη</translation> <translation id="8602573493531049509">Μάθετε πώς</translation> +<translation id="862630654532726387">Το όνομα χρήστη αντιγράφηκε.</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_es-419.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb index 4d09b1e..5a35573a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es-419.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="es-419"> <translation id="1211920912879022906">Se quitaron las contraseñas sincronizadas porque hace poco saliste de tu Cuenta de Google. Para verlas aquí, accede a tu cuenta en Chrome y activa la sincronización.</translation> +<translation id="2034355755416337795">Se copió la URL</translation> <translation id="2488806977964805203">Establece una contraseña</translation> <translation id="2492201814011227831">Guarda algunas contraseñas en Chrome para comenzar. Si ya tienes contraseñas almacenadas en tu Cuenta de Google, accede en Chrome y activa la sincronización para poder verlas.</translation> <translation id="3378542047369517508">Accede a todas las contraseñas que guardas en Chrome, desde cualquier app y en cualquier momento.</translation> <translation id="3660601625129812825">Autocompletar las contraseñas de Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Contraseñas de acceso…</translation> +<translation id="5057732351953537135">Copiar</translation> <translation id="5178539339249989017">No se encontraron resultados en la búsqueda</translation> <translation id="5313485577007399362">Habilitar Autocompletar…</translation> +<translation id="6299043380422084998">Contraseña</translation> <translation id="6494101196118320406">No hay contraseñas en Chrome</translation> +<translation id="6796761605222685491">Se copió la contraseña</translation> <translation id="6846906712230932330">Para usar contraseñas, primero debes establecer una en tu dispositivo.</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="7870350829250847712">No hay contraseñas en Chrome</translation> <translation id="8208791657167738630">Todas las contraseñas</translation> +<translation id="8267303240703176873">Nombre de usuario</translation> <translation id="8602573493531049509">Más información</translation> +<translation id="862630654532726387">Se copió el nombre de usuario</translation> <translation id="8982444110803529242">Contraseñas 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_es.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb index b084aa4..8c30241 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_es.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="es"> <translation id="1211920912879022906">Has cerrado la sesión que tenías abierta en tu cuenta de Google recientemente, con lo cual se han quitado las contraseñas sincronizadas. Inicia sesión en Chrome y activa la sincronización para verlas aquí.</translation> +<translation id="2034355755416337795">URL copiada</translation> <translation id="2488806977964805203">Establecer una contraseña</translation> <translation id="2492201814011227831">Guarda algunas contraseñas en Chrome para empezar. Si ya tienes contraseñas almacenadas en tu cuenta de Google, inicia sesión en Chrome y activa la sincronización para verlas aquí.</translation> <translation id="3378542047369517508">Accede a todas las contraseñas que hayas guardado en Chrome. Desde cualquier aplicación y en cualquier momento.</translation> <translation id="3660601625129812825">Permite el autorelleno de contraseñas de Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Acceder a contraseñas...</translation> +<translation id="5057732351953537135">Copiar</translation> <translation id="5178539339249989017">No se han encontrado resultados de búsqueda</translation> <translation id="5313485577007399362">Habilitar Autorrelleno...</translation> +<translation id="6299043380422084998">Contraseña</translation> <translation id="6494101196118320406">No hay contraseñas de Chrome</translation> +<translation id="6796761605222685491">Contraseña copiada</translation> <translation id="6846906712230932330">Para usar las contraseñas, primero debes establecer una contraseña en tu dispositivo.</translation> <translation id="6965382102122355670">Aceptar</translation> <translation id="7870350829250847712">No hay contraseñas de Chrome</translation> <translation id="8208791657167738630">Todas las contraseñas</translation> +<translation id="8267303240703176873">Nombre de usuario</translation> <translation id="8602573493531049509">Más información</translation> +<translation id="862630654532726387">Nombre de usuario copiado</translation> <translation id="8982444110803529242">Contraseñas 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_et.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb index 3564bfa..2c4d15d 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_et.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="et"> <translation id="1211920912879022906">Logisite hiljuti oma Google'i kontolt välja ja teie sünkroonitud paroolid eemaldati. Logige Chrome'i sisse ja lülitage sünkroonimine nende siin nägemiseks sisse.</translation> +<translation id="2034355755416337795">URL kopeeriti</translation> <translation id="2488806977964805203">Pääsukoodi seadistamine</translation> <translation id="2492201814011227831">Alustamiseks salvestage mõned paroolid Chrome'i. Kui olete paroolid juba oma Google'i kontole salvestanud, logige Chrome'i sisse ja lülitage sünkroonimine nende siin nägemiseks sisse.</translation> <translation id="3378542047369517508">Hankige juurdepääs kõigile paroolidele, mille Chrome'is salvestate. Igas rakenduses, igal ajal.</translation> <translation id="3660601625129812825">Chrome'i paroolide automaatne täitmine</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Juurdepääs paroolidele …</translation> +<translation id="5057732351953537135">Kopeeri</translation> <translation id="5178539339249989017">Otsingutulemusi ei leitud</translation> <translation id="5313485577007399362">Automaatse täitmise lubamine …</translation> +<translation id="6299043380422084998">Parool</translation> <translation id="6494101196118320406">Chrome'i paroole pole</translation> +<translation id="6796761605222685491">Parooli ei kopeeritud</translation> <translation id="6846906712230932330">Paroolide kasutamiseks peate oma seadmes esmalt pääsukoodi seadistama.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Chrome'i paroole pole</translation> <translation id="8208791657167738630">Kõik paroolid</translation> +<translation id="8267303240703176873">Kasutajanimi</translation> <translation id="8602573493531049509">Juhised</translation> +<translation id="862630654532726387">Kasutajanime ei kopeeritud</translation> <translation id="8982444110803529242">Soovitatud paroolid</translation> <translation id="9087836967653912639">Tühista</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb index 109a115..664e96e4 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fa.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="fa"> <translation id="1211920912879022906">بهتازگی از سیستم «حساب Google» خود خارج شدهاید که این کار باعث حذف شدن گذرواژههای همگامسازیشدهتان شده است. به سیستم Chrome وارد شوید و همگامسازی را روشن کنید تا گذرواژهها را اینجا ببینید.</translation> +<translation id="2034355755416337795">نشانی وب کپی شد</translation> <translation id="2488806977964805203">تنظیم گذرنویسه</translation> <translation id="2492201814011227831">برای شروع، چند گذرواژه در Chrome ذخیره کنید. اگر قبلاً در «حساب Google» خود گذرواژه ذخیره کردهاید، به سیستم Chrome وارد شوید و همگامسازی را روشن کنید تا گذرواژهها را اینجا ببینید.</translation> <translation id="3378542047369517508">به همه گذرواژههایی که در Chrome ذخیره میکنید دسترسی داشته باشید. در هر برنامهای. هرزمانی.</translation> <translation id="3660601625129812825">تکمیل خودکار گذرواژههای Chrome</translation> +<translation id="3890063218104739480">نشانی وب</translation> <translation id="4695654165345019650">دسترسی به گذرواژهها…</translation> +<translation id="5057732351953537135">کپی کردن</translation> <translation id="5178539339249989017">هیچ نتیجهای برای جستجو یافت نشد</translation> <translation id="5313485577007399362">فعال کردن «تکمیل خودکار»…</translation> +<translation id="6299043380422084998">گذرواژه</translation> <translation id="6494101196118320406">گذرواژهای در Chrome نیست</translation> +<translation id="6796761605222685491">گذرواژه کپی شد</translation> <translation id="6846906712230932330">برای استفاده از گذرواژهها، ابتدا باید گذرنویسهای در دستگاه تنظیم کنید.</translation> <translation id="6965382102122355670">قبول</translation> <translation id="7870350829250847712">گذرواژهای در Chrome نیست</translation> <translation id="8208791657167738630">همه گذرواژهها</translation> +<translation id="8267303240703176873">نام کاربری</translation> <translation id="8602573493531049509">با نحوه انجام کار آشنا شوید</translation> +<translation id="862630654532726387">نام کاربری کپی شد</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_fil.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb index 00a4b2d..000a678 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fil.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="fil"> <translation id="1211920912879022906">Nag-sign out ka kamakailan sa iyong Google Account, na dahilan kaya naalis ang mga naka-sync mong password. Mag-sign in sa Chrome at i-on ang pag-sync para makita ang mga ito rito.</translation> +<translation id="2034355755416337795">Nakopya ang URL</translation> <translation id="2488806977964805203">Magtakda ng Passcode</translation> <translation id="2492201814011227831">Mag-save ng ilang password sa Chrome para magsimula. Kung may mga password ka nang naka-store sa iyong Google Account, mag-sign in sa Chrome at i-on ang pag-sync para makita ang mga ito rito.</translation> <translation id="3378542047369517508">Magkaroon ng access sa lahat ng password na sine-save mo sa Chrome. Sa anumang app. Anumang oras.</translation> <translation id="3660601625129812825">I-autoFill ang Mga Password sa Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">I-access ang Mga Password...</translation> +<translation id="5057732351953537135">Kopyahin</translation> <translation id="5178539339249989017">Walang nakitang resulta ng paghahanap</translation> <translation id="5313485577007399362">I-enable ang AutoFill...</translation> +<translation id="6299043380422084998">Password</translation> <translation id="6494101196118320406">Walang Password sa Chrome</translation> +<translation id="6796761605222685491">Nakopya ang passsword</translation> <translation id="6846906712230932330">Para gumamit ng mga password, dapat ka munang magtakda ng passcode sa iyong device.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Walang Password sa Chrome</translation> <translation id="8208791657167738630">Lahat ng Password</translation> +<translation id="8267303240703176873">Username</translation> <translation id="8602573493531049509">Alamin Kung Paano</translation> +<translation id="862630654532726387">Nakopya ang username</translation> <translation id="8982444110803529242">Mga Iminumungkahing Password</translation> <translation id="9087836967653912639">Kanselahin</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb index 6c423d05..58853f4 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_fr.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="fr"> <translation id="1211920912879022906">Vous vous êtes récemment déconnecté de votre compte Google, ce qui a entraîné la suppression de vos mots de passe synchronisés. Connectez-vous à Chrome et activez la synchronisation pour les afficher ici.</translation> +<translation id="2034355755416337795">L'URL a été copiée</translation> <translation id="2488806977964805203">Définir un code secret</translation> <translation id="2492201814011227831">Pour commencer, enregistrez des mots de passe dans Chrome. Si vous avez déjà stocké des mots de passe dans votre compte Google, connectez-vous à Chrome et activez la synchronisation pour les afficher ici.</translation> <translation id="3378542047369517508">Accédez à tous les mots de passe que vous enregistrez dans Chrome, à tout moment et quelle que soit l'application.</translation> <translation id="3660601625129812825">Remplir automatiquement les mots de passe Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Accéder aux mots de passe…</translation> +<translation id="5057732351953537135">Copier</translation> <translation id="5178539339249989017">Aucun résultat de recherche n'a été trouvé</translation> <translation id="5313485577007399362">Activer la saisie automatique…</translation> +<translation id="6299043380422084998">Mot de passe</translation> <translation id="6494101196118320406">Aucun mot de passe Chrome</translation> +<translation id="6796761605222685491">Le mot de passe a été copié</translation> <translation id="6846906712230932330">Pour utiliser les mots de passe, vous devez d'abord définir un code secret sur votre appareil.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Aucun mot de passe Chrome</translation> <translation id="8208791657167738630">Tous les mots de passe</translation> +<translation id="8267303240703176873">Nom d'utilisateur</translation> <translation id="8602573493531049509">En savoir plus</translation> +<translation id="862630654532726387">Le nom d'utilisateur a été copié</translation> <translation id="8982444110803529242">Mots de passe suggérés</translation> <translation id="9087836967653912639">Annuler</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb index 4431deab..39a1335 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_gu.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="gu"> <translation id="1211920912879022906">તમે તાજેતરમાં તમારા Google એકાઉન્ટમાંથી સાઇન આઉટ થયા હતા, જેને કારણે તમારા સિંક કરેલા પાસવર્ડ કાઢી નાખવામાં આવ્યા છે. Chromeમાં સાઇન ઇન કરો અને તેને અહીં જોવા માટે સિંકની સુવિધા ચાલુ કરો.</translation> +<translation id="2034355755416337795">URL કૉપિ કરવામાં આવ્યું હતું</translation> <translation id="2488806977964805203">પાસકોડ સેટ કરો</translation> <translation id="2492201814011227831">શરૂ કરવા માટે, Chromeમાં થોડા પાસવર્ડ સાચવો. જો તમે પહેલેથી તમારા Google એકાઉન્ટમાં પાસવર્ડ સ્ટોર કર્યા હોય, તો Chromeમાં સાઇન ઇન કરો અને તેને અહીં જોવા માટે સિંકની સુવિધા ચાલુ કરો.</translation> <translation id="3378542047369517508">તમે Chromeમાં સાચવો તે બધા પાસવર્ડનો ઍક્સેસ મેળવો. કોઈપણ ઍપમાં. કોઈપણ સમયે.</translation> <translation id="3660601625129812825">Chromeના પાસવર્ડ ઑટોમૅટિક રીતે ભરાય</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">ઍક્સેસ માટેના પાસવર્ડ...</translation> +<translation id="5057732351953537135">કૉપિ</translation> <translation id="5178539339249989017">કોઈ શોધ પરિણામ મળ્યું નથી</translation> <translation id="5313485577007399362">ઑટોમૅટિક રીતે ભરાવાનું ચાલુ કરો…</translation> +<translation id="6299043380422084998">પાસવર્ડ</translation> <translation id="6494101196118320406">Chromeમાં કોઈ પાસવર્ડ નથી</translation> +<translation id="6796761605222685491">પાસવર્ડ કૉપિ કરવામાં આવ્યો</translation> <translation id="6846906712230932330">પાસવર્ડનો ઉપયોગ કરવા માટે, તમારે પહેલાં તમારા ડિવાઇસ પર પાસકોડ સેટ કરવો આવશ્યક છે.</translation> <translation id="6965382102122355670">બરાબર, સમજાઇ ગયું</translation> <translation id="7870350829250847712">Chromeમાં કોઈ પાસવર્ડ નથી</translation> <translation id="8208791657167738630">બધા પાસવર્ડ</translation> +<translation id="8267303240703176873">વપરાશકર્તાનું નામ</translation> <translation id="8602573493531049509">જાણો કેવી રીતે</translation> +<translation id="862630654532726387">વપરાશકર્તાનું નામ કૉપિ કરવામાં આવ્યું</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_hi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb index c03bcdd..a529391 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hi.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="hi"> <translation id="1211920912879022906">आपने अभी-अभी Google खाते से साइन आउट किया है. इससे आपके सिंक किए गए पासवर्ड हट गए हैं. अपने सिंक किए गए पासवर्ड यहां देखने के लिए, Chrome में साइन इन करके सिंक चालू करें.</translation> +<translation id="2034355755416337795">यूआरएल कॉपी किया गया था</translation> <translation id="2488806977964805203">पासवर्ड सेट करें</translation> <translation id="2492201814011227831">शुरू करने के लिए, Chrome में कुछ पासवर्ड सेव करें. अगर आपने पहले से ही अपने Google खाते में पासवर्ड सेव कर रखे हैं, तो उन्हें वहां देखने के लिए, Chrome में साइन इन करके सिंक चालू करें.</translation> <translation id="3378542047369517508">Chrome में सेव किए गए अपने सभी पासवर्ड का ऐक्सेस पाएं. किसी भी ऐप्लिकेशन में. किसी भी समय.</translation> <translation id="3660601625129812825">Chrome पासवर्ड ऑटोमैटिक तरीके से भरें</translation> +<translation id="3890063218104739480">यूआरएल</translation> <translation id="4695654165345019650">पासवर्ड ऐक्सेस करें...</translation> +<translation id="5057732351953537135">कॉपी करें</translation> <translation id="5178539339249989017">खोज का कोई भी नतीजा नहीं मिला</translation> <translation id="5313485577007399362">ऑटोमैटिक भरने की सुविधा चालू करें...</translation> +<translation id="6299043380422084998">पासवर्ड</translation> <translation id="6494101196118320406">कोई भी Chrome पासवर्ड नहीं है</translation> +<translation id="6796761605222685491">पासवर्ड कॉपी किया गया था</translation> <translation id="6846906712230932330">पासवर्ड इस्तेमाल करने के लिए, आपको सबसे पहले अपने डिवाइस पर एक पासवर्ड सेट करना होगा.</translation> <translation id="6965382102122355670">ठीक है</translation> <translation id="7870350829250847712">कोई भी Chrome पासवर्ड नहीं है</translation> <translation id="8208791657167738630">सभी पासवर्ड</translation> +<translation id="8267303240703176873">उपयोगकर्ता नाम</translation> <translation id="8602573493531049509">तरीका जानें</translation> +<translation id="862630654532726387">उपयोगकर्ता नाम कॉपी किया गया था</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_hr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_hr.xtb index f7724cc..2315b2b 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="hr"> <translation id="1211920912879022906">Nedavno ste se odjavili sa svojeg Google računa, čime su uklonjene vaše sinkronizirane zaporke. Prijavite se u Chrome i uključite sinkronizaciju kako biste ih tamo vidjeli.</translation> +<translation id="2034355755416337795">URL je kopiran</translation> <translation id="2488806977964805203">Postavite šifru zaporke</translation> <translation id="2492201814011227831">Spremite neke zaporke u Chromeu kako biste počeli. Ako na svojem Google računu već imate spremljene zaporke, prijavite se u Chrome i uključite sinkronizaciju kako biste ih vidjeli tamo.</translation> <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="3890063218104739480">URL</translation> <translation id="4695654165345019650">Pristupite zaporkama…</translation> +<translation id="5057732351953537135">Kopiraj</translation> <translation id="5178539339249989017">Nema rezultata pretraživanja</translation> <translation id="5313485577007399362">Omogući automatsko popunjavanje...</translation> +<translation id="6299043380422084998">Zaporka</translation> <translation id="6494101196118320406">Nema zaporki za Chrome</translation> +<translation id="6796761605222685491">Zaporka je kopirana</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="8267303240703176873">Korisničko ime</translation> <translation id="8602573493531049509">Saznajte kako</translation> +<translation id="862630654532726387">Korisničko je ime kopirano</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_id.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb index 8f668a7..db9108a2 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_id.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="id"> <translation id="1211920912879022906">Anda baru saja logout dari Akun Google, yang mengakibatkan sandi yang disinkronkan terhapus. Login ke Chrome dan aktifkan sinkronisasi untuk melihatnya di sini.</translation> +<translation id="2034355755416337795">URL telah disalin</translation> <translation id="2488806977964805203">Setel Kode Sandi</translation> <translation id="2492201814011227831">Simpan sandi di Chrome untuk memulai. Jika Anda telah menyimpan sandi di Akun Google, login ke Chrome dan aktifkan sinkronisasi untuk melihatnya di sini.</translation> <translation id="3378542047369517508">Dapatkan akses ke semua sandi yang Anda simpan di Chrome. Di aplikasi apa saja. Kapan saja.</translation> <translation id="3660601625129812825">Isi Otomatis Sandi Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Akses Sandi ...</translation> +<translation id="5057732351953537135">Salin</translation> <translation id="5178539339249989017">Hasil penelusuran tidak ditemukan</translation> <translation id="5313485577007399362">Aktifkan Isi Otomatis...</translation> +<translation id="6299043380422084998">Sandi</translation> <translation id="6494101196118320406">Tidak Ada Sandi Chrome</translation> +<translation id="6796761605222685491">Sandi disalin</translation> <translation id="6846906712230932330">Untuk menggunakan sandi, Anda harus menyetel kode sandi di perangkat terlebih dahulu.</translation> <translation id="6965382102122355670">Oke</translation> <translation id="7870350829250847712">Tidak Ada Sandi Chrome</translation> <translation id="8208791657167738630">Semua Sandi</translation> +<translation id="8267303240703176873">Nama pengguna</translation> <translation id="8602573493531049509">Pelajari Caranya</translation> +<translation id="862630654532726387">Nama pengguna telah disalin</translation> <translation id="8982444110803529242">Sandi yang Disarankan</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_it.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_it.xtb index 494affc..666ace2 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="it"> <translation id="1211920912879022906">Di recente hai scollegato il tuo Account Google, pertanto sono state rimosse le tue password sincronizzate. Accedi a Chrome e attiva la sincronizzazione per vederle nel browser.</translation> +<translation id="2034355755416337795">L'URL è stato copiato</translation> <translation id="2488806977964805203">Imposta un passcode</translation> <translation id="2492201814011227831">Per iniziare, salva alcune password in Chrome. Se hai già memorizzato delle password nel tuo Account Google, accedi a Chrome e attiva la sincronizzazione per vederle nel browser.</translation> <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="3890063218104739480">URL</translation> <translation id="4695654165345019650">Accesso password…</translation> +<translation id="5057732351953537135">Copia</translation> <translation id="5178539339249989017">Nessun risultato di ricerca trovato</translation> <translation id="5313485577007399362">Attiva Riempimento automatico…</translation> +<translation id="6299043380422084998">Password</translation> <translation id="6494101196118320406">Nessuna password di Chrome</translation> +<translation id="6796761605222685491">La password è stata copiata</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="8267303240703176873">Nome utente</translation> <translation id="8602573493531049509">Ulteriori informazioni</translation> +<translation id="862630654532726387">Il nome utente è stato copiato</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_ja.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb index f9456c093..b89b651 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ja.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="ja"> <translation id="1211920912879022906">最近 Google アカウントからログアウトしたため、同期していたパスワードが削除されました。Chrome にログインして同期をオンにすると、ここにパスワードが表示されます。</translation> +<translation id="2034355755416337795">URL をコピーしました</translation> <translation id="2488806977964805203">パスコードの設定</translation> <translation id="2492201814011227831">開始するには Chrome でパスワードを保存してください。Google アカウントにパスワードをすでに保存している場合は、Chrome にログインして同期をオンにすると、パスワードがここに表示されます。</translation> <translation id="3378542047369517508">Chrome で保存したすべてのパスワードにはいつでもどのアプリからでもアクセスできます。</translation> <translation id="3660601625129812825">Chrome のパスワード自動入力</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">パスワードにアクセスしています...</translation> +<translation id="5057732351953537135">コピー</translation> <translation id="5178539339249989017">一致する結果は見つかりませんでした</translation> <translation id="5313485577007399362">自動入力を有効にする...</translation> +<translation id="6299043380422084998">パスワード</translation> <translation id="6494101196118320406">Chrome パスワードはありません</translation> +<translation id="6796761605222685491">パスワードをコピーしました</translation> <translation id="6846906712230932330">パスワードを使用するには、まずデバイスにパスコードを設定する必要があります。</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Chrome パスワードはありません</translation> <translation id="8208791657167738630">すべてのパスワード</translation> +<translation id="8267303240703176873">ユーザー名</translation> <translation id="8602573493531049509">詳細</translation> +<translation id="862630654532726387">ユーザー名をコピーしました</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 82dfdf7..9ad9365 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="ka"> <translation id="1211920912879022906">ახლახან თქვენი Google ანგარიშიდან გამოხვედით, რამაც სინქრონიზებული პაროლების ამოშლა გამოიწვია. მათ აქ სანახავად შედით Chrome-ში და ჩართეთ სინქრონიზაცია.</translation> +<translation id="2034355755416337795">URL დაკოპირდა</translation> <translation id="2488806977964805203">დააყენეთ საიდუმლო კოდი</translation> <translation id="2492201814011227831">დასაწყისისთვის შეინახეთ პაროლები Chrome-ში. თუ Google ანგარიშში პაროლები უკვე შენახული გაქვთ, მათ აქ სანახავად შედით Chrome-ში და ჩართეთ სინქრონიზაცია.</translation> <translation id="3378542047369517508">იქონიეთ წვდომა თქვენ მიერ Chrome-ში შენახულ ყველა პაროლზე. ნებისმიერი აპიდან, ნებისმიერ დროს.</translation> <translation id="3660601625129812825">Chrome-ის პაროლების ავტომატური შევსება</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">პაროლებზე წვდომა...</translation> +<translation id="5057732351953537135">კოპირება</translation> <translation id="5178539339249989017">ძიების შედეგები არ არის</translation> <translation id="5313485577007399362">ავტომატური შევსების ჩართვა...</translation> +<translation id="6299043380422084998">პაროლი</translation> <translation id="6494101196118320406">Chrome-ის პაროლები არ არის</translation> +<translation id="6796761605222685491">პაროლი დაკოპირდა</translation> <translation id="6846906712230932330">პაროლების გამოსაყენებლად, პირველ რიგში, საჭიროა თქვენს მოწყობილობაზე საიდუმლო კოდის დაყენება.</translation> <translation id="6965382102122355670">კარგი</translation> <translation id="7870350829250847712">Chrome-ის პაროლები არ არის</translation> <translation id="8208791657167738630">ყველა პაროლი</translation> +<translation id="8267303240703176873">მომხმარებლის სახელი</translation> <translation id="8602573493531049509">ინსტრუქცია</translation> +<translation id="862630654532726387">მომხმარებლის სახელი დაკოპირდა</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_kk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb index 97c1cf4..76b5de1a 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kk.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="kk"> <translation id="1211920912879022906">Google есептік жазбасынан жақында шығып кеткендіктен, синхрондалған құпия сөздеріңіз өшірілді. Оларды осында көру үшін Chrome есептік жазбасына кіріп, синхрондауды іске қосыңыз.</translation> +<translation id="2034355755416337795">URL мекенжайы көшірілді.</translation> <translation id="2488806977964805203">Рұқсат кодын орнату</translation> <translation id="2492201814011227831">Бастау үшін Chrome браузерінде кейбір құпия сөздерді сақтаңыз. Google есептік жазбаңызда сақталған құпия сөздер болса, оларды көру үшін Chrome браузеріне кіріп, синхрондауды іске қосыңыз.</translation> <translation id="3378542047369517508">Chrome браузерінде сақталған барлық құпия сөзді пайдаланыңыз. Оларды кез келген қолданбада және уақытта пайдалана аласыз.</translation> <translation id="3660601625129812825">Chrome құпия сөздерін автотолтыру</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Құпия сөздерге кіріңіз...</translation> +<translation id="5057732351953537135">Көшіру</translation> <translation id="5178539339249989017">Іздеу нәтижелері табылмады.</translation> <translation id="5313485577007399362">Автотолтыруды қосу...</translation> +<translation id="6299043380422084998">Құпия сөз</translation> <translation id="6494101196118320406">Chrome құпия сөздері жоқ</translation> +<translation id="6796761605222685491">Құпия сөз көшірілді.</translation> <translation id="6846906712230932330">Құпия сөздерді пайдалану үшін алдымен құрылғыға рұқсат кодын орнату керек.</translation> <translation id="6965382102122355670">Жарайды</translation> <translation id="7870350829250847712">Chrome құпия сөздері жоқ</translation> <translation id="8208791657167738630">Барлық құпия сөздер</translation> +<translation id="8267303240703176873">Пайдаланушы аты</translation> <translation id="8602573493531049509">Әдісін білу</translation> +<translation id="862630654532726387">Пайдаланушы аты көшірілді.</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_km.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb index bd285c8..e61da63 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_km.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="km"> <translation id="1211920912879022906">កាលពីពេលថ្មីៗនេះ អ្នកបានចេញពីគណនី Google របស់អ្នក ដែលបានលុបពាក្យសម្ងាត់ដែលអ្នកបានធ្វើសមកាលកម្ម។ សូមចូល Chrome រួចបើកសមកាលកម្ម ដើម្បីមើលពាក្យសម្ងាត់ទាំងនោះនៅទីនេះ។</translation> +<translation id="2034355755416337795">បានចម្លង URL</translation> <translation id="2488806977964805203">កំណត់លេខកូដសម្ងាត់</translation> <translation id="2492201814011227831">រក្សាទុកពាក្យសម្ងាត់មួយចំនួននៅក្នុង Chrome ដើម្បីចាប់ផ្ដើម។ ប្រសិនបើអ្នកបានរក្សាទុកពាក្យសម្ងាត់នៅក្នុងគណនី Google របស់អ្នករួចហើយ សូមចូល Chrome រួចបើកសមកាលកម្ម ដើម្បីមើលពាក្យសម្ងាត់ទាំងនោះនៅទីនេះ។</translation> <translation id="3378542047369517508">មានសិទ្ធិចូលប្រើពាក្យសម្ងាត់ទាំងអស់ ដែលអ្នករក្សាទុកនៅក្នុង Chrome។ គ្រប់កម្មវិធី និងគ្រប់ពេលវេលា។</translation> <translation id="3660601625129812825">បំពេញពាក្យសម្ងាត់ Chrome ដោយស្វ័យប្រវត្តិ</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">ចូលប្រើពាក្យសម្ងាត់...</translation> +<translation id="5057732351953537135">ចម្លង</translation> <translation id="5178539339249989017">រកមិនឃើញលទ្ធផលស្វែងរកទេ</translation> <translation id="5313485577007399362">បើកការបំពេញស្វ័យប្រវត្តិ...</translation> +<translation id="6299043380422084998">ពាក្យសម្ងាត់</translation> <translation id="6494101196118320406">គ្មានពាក្យសម្ងាត់ Chrome ទេ</translation> +<translation id="6796761605222685491">បានចម្លងពាក្យសម្ងាត់</translation> <translation id="6846906712230932330">ដើម្បីប្រើពាក្យសម្ងាត់ អ្នកត្រូវតែកំណត់លេខកូដសម្ងាត់នៅលើឧបករណ៍របស់អ្នកជាមុនសិន។</translation> <translation id="6965382102122355670">យល់ព្រម</translation> <translation id="7870350829250847712">គ្មានពាក្យសម្ងាត់ Chrome ទេ</translation> <translation id="8208791657167738630">ពាក្យសម្ងាត់ទាំងអស់</translation> +<translation id="8267303240703176873">ឈ្មោះអ្នកប្រើប្រាស់</translation> <translation id="8602573493531049509">ស្វែងយល់អំពីរបៀប</translation> +<translation id="862630654532726387">បានចម្លងឈ្មោះអ្នកប្រើប្រាស់</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_kn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb index 01888204..6204f50 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_kn.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="kn"> <translation id="1211920912879022906">ನಿಮ್ಮ ಸಿಂಕ್ ಮಾಡಿದ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ತೆಗೆದುಹಾಕಲು ಕಾರಣವಾದ ನಿಮ್ಮ Google ಖಾತೆಯಿಂದ ನೀವು ಇತ್ತೀಚೆಗೆ ಸೈನ್ ಔಟ್ ಆಗಿದ್ದೀರಿ. Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ ಮತ್ತು ಆ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಇಲ್ಲಿ ನೋಡಲು ಸಿಂಕ್ ಆನ್ ಮಾಡಿ.</translation> +<translation id="2034355755416337795">URL ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="2488806977964805203">ಪಾಸ್ಕೋಡ್ ಹೊಂದಿಸಿ</translation> <translation id="2492201814011227831">ಪ್ರಾರಂಭಿಸಲು, Chrome ನಲ್ಲಿ ಕೆಲವು ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಿ. ನೀವು ಈಗಾಗಲೇ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಿದ್ದರೆ, ಅವುಗಳನ್ನು ಇಲ್ಲಿ ನೋಡಲು Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ ಹಾಗೂ ಸಿಂಕ್ ಅನ್ನು ಆನ್ ಮಾಡಿ.</translation> <translation id="3378542047369517508">Chrome ನಲ್ಲಿ ನೀವು ಉಳಿಸುವ ಎಲ್ಲಾ ಪಾಸ್ವರ್ಡ್ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಪಡೆದುಕೊಳ್ಳಿ. ಯಾವುದೇ ಆ್ಯಪ್ನಲ್ಲಿ, ಯಾವಾಗ ಬೇಕಾದರೂ.</translation> <translation id="3660601625129812825">ಸ್ವಯಂ ಭರ್ತಿ Chrome ಪಾಸ್ವರ್ಡ್ಗಳು</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ...</translation> +<translation id="5057732351953537135">ನಕಲಿಸಿ</translation> <translation id="5178539339249989017">ಯಾವುದೇ ಹುಡುಕಾಟ ಫಲಿತಾಂಶಗಳು ಕಂಡುಬಂದಿಲ್ಲ</translation> <translation id="5313485577007399362">ಸ್ವಯಂ ಭರ್ತಿ ಸಕ್ರಿಯಗೊಳಿಸಿ...</translation> +<translation id="6299043380422084998">ಪಾಸ್ವರ್ಡ್</translation> <translation id="6494101196118320406">ಯಾವುದೇ Chrome ಪಾಸ್ವರ್ಡ್ಗಳಿಲ್ಲ</translation> +<translation id="6796761605222685491">ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಕಲಿಸಲಾಗಿದೆ</translation> <translation id="6846906712230932330">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಬಳಸಲು, ನೀವು ಮೊದಲು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಬೇಕು.</translation> <translation id="6965382102122355670">ಸರಿ</translation> <translation id="7870350829250847712">ಯಾವುದೇ Chrome ಪಾಸ್ವರ್ಡ್ಗಳಿಲ್ಲ</translation> <translation id="8208791657167738630">ಎಲ್ಲಾ ಪಾಸ್ವರ್ಡ್ಗಳು</translation> +<translation id="8267303240703176873">ಬಳಕೆದಾರರಹೆಸರು</translation> <translation id="8602573493531049509">ಹೇಗೆ ಎಂಬುದನ್ನು ತಿಳಿದುಕೊಳ್ಳಿ</translation> +<translation id="862630654532726387">ಬಳಕೆದಾರರ ಹೆಸರನ್ನು ನಕಲಿಸಲಾಗಿದೆ</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_ko.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb index de486fa3..82b1656 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ko.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="ko"> <translation id="1211920912879022906">최근 Google 계정에서 로그아웃했기 때문에 동기화된 비밀번호가 삭제되었습니다. Chrome에 로그인한 다음 동기화를 사용 설정하면 여기에서 비밀번호를 확인할 수 있습니다.</translation> +<translation id="2034355755416337795">URL이 복사되었습니다.</translation> <translation id="2488806977964805203">비밀번호 설정</translation> <translation id="2492201814011227831">Chrome에 비밀번호를 저장하여 시작해 보세요. 이미 Google 계정에 저장된 비밀번호가 있다면 Chrome에 로그인하고 동기화를 사용 설정하면 여기에서 비밀번호를 확인할 수 있습니다.</translation> <translation id="3378542047369517508">Chrome에 저장한 모든 비밀번호에 언제든지, 어떤 앱에서든 액세스할 수 있습니다.</translation> <translation id="3660601625129812825">Chrome 비밀번호 자동 완성</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">비밀번호에 액세스합니다...</translation> +<translation id="5057732351953537135">복사</translation> <translation id="5178539339249989017">검색결과 없음</translation> <translation id="5313485577007399362">자동 완성 사용...</translation> +<translation id="6299043380422084998">비밀번호</translation> <translation id="6494101196118320406">Chrome 비밀번호 없음</translation> +<translation id="6796761605222685491">비밀번호가 복사되었습니다.</translation> <translation id="6846906712230932330">비밀번호를 사용하려면 기기에 비밀번호를 설정해야 합니다.</translation> <translation id="6965382102122355670">확인</translation> <translation id="7870350829250847712">Chrome 비밀번호 없음</translation> <translation id="8208791657167738630">모든 비밀번호</translation> +<translation id="8267303240703176873">사용자 이름</translation> <translation id="8602573493531049509">방법 알아보기</translation> +<translation id="862630654532726387">사용자 이름이 복사되었습니다.</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_ky.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb index b77a88a..d0d01029 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ky.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="ky"> <translation id="1211920912879022906">Жакында Google аккаунтуңуздан чыгып кеткениңизден улам, шайкештирилген сырсөздөрүңүз өчүрүлдү. Chrome'го кирип, аларды бул жерде көрүү үчүн шайкештирүүнү күйгүзүңүз.</translation> +<translation id="2034355755416337795">URL көчүрүлдү</translation> <translation id="2488806977964805203">Өткөрүүчү кодду коюу</translation> <translation id="2492201814011227831">Баштоо үчүн айрым сырсөздөрдү Chrome'до сактаңыз. Эгер Google аккаунтуңузга сакталган сырсөздөрүңүз болсо, Chrome'го кирип, аларды бул жерде көрүү үчүн шайкештирүүнү күйгүзүңүз.</translation> <translation id="3378542047369517508">Chrome'до сакталган бардык сырсөздөрдү колдонуу мүмкүнчүлүгүн алыңыз. Бардык колдонмолордо. Ар дайым.</translation> <translation id="3660601625129812825">Chrome сырсөздөрүн автоматтык түрдө толтуруңүз</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Сырсөздөргө мүмкүнчүлүк алуу...</translation> +<translation id="5057732351953537135">Көчүрүү</translation> <translation id="5178539339249989017">Эч нерсе табылган жок</translation> <translation id="5313485577007399362">Автоматтык түрдө толтурууну иштетүү...</translation> +<translation id="6299043380422084998">Сырсөз</translation> <translation id="6494101196118320406">Chrome сырсөздөрү жок</translation> +<translation id="6796761605222685491">Сырсөз көчүрүлдү</translation> <translation id="6846906712230932330">Сырсөздөрдү колдонуу үчүн, адегенде, түзмөгүңүздөгү өткөрүүчү кодду жөндөп алышыңыз керек.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Chrome сырсөздөрү жок</translation> <translation id="8208791657167738630">Бардык сырсөздөр</translation> +<translation id="8267303240703176873">Колдонуучунун аты</translation> <translation id="8602573493531049509">Үйрөнүп алыңыз</translation> +<translation id="862630654532726387">Колдонуучунун аты көчүрүлдү</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 ca15b08..ca4b7df 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="lt"> <translation id="1211920912879022906">Neseniai atsijungėte nuo „Google“ paskyros, iš kurios pašalinti jūsų sinchronizuoti slaptažodžiai. Prisijunkite prie „Chrome“ ir įjunkite sinchronizavimą, kad galėtumėte juos peržiūrėti čia.</translation> +<translation id="2034355755416337795">URL nukopijuotas</translation> <translation id="2488806977964805203">Slaptažodžio nustatymas</translation> <translation id="2492201814011227831">Išsaugokite kai kuriuos slaptažodžius naršyklėje „Chrome“, kad galėtumėte pradėti. Jei „Google“ paskyroje jau turite išsaugotų slaptažodžių, prisijunkite prie „Chrome“ ir įjunkite sinchronizavimą, kad galėtumėte juos peržiūrėti.</translation> <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="3890063218104739480">URL</translation> <translation id="4695654165345019650">Pasiekti slaptažodžius...</translation> +<translation id="5057732351953537135">Kopijuoti</translation> <translation id="5178539339249989017">Nerasta jokių paieškos rezultatų</translation> <translation id="5313485577007399362">Įgalinti automatinį pildymą...</translation> +<translation id="6299043380422084998">Slaptažodis</translation> <translation id="6494101196118320406">„Chrome“ slaptažodžių nėra</translation> +<translation id="6796761605222685491">Slaptažodis nukopijuotas</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="8267303240703176873">Naudotojo vardas</translation> <translation id="8602573493531049509">Sužinoti, kaip tai padaryti</translation> +<translation id="862630654532726387">Naudotojo vardas nukopijuotas</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 c7d1837c..d23cc893 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="mk"> <translation id="1211920912879022906">Неодамна се одјавивте од вашата сметка на Google, а тоа ги отстрани вашите синхронизирани лозинки. Најавете се на Chrome и вклучете синхронизација за да ги видите тука.</translation> +<translation id="2034355755416337795">URL-адресата е копирана</translation> <translation id="2488806977964805203">Поставете лозинка</translation> <translation id="2492201814011227831">Зачувајте некои лозинки во Chrome за да започнете. Ако веќе имате лозинки складирани во сметката на Google, најавете се на Chrome и вклучете синхронизација за да ги видите тука.</translation> <translation id="3378542047369517508">Добијте пристап до сите лозинки што ги зачувувате во Chrome. Во секоја апликација. Во секое време.</translation> <translation id="3660601625129812825">Автоматско пополнување лозинки на Chrome</translation> +<translation id="3890063218104739480">URL-адреса</translation> <translation id="4695654165345019650">Пристап до лозинките…</translation> +<translation id="5057732351953537135">Копирај</translation> <translation id="5178539339249989017">Не се пронајдени резултати од пребарувањето</translation> <translation id="5313485577007399362">Овозможи автоматско пополнување…</translation> +<translation id="6299043380422084998">Лозинка</translation> <translation id="6494101196118320406">Нема лозинки за Chrome</translation> +<translation id="6796761605222685491">Лозинката е копирана</translation> <translation id="6846906712230932330">За да ги користите лозинките, прво мора да поставите лозинка на вашиот уред.</translation> <translation id="6965382102122355670">Во ред</translation> <translation id="7870350829250847712">Нема лозинки за Chrome</translation> <translation id="8208791657167738630">Сите лозинки</translation> +<translation id="8267303240703176873">Корисничко име</translation> <translation id="8602573493531049509">Дознајте како</translation> +<translation id="862630654532726387">Корисничкото име е копирано</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_ml.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb index f15dd323..448b1be6 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ml.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="ml"> <translation id="1211920912879022906">സമന്വയിപ്പിച്ച പാസ്വേഡുകൾ നീക്കം ചെയ്ത Google അക്കൗണ്ടിൽ നിന്ന് നിങ്ങൾ അടുത്തിടെ സൈൻ ഔട്ട് ചെയ്തു. Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്ത് അവ ഇവിടെ കാണാൻ സമന്വയിപ്പിക്കൽ ഓണാക്കുക.</translation> +<translation id="2034355755416337795">URL പകർത്തി</translation> <translation id="2488806977964805203">പാസ്കോഡ് സജ്ജീകരിക്കുക</translation> <translation id="2492201814011227831">ആരംഭിക്കുന്നതിന് Chrome-ൽ ചില പാസ്വേഡുകൾ സംരക്ഷിക്കുക. നിങ്ങളുടെ Google അക്കൗണ്ടിൽ നിലവിൽ പാസ്വേഡുകൾ സംഭരിച്ചിട്ടുണ്ടെങ്കിൽ, Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്ത് അവ ഇവിടെ കാണാൻ സമന്വയിപ്പിക്കൽ ഓണാക്കുക.</translation> <translation id="3378542047369517508">നിങ്ങൾ Chrome-ൽ സംരക്ഷിക്കുന്ന എല്ലാ പാസ്വേഡുകളിലേക്കും ആക്സസ് നേടുക. ഏത് ആപ്പിലും. ഏതുസമയത്തും.</translation> <translation id="3660601625129812825">Chrome പാസ്വേഡുകൾ സ്വയമേവ പൂരിപ്പിക്കൽ</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">പാസ്വേഡുകൾ ആക്സസ് ചെയ്യുക...</translation> +<translation id="5057732351953537135">പകർത്തുക</translation> <translation id="5178539339249989017">തിരയൽ ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല</translation> <translation id="5313485577007399362">സ്വയമേവ പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക...</translation> +<translation id="6299043380422084998">പാസ്വേഡ്</translation> <translation id="6494101196118320406">Chrome പാസ്വേഡുകളൊന്നുമില്ല</translation> +<translation id="6796761605222685491">പാസ്വേഡ് പകർത്തി</translation> <translation id="6846906712230932330">പാസ്വേഡുകൾ ഉപയോഗിക്കാൻ, ആദ്യം നിങ്ങളുടെ ഉപകരണത്തിൽ പാസ്കോഡ് സജ്ജീകരിക്കുക.</translation> <translation id="6965382102122355670">ശരി</translation> <translation id="7870350829250847712">Chrome പാസ്വേഡുകളൊന്നുമില്ല</translation> <translation id="8208791657167738630">എല്ലാ പാസ്വേഡുകളും</translation> +<translation id="8267303240703176873">ഉപയോക്തൃനാമം</translation> <translation id="8602573493531049509">എങ്ങനെയെന്നറിയുക</translation> +<translation id="862630654532726387">ഉപയോക്തൃനാമം പകർത്തി</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_mn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb index 9d4ed8d..f047490d 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_mn.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="mn"> <translation id="1211920912879022906">Та саяхан Google Бүртгэлээсээ гарсан тул таны синк хийсэн нууц үгсийг хассан. Тэднийг энд харахын тулд Chrome-д нэвтэрч, синк хийхийг асаана уу.</translation> +<translation id="2034355755416337795">URL-г хууллаа</translation> <translation id="2488806977964805203">Нууц код тохируулах</translation> <translation id="2492201814011227831">Эхлүүлэхийн тул Chrome-д зарим нууц үгээ хадгална уу. Хэрэв танд Google Бүртгэлдээ хадгалсан нууц үгс хэдийн байгаа бол тэднийг энд харахын тулд Chrome-д нэвтэрч, синк хийхийг асаана уу.</translation> <translation id="3378542047369517508">Chrome-д хадгалсан бүх нууц үгэндээ хандаарай. Дурын апп дээр. Хүссэн үедээ.</translation> <translation id="3660601625129812825">Chrome-н нууц үгийг автоматаар бөглөх</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Нууц үгнүүдэд хандах...</translation> +<translation id="5057732351953537135">Хуулах</translation> <translation id="5178539339249989017">Ямар ч хайлтын илэрц олдсонгүй</translation> <translation id="5313485577007399362">Автоматаар бөглөх хэсгийг идэвхжүүлэх...</translation> +<translation id="6299043380422084998">Нууц үг</translation> <translation id="6494101196118320406">Chrome-н нууц үг байхгүй</translation> +<translation id="6796761605222685491">Нууц үгийг хууллаа</translation> <translation id="6846906712230932330">Нууц үгсийг ашиглахын тулд та эхлээд төхөөрөмж дээрээ нууц код тохируулах ёстой.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Chrome-н нууц үг байхгүй</translation> <translation id="8208791657167738630">Бүх нууц үг</translation> +<translation id="8267303240703176873">Хэрэглэгчийн нэр</translation> <translation id="8602573493531049509">Заавар харах</translation> +<translation id="862630654532726387">Хэрэглэгчийн нэрийг хууллаа</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_pa.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb index ce3b1e9..e5216f8 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_pa.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="pa"> <translation id="1211920912879022906">ਤੁਸੀਂ ਹਾਲ ਹੀ ਵਿੱਚ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚੋਂ ਸਾਈਨ-ਆਊਟ ਕੀਤਾ ਹੈ, ਜਿਸ ਕਰਕੇ ਤੁਹਾਡੇ ਸਮਕਾਲੀਕਰਨ ਕੀਤੇ ਪਾਸਵਰਡ ਹਟ ਗਏ ਹਨ। Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਇੱਥੇ ਦੇਖਣ ਲਈ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ।</translation> +<translation id="2034355755416337795">URL ਕਾਪੀ ਕੀਤਾ ਗਿਆ ਸੀ</translation> <translation id="2488806977964805203">ਕੋਈ ਪਾਸਕੋਡ ਸੈੱਟ ਕਰੋ</translation> <translation id="2492201814011227831">ਸ਼ੁਰੂ ਕਰਨ ਲਈ Chrome ਵਿੱਚ ਕੁਝ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰੋ। ਜੇ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਪਾਸਵਰਡ ਸਟੋਰ ਕੀਤੇ ਹੋਏ ਹਨ, ਤਾਂ Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਇੱਥੇ ਦੇਖਣ ਲਈ ਸਮਕਾਲੀਕਰਨ ਚਾਲੂ ਕਰੋ।</translation> <translation id="3378542047369517508">Chrome ਵਿੱਚ ਆਪਣੇ ਰੱਖਿਅਤ ਕੀਤੇ ਸਾਰੇ ਪਾਸਵਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਾਪਤ ਕਰੋ। ਕਿਸੇ ਵੀ ਐਪ ਵਿੱਚ। ਕਿਸੇ ਵੀ ਵੇਲੇ।</translation> <translation id="3660601625129812825">ਆਟੋਫਿਲ Chrome ਪਾਸਵਰਡ</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">ਪਾਸਵਰਡਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰੋ...</translation> +<translation id="5057732351953537135">ਕਾਪੀ ਕਰੋ</translation> <translation id="5178539339249989017">ਕੋਈ ਖੋਜ ਨਤੀਜਾ ਨਹੀਂ ਮਿਲਿਆ</translation> <translation id="5313485577007399362">ਆਟੋਫਿਲ ਨੂੰ ਚਾਲੂ ਕਰੋ...</translation> +<translation id="6299043380422084998">ਪਾਸਵਰਡ</translation> <translation id="6494101196118320406">ਕੋਈ Chrome ਪਾਸਵਰਡ ਨਹੀਂ</translation> +<translation id="6796761605222685491">ਪਾਸਵਰਡ ਕਾਪੀ ਕੀਤਾ ਗਿਆ ਸੀ</translation> <translation id="6846906712230932330">ਪਾਸਵਰਡਾਂ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਪਾਸਕੋਡ ਸੈੱਟ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ।</translation> <translation id="6965382102122355670">ਠੀਕ</translation> <translation id="7870350829250847712">ਕੋਈ Chrome ਪਾਸਵਰਡ ਨਹੀਂ</translation> <translation id="8208791657167738630">ਸਾਰੇ ਪਾਸਵਰਡ</translation> +<translation id="8267303240703176873">ਵਰਤੋਂਕਾਰ ਨਾਮ</translation> <translation id="8602573493531049509">ਤਰੀਕਾ ਜਾਣੋ</translation> +<translation id="862630654532726387">ਵਰਤੋਂਕਾਰ ਨਾਮ ਕਾਪੀ ਕੀਤਾ ਗਿਆ ਸੀ</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_sk.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb index f2d4d46..4c4ae4b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sk.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="sk"> <translation id="1211920912879022906">Nedávno ste sa odhlásili zo svojho účtu Google, čím ste odstránili synchronizované heslá. Ak si ich tu chcete zobraziť, prihláste sa do Chromu a zapnite synchronizáciu.</translation> +<translation id="2034355755416337795">Webová adresa bola skopírovaná</translation> <translation id="2488806977964805203">Nastavenie vstupného kódu</translation> <translation id="2492201814011227831">Začnite uložením niekoľkých hesiel v Chrome. Ak už máte heslá uložené v účte Google, prihláste sa do Chromu a zapnite synchronizáciu, aby sa vám tu zobrazili.</translation> <translation id="3378542047369517508">Získajte prístup k všetkým heslám, ktoré ste si uložili v Chrome. V ľubovoľnej aplikácii a hocikedy.</translation> <translation id="3660601625129812825">Automatické dopĺňanie hesiel Chromu</translation> +<translation id="3890063218104739480">Webová adresa</translation> <translation id="4695654165345019650">Prístup k heslám…</translation> +<translation id="5057732351953537135">Kopírovať</translation> <translation id="5178539339249989017">Neboli nájdené žiadne výsledky vyhľadávania</translation> <translation id="5313485577007399362">Povoliť automatické dopĺňanie…</translation> +<translation id="6299043380422084998">Heslo</translation> <translation id="6494101196118320406">Žiadne heslá Chromu</translation> +<translation id="6796761605222685491">Heslo bolo skopírované</translation> <translation id="6846906712230932330">Ak chcete používať heslá, najprv musíte v zariadení nastaviť vstupný kód.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Žiadne heslá Chromu</translation> <translation id="8208791657167738630">Všetky heslá</translation> +<translation id="8267303240703176873">Používateľské meno</translation> <translation id="8602573493531049509">Postup</translation> +<translation id="862630654532726387">Používateľské meno bolo skopírované</translation> <translation id="8982444110803529242">Navrhnuté heslá</translation> <translation id="9087836967653912639">Zrušiť</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb index bcda233..f0d8f59 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sq.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="sq"> <translation id="1211920912879022906">Ke dalë së fundi nga "Llogaria jote e Google", gjë që ka hequr fjalëkalimet e tua të sinkronizuara. Identifikohu në Chrome dhe aktivizo sinkronizimin për t'i parë këtu.</translation> +<translation id="2034355755416337795">URL-ja u kopjua</translation> <translation id="2488806977964805203">Vendos një kod</translation> <translation id="2492201814011227831">Ruaj disa fjalëkalime në Chrome që të fillosh. Nëse ke tashmë fjalëkalime të ruajtura në "Llogarinë tënde të Google", identifikohu në Chrome dhe aktivizo sinkronizimin për t'i parë ato këtu.</translation> <translation id="3378542047369517508">Merr qasjen te të gjitha fjalëkalimet që ruan në Chrome. Në çdo aplikacion. Në çdo kohë.</translation> <translation id="3660601625129812825">Plotëso automatikisht fjalëkalimet e Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Qasu te fjalëkalimet...</translation> +<translation id="5057732351953537135">Kopjo</translation> <translation id="5178539339249989017">Nuk u gjetën rezultate kërkimi</translation> <translation id="5313485577007399362">Aktivizo plotësimin automatik...</translation> +<translation id="6299043380422084998">Fjalëkalimi</translation> <translation id="6494101196118320406">Nuk ka asnjë fjalëkalim të Chrome</translation> +<translation id="6796761605222685491">Fjalëkalimi u kopjua</translation> <translation id="6846906712230932330">Për të përdorur fjalëkalimet, duhet të vendosësh në fillim një kod në pajisjen tënde.</translation> <translation id="6965382102122355670">Në rregull</translation> <translation id="7870350829250847712">Nuk ka asnjë fjalëkalim të Chrome</translation> <translation id="8208791657167738630">Të gjitha fjalëkalimet</translation> +<translation id="8267303240703176873">Emri i përdoruesit</translation> <translation id="8602573493531049509">Mëso se si</translation> +<translation id="862630654532726387">Emri i përdoruesit u kopjua</translation> <translation id="8982444110803529242">Fjalëkalimet e sugjeruara</translation> <translation id="9087836967653912639">Anulo</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 18d1449..c9ac38d 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="sr-Latn"> <translation id="1211920912879022906">Nedavno ste se odjavili sa Google naloga, čime su uklonjene sinhronizovane lozinke. Prijavite se u Chrome i uključite sinhronizaciju da biste ih videli ovde.</translation> +<translation id="2034355755416337795">URL je kopiran</translation> <translation id="2488806977964805203">Podesite šifru</translation> <translation id="2492201814011227831">Sačuvajte neke lozinke u Chrome-u da biste započeli. Ako ste već sačuvali lozinke na Google nalogu, prijavite se u Chrome i uključite sinhronizaciju da bi se prikazale ovde.</translation> <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="3890063218104739480">URL</translation> <translation id="4695654165345019650">Pristupa se lozinkama...</translation> +<translation id="5057732351953537135">Kopiraj</translation> <translation id="5178539339249989017">Nije pronađen nijedan rezultat pretrage</translation> <translation id="5313485577007399362">Omogući automatsko popunjavanje...</translation> +<translation id="6299043380422084998">Lozinka</translation> <translation id="6494101196118320406">Nema lozinki za Chrome</translation> +<translation id="6796761605222685491">Lozinka je kopirana</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="8267303240703176873">Korisničko ime</translation> <translation id="8602573493531049509">Saznajte kako</translation> +<translation id="862630654532726387">Korisničko ime je kopirano</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 b0b21a2..d4a9110 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="sr"> <translation id="1211920912879022906">Недавно сте се одјавили са Google налога, чиме су уклоњене синхронизоване лозинке. Пријавите се у Chrome и укључите синхронизацију да бисте их видели овде.</translation> +<translation id="2034355755416337795">URL је копиран</translation> <translation id="2488806977964805203">Подесите шифру</translation> <translation id="2492201814011227831">Сачувајте неке лозинке у Chrome-у да бисте започели. Ако сте већ сачували лозинке на Google налогу, пријавите се у Chrome и укључите синхронизацију да би се приказале овде.</translation> <translation id="3378542047369517508">Добијте приступ свим лозинкама које чувате у Chrome-у. У било којој апликацији. У било ком тренутку.</translation> <translation id="3660601625129812825">Аутоматско попуњавање лозинки за Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Приступа се лозинкама...</translation> +<translation id="5057732351953537135">Копирај</translation> <translation id="5178539339249989017">Није пронађен ниједан резултат претраге</translation> <translation id="5313485577007399362">Омогући аутоматско попуњавање...</translation> +<translation id="6299043380422084998">Лозинка</translation> <translation id="6494101196118320406">Нема лозинки за Chrome</translation> +<translation id="6796761605222685491">Лозинка је копирана</translation> <translation id="6846906712230932330">Да бисте користили лозинке, прво морате да подесите шифру на уређају.</translation> <translation id="6965382102122355670">Потврди</translation> <translation id="7870350829250847712">Нема лозинки за Chrome</translation> <translation id="8208791657167738630">Све лозинке</translation> +<translation id="8267303240703176873">Корисничко име</translation> <translation id="8602573493531049509">Сазнајте како</translation> +<translation id="862630654532726387">Корисничко име је копирано</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_ta.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_ta.xtb index b7babef..0e32623 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="ta"> <translation id="1211920912879022906">சமீபத்தில் Google கணக்கிலிருந்து வெளியேறியதால் நீங்கள் ஒத்திசைத்த கடவுச்சொற்கள் அகற்றப்பட்டன. அவற்றை இங்குப் பார்க்க Chromeமில் உள்நுழைந்து ஒத்திசைவை இயக்கவும்.</translation> +<translation id="2034355755416337795">URL நகலெடுக்கப்பட்டது</translation> <translation id="2488806977964805203">கடவுக்குறியீட்டை அமைக்கவும்</translation> <translation id="2492201814011227831">தொடங்க, சில கடவுச்சொற்களை Chromeமில் சேமிக்கவும். உங்கள் Google கணக்கில் ஏற்கெனவே கடவுச்சொற்களைச் சேமித்து வைத்துள்ளீர்கள் எனில் அவற்றை இங்குப் பார்ப்பதற்கு Chromeமில் உள்நுழைந்து ஒத்திசைவை இயக்கவும்.</translation> <translation id="3378542047369517508">Chromeமில் சேமிக்கப்பட்டுள்ள எல்லாக் கடவுச்சொற்களுக்கும் அணுகலைப் பெறுங்கள். எந்த ஆப்ஸிலும். எந்த நேரத்திலும்.</translation> <translation id="3660601625129812825">Chrome கடவுச்சொற்களைத் தன்னிரப்பு</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">கடவுச்சொற்களை அணுகுகிறது...</translation> +<translation id="5057732351953537135">நகலெடு</translation> <translation id="5178539339249989017">தேடல் முடிவுகள் எதுவுமில்லை</translation> <translation id="5313485577007399362">தன்னிரப்பியை இயக்கு...</translation> +<translation id="6299043380422084998">கடவுச்சொல்</translation> <translation id="6494101196118320406">Chrome கடவுச்சொற்கள் எதுவும் இல்லை</translation> +<translation id="6796761605222685491">கடவுச்சொல் நகலெடுக்கப்பட்டது</translation> <translation id="6846906712230932330">கடவுச்சொற்களைப் பயன்படுத்த, முதலில் உங்கள் சாதனத்தில் கடவுக்குறியீட்டை அமைக்க வேண்டும்.</translation> <translation id="6965382102122355670">சரி</translation> <translation id="7870350829250847712">Chrome கடவுச்சொற்கள் எதுவும் இல்லை</translation> <translation id="8208791657167738630">அனைத்துக் கடவுச்சொற்களும்</translation> +<translation id="8267303240703176873">பயனர்பெயர்</translation> <translation id="8602573493531049509">எப்படி என அறிக</translation> +<translation id="862630654532726387">பயனர்பெயர் நகலெடுக்கப்பட்டது</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_te.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb index 176e5bff..3aba7ba 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_te.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="te"> <translation id="1211920912879022906">ఇటీవల మీ Google ఖాతా నుండి మీరు సైన్ అవుట్ చేశారు కాబట్టి, సింక్ చేసి ఉన్న మీ పాస్వర్డ్లు తీసివేయబడ్డాయి. వాటిని ఇక్కడ చూడటానికి Chromeలో సైన్ ఇన్ చేసి, సింక్ను ఆన్ చేయండి.</translation> +<translation id="2034355755416337795">URL కాపీ చేయబడింది</translation> <translation id="2488806977964805203">పాస్కోడ్ను సెట్ చేయండి</translation> <translation id="2492201814011227831">ప్రారంభించడానికి కొన్ని పాస్వర్డ్లను Chromeలో సేవ్ చేయండి. మీ Google ఖాతాలో పాస్వర్డ్లు ఏవైనా ఇదివరకే స్టోర్ అయి ఉంటే, వాటిని ఇక్కడ చూడటానికి Chromeలో సైన్ ఇన్ చేసి, సింక్ను ఆన్ చేయండి.</translation> <translation id="3378542047369517508">మీరు Chromeలో సేవ్ చేసే అన్ని పాస్వర్డ్లకు యాక్సెస్ పొందండి. ఏదైనా యాప్లో, ఎప్పుడైనా పొందండి.</translation> <translation id="3660601625129812825">Chrome పాస్వర్డ్లను ఆటోఫిల్ చేయండి</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">పాస్వర్డ్లను యాక్సెస్ చేయడానికి...</translation> +<translation id="5057732351953537135">కాపీ చేయి</translation> <translation id="5178539339249989017">శోధన ఫలితాలు ఏవీ కనుగొనబడలేదు</translation> <translation id="5313485577007399362">ఆటోఫిల్ను ఎనేబుల్ చేయి...</translation> +<translation id="6299043380422084998">పాస్వర్డ్</translation> <translation id="6494101196118320406">Chrome పాస్వర్డ్లు లేవు</translation> +<translation id="6796761605222685491">పాస్వర్డ్ కాపీ చేయబడింది</translation> <translation id="6846906712230932330">పాస్వర్డ్లను ఉపయోగించడానికి, మీరు ముందుగా తప్పక మీ పరికరంలో పాస్కోడ్ను సెట్ చేయాలి.</translation> <translation id="6965382102122355670">సరే</translation> <translation id="7870350829250847712">Chrome పాస్వర్డ్లు లేవు</translation> <translation id="8208791657167738630">అన్ని పాస్వర్డ్లు</translation> +<translation id="8267303240703176873">యూజర్నేమ్</translation> <translation id="8602573493531049509">ఎలాగో తెలుసుకోండి</translation> +<translation id="862630654532726387">యూజర్నేమ్ కాపీ చేయబడింది</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_vi.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb index 9d1340f1..114d5a88 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_vi.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="vi"> <translation id="1211920912879022906">Gần đây, bạn đã đăng xuất khỏi Tài khoản Google của mình nên các mật khẩu mà bạn đồng bộ hóa đã bị xóa. Hãy đăng nhập vào Chrome rồi bật tính năng đồng bộ hóa để xem các mật khẩu đó tại đây.</translation> +<translation id="2034355755416337795">Đã sao chép URL</translation> <translation id="2488806977964805203">Đặt mật mã</translation> <translation id="2492201814011227831">Lưu một số mật khẩu trong Chrome để bắt đầu. Nếu bạn đã lưu các mật khẩu trong Tài khoản Google của mình, hãy đăng nhập vào Chrome rồi bật tính năng đồng bộ hóa để xem các mật khẩu đó tại đây.</translation> <translation id="3378542047369517508">Có quyền sử dụng tất cả các mật khẩu mà bạn lưu trên Chrome trong mọi ứng dụng, bất cứ lúc nào.</translation> <translation id="3660601625129812825">Tự động điền mật khẩu Chrome</translation> +<translation id="3890063218104739480">URL</translation> <translation id="4695654165345019650">Truy cập vào các mật khẩu...</translation> +<translation id="5057732351953537135">Sao chép</translation> <translation id="5178539339249989017">Không tìm thấy kết quả nào</translation> <translation id="5313485577007399362">Bật tính năng Tự động điền...</translation> +<translation id="6299043380422084998">Mật khẩu</translation> <translation id="6494101196118320406">Không có mật khẩu Chrome</translation> +<translation id="6796761605222685491">Đã sao chép mật khẩu</translation> <translation id="6846906712230932330">Để sử dụng mật khẩu, trước tiên, bạn phải đặt mật mã trên thiết bị của mình.</translation> <translation id="6965382102122355670">OK</translation> <translation id="7870350829250847712">Không có mật khẩu Chrome</translation> <translation id="8208791657167738630">Tất cả mật khẩu</translation> +<translation id="8267303240703176873">Tên người dùng</translation> <translation id="8602573493531049509">Tìm hiểu cách thức</translation> +<translation id="862630654532726387">Đã sao chép tên người dùng</translation> <translation id="8982444110803529242">Mật khẩu đề xuất</translation> <translation id="9087836967653912639">Hủy</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb index f53f26e6..67fbe45 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zh-CN.xtb
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> <translation id="1211920912879022906">您最近退出过自己的 Google 帐号,导致系统移除了您的已同步密码。您只需登录 Chrome 并开启同步功能,便可在此处看到那些密码。</translation> +<translation id="2034355755416337795">已复制网址</translation> <translation id="2488806977964805203">设置密码</translation> <translation id="2492201814011227831">您需要在 Chrome 中保存一些密码,才能开始使用。如果您已在自己的 Google 帐号中存储了密码,请登录 Chrome 并开启同步功能,然后您可在此处看到您的密码。</translation> <translation id="3378542047369517508">获取您在 Chrome 中保存的所有密码。不限应用。不限时间。</translation> <translation id="3660601625129812825">自动填充 Chrome 中存储的密码</translation> +<translation id="3890063218104739480">网址</translation> <translation id="4695654165345019650">获取密码…</translation> +<translation id="5057732351953537135">复制</translation> <translation id="5178539339249989017">未找到任何搜索结果</translation> <translation id="5313485577007399362">启用自动填充…</translation> +<translation id="6299043380422084998">密码</translation> <translation id="6494101196118320406">您未在 Chrome 中存储任何密码</translation> +<translation id="6796761605222685491">已复制密码</translation> <translation id="6846906712230932330">您必须先在设备上设置密码,才能使用密码。</translation> <translation id="6965382102122355670">确定</translation> <translation id="7870350829250847712">您未在 Chrome 中存储任何密码</translation> <translation id="8208791657167738630">所有密码</translation> +<translation id="8267303240703176873">用户名</translation> <translation id="8602573493531049509">了解如何操作</translation> +<translation id="862630654532726387">已复制用户名</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_zu.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_zu.xtb index d4cdbd1..10e7f48 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
@@ -2,19 +2,26 @@ <!DOCTYPE translationbundle> <translationbundle lang="zu"> <translation id="1211920912879022906">Usanda kuphuma ngemvume ku-akhawunti yakho ye-Google, okususe amaphasiwedi akho avunyelanisiwe. Ngena ngemvume ku-Chrome bese uvula ukuvumelanisa ukuwabona lapha.</translation> +<translation id="2034355755416337795">I-URL ikopishiwe</translation> <translation id="2488806977964805203">Setha ikhodi yokudlula</translation> <translation id="2492201814011227831">Londoloza amanye amaphasiwedi ku-Chrome ukuqalisa. Uma usunawo kakade amaphasiwedi agcinwe ku-akhawunti yakho ye-Google, ngena ngemvume ku-Chrome bese uvula ukuvumelanisa ukuwabona lapha.</translation> <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="3890063218104739480">I-URL</translation> <translation id="4695654165345019650">Finyelela kumaphasiwedi...</translation> +<translation id="5057732351953537135">Kopisha</translation> <translation id="5178539339249989017">Ayikho imiphumela yosesho etholakele</translation> <translation id="5313485577007399362">Nika amandla Ukugcwalisa Ngokuzenzakalela...</translation> +<translation id="6299043380422084998">Iphasiwedi</translation> <translation id="6494101196118320406">Awekho amaphasiwedi we-Chrome</translation> +<translation id="6796761605222685491">Iphasiwedi ikopishiwe</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="8267303240703176873">Igama lomsebenzisi</translation> <translation id="8602573493531049509">Funda ukuthi kanjani</translation> +<translation id="862630654532726387">Igama lomsebenzisi likopishiwe</translation> <translation id="8982444110803529242">Amaphasiwedi Aphakanyisiwe</translation> <translation id="9087836967653912639">Khansela</translation> </translationbundle> \ No newline at end of file
diff --git a/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm b/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm index 4580845..31a73c9e 100644 --- a/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm +++ b/ios/chrome/credential_provider_extension/ui/credential_list_view_controller.mm
@@ -4,7 +4,6 @@ #import "ios/chrome/credential_provider_extension/ui/credential_list_view_controller.h" -#import "base/mac/foundation_util.h" #import "ios/chrome/common/credential_provider/credential.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" @@ -18,54 +17,6 @@ NSString* kCellIdentifier = @"clvcCell"; const CGFloat kHeaderHeight = 70; -const CGFloat kFallbackIconSize = 24; -const CGFloat kFallbackRoundedCorner = 3; - -// Returns an icon with centered letter from given |string| and some -// colors computed from the string. -// TODO(crbug.com/1045454): draw actual icon or default icon. -UIImage* GetFallbackImageWithStringAndColor(NSString* string) { - int hash = string.hash; - UIColor* backgroundColor = - [UIColor colorWithRed:0.5 + (hash & 0xff) / 510.0 - green:0.5 + ((hash >> 8) & 0xff) / 510.0 - blue:0.5 + ((hash >> 16) & 0xff) / 510.0 - alpha:1.0]; - - UIColor* textColor = [UIColor colorWithRed:(hash & 0xff) / 510.0 - green:((hash >> 8) & 0xff) / 510.0 - blue:((hash >> 16) & 0xff) / 510.0 - alpha:1.0]; - - CGRect rect = CGRectMake(0, 0, kFallbackIconSize, kFallbackIconSize); - - UIGraphicsBeginImageContext(rect.size); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetFillColorWithColor(context, [backgroundColor CGColor]); - CGContextSetStrokeColorWithColor(context, [textColor CGColor]); - - UIBezierPath* rounded = - [UIBezierPath bezierPathWithRoundedRect:rect - cornerRadius:kFallbackRoundedCorner]; - [rounded fill]; - - UIFont* font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; - font = [font fontWithSize:(kFallbackIconSize / 2)]; - CGRect textRect = CGRectMake(0, (kFallbackIconSize - [font lineHeight]) / 2, - kFallbackIconSize, [font lineHeight]); - NSMutableParagraphStyle* paragraphStyle = - [[NSMutableParagraphStyle alloc] init]; - [paragraphStyle setAlignment:NSTextAlignmentCenter]; - NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init]; - [attributes setValue:font forKey:NSFontAttributeName]; - [attributes setValue:textColor forKey:NSForegroundColorAttributeName]; - [attributes setValue:paragraphStyle forKey:NSParagraphStyleAttributeName]; - [[string substringToIndex:1] drawInRect:textRect withAttributes:attributes]; - - UIImage* image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - return image; -} } @interface CredentialListViewController () <UITableViewDataSource, @@ -158,7 +109,15 @@ } id<Credential> credential = [self credentialForIndexPath:indexPath]; - cell.imageView.image = GetFallbackImageWithStringAndColor(credential.user); + if (credential.favicon.length) { + // TODO(crbug.com/1045454): draw actual icon. + cell.imageView.image = [[UIImage imageNamed:@"default_world_favicon"] + imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } else { + cell.imageView.image = [[UIImage imageNamed:@"default_world_favicon"] + imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + cell.imageView.tintColor = [UIColor colorNamed:kPlaceholderImageTintColor]; + } cell.imageView.contentMode = UIViewContentModeScaleAspectFit; cell.textLabel.text = credential.user; cell.textLabel.textColor = [UIColor colorNamed:kTextPrimaryColor];
diff --git a/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn b/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn index 8494b31..cf2ff89 100644 --- a/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn +++ b/ios/chrome/credential_provider_extension/ui/resources/BUILD.gn
@@ -8,6 +8,7 @@ group("resources") { deps = [ ":consent_illustration", + ":default_world_favicon", ":empty_credentials_illustration", ":password_hide_icon", ":password_reveal_icon", @@ -54,3 +55,12 @@ "password_hide_icon.imageset/password_hide_icon@3x.png", ] } + +imageset("default_world_favicon") { + sources = [ + "default_world_favicon.imageset/Contents.json", + "default_world_favicon.imageset/default_world_favicon.png", + "default_world_favicon.imageset/default_world_favicon@2x.png", + "default_world_favicon.imageset/default_world_favicon@3x.png", + ] +}
diff --git a/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/Contents.json b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/Contents.json new file mode 100644 index 0000000..3614ccd --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/Contents.json
@@ -0,0 +1,23 @@ +{ + "images": [ + { + "idiom": "universal", + "scale": "1x", + "filename": "default_world_favicon.png" + }, + { + "idiom": "universal", + "scale": "2x", + "filename": "default_world_favicon@2x.png" + }, + { + "idiom": "universal", + "scale": "3x", + "filename": "default_world_favicon@3x.png" + } + ], + "info": { + "version": 1, + "author": "xcode" + } +}
diff --git a/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon.png b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon.png new file mode 100644 index 0000000..3b6c9360 --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon@2x.png b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon@2x.png new file mode 100644 index 0000000..72b0b7c --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon@2x.png Binary files differ
diff --git a/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon@3x.png b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon@3x.png new file mode 100644 index 0000000..7d10a12 --- /dev/null +++ b/ios/chrome/credential_provider_extension/ui/resources/default_world_favicon.imageset/default_world_favicon@3x.png Binary files differ
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index 044bfa0..addc3ac4 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -300,7 +300,7 @@ "//ios/chrome/browser/ui/settings/google_services:constants", "//ios/chrome/browser/ui/settings/password:eg_test_support", "//ios/chrome/browser/ui/settings/password:password_constants", - "//ios/chrome/browser/ui/settings/privacy", + "//ios/chrome/browser/ui/settings/privacy:privacy_ui", "//ios/chrome/browser/ui/settings/sync", "//ios/chrome/browser/ui/tab_grid:tab_grid_ui_constants", "//ios/chrome/browser/ui/tab_grid/grid:grid_ui_constants", @@ -461,7 +461,7 @@ "//ios/chrome/browser/ui/settings/language:eg_app_support+eg2", "//ios/chrome/browser/ui/settings/password:eg_app_support+eg2", "//ios/chrome/browser/ui/settings/password:password_constants", - "//ios/chrome/browser/ui/settings/privacy", + "//ios/chrome/browser/ui/settings/privacy:privacy_ui", "//ios/chrome/browser/ui/settings/sync", "//ios/chrome/browser/ui/signin_interaction:eg_app_support+eg2", "//ios/chrome/browser/ui/tab_grid:tab_grid_ui_constants",
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn index 313f4ae..4f14411 100644 --- a/ios/web_view/BUILD.gn +++ b/ios/web_view/BUILD.gn
@@ -188,8 +188,6 @@ "internal/signin/web_view_identity_manager_factory.mm", "internal/signin/web_view_signin_client_factory.h", "internal/signin/web_view_signin_client_factory.mm", - "internal/signin/web_view_signin_error_controller_factory.h", - "internal/signin/web_view_signin_error_controller_factory.mm", "internal/sync/cwv_sync_controller.mm", "internal/sync/cwv_sync_controller_internal.h", "internal/sync/web_view_device_info_sync_service_factory.h",
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller.mm b/ios/web_view/internal/autofill/cwv_autofill_controller.mm index d436b6c..fbc78ef 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller.mm
@@ -44,6 +44,7 @@ #import "ios/web_view/internal/autofill/cwv_credit_card_verifier_internal.h" #include "ios/web_view/internal/autofill/web_view_autocomplete_history_manager_factory.h" #import "ios/web_view/internal/autofill/web_view_autofill_client_ios.h" +#import "ios/web_view/internal/autofill/web_view_autofill_log_router_factory.h" #include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h" #include "ios/web_view/internal/autofill/web_view_strike_database_factory.h" #import "ios/web_view/internal/passwords/cwv_password_controller.h" @@ -117,18 +118,19 @@ @synthesize delegate = _delegate; - (instancetype)initWithWebState:(web::WebState*)webState + autofillClient: + (std::unique_ptr<autofill::WebViewAutofillClientIOS>) + autofillClient autofillAgent:(AutofillAgent*)autofillAgent JSAutofillManager:(JsAutofillManager*)JSAutofillManager JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager - passwordController:(CWVPasswordController*)passwordController { + passwordController:(CWVPasswordController*)passwordController + applicationLocale:(const std::string&)applicationLocale { self = [super init]; if (self) { DCHECK(webState); _webState = webState; - ios_web_view::WebViewBrowserState* browserState = - ios_web_view::WebViewBrowserState::FromBrowserState( - _webState->GetBrowserState()); _autofillAgent = autofillAgent; _webStateObserverBridge = @@ -138,22 +140,11 @@ _formActivityObserverBridge = std::make_unique<autofill::FormActivityObserverBridge>(webState, self); - _autofillClient.reset(new autofill::WebViewAutofillClientIOS( - browserState->GetPrefs(), - ios_web_view::WebViewPersonalDataManagerFactory::GetForBrowserState( - browserState->GetRecordingBrowserState()), - ios_web_view::WebViewAutocompleteHistoryManagerFactory:: - GetForBrowserState(browserState), - _webState, self, - ios_web_view::WebViewIdentityManagerFactory::GetForBrowserState( - browserState->GetRecordingBrowserState()), - ios_web_view::WebViewStrikeDatabaseFactory::GetForBrowserState( - browserState->GetRecordingBrowserState()), - ios_web_view::WebViewProfileSyncServiceFactory::GetForBrowserState( - browserState))); + _autofillClient = std::move(autofillClient); + _autofillClient->set_bridge(self); + autofill::AutofillDriverIOS::PrepareForWebStateWebFrameAndDelegate( - _webState, _autofillClient.get(), self, - ios_web_view::ApplicationContext::GetInstance()->GetApplicationLocale(), + _webState, _autofillClient.get(), self, applicationLocale, autofill::AutofillManager::ENABLE_AUTOFILL_DOWNLOAD_MANAGER); _JSAutofillManager = JSAutofillManager; @@ -314,20 +305,6 @@ } } -- (BOOL)removeSuggestion:(CWVAutofillSuggestion*)suggestion { - // Identifier is greater than 0 for Autofill suggestions. - DCHECK_LT(0, suggestion.formSuggestion.identifier); - - web::WebFrame* frame = web::GetWebFrameWithId( - _webState, base::SysNSStringToUTF8(suggestion.frameID)); - autofill::AutofillManager* manager = [self autofillManagerForFrame:frame]; - if (!manager) { - return NO; - } - return manager->RemoveAutofillProfileOrCreditCard( - suggestion.formSuggestion.identifier); -} - - (void)focusPreviousField { [_JSSuggestionManager selectPreviousElementInFrameWithID:_lastFocusFormActivityWebFrameID]; @@ -346,16 +323,6 @@ completionHandler:completionHandler]; } -#pragma mark - Utility Methods - -- (autofill::AutofillManager*)autofillManagerForFrame:(web::WebFrame*)frame { - if (!_webState || !frame) { - return nil; - } - return autofill::AutofillDriverIOS::FromWebStateAndWebFrame(_webState, frame) - ->autofill_manager(); -} - #pragma mark - CWVAutofillClientIOSBridge - (void)showAutofillPopup:(const std::vector<autofill::Suggestion>&)suggestions
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h b/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h index a0f5ff59..16480f3b 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h +++ b/ios/web_view/internal/autofill/cwv_autofill_controller_internal.h
@@ -5,10 +5,17 @@ #ifndef IOS_WEB_VIEW_INTERNAL_AUTOFILL_CWV_AUTOFILL_CONTROLLER_INTERNAL_H_ #define IOS_WEB_VIEW_INTERNAL_AUTOFILL_CWV_AUTOFILL_CONTROLLER_INTERNAL_H_ +#include <memory> +#include <string> + #import "ios/web_view/public/cwv_autofill_controller.h" NS_ASSUME_NONNULL_BEGIN +namespace autofill { +class WebViewAutofillClientIOS; +} // namespace autofill + namespace web { class WebState; } // namespace web @@ -21,10 +28,14 @@ @interface CWVAutofillController () - (instancetype)initWithWebState:(web::WebState*)webState + autofillClient: + (std::unique_ptr<autofill::WebViewAutofillClientIOS>) + autofillClient autofillAgent:(AutofillAgent*)autofillAgent JSAutofillManager:(JsAutofillManager*)JSAutofillManager JSSuggestionManager:(JsSuggestionManager*)JSSuggestionManager passwordController:(CWVPasswordController*)passwordController + applicationLocale:(const std::string&)applicationLocale NS_DESIGNATED_INITIALIZER; @end
diff --git a/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm b/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm index 9a50b75..e301f62 100644 --- a/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm +++ b/ios/web_view/internal/autofill/cwv_autofill_controller_unittest.mm
@@ -12,6 +12,10 @@ #include "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h" #include "components/autofill/core/browser/autofill_manager.h" +#include "components/autofill/core/browser/logging/stub_log_manager.h" +#include "components/autofill/core/browser/payments/test_strike_database.h" +#include "components/autofill/core/browser/test_personal_data_manager.h" +#include "components/autofill/core/common/autofill_prefs.h" #import "components/autofill/ios/browser/fake_autofill_agent.h" #import "components/autofill/ios/browser/fake_js_autofill_manager.h" #import "components/autofill/ios/browser/form_suggestion.h" @@ -20,21 +24,24 @@ #import "components/autofill/ios/form_util/form_activity_tab_helper.h" #import "components/autofill/ios/form_util/test_form_activity_tab_helper.h" #include "components/password_manager/core/browser/password_manager.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" +#include "components/sync/driver/test_sync_service.h" #import "ios/web/public/deprecated/crw_test_js_injection_receiver.h" #include "ios/web/public/js_messaging/web_frames_manager.h" #import "ios/web/public/test/fakes/fake_web_frame.h" #import "ios/web/public/test/fakes/fake_web_frames_manager.h" +#include "ios/web/public/test/fakes/test_browser_state.h" #import "ios/web/public/test/fakes/test_web_state.h" -#include "ios/web/public/test/scoped_testing_web_client.h" #include "ios/web/public/test/web_task_environment.h" -#include "ios/web/public/web_client.h" #import "ios/web_view/internal/autofill/cwv_autofill_suggestion_internal.h" +#import "ios/web_view/internal/autofill/web_view_autofill_client_ios.h" #import "ios/web_view/internal/passwords/cwv_password_controller_fake.h" #import "ios/web_view/internal/passwords/web_view_password_manager_client.h" #import "ios/web_view/internal/passwords/web_view_password_manager_driver.h" #include "ios/web_view/internal/web_view_browser_state.h" #import "ios/web_view/public/cwv_autofill_controller_delegate.h" -#include "ios/web_view/test/test_with_locale_and_resources.h" #include "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #include "testing/platform_test.h" @@ -51,6 +58,7 @@ namespace { +const char kApplicationLocale[] = "en-US"; NSString* const kTestFormName = @"FormName"; NSString* const kTestFieldIdentifier = @"FieldIdentifier"; NSString* const kTestFrameId = @"FrameID"; @@ -59,72 +67,85 @@ } // namespace -class CWVAutofillControllerTest : public TestWithLocaleAndResources { +class CWVAutofillControllerTest : public PlatformTest { protected: - CWVAutofillControllerTest() - : web_client_(std::make_unique<web::WebClient>()), - task_environment_(web::WebTaskEnvironment::IO_MAINLOOP), - browser_state_(/*off_the_record=*/false) { - test_web_state_.SetBrowserState(&browser_state_); + CWVAutofillControllerTest() { + pref_service_.registry()->RegisterBooleanPref( + password_manager::prefs::kCredentialsEnableService, true); + pref_service_.registry()->RegisterBooleanPref( + autofill::prefs::kAutofillProfileEnabled, true); + + web_state_.SetBrowserState(&browser_state_); CRWTestJSInjectionReceiver* injectionReceiver = [[CRWTestJSInjectionReceiver alloc] init]; - test_web_state_.SetJSInjectionReceiver(injectionReceiver); + web_state_.SetJSInjectionReceiver(injectionReceiver); js_autofill_manager_ = [[FakeJSAutofillManager alloc] initWithReceiver:injectionReceiver]; js_suggestion_manager_ = OCMClassMock([JsSuggestionManager class]); autofill_agent_ = - [[FakeAutofillAgent alloc] initWithPrefService:browser_state_.GetPrefs() - webState:&test_web_state_]; + [[FakeAutofillAgent alloc] initWithPrefService:&pref_service_ + webState:&web_state_]; auto frames_manager = std::make_unique<web::FakeWebFramesManager>(); - fake_web_frames_manager_ = frames_manager.get(); - test_web_state_.SetWebFramesManager(std::move(frames_manager)); + web_frames_manager_ = frames_manager.get(); + web_state_.SetWebFramesManager(std::move(frames_manager)); // TODO(crbug.com/1070468): Redo CWVPasswordController so it is easier to // fake in unit tests. - auto passwordManagerClient = std::make_unique<WebViewPasswordManagerClient>( - &test_web_state_, /*sync_service=*/nullptr, browser_state_.GetPrefs(), - /*identity_manager=*/nullptr, /*log_manager=*/nullptr, - /*profile_store=*/nullptr, /*account_store=*/nullptr); - auto passwordManager = std::make_unique<password_manager::PasswordManager>( - passwordManagerClient.get()); - auto passwordManagerDriver = + auto password_manager_client = + std::make_unique<WebViewPasswordManagerClient>( + &web_state_, /*sync_service=*/nullptr, &pref_service_, + /*identity_manager=*/nullptr, /*log_manager=*/nullptr, + /*profile_store=*/nullptr, /*account_store=*/nullptr); + auto password_manager = std::make_unique<password_manager::PasswordManager>( + password_manager_client.get()); + auto password_manager_driver = std::make_unique<WebViewPasswordManagerDriver>(); password_controller_ = [[CWVPasswordControllerFake alloc] - initWithWebState:&test_web_state_ - passwordManager:std::move(passwordManager) - passwordManagerClient:std::move(passwordManagerClient) - passwordManagerDriver:std::move(passwordManagerDriver)]; + initWithWebState:&web_state_ + passwordManager:std::move(password_manager) + passwordManagerClient:std::move(password_manager_client) + passwordManagerDriver:std::move(password_manager_driver)]; - autofill_controller_ = - [[CWVAutofillController alloc] initWithWebState:&test_web_state_ - autofillAgent:autofill_agent_ - JSAutofillManager:js_autofill_manager_ - JSSuggestionManager:js_suggestion_manager_ - passwordController:password_controller_]; - test_form_activity_tab_helper_ = - std::make_unique<autofill::TestFormActivityTabHelper>(&test_web_state_); + auto autofill_client = std::make_unique<autofill::WebViewAutofillClientIOS>( + kApplicationLocale, &pref_service_, &personal_data_manager_, + /*autocomplete_history_manager=*/nullptr, &web_state_, + /*identity_manager=*/nullptr, &strike_database_, &sync_service_, + std::make_unique<autofill::StubLogManager>()); + autofill_controller_ = [[CWVAutofillController alloc] + initWithWebState:&web_state_ + autofillClient:std::move(autofill_client) + autofillAgent:autofill_agent_ + JSAutofillManager:js_autofill_manager_ + JSSuggestionManager:js_suggestion_manager_ + passwordController:password_controller_ + applicationLocale:kApplicationLocale]; + form_activity_tab_helper_ = + std::make_unique<autofill::TestFormActivityTabHelper>(&web_state_); } void AddWebFrame(std::unique_ptr<web::WebFrame> frame) { web::WebFrame* frame_ptr = frame.get(); - fake_web_frames_manager_->AddWebFrame(std::move(frame)); - test_web_state_.OnWebFrameDidBecomeAvailable(frame_ptr); + web_frames_manager_->AddWebFrame(std::move(frame)); + web_state_.OnWebFrameDidBecomeAvailable(frame_ptr); } - web::ScopedTestingWebClient web_client_; web::WebTaskEnvironment task_environment_; - ios_web_view::WebViewBrowserState browser_state_; - web::TestWebState test_web_state_; - web::FakeWebFramesManager* fake_web_frames_manager_; + TestingPrefServiceSimple pref_service_; + web::TestBrowserState browser_state_; + web::TestWebState web_state_; + autofill::TestPersonalDataManager personal_data_manager_; + autofill::TestStrikeDatabase strike_database_; + syncer::TestSyncService sync_service_; + web::FakeWebFramesManager* web_frames_manager_; CWVAutofillController* autofill_controller_; FakeAutofillAgent* autofill_agent_; FakeJSAutofillManager* js_autofill_manager_; CWVPasswordControllerFake* password_controller_; std::unique_ptr<autofill::TestFormActivityTabHelper> - test_form_activity_tab_helper_; + form_activity_tab_helper_; id js_suggestion_manager_; }; @@ -292,30 +313,25 @@ id delegate = OCMProtocolMock(@protocol(CWVAutofillControllerDelegate)); autofill_controller_.delegate = delegate; - // [delegate expect] returns an autoreleased object, but it must be - // destroyed before this test exits to avoid holding on to - // |autofill_controller_|. - @autoreleasepool { - [[delegate expect] autofillController:autofill_controller_ - didFocusOnFieldWithIdentifier:kTestFieldIdentifier - fieldType:@"" - formName:kTestFormName - frameID:kTestFrameId - value:kTestFieldValue - userInitiated:YES]; + [[delegate expect] autofillController:autofill_controller_ + didFocusOnFieldWithIdentifier:kTestFieldIdentifier + fieldType:@"" + formName:kTestFormName + frameID:kTestFrameId + value:kTestFieldValue + userInitiated:YES]; - autofill::FormActivityParams params; - params.form_name = base::SysNSStringToUTF8(kTestFormName); - params.field_identifier = base::SysNSStringToUTF8(kTestFieldIdentifier); - params.value = base::SysNSStringToUTF8(kTestFieldValue); - params.frame_id = base::SysNSStringToUTF8(kTestFrameId); - params.has_user_gesture = true; - params.type = "focus"; - web::FakeWebFrame frame(base::SysNSStringToUTF8(kTestFrameId), true, - GURL::EmptyGURL()); - test_form_activity_tab_helper_->FormActivityRegistered(&frame, params); - [delegate verify]; - } + autofill::FormActivityParams params; + params.form_name = base::SysNSStringToUTF8(kTestFormName); + params.field_identifier = base::SysNSStringToUTF8(kTestFieldIdentifier); + params.value = base::SysNSStringToUTF8(kTestFieldValue); + params.frame_id = base::SysNSStringToUTF8(kTestFrameId); + params.has_user_gesture = true; + params.type = "focus"; + web::FakeWebFrame frame(base::SysNSStringToUTF8(kTestFrameId), true, + GURL::EmptyGURL()); + form_activity_tab_helper_->FormActivityRegistered(&frame, params); + [delegate verify]; } // Tests CWVAutofillController delegate input callback is invoked. @@ -323,30 +339,25 @@ id delegate = OCMProtocolMock(@protocol(CWVAutofillControllerDelegate)); autofill_controller_.delegate = delegate; - // [delegate expect] returns an autoreleased object, but it must be - // destroyed before this test exits to avoid holding on to - // |autofill_controller_|. - @autoreleasepool { - [[delegate expect] autofillController:autofill_controller_ - didInputInFieldWithIdentifier:kTestFieldIdentifier - fieldType:@"" - formName:kTestFormName - frameID:kTestFrameId - value:kTestFieldValue - userInitiated:YES]; + [[delegate expect] autofillController:autofill_controller_ + didInputInFieldWithIdentifier:kTestFieldIdentifier + fieldType:@"" + formName:kTestFormName + frameID:kTestFrameId + value:kTestFieldValue + userInitiated:YES]; - autofill::FormActivityParams params; - params.form_name = base::SysNSStringToUTF8(kTestFormName); - params.field_identifier = base::SysNSStringToUTF8(kTestFieldIdentifier); - params.value = base::SysNSStringToUTF8(kTestFieldValue); - params.frame_id = base::SysNSStringToUTF8(kTestFrameId); - params.type = "input"; - params.has_user_gesture = true; - web::FakeWebFrame frame(base::SysNSStringToUTF8(kTestFrameId), true, - GURL::EmptyGURL()); - test_form_activity_tab_helper_->FormActivityRegistered(&frame, params); - [delegate verify]; - } + autofill::FormActivityParams params; + params.form_name = base::SysNSStringToUTF8(kTestFormName); + params.field_identifier = base::SysNSStringToUTF8(kTestFieldIdentifier); + params.value = base::SysNSStringToUTF8(kTestFieldValue); + params.frame_id = base::SysNSStringToUTF8(kTestFrameId); + params.type = "input"; + params.has_user_gesture = true; + web::FakeWebFrame frame(base::SysNSStringToUTF8(kTestFrameId), true, + GURL::EmptyGURL()); + form_activity_tab_helper_->FormActivityRegistered(&frame, params); + [delegate verify]; } // Tests CWVAutofillController delegate blur callback is invoked. @@ -354,9 +365,6 @@ id delegate = OCMProtocolMock(@protocol(CWVAutofillControllerDelegate)); autofill_controller_.delegate = delegate; - // [delegate expect] returns an autoreleased object, but it must be destroyed - // before this test exits to avoid holding on to |autofill_controller_|. - @autoreleasepool { [[delegate expect] autofillController:autofill_controller_ didBlurOnFieldWithIdentifier:kTestFieldIdentifier fieldType:@"" @@ -374,10 +382,9 @@ params.has_user_gesture = true; web::FakeWebFrame frame(base::SysNSStringToUTF8(kTestFrameId), true, GURL::EmptyGURL()); - test_form_activity_tab_helper_->FormActivityRegistered(&frame, params); + form_activity_tab_helper_->FormActivityRegistered(&frame, params); [delegate verify]; - } } // Tests CWVAutofillController delegate submit callback is invoked. @@ -385,16 +392,13 @@ id delegate = OCMProtocolMock(@protocol(CWVAutofillControllerDelegate)); autofill_controller_.delegate = delegate; - // [delegate expect] returns an autoreleased object, but it must be destroyed - // before this test exits to avoid holding on to |autofill_controller_|. - @autoreleasepool { [[delegate expect] autofillController:autofill_controller_ didSubmitFormWithName:kTestFormName frameID:kTestFrameId userInitiated:YES]; web::FakeWebFrame frame(base::SysNSStringToUTF8(kTestFrameId), true, GURL::EmptyGURL()); - test_form_activity_tab_helper_->DocumentSubmitted( + form_activity_tab_helper_->DocumentSubmitted( /*sender_frame*/ &frame, base::SysNSStringToUTF8(kTestFormName), /*form_data=*/"", /*user_initiated=*/true, @@ -405,14 +409,13 @@ frameID:kTestFrameId userInitiated:NO]; - test_form_activity_tab_helper_->DocumentSubmitted( + form_activity_tab_helper_->DocumentSubmitted( /*sender_frame*/ &frame, base::SysNSStringToUTF8(kTestFormName), /*form_data=*/"", /*user_initiated=*/false, /*is_main_frame=*/true); [delegate verify]; - } } } // namespace ios_web_view
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h index f60ac22e..39701d2e 100644 --- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h +++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
@@ -13,32 +13,36 @@ #include "base/memory/weak_ptr.h" #include "components/autofill/core/browser/autocomplete_history_manager.h" #include "components/autofill/core/browser/autofill_client.h" +#include "components/autofill/core/browser/logging/log_manager.h" #include "components/autofill/core/browser/payments/card_unmask_delegate.h" #include "components/autofill/core/browser/payments/legal_message_line.h" #include "components/autofill/core/browser/payments/strike_database.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/prefs/pref_service.h" #include "components/sync/driver/sync_service.h" +#import "ios/web/public/web_state.h" #import "ios/web_view/internal/autofill/cwv_autofill_client_ios_bridge.h" - -namespace web { -class WebState; -} +#include "ios/web_view/internal/web_view_browser_state.h" namespace autofill { // WebView implementation of AutofillClient. class WebViewAutofillClientIOS : public AutofillClient { public: + static std::unique_ptr<WebViewAutofillClientIOS> Create( + web::WebState* web_state, + ios_web_view::WebViewBrowserState* browser_state); + WebViewAutofillClientIOS( + const std::string& locale, PrefService* pref_service, PersonalDataManager* personal_data_manager, AutocompleteHistoryManager* autocomplete_history_manager, web::WebState* web_state, - id<CWVAutofillClientIOSBridge> bridge, signin::IdentityManager* identity_manager, StrikeDatabase* strike_database, - syncer::SyncService* sync_service); + syncer::SyncService* sync_service, + std::unique_ptr<autofill::LogManager> log_manager); ~WebViewAutofillClientIOS() override; // AutofillClient: @@ -125,6 +129,8 @@ LogManager* GetLogManager() const override; + void set_bridge(id<CWVAutofillClientIOSBridge> bridge) { bridge_ = bridge; } + private: PrefService* pref_service_; PersonalDataManager* personal_data_manager_;
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm index 3d077212..8600300 100644 --- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm +++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
@@ -10,15 +10,20 @@ #include "base/logging.h" #include "base/memory/ptr_util.h" #include "components/autofill/core/browser/form_data_importer.h" -#include "components/autofill/core/browser/logging/log_manager.h" +#include "components/autofill/core/browser/logging/log_router.h" #include "components/autofill/core/browser/payments/payments_client.h" #include "components/autofill/core/common/autofill_prefs.h" #include "components/autofill/ios/browser/autofill_util.h" #include "components/security_state/ios/security_state_utils.h" +#include "ios/web/public/browser_state.h" #import "ios/web/public/web_state.h" #include "ios/web_view/internal/app/application_context.h" +#include "ios/web_view/internal/autofill/web_view_autocomplete_history_manager_factory.h" #import "ios/web_view/internal/autofill/web_view_autofill_log_router_factory.h" -#include "ios/web_view/internal/web_view_browser_state.h" +#include "ios/web_view/internal/autofill/web_view_personal_data_manager_factory.h" +#include "ios/web_view/internal/autofill/web_view_strike_database_factory.h" +#include "ios/web_view/internal/signin/web_view_identity_manager_factory.h" +#import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" @@ -28,20 +33,47 @@ namespace autofill { +// static +std::unique_ptr<WebViewAutofillClientIOS> WebViewAutofillClientIOS::Create( + web::WebState* web_state, + ios_web_view::WebViewBrowserState* browser_state) { + return std::make_unique<autofill::WebViewAutofillClientIOS>( + ios_web_view::ApplicationContext::GetInstance()->GetApplicationLocale(), + browser_state->GetPrefs(), + ios_web_view::WebViewPersonalDataManagerFactory::GetForBrowserState( + browser_state->GetRecordingBrowserState()), + ios_web_view::WebViewAutocompleteHistoryManagerFactory:: + GetForBrowserState(browser_state), + web_state, + ios_web_view::WebViewIdentityManagerFactory::GetForBrowserState( + browser_state->GetRecordingBrowserState()), + ios_web_view::WebViewStrikeDatabaseFactory::GetForBrowserState( + browser_state->GetRecordingBrowserState()), + ios_web_view::WebViewProfileSyncServiceFactory::GetForBrowserState( + browser_state), + // TODO(crbug.com/928595): Replace the closure with a callback to the + // renderer that indicates if log messages should be sent from the + // renderer. + LogManager::Create( + autofill::WebViewAutofillLogRouterFactory::GetForBrowserState( + browser_state), + base::Closure())); +} + WebViewAutofillClientIOS::WebViewAutofillClientIOS( + const std::string& locale, PrefService* pref_service, PersonalDataManager* personal_data_manager, AutocompleteHistoryManager* autocomplete_history_manager, web::WebState* web_state, - id<CWVAutofillClientIOSBridge> bridge, signin::IdentityManager* identity_manager, StrikeDatabase* strike_database, - syncer::SyncService* sync_service) + syncer::SyncService* sync_service, + std::unique_ptr<autofill::LogManager> log_manager) : pref_service_(pref_service), personal_data_manager_(personal_data_manager), autocomplete_history_manager_(autocomplete_history_manager), web_state_(web_state), - bridge_(bridge), identity_manager_(identity_manager), payments_client_(std::make_unique<payments::PaymentsClient>( base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( @@ -49,22 +81,14 @@ identity_manager_, personal_data_manager_, web_state_->GetBrowserState()->IsOffTheRecord())), - form_data_importer_(std::make_unique<FormDataImporter>( - this, - payments_client_.get(), - personal_data_manager_, - ios_web_view::ApplicationContext::GetInstance() - ->GetApplicationLocale())), + form_data_importer_( + std::make_unique<FormDataImporter>(this, + payments_client_.get(), + personal_data_manager_, + locale)), strike_database_(strike_database), sync_service_(sync_service), - // TODO(crbug.com/928595): Replace the closure with a callback to the - // renderer that indicates if log messages should be sent from the - // renderer. - log_manager_(LogManager::Create( - autofill::WebViewAutofillLogRouterFactory::GetForBrowserState( - ios_web_view::WebViewBrowserState::FromBrowserState( - web_state->GetBrowserState())), - base::Closure())) {} + log_manager_(std::move(log_manager)) {} WebViewAutofillClientIOS::~WebViewAutofillClientIOS() { HideAutofillPopup(PopupHidingReason::kTabGone);
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm index 46c96f5e..42ad654 100644 --- a/ios/web_view/internal/cwv_web_view.mm +++ b/ios/web_view/internal/cwv_web_view.mm
@@ -38,7 +38,9 @@ #import "ios/web/public/web_state_delegate_bridge.h" #import "ios/web/public/web_state_observer_bridge.h" #import "ios/web/public/web_view_only/wk_web_view_configuration_util.h" +#include "ios/web_view/internal/app/application_context.h" #import "ios/web_view/internal/autofill/cwv_autofill_controller_internal.h" +#import "ios/web_view/internal/autofill/web_view_autofill_client_ios.h" #import "ios/web_view/internal/cwv_back_forward_list_internal.h" #import "ios/web_view/internal/cwv_favicon_internal.h" #import "ios/web_view/internal/cwv_html_element_internal.h" @@ -634,6 +636,8 @@ } - (CWVAutofillController*)newAutofillController { + auto autofillClient = autofill::WebViewAutofillClientIOS::Create( + _webState.get(), _configuration.browserState); AutofillAgent* autofillAgent = [[AutofillAgent alloc] initWithPrefService:_configuration.browserState->GetPrefs() webState:_webState.get()]; @@ -660,11 +664,15 @@ passwordManagerClient:std::move(passwordManagerClient) passwordManagerDriver:std::move(passwordManagerDriver)]; - return [[CWVAutofillController alloc] initWithWebState:_webState.get() - autofillAgent:autofillAgent - JSAutofillManager:JSAutofillManager - JSSuggestionManager:JSSuggestionManager - passwordController:passwordController]; + return [[CWVAutofillController alloc] + initWithWebState:_webState.get() + autofillClient:std::move(autofillClient) + autofillAgent:autofillAgent + JSAutofillManager:JSAutofillManager + JSSuggestionManager:JSSuggestionManager + passwordController:passwordController + applicationLocale:ios_web_view::ApplicationContext::GetInstance() + ->GetApplicationLocale()]; } #pragma mark - Preserving and Restoring State
diff --git a/ios/web_view/internal/cwv_web_view_configuration.mm b/ios/web_view/internal/cwv_web_view_configuration.mm index 23e1f64..cdedb07e 100644 --- a/ios/web_view/internal/cwv_web_view_configuration.mm +++ b/ios/web_view/internal/cwv_web_view_configuration.mm
@@ -19,7 +19,6 @@ #import "ios/web_view/internal/cwv_web_view_internal.h" #import "ios/web_view/internal/passwords/web_view_account_password_store_factory.h" #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h" -#include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h" #import "ios/web_view/internal/sync/cwv_sync_controller_internal.h" #import "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h" #include "ios/web_view/internal/web_view_browser_state.h" @@ -147,14 +146,10 @@ signin::IdentityManager* identityManager = ios_web_view::WebViewIdentityManagerFactory::GetForBrowserState( self.browserState); - SigninErrorController* signinErrorController = - ios_web_view::WebViewSigninErrorControllerFactory::GetForBrowserState( - self.browserState); - - _syncController = - [[CWVSyncController alloc] initWithSyncService:syncService - identityManager:identityManager - signinErrorController:signinErrorController]; + _syncController = [[CWVSyncController alloc] + initWithSyncService:syncService + identityManager:identityManager + prefService:_browserState->GetPrefs()]; } return _syncController; } @@ -179,7 +174,6 @@ for (CWVWebView* webView in _webViews) { [webView shutDown]; } - [_syncController shutDown]; _browserState.reset(); }
diff --git a/ios/web_view/internal/signin/web_view_signin_error_controller_factory.h b/ios/web_view/internal/signin/web_view_signin_error_controller_factory.h deleted file mode 100644 index 06a2be5..0000000 --- a/ios/web_view/internal/signin/web_view_signin_error_controller_factory.h +++ /dev/null
@@ -1,44 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef IOS_WEB_VIEW_INTERNAL_SIGNIN_WEB_VIEW_SIGNIN_ERROR_CONTROLLER_FACTORY_H_ -#define IOS_WEB_VIEW_INTERNAL_SIGNIN_WEB_VIEW_SIGNIN_ERROR_CONTROLLER_FACTORY_H_ - -#include <memory> - -#include "base/macros.h" -#include "base/no_destructor.h" -#include "components/keyed_service/ios/browser_state_keyed_service_factory.h" - -class SigninErrorController; - -namespace ios_web_view { - -class WebViewBrowserState; - -// Singleton that owns all SigninErrorControllers and associates them with -// a browser state. -class WebViewSigninErrorControllerFactory - : public BrowserStateKeyedServiceFactory { - public: - static SigninErrorController* GetForBrowserState( - ios_web_view::WebViewBrowserState* browser_state); - static WebViewSigninErrorControllerFactory* GetInstance(); - - private: - friend class base::NoDestructor<WebViewSigninErrorControllerFactory>; - - WebViewSigninErrorControllerFactory(); - ~WebViewSigninErrorControllerFactory() override = default; - - // BrowserStateKeyedServiceFactory implementation. - std::unique_ptr<KeyedService> BuildServiceInstanceFor( - web::BrowserState* context) const override; - - DISALLOW_COPY_AND_ASSIGN(WebViewSigninErrorControllerFactory); -}; - -} // namespace ios_web_view - -#endif // IOS_WEB_VIEW_INTERNAL_SIGNIN_WEB_VIEW_SIGNIN_ERROR_CONTROLLER_FACTORY_H_
diff --git a/ios/web_view/internal/signin/web_view_signin_error_controller_factory.mm b/ios/web_view/internal/signin/web_view_signin_error_controller_factory.mm deleted file mode 100644 index 08feb4c..0000000 --- a/ios/web_view/internal/signin/web_view_signin_error_controller_factory.mm +++ /dev/null
@@ -1,53 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h" - -#include <utility> - -#include "base/no_destructor.h" -#include "components/keyed_service/core/service_access_type.h" -#include "components/keyed_service/ios/browser_state_dependency_manager.h" -#include "components/signin/core/browser/signin_error_controller.h" -#include "ios/web_view/internal/signin/web_view_identity_manager_factory.h" -#include "ios/web_view/internal/web_view_browser_state.h" - -#if !defined(__has_feature) || !__has_feature(objc_arc) -#error "This file requires ARC support." -#endif - -namespace ios_web_view { - -// static -SigninErrorController* WebViewSigninErrorControllerFactory::GetForBrowserState( - ios_web_view::WebViewBrowserState* browser_state) { - return static_cast<SigninErrorController*>( - GetInstance()->GetServiceForBrowserState(browser_state, true)); -} - -// static -WebViewSigninErrorControllerFactory* -WebViewSigninErrorControllerFactory::GetInstance() { - static base::NoDestructor<WebViewSigninErrorControllerFactory> instance; - return instance.get(); -} - -WebViewSigninErrorControllerFactory::WebViewSigninErrorControllerFactory() - : BrowserStateKeyedServiceFactory( - "SigninErrorController", - BrowserStateDependencyManager::GetInstance()) { - DependsOn(WebViewIdentityManagerFactory::GetInstance()); -} - -std::unique_ptr<KeyedService> -WebViewSigninErrorControllerFactory::BuildServiceInstanceFor( - web::BrowserState* context) const { - WebViewBrowserState* browser_state = - WebViewBrowserState::FromBrowserState(context); - return std::make_unique<SigninErrorController>( - SigninErrorController::AccountMode::ANY_ACCOUNT, - WebViewIdentityManagerFactory::GetForBrowserState(browser_state)); -} - -} // namespace ios_web_view
diff --git a/ios/web_view/internal/sync/cwv_sync_controller.mm b/ios/web_view/internal/sync/cwv_sync_controller.mm index 3e90d97..836202d86 100644 --- a/ios/web_view/internal/sync/cwv_sync_controller.mm +++ b/ios/web_view/internal/sync/cwv_sync_controller.mm
@@ -7,19 +7,15 @@ #import <UIKit/UIKit.h> #include <memory> -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/callback_helpers.h" #include "base/strings/sys_string_conversions.h" -#include "base/time/time.h" -#include "components/signin/core/browser/signin_error_controller.h" +#include "components/autofill/core/common/autofill_prefs.h" +#include "components/password_manager/core/browser/password_manager_util.h" #include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/device_accounts_synchronizer.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/primary_account_mutator.h" #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_user_settings.h" -#include "ios/web/public/thread/web_thread.h" #import "ios/web_view/public/cwv_identity.h" #import "ios/web_view/public/cwv_sync_controller_data_source.h" #import "ios/web_view/public/cwv_sync_controller_delegate.h" @@ -30,6 +26,12 @@ NSErrorDomain const CWVSyncErrorDomain = @"org.chromium.chromewebview.SyncErrorDomain"; +NSErrorUserInfoKey const CWVSyncErrorDescriptionKey = + @"org.chromium.chromewebview.SyncErrorDescriptionKey"; +NSErrorUserInfoKey const CWVSyncErrorMessageKey = + @"org.chromium.chromewebview.SyncErrorMessageKey"; +NSErrorUserInfoKey const CWVSyncErrorIsTransientKey = + @"org.chromium.chromewebview.SyncErrorIsTransientKey"; namespace { CWVSyncError CWVConvertGoogleServiceAuthErrorStateToCWVSyncError( @@ -60,18 +62,13 @@ @interface CWVSyncController () -// Called by WebViewSyncControllerObserverBridge's -// |OnSyncConfigurationCompleted|. -- (void)didCompleteSyncConfiguration; // Called by WebViewSyncControllerObserverBridge's |OnSyncShutdown|. - (void)didShutdownSync; -// Called by WebViewSyncControllerObserverBridge's |OnErrorChanged|. -- (void)didUpdateAuthError; -// Called by WebViewSyncControllerObserverBridge's |OnPrimaryAccountCleared|. -- (void)didClearPrimaryAccount; +// Called by WebViewSyncControllerObserverBridge's |OnStateChanged|. +- (void)syncStateDidChange; -// Call to refresh access tokens for |currentIdentity|. -- (void)reloadCredentials; +// Call to reload accounts from the |dataSource|. +- (void)reloadAccounts; @end @@ -79,33 +76,20 @@ // Bridge that observes syncer::SyncService and calls analagous // methods on CWVSyncController. -class WebViewSyncControllerObserverBridge - : public syncer::SyncServiceObserver, - public signin::IdentityManager::Observer, - public SigninErrorController::Observer { +class WebViewSyncControllerObserverBridge : public syncer::SyncServiceObserver { public: explicit WebViewSyncControllerObserverBridge( CWVSyncController* sync_controller) : sync_controller_(sync_controller) {} - // syncer::SyncServiceObserver: - void OnSyncConfigurationCompleted(syncer::SyncService* sync) override { - [sync_controller_ didCompleteSyncConfiguration]; + void OnStateChanged(syncer::SyncService* sync) override { + [sync_controller_ syncStateDidChange]; } void OnSyncShutdown(syncer::SyncService* sync) override { [sync_controller_ didShutdownSync]; } - // signin::IdentityManager::Observer - void OnPrimaryAccountCleared( - const CoreAccountInfo& previous_primary_account_info) override { - [sync_controller_ didClearPrimaryAccount]; - } - - // SigninErrorController::Observer: - void OnErrorChanged() override { [sync_controller_ didUpdateAuthError]; } - private: __weak CWVSyncController* sync_controller_; }; @@ -115,13 +99,12 @@ @implementation CWVSyncController { syncer::SyncService* _syncService; signin::IdentityManager* _identityManager; - SigninErrorController* _signinErrorController; std::unique_ptr<ios_web_view::WebViewSyncControllerObserverBridge> _observer; + PrefService* _prefService; + syncer::SyncService::TransportState _lastTransportState; + GoogleServiceAuthError _lastAuthError; } -@synthesize currentIdentity = _currentIdentity; -@synthesize delegate = _delegate; - namespace { // Data source that can provide access tokens. __weak id<CWVSyncControllerDataSource> gSyncDataSource; @@ -137,32 +120,21 @@ - (instancetype)initWithSyncService:(syncer::SyncService*)syncService identityManager:(signin::IdentityManager*)identityManager - signinErrorController: - (SigninErrorController*)signinErrorController { + prefService:(PrefService*)prefService { self = [super init]; if (self) { _syncService = syncService; _identityManager = identityManager; - _signinErrorController = signinErrorController; + _prefService = prefService; _observer = std::make_unique<ios_web_view::WebViewSyncControllerObserverBridge>( self); _syncService->AddObserver(_observer.get()); - _identityManager->AddObserver(_observer.get()); - _signinErrorController->AddObserver(_observer.get()); - - if (_identityManager->HasPrimaryAccount()) { - CoreAccountInfo accountInfo = _identityManager->GetPrimaryAccountInfo(); - _currentIdentity = [[CWVIdentity alloc] - initWithEmail:base::SysUTF8ToNSString(accountInfo.email) - fullName:nil - gaiaID:base::SysUTF8ToNSString(accountInfo.gaia)]; - } // Refresh access tokens on foreground to extend expiration dates. [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(reloadCredentials) + selector:@selector(reloadAccounts) name:UIApplicationWillEnterForegroundNotification object:nil]; } @@ -171,23 +143,31 @@ - (void)dealloc { _syncService->RemoveObserver(_observer.get()); - _identityManager->RemoveObserver(_observer.get()); - _signinErrorController->RemoveObserver(_observer.get()); } #pragma mark - Public Methods +- (CWVIdentity*)currentIdentity { + if (_identityManager->HasPrimaryAccount()) { + CoreAccountInfo accountInfo = _identityManager->GetPrimaryAccountInfo(); + return [[CWVIdentity alloc] + initWithEmail:base::SysUTF8ToNSString(accountInfo.email) + fullName:nil + gaiaID:base::SysUTF8ToNSString(accountInfo.gaia)]; + } + + return nil; +} + - (BOOL)isPassphraseNeeded { return _syncService->GetUserSettings() ->IsPassphraseRequiredForPreferredDataTypes(); } - (void)startSyncWithIdentity:(CWVIdentity*)identity { - DCHECK(!_currentIdentity) + DCHECK(!self.currentIdentity) << "Already syncing! Call -stopSyncAndClearIdentity first."; - _currentIdentity = identity; - const CoreAccountId accountId = _identityManager->PickAccountIdForAccount( base::SysNSStringToUTF8(identity.gaiaID), base::SysNSStringToUTF8(identity.email)); @@ -198,6 +178,13 @@ _identityManager->GetPrimaryAccountMutator()->SetPrimaryAccount(accountId); CHECK_EQ(_identityManager->GetPrimaryAccountId(), accountId); + + autofill::prefs::SetUserOptedInWalletSyncTransport(_prefService, accountId, + /*opted_in=*/true); + password_manager_util::SetDefaultPasswordStore( + _prefService, _syncService, autofill::PasswordForm::Store::kAccountStore); + password_manager_util::SetAccountStorageOptIn(_prefService, _syncService, + /*opt_in=*/true); } - (void)stopSyncAndClearIdentity { @@ -215,58 +202,57 @@ #pragma mark - Private Methods -- (void)didCompleteSyncConfiguration { - if ([_delegate respondsToSelector:@selector(syncControllerDidStartSync:)]) { - [_delegate syncControllerDidStartSync:self]; - } -} - - (void)didShutdownSync { _syncService->RemoveObserver(_observer.get()); - _signinErrorController->RemoveObserver(_observer.get()); } -- (void)reloadCredentials { +- (void)syncStateDidChange { + if (_lastTransportState != _syncService->GetTransportState()) { + _lastTransportState = _syncService->GetTransportState(); + + if (_lastTransportState == syncer::SyncService::TransportState::ACTIVE) { + if ([_delegate + respondsToSelector:@selector(syncControllerDidStartSync:)]) { + [_delegate syncControllerDidStartSync:self]; + } + } else if (_lastTransportState == + syncer::SyncService::TransportState::DISABLED) { + if ([_delegate + respondsToSelector:@selector(syncControllerDidStopSync:)]) { + [_delegate syncControllerDidStopSync:self]; + } + } + } + + if (_lastAuthError.state() != _syncService->GetAuthError().state()) { + _lastAuthError = _syncService->GetAuthError(); + + CWVSyncError code = CWVConvertGoogleServiceAuthErrorStateToCWVSyncError( + _lastAuthError.state()); + if (code != CWVSyncErrorNone && + [_delegate respondsToSelector:@selector(syncController: + didFailWithError:)]) { + NSString* description = + base::SysUTF8ToNSString(_lastAuthError.ToString()); + NSString* message = + base::SysUTF8ToNSString(_lastAuthError.error_message()); + BOOL isTransient = _lastAuthError.IsTransientError(); + NSError* error = + [NSError errorWithDomain:CWVSyncErrorDomain + code:code + userInfo:@{ + CWVSyncErrorDescriptionKey : description, + CWVSyncErrorMessageKey : message, + CWVSyncErrorIsTransientKey : @(isTransient), + }]; + [_delegate syncController:self didFailWithError:error]; + } + } +} + +- (void)reloadAccounts { _identityManager->GetDeviceAccountsSynchronizer() ->ReloadAllAccountsFromSystem(); } -#pragma mark - Internal Methods - -- (void)shutDown { - _syncService->RemoveObserver(_observer.get()); - _identityManager->RemoveObserver(_observer.get()); - _signinErrorController->RemoveObserver(_observer.get()); -} - -- (void)didClearPrimaryAccount { - _currentIdentity = nil; - if ([_delegate respondsToSelector:@selector(syncControllerDidStopSync:)]) { - [_delegate syncControllerDidStopSync:self]; - } -} - -- (void)didUpdateAuthError { - GoogleServiceAuthError authError = _signinErrorController->auth_error(); - CWVSyncError code = - CWVConvertGoogleServiceAuthErrorStateToCWVSyncError(authError.state()); - if (code != CWVSyncErrorNone) { - NSError* error = - [NSError errorWithDomain:CWVSyncErrorDomain - code:code - userInfo:@{ - NSLocalizedDescriptionKey : - base::SysUTF8ToNSString(authError.ToString()) - }]; - [self invokeDelegateDidFailWithError:error]; - } -} - -- (void)invokeDelegateDidFailWithError:(NSError*)error { - if ([_delegate respondsToSelector:@selector(syncController: - didFailWithError:)]) { - [_delegate syncController:self didFailWithError:error]; - } -} - @end
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_internal.h b/ios/web_view/internal/sync/cwv_sync_controller_internal.h index fd1da81..4812abda 100644 --- a/ios/web_view/internal/sync/cwv_sync_controller_internal.h +++ b/ios/web_view/internal/sync/cwv_sync_controller_internal.h
@@ -17,21 +17,16 @@ class IdentityManager; } // namespace signin -class SigninErrorController; +class PrefService; @interface CWVSyncController () // All dependencies must out live this class. -- (instancetype) - initWithSyncService:(syncer::SyncService*)syncService - identityManager:(signin::IdentityManager*)identityManager - signinErrorController:(SigninErrorController*)signinErrorController +- (instancetype)initWithSyncService:(syncer::SyncService*)syncService + identityManager:(signin::IdentityManager*)identityManager + prefService:(PrefService*)prefService NS_DESIGNATED_INITIALIZER; -// Called by the associated CWVWebViewConfiguration in order to shut -// down cleanly. See CWVWebViewConfiguration's |shutDown| method for more info. -- (void)shutDown; - @end NS_ASSUME_NONNULL_END
diff --git a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm index fe0eeac..4aa87b2 100644 --- a/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm +++ b/ios/web_view/internal/sync/cwv_sync_controller_unittest.mm
@@ -10,34 +10,31 @@ #include "base/bind_helpers.h" #include "base/callback.h" #include "base/files/file_path.h" +#include "base/strings/sys_string_conversions.h" #include "base/test/bind_test_util.h" -#import "base/test/ios/wait_util.h" -#include "components/signin/core/browser/signin_error_controller.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" +#include "components/autofill/core/common/autofill_prefs.h" +#include "components/image_fetcher/ios/ios_image_decoder_impl.h" +#include "components/password_manager/core/browser/password_manager_util.h" +#include "components/password_manager/core/common/password_manager_features.h" +#include "components/password_manager/core/common/password_manager_pref_names.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/testing_pref_service.h" #include "components/signin/public/base/account_consistency_method.h" #include "components/signin/public/base/signin_pref_names.h" -#include "components/signin/public/identity_manager/identity_test_utils.h" +#include "components/signin/public/base/test_signin_client.h" +#include "components/signin/public/identity_manager/device_accounts_synchronizer.h" +#include "components/signin/public/identity_manager/identity_manager_builder.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/signin/public/identity_manager/primary_account_mutator.h" -#include "components/sync/driver/mock_sync_service.h" #include "components/sync/driver/sync_service_observer.h" +#include "components/sync/driver/test_sync_service.h" #include "google_apis/gaia/google_service_auth_error.h" -#import "ios/web/public/test/fakes/test_web_state.h" -#include "ios/web/public/test/scoped_testing_web_client.h" -#include "ios/web/public/test/web_task_environment.h" -#include "ios/web/public/web_client.h" -#include "ios/web_view/internal/app/application_context.h" -#include "ios/web_view/internal/signin/ios_web_view_signin_client.h" #include "ios/web_view/internal/signin/web_view_device_accounts_provider_impl.h" -#include "ios/web_view/internal/signin/web_view_identity_manager_factory.h" -#include "ios/web_view/internal/signin/web_view_signin_client_factory.h" -#include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h" -#include "ios/web_view/internal/sync/web_view_profile_sync_service_factory.h" -#include "ios/web_view/internal/web_view_browser_state.h" #import "ios/web_view/public/cwv_identity.h" #import "ios/web_view/public/cwv_sync_controller_data_source.h" #import "ios/web_view/public/cwv_sync_controller_delegate.h" -#include "ios/web_view/test/test_with_locale_and_resources.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" -#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #import "testing/gtest_mac.h" #include "testing/platform_test.h" @@ -50,175 +47,141 @@ namespace ios_web_view { namespace { -using testing::_; -using testing::Invoke; -using testing::Return; - -const char kTestGaiaId[] = "1337"; const char kTestEmail[] = "johndoe@chromium.org"; -const char kTestFullName[] = "John Doe"; -const char kTestPassphrase[] = "dummy-passphrase"; -const char kTestScope1[] = "scope1.chromium.org"; -const char kTestScope2[] = "scope2.chromium.org"; - -using base::test::ios::kWaitForActionTimeout; -using base::test::ios::WaitUntilConditionOrTimeout; - -std::unique_ptr<KeyedService> BuildMockSyncService(web::BrowserState* context) { - return std::make_unique<syncer::MockSyncService>(); -} } // namespace -class CWVSyncControllerTest : public TestWithLocaleAndResources { +class CWVSyncControllerTest : public PlatformTest { protected: - CWVSyncControllerTest() - : web_client_(std::make_unique<web::WebClient>()), - browser_state_(/*off_the_record=*/false) { - // Clear account info before each test. - PrefService* pref_service = browser_state_.GetPrefs(); - pref_service->ClearPref(prefs::kGoogleServicesAccountId); - pref_service->ClearPref(prefs::kGoogleServicesConsentedToSync); - pref_service->ClearPref(prefs::kAccountInfo); + CWVSyncControllerTest() { + scoped_feature_.InitAndEnableFeature( + password_manager::features::kEnablePasswordsAccountStorage); - WebViewProfileSyncServiceFactory::GetInstance()->SetTestingFactory( - &browser_state_, base::BindRepeating(&BuildMockSyncService)); + pref_service_.registry()->RegisterDictionaryPref( + autofill::prefs::kAutofillSyncTransportOptIn); + pref_service_.registry()->RegisterDictionaryPref( + password_manager::prefs::kAccountStoragePerAccountSettings); - EXPECT_CALL(*mock_sync_service(), AddObserver(_)) - .WillOnce(Invoke(this, &CWVSyncControllerTest::AddObserver)); - - sync_controller_ = [[CWVSyncController alloc] - initWithSyncService:mock_sync_service() - identityManager:identity_manager() - signinErrorController:signin_error_controller()]; + // Change the default transport state to be disabled. + sync_service_.SetTransportState( + syncer::SyncService::TransportState::DISABLED); } - ~CWVSyncControllerTest() override { - EXPECT_CALL(*mock_sync_service(), RemoveObserver(_)); - EXPECT_CALL(*mock_sync_service(), Shutdown()); - } - - void AddObserver(syncer::SyncServiceObserver* observer) { - sync_service_observer_ = observer; - } - - signin::IdentityManager* identity_manager() { - return WebViewIdentityManagerFactory::GetForBrowserState(&browser_state_); - } - - syncer::MockSyncService* mock_sync_service() { - return static_cast<syncer::MockSyncService*>( - WebViewProfileSyncServiceFactory::GetForBrowserState(&browser_state_)); - } - - SigninErrorController* signin_error_controller() { - return WebViewSigninErrorControllerFactory::GetForBrowserState( - &browser_state_); - } - - web::WebTaskEnvironment task_environment_; - web::ScopedTestingWebClient web_client_; - ios_web_view::WebViewBrowserState browser_state_; - CWVSyncController* sync_controller_ = nil; - syncer::SyncServiceObserver* sync_service_observer_ = nullptr; + base::test::ScopedFeatureList scoped_feature_; + base::test::TaskEnvironment task_environment_; + signin::IdentityTestEnvironment identity_test_environment_; + syncer::TestSyncService sync_service_; + TestingPrefServiceSimple local_state_; + TestingPrefServiceSimple pref_service_; }; -// Verifies CWVSyncControllerDataSource methods are invoked with the correct -// parameters. -TEST_F(CWVSyncControllerTest, DataSourceCallbacks) { - // [data_source expect] returns an autoreleased object, but it must be - // destroyed before this test exits to avoid holding on to |sync_controller_|. - @autoreleasepool { - id data_source = OCMProtocolMock(@protocol(CWVSyncControllerDataSource)); - CWVSyncController.dataSource = data_source; - [[data_source expect] - fetchAccessTokenForIdentity:[OCMArg checkWithBlock:^BOOL( - CWVIdentity* identity) { - return [identity.gaiaID isEqualToString:@(kTestGaiaId)]; - }] - scopes:[OCMArg checkWithBlock:^BOOL( - NSArray* scopes) { - return [scopes containsObject:@(kTestScope1)] && - [scopes containsObject:@(kTestScope2)]; - }] - completionHandler:[OCMArg any]]; +TEST_F(CWVSyncControllerTest, StartSyncWithIdentity) { + CoreAccountInfo account_info = + identity_test_environment_.MakeAccountAvailable(kTestEmail); - WebViewDeviceAccountsProviderImpl accounts_provider; - std::set<std::string> scopes = {kTestScope1, kTestScope2}; - accounts_provider.GetAccessToken(kTestGaiaId, "dummy-client-id", scopes, - base::DoNothing()); + CWVIdentity* identity = [[CWVIdentity alloc] + initWithEmail:@(kTestEmail) + fullName:nil + gaiaID:base::SysUTF8ToNSString(account_info.gaia)]; - [data_source verify]; - } + // Preconfigure TestSyncService as if it was enabled in transport mode. + sync_service_.SetFirstSetupComplete(false); + sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); + sync_service_.SetIsUsingSecondaryPassphrase(false); + sync_service_.SetAuthenticatedAccountInfo(account_info); + + CWVSyncController* sync_controller = [[CWVSyncController alloc] + initWithSyncService:&sync_service_ + identityManager:identity_test_environment_.identity_manager() + prefService:&pref_service_]; + [sync_controller startSyncWithIdentity:identity]; + EXPECT_NSEQ(sync_controller.currentIdentity.gaiaID, identity.gaiaID); + + CoreAccountInfo primary_account_info = + identity_test_environment_.identity_manager()->GetPrimaryAccountInfo(); + EXPECT_EQ(primary_account_info, account_info); + + // Ensure opt-ins for transport only sync data is flipped to true. + EXPECT_TRUE(autofill::prefs::IsUserOptedInWalletSyncTransport( + &pref_service_, primary_account_info.account_id)); + EXPECT_EQ(password_manager_util::GetDefaultPasswordStore(&pref_service_, + &sync_service_), + autofill::PasswordForm::Store::kAccountStore); + EXPECT_TRUE(password_manager_util::IsOptedInForAccountStorage( + &pref_service_, &sync_service_)); } -// Verifies CWVSyncControllerDelegate methods are invoked with the correct -// parameters. -TEST_F(CWVSyncControllerTest, DelegateCallbacks) { - // [delegate expect] returns an autoreleased object, but it must be destroyed - // before this test exits to avoid holding on to |sync_controller_|. - @autoreleasepool { - CWVIdentity* identity = [[CWVIdentity alloc] initWithEmail:@(kTestEmail) - fullName:@(kTestFullName) - gaiaID:@(kTestGaiaId)]; - id data_source = OCMProtocolMock(@protocol(CWVSyncControllerDataSource)); - [[[data_source stub] andReturn:@[ identity ]] allKnownIdentities]; - CWVSyncController.dataSource = data_source; - id delegate = OCMProtocolMock(@protocol(CWVSyncControllerDelegate)); - sync_controller_.delegate = delegate; - [sync_controller_ startSyncWithIdentity:identity]; +TEST_F(CWVSyncControllerTest, StopSyncAndClearIdentity) { + CoreAccountInfo account_info = + identity_test_environment_.MakePrimaryAccountAvailable(kTestEmail); - [[delegate expect] syncControllerDidStartSync:sync_controller_]; - sync_service_observer_->OnSyncConfigurationCompleted(mock_sync_service()); + CWVSyncController* sync_controller = [[CWVSyncController alloc] + initWithSyncService:&sync_service_ + identityManager:identity_test_environment_.identity_manager() + prefService:&pref_service_]; + CWVIdentity* current_identity = sync_controller.currentIdentity; + ASSERT_TRUE(current_identity); + EXPECT_NSEQ(current_identity.gaiaID, + base::SysUTF8ToNSString(account_info.gaia)); + EXPECT_NSEQ(current_identity.email, base::SysUTF8ToNSString(kTestEmail)); - [[delegate expect] - syncController:sync_controller_ - didFailWithError:[OCMArg checkWithBlock:^BOOL(NSError* error) { - return error.code == CWVSyncErrorInvalidGAIACredentials; - }]]; - GoogleServiceAuthError auth_error( - GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS); - signin::UpdatePersistentErrorOfRefreshTokenForAccount( - identity_manager(), identity_manager()->GetPrimaryAccountId(), - auth_error); - - [[delegate expect] syncControllerDidStopSync:sync_controller_]; - [sync_controller_ stopSyncAndClearIdentity]; - - [delegate verify]; - } + [sync_controller stopSyncAndClearIdentity]; + EXPECT_FALSE(sync_controller.currentIdentity); } -// Verifies CWVSyncController properly maintains the current syncing user. -TEST_F(CWVSyncControllerTest, CurrentIdentity) { - CWVIdentity* identity = [[CWVIdentity alloc] initWithEmail:@(kTestEmail) - fullName:@(kTestFullName) - gaiaID:@(kTestGaiaId)]; - id data_source = OCMProtocolMock(@protocol(CWVSyncControllerDataSource)); - [[[data_source stub] andReturn:@[ identity ]] allKnownIdentities]; - CWVSyncController.dataSource = data_source; - [sync_controller_ startSyncWithIdentity:identity]; - CWVIdentity* currentIdentity = sync_controller_.currentIdentity; - EXPECT_TRUE(currentIdentity); - EXPECT_NSEQ(identity.email, currentIdentity.email); - EXPECT_NSEQ(identity.fullName, currentIdentity.fullName); - EXPECT_NSEQ(identity.gaiaID, currentIdentity.gaiaID); - - [sync_controller_ stopSyncAndClearIdentity]; - - EXPECT_FALSE(sync_controller_.currentIdentity); +TEST_F(CWVSyncControllerTest, PassphraseNeeded) { + CWVSyncController* sync_controller = [[CWVSyncController alloc] + initWithSyncService:&sync_service_ + identityManager:identity_test_environment_.identity_manager() + prefService:&pref_service_]; + sync_service_.SetPassphraseRequiredForPreferredDataTypes(false); + EXPECT_FALSE(sync_controller.passphraseNeeded); + sync_service_.SetPassphraseRequiredForPreferredDataTypes(true); + EXPECT_TRUE(sync_controller.passphraseNeeded); } -// Verifies CWVSyncController's passphrase API. -TEST_F(CWVSyncControllerTest, Passphrase) { - EXPECT_CALL(*mock_sync_service()->GetMockUserSettings(), - IsPassphraseRequiredForPreferredDataTypes()) - .WillOnce(Return(true)); - EXPECT_TRUE(sync_controller_.passphraseNeeded); - EXPECT_CALL(*mock_sync_service()->GetMockUserSettings(), - SetDecryptionPassphrase(kTestPassphrase)) - .WillOnce(Return(true)); - EXPECT_TRUE([sync_controller_ unlockWithPassphrase:@(kTestPassphrase)]); +TEST_F(CWVSyncControllerTest, DelegateDidStartAndStopSync) { + CWVSyncController* sync_controller = [[CWVSyncController alloc] + initWithSyncService:&sync_service_ + identityManager:identity_test_environment_.identity_manager() + prefService:&pref_service_]; + + id delegate = OCMStrictProtocolMock(@protocol(CWVSyncControllerDelegate)); + sync_controller.delegate = delegate; + + // TestSyncService's transport state has to actually change before a callback + // will be fired, so we have to start it before we can stop it. + OCMExpect([delegate syncControllerDidStartSync:sync_controller]); + OCMExpect([delegate syncControllerDidStopSync:sync_controller]); + sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE); + sync_service_.FireStateChanged(); + sync_service_.SetTransportState( + syncer::SyncService::TransportState::DISABLED); + sync_service_.FireStateChanged(); + + [delegate verify]; +} + +TEST_F(CWVSyncControllerTest, DelegateDidFailWithError) { + CWVSyncController* sync_controller = [[CWVSyncController alloc] + initWithSyncService:&sync_service_ + identityManager:identity_test_environment_.identity_manager() + prefService:&pref_service_]; + + id delegate = OCMStrictProtocolMock(@protocol(CWVSyncControllerDelegate)); + sync_controller.delegate = delegate; + + OCMExpect([delegate + syncController:sync_controller + didFailWithError:[OCMArg checkWithBlock:^BOOL(NSError* error) { + return error.code == CWVSyncErrorConnectionFailed && + error.domain == CWVSyncErrorDomain && + [error.userInfo[CWVSyncErrorIsTransientKey] boolValue]; + }]]); + sync_service_.SetAuthError(GoogleServiceAuthError::FromConnectionError(0)); + sync_service_.FireStateChanged(); + + [delegate verify]; } } // namespace ios_web_view
diff --git a/ios/web_view/internal/web_view_browser_state.mm b/ios/web_view/internal/web_view_browser_state.mm index 40e7bae..949b4c4 100644 --- a/ios/web_view/internal/web_view_browser_state.mm +++ b/ios/web_view/internal/web_view_browser_state.mm
@@ -42,7 +42,6 @@ #include "ios/web_view/internal/passwords/web_view_password_store_factory.h" #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h" #include "ios/web_view/internal/signin/web_view_signin_client_factory.h" -#include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h" #import "ios/web_view/internal/sync/web_view_gcm_profile_service_factory.h" #import "ios/web_view/internal/sync/web_view_model_type_store_service_factory.h" #import "ios/web_view/internal/sync/web_view_profile_invalidation_provider_factory.h" @@ -186,7 +185,6 @@ WebViewAccountPasswordStoreFactory::GetInstance(); WebViewPasswordStoreFactory::GetInstance(); WebViewSigninClientFactory::GetInstance(); - WebViewSigninErrorControllerFactory::GetInstance(); WebViewIdentityManagerFactory::GetInstance(); WebViewGCMProfileServiceFactory::GetInstance(); WebViewProfileInvalidationProviderFactory::GetInstance();
diff --git a/ios/web_view/internal/web_view_web_main_parts.mm b/ios/web_view/internal/web_view_web_main_parts.mm index 94ab5a6c..5e0e4ae 100644 --- a/ios/web_view/internal/web_view_web_main_parts.mm +++ b/ios/web_view/internal/web_view_web_main_parts.mm
@@ -11,7 +11,6 @@ #include "base/strings/string_util.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_payments_features.h" -#include "components/content_settings/core/common/content_settings_pattern.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/sync/driver/sync_driver_switches.h" #include "ios/web/public/webui/web_ui_ios_controller_factory.h" @@ -73,9 +72,6 @@ void WebViewWebMainParts::PreMainMessageLoopRun() { WebViewTranslateService::GetInstance()->Initialize(); - ContentSettingsPattern::SetNonWildcardDomainNonPortSchemes( - /*schemes=*/nullptr, 0); - web::WebUIIOSControllerFactory::RegisterFactory( WebViewWebUIIOSControllerFactory::GetInstance()); }
diff --git a/ios/web_view/public/cwv_autofill_controller.h b/ios/web_view/public/cwv_autofill_controller.h index cbe8e64..00c498dd 100644 --- a/ios/web_view/public/cwv_autofill_controller.h +++ b/ios/web_view/public/cwv_autofill_controller.h
@@ -65,11 +65,6 @@ - (void)acceptSuggestion:(CWVAutofillSuggestion*)suggestion completionHandler:(nullable void (^)(void))completionHandler; -// Deletes a suggestion from the data store. -// Returns YES if suggestion exists and can be deleted. -// Note that it may take a short while before |suggestion| is no longer fetched. -- (BOOL)removeSuggestion:(CWVAutofillSuggestion*)suggestion; - // Changes focus to the previous sibling of the currently focused field. // No-op if no field is currently focused or if previous field is not available. - (void)focusPreviousField;
diff --git a/ios/web_view/public/cwv_sync_controller.h b/ios/web_view/public/cwv_sync_controller.h index fe452fd..14ef624 100644 --- a/ios/web_view/public/cwv_sync_controller.h +++ b/ios/web_view/public/cwv_sync_controller.h
@@ -17,6 +17,14 @@ // The error domain for sync errors. FOUNDATION_EXPORT CWV_EXPORT NSErrorDomain const CWVSyncErrorDomain; +// NSString description for the type of error. +FOUNDATION_EXPORT CWV_EXPORT + NSErrorUserInfoKey const CWVSyncErrorDescriptionKey; +// NSString message describing the error in more detail. +FOUNDATION_EXPORT CWV_EXPORT NSErrorUserInfoKey const CWVSyncErrorMessageKey; +// NSValue wrapped BOOL indicating if the error is transient. +FOUNDATION_EXPORT CWV_EXPORT + NSErrorUserInfoKey const CWVSyncErrorIsTransientKey; // Possible error codes during syncing. typedef NS_ENUM(NSInteger, CWVSyncError) {
diff --git a/ios/web_view/test/web_view_autofill_inttest.mm b/ios/web_view/test/web_view_autofill_inttest.mm index 74e4368..806fc64 100644 --- a/ios/web_view/test/web_view_autofill_inttest.mm +++ b/ios/web_view/test/web_view_autofill_inttest.mm
@@ -322,30 +322,4 @@ ASSERT_NSEQ(nil, cleared_error); } -// Tests that CWVAutofillController can remove a suggestion. -TEST_F(WebViewAutofillTest, TestSuggestionFetchRemoveFetch) { - ASSERT_TRUE(test_server_->Start()); - ASSERT_TRUE(LoadTestPage()); - ASSERT_TRUE(SetFormFieldValue(kTestNameFieldID, kTestNameFieldValue)); - ASSERT_TRUE(SetFormFieldValue(kTestAddressFieldID, kTestAddressFieldValue)); - ASSERT_TRUE(SetFormFieldValue(kTestStateFieldID, kTestStateFieldValue)); - ASSERT_TRUE(SetFormFieldValue(kTestCityFieldID, kTestCityFieldValue)); - ASSERT_TRUE(SetFormFieldValue(kTestZipFieldID, kTestZipFieldValue)); - ASSERT_TRUE(SubmitForm()); - // Wait for about:blank to be loaded after <form> submitted. - ASSERT_TRUE(WaitUntilPageLoaded()); - ASSERT_TRUE(LoadTestPage()); - - NSArray* fetched_suggestions_after_creating = FetchSuggestions(); - ASSERT_EQ(1U, fetched_suggestions_after_creating.count); - - CWVAutofillSuggestion* suggestion_to_remove = - fetched_suggestions_after_creating.firstObject; - EXPECT_TRUE([autofill_controller_ removeSuggestion:suggestion_to_remove]); - - EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForActionTimeout, ^bool { - return FetchSuggestions().count == 0; - })); -} - } // namespace ios_web_view
diff --git a/media/capabilities/video_decode_stats_db_impl.cc b/media/capabilities/video_decode_stats_db_impl.cc index 4346d68..2190954 100644 --- a/media/capabilities/video_decode_stats_db_impl.cc +++ b/media/capabilities/video_decode_stats_db_impl.cc
@@ -124,7 +124,7 @@ auto proto_db = db_provider->GetDB<DecodeStatsProto>( leveldb_proto::ProtoDbType::VIDEO_DECODE_STATS_DB, db_dir, base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, + {base::MayBlock(), base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})); return base::WrapUnique(new VideoDecodeStatsDBImpl(std::move(proto_db)));
diff --git a/media/capture/video/chromeos/camera_app_device_impl.cc b/media/capture/video/chromeos/camera_app_device_impl.cc index 3120a85..498e409 100644 --- a/media/capture/video/chromeos/camera_app_device_impl.cc +++ b/media/capture/video/chromeos/camera_app_device_impl.cc
@@ -107,16 +107,15 @@ std::move(consumption_callback).Run(std::move(result_task_queue)); } -void CameraAppDeviceImpl::GetFpsRange(const gfx::Size& resolution, - GetFpsRangeCallback callback) { +base::Optional<gfx::Range> CameraAppDeviceImpl::GetFpsRange( + const gfx::Size& resolution) { base::AutoLock lock(fps_ranges_lock_); auto it = resolution_fps_range_map_.find(resolution); if (it == resolution_fps_range_map_.end()) { - std::move(callback).Run({}); - return; + return {}; } - std::move(callback).Run(it->second); + return it->second; } cros::mojom::CaptureIntent CameraAppDeviceImpl::GetCaptureIntent() { @@ -144,19 +143,6 @@ } } -void CameraAppDeviceImpl::SetReprocessResult( - SetReprocessOptionCallback callback, - const int32_t status, - media::mojom::BlobPtr blob) { - auto callback_on_mojo_thread = base::BindOnce( - [](const int32_t status, media::mojom::BlobPtr blob, - SetReprocessOptionCallback callback) { - std::move(callback).Run(status, std::move(blob)); - }, - status, std::move(blob), std::move(callback)); - task_runner_->PostTask(FROM_HERE, std::move(callback_on_mojo_thread)); -} - void CameraAppDeviceImpl::GetCameraInfo(GetCameraInfoCallback callback) { DCHECK(camera_info_); std::move(callback).Run(camera_info_.Clone()); @@ -294,4 +280,17 @@ task->extra_metadata.push_back(std::move(nr_entry)); } +void CameraAppDeviceImpl::SetReprocessResult( + SetReprocessOptionCallback callback, + const int32_t status, + media::mojom::BlobPtr blob) { + auto callback_on_mojo_thread = base::BindOnce( + [](const int32_t status, media::mojom::BlobPtr blob, + SetReprocessOptionCallback callback) { + std::move(callback).Run(status, std::move(blob)); + }, + status, std::move(blob), std::move(callback)); + task_runner_->PostTask(FROM_HERE, std::move(callback_on_mojo_thread)); +} + } // namespace media
diff --git a/media/capture/video/chromeos/camera_app_device_impl.h b/media/capture/video/chromeos/camera_app_device_impl.h index 2f4ae3a..71e772e 100644 --- a/media/capture/video/chromeos/camera_app_device_impl.h +++ b/media/capture/video/chromeos/camera_app_device_impl.h
@@ -42,22 +42,26 @@ constexpr uint32_t kPortraitModeSegmentationResultVendorKey = 0x80000001; constexpr int32_t kReprocessSuccess = 0; +// Implementation of CameraAppDevice that is used as the ommunication bridge +// between Chrome Camera App (CCA) and the ChromeOS Video Capture Device. By +// using this, we can do more complicated operations on cameras which is not +// supported by Chrome API. class CAPTURE_EXPORT CameraAppDeviceImpl : public cros::mojom::CameraAppDevice { public: struct SizeComparator { bool operator()(const gfx::Size& size_1, const gfx::Size& size_2) const; }; - using GetFpsRangeCallback = - base::OnceCallback<void(base::Optional<gfx::Range>)>; - using ResolutionFpsRangeMap = base::flat_map<gfx::Size, gfx::Range, SizeComparator>; + // Retrieve the return code for reprocess |effect| from the |metadata|. static int GetReprocessReturnCode( cros::mojom::Effect effect, const cros::mojom::CameraMetadataPtr* metadata); + // Construct a ReprocessTaskQueue for regular capture with + // |take_photo_callback|. static ReprocessTaskQueue GetSingleShotReprocessOptions( media::mojom::ImageCapture::TakePhotoCallback take_photo_callback); @@ -65,52 +69,52 @@ cros::mojom::CameraInfoPtr camera_info); ~CameraAppDeviceImpl() override; + // Binds the mojo receiver to this implementation. void BindReceiver( mojo::PendingReceiver<cros::mojom::CameraAppDevice> receiver); + // Consumes all the pending reprocess tasks if there is any and eventually + // generates a ReprocessTaskQueue which contains: + // 1. A regular capture task with |take_photo_callback|. + // 2. One or more reprocess tasks if there is any. + // And passes the generated ReprocessTaskQueue through |consumption_callback|. void ConsumeReprocessOptions( media::mojom::ImageCapture::TakePhotoCallback take_photo_callback, base::OnceCallback<void(ReprocessTaskQueue)> consumption_callback); - void GetFpsRange(const gfx::Size& resolution, GetFpsRangeCallback callback); + // Retrieves the corresponding fps range given by stream |resolution|. + base::Optional<gfx::Range> GetFpsRange(const gfx::Size& resolution); + // Gets the capture intent which is specified by the app. cros::mojom::CaptureIntent GetCaptureIntent(); + // Delivers the result |metadata| with its |stream_type| to the metadata + // observers. void OnResultMetadataAvailable(const cros::mojom::CameraMetadataPtr& metadata, const cros::mojom::StreamType stream_type); + // Notifies the camera event observers that the shutter is finished. void OnShutterDone(); - void SetReprocessResult(SetReprocessOptionCallback callback, - const int32_t status, - media::mojom::BlobPtr blob); - // cros::mojom::CameraAppDevice implementations. void GetCameraInfo(GetCameraInfoCallback callback) override; - void SetReprocessOption(cros::mojom::Effect effect, SetReprocessOptionCallback callback) override; - void SetFpsRange(const gfx::Size& resolution, const gfx::Range& fps_range, SetFpsRangeCallback callback) override; - void SetCaptureIntent(cros::mojom::CaptureIntent capture_intent, SetCaptureIntentCallback callback) override; - void AddResultMetadataObserver( mojo::PendingRemote<cros::mojom::ResultMetadataObserver> observer, cros::mojom::StreamType streamType, AddResultMetadataObserverCallback callback) override; - void RemoveResultMetadataObserver( uint32_t id, RemoveResultMetadataObserverCallback callback) override; - void AddCameraEventObserver( mojo::PendingRemote<cros::mojom::CameraEventObserver> observer, AddCameraEventObserverCallback callback) override; - void RemoveCameraEventObserver( uint32_t id, RemoveCameraEventObserverCallback callback) override; @@ -118,6 +122,10 @@ private: static void DisableEeNr(ReprocessTask* task); + void SetReprocessResult(SetReprocessOptionCallback callback, + const int32_t status, + media::mojom::BlobPtr blob); + std::string device_id_; mojo::ReceiverSet<cros::mojom::CameraAppDevice> receivers_; @@ -126,34 +134,33 @@ const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + // The queue will be enqueued and dequeued from different threads. base::Lock reprocess_tasks_lock_; + base::queue<ReprocessTask> reprocess_task_queue_ + GUARDED_BY(reprocess_tasks_lock_); - base::queue<ReprocessTask> reprocess_task_queue_; - + // The map will be inserted and read from different threads. base::Lock fps_ranges_lock_; + ResolutionFpsRangeMap resolution_fps_range_map_ GUARDED_BY(fps_ranges_lock_); - ResolutionFpsRangeMap resolution_fps_range_map_; - + // It will be modified and read from different threads. base::Lock capture_intent_lock_; + cros::mojom::CaptureIntent capture_intent_ GUARDED_BY(capture_intent_lock_); - cros::mojom::CaptureIntent capture_intent_; - + // Those maps will be changed and used from different threads. base::Lock metadata_observers_lock_; - - base::Lock camera_event_observers_lock_; - - uint32_t next_metadata_observer_id_; - - uint32_t next_camera_event_observer_id_; - + uint32_t next_metadata_observer_id_ GUARDED_BY(metadata_observers_lock_); base::flat_map<uint32_t, mojo::Remote<cros::mojom::ResultMetadataObserver>> - metadata_observers_; - + metadata_observers_ GUARDED_BY(metadata_observers_lock_); base::flat_map<cros::mojom::StreamType, base::flat_set<uint32_t>> - stream_metadata_observer_ids_; + stream_metadata_observer_ids_ GUARDED_BY(metadata_observers_lock_); + // Those maps will be changed and used from different threads. + base::Lock camera_event_observers_lock_; + uint32_t next_camera_event_observer_id_ + GUARDED_BY(camera_event_observers_lock_); base::flat_map<uint32_t, mojo::Remote<cros::mojom::CameraEventObserver>> - camera_event_observers_; + camera_event_observers_ GUARDED_BY(camera_event_observers_lock_); std::unique_ptr<base::WeakPtrFactory<CameraAppDeviceImpl>> weak_ptr_factory_;
diff --git a/media/capture/video/chromeos/camera_device_delegate.cc b/media/capture/video/chromeos/camera_device_delegate.cc index 8d5fae0d..05dde6c 100644 --- a/media/capture/video/chromeos/camera_device_delegate.cc +++ b/media/capture/video/chromeos/camera_device_delegate.cc
@@ -875,11 +875,9 @@ } if (camera_app_device_) { - camera_app_device_->GetFpsRange( - chrome_capture_params_.requested_format.frame_size, - media::BindToCurrentLoop( - base::BindOnce(&CameraDeviceDelegate::OnGotFpsRange, GetWeakPtr(), - std::move(settings)))); + OnGotFpsRange(std::move(settings), + camera_app_device_->GetFpsRange( + chrome_capture_params_.requested_format.frame_size)); } else { OnGotFpsRange(std::move(settings), {}); }
diff --git a/media/capture/video/chromeos/request_manager.cc b/media/capture/video/chromeos/request_manager.cc index 4908f3d..9b93346a 100644 --- a/media/capture/video/chromeos/request_manager.cc +++ b/media/capture/video/chromeos/request_manager.cc
@@ -227,11 +227,10 @@ } void RequestManager::SetJpegOrientation( - cros::mojom::CameraMetadataPtr* settings) { + cros::mojom::CameraMetadataPtr* settings, + int32_t orientation) { auto e = BuildMetadataEntry( - cros::mojom::CameraMetadataTag::ANDROID_JPEG_ORIENTATION, - base::checked_cast<int32_t>( - device_context_->GetCameraFrameOrientation())); + cros::mojom::CameraMetadataTag::ANDROID_JPEG_ORIENTATION, orientation); AddOrUpdateMetadataEntry(settings, std::move(e)); } @@ -319,6 +318,7 @@ pending_result.input_buffer_id = input_buffer_id; pending_result.reprocess_effect = reprocess_effect; pending_result.still_capture_callback = std::move(callback); + pending_result.orientation = device_context_->GetCameraFrameOrientation(); // For reprocess supported devices, bind the ReprocessTaskQueue with this // frame number. Once the shot result is returned, we will rebind the @@ -377,7 +377,7 @@ // Prepare metadata by adding extra metadata. *settings = reprocess_job_info->metadata.Clone(); SetSensorTimestamp(settings, reprocess_job_info->shutter_timestamp); - SetJpegOrientation(settings); + SetJpegOrientation(settings, reprocess_job_info->orientation); for (auto& metadata : task.extra_metadata) { AddOrUpdateMetadataEntry(settings, std::move(metadata)); } @@ -440,7 +440,7 @@ take_photo_callback_queue_.pop(); *settings = std::move(take_photo_settings_queue_.front()); - SetJpegOrientation(settings); + SetJpegOrientation(settings, device_context_->GetCameraFrameOrientation()); } SetZeroShutterLag(settings, true); take_photo_settings_queue_.pop(); @@ -795,7 +795,8 @@ DCHECK_GT(pending_result.shutter_timestamp, 0UL); ReprocessJobInfo reprocess_job_info( std::move(frame_number_reprocess_tasks_map_[frame_number]), - std::move(pending_result.metadata), pending_result.shutter_timestamp); + std::move(pending_result.metadata), pending_result.shutter_timestamp, + pending_result.orientation); buffer_id_reprocess_job_info_map_.emplace(buffer_ipc_id, std::move(reprocess_job_info)); frame_number_reprocess_tasks_map_.erase(frame_number); @@ -947,15 +948,18 @@ RequestManager::ReprocessJobInfo::ReprocessJobInfo( ReprocessTaskQueue queue, cros::mojom::CameraMetadataPtr metadata, - uint64_t timestamp) + uint64_t timestamp, + int32_t orientation) : task_queue(std::move(queue)), metadata(std::move(metadata)), - shutter_timestamp(timestamp) {} + shutter_timestamp(timestamp), + orientation(orientation) {} RequestManager::ReprocessJobInfo::ReprocessJobInfo(ReprocessJobInfo&& info) : task_queue(std::move(info.task_queue)), metadata(std::move(info.metadata)), - shutter_timestamp(info.shutter_timestamp) {} + shutter_timestamp(info.shutter_timestamp), + orientation(info.orientation) {} RequestManager::ReprocessJobInfo::~ReprocessJobInfo() = default;
diff --git a/media/capture/video/chromeos/request_manager.h b/media/capture/video/chromeos/request_manager.h index 4d3afac..0f2c89e 100644 --- a/media/capture/video/chromeos/request_manager.h +++ b/media/capture/video/chromeos/request_manager.h
@@ -119,6 +119,9 @@ cros::mojom::Effect reprocess_effect; // The input buffer id for this capture request. base::Optional<uint64_t> input_buffer_id; + // The orientation which is stored at the time the request is prepared. It + // can be used to construct the reprocess job info when the result is back. + int32_t orientation; }; RequestManager(mojo::PendingReceiver<cros::mojom::Camera3CallbackOps> @@ -207,17 +210,20 @@ struct ReprocessJobInfo { ReprocessJobInfo(ReprocessTaskQueue queue, cros::mojom::CameraMetadataPtr metadata, - uint64_t timestamp); + uint64_t timestamp, + int32_t orientation); ReprocessJobInfo(ReprocessJobInfo&& info); ~ReprocessJobInfo(); ReprocessTaskQueue task_queue; cros::mojom::CameraMetadataPtr metadata; uint64_t shutter_timestamp; + int32_t orientation; }; // Puts Jpeg orientation information into the metadata. - void SetJpegOrientation(cros::mojom::CameraMetadataPtr* settings); + void SetJpegOrientation(cros::mojom::CameraMetadataPtr* settings, + int32_t orientation); // Puts sensor timestamp into the metadata for reprocess request. void SetSensorTimestamp(cros::mojom::CameraMetadataPtr* settings,
diff --git a/media/gpu/OWNERS b/media/gpu/OWNERS index 18fb4fa..2b32545 100644 --- a/media/gpu/OWNERS +++ b/media/gpu/OWNERS
@@ -7,6 +7,7 @@ acourbot@chromium.org hiroh@chromium.org jcliang@chromium.org +jkardatzke@chromium.org kcwu@chromium.org mcasas@chromium.org posciak@chromium.org
diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc index 58f99f4..9b81f8046 100644 --- a/media/gpu/v4l2/v4l2_device.cc +++ b/media/gpu/v4l2/v4l2_device.cc
@@ -240,9 +240,9 @@ // We can create the VideoFrame only when using MMAP buffers. if (v4l2_buffer_.memory != V4L2_MEMORY_MMAP) { VLOGF(1) << "Cannot create video frame from non-MMAP buffer"; - // video_frame_ should be null since that's its default value. - DCHECK_EQ(video_frame_, nullptr); - return video_frame_; + // Allow NOTREACHED() on invalid argument because this is an internal + // method. + NOTREACHED(); } // Create the video frame instance if requiring it for the first time. @@ -2047,6 +2047,23 @@ return Ioctl(VIDIOC_S_EXT_CTRLS, &ext_ctrls) == 0; } +base::Optional<struct v4l2_ext_control> V4L2Device::GetCtrl(uint32_t ctrl_id) { + DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); + struct v4l2_ext_control ctrl = {}; + struct v4l2_ext_controls ext_ctrls = {}; + + ctrl.id = ctrl_id; + ext_ctrls.controls = &ctrl; + ext_ctrls.count = 1; + + if (Ioctl(VIDIOC_G_EXT_CTRLS, &ext_ctrls) != 0) { + VPLOGF(3) << "Failed to get control"; + return base::nullopt; + } + + return ctrl; +} + class V4L2Request { public: // Apply the passed controls to the request.
diff --git a/media/gpu/v4l2/v4l2_device.h b/media/gpu/v4l2/v4l2_device.h index f58c570..310d4a4a 100644 --- a/media/gpu/v4l2/v4l2_device.h +++ b/media/gpu/v4l2/v4l2_device.h
@@ -726,6 +726,10 @@ // whether the operation succeeded. bool SetExtCtrls(uint32_t ctrl_class, std::vector<V4L2ExtCtrl> ctrls); + // Get the value of a single control, or base::nullopt of the control is not + // exposed by the device. + base::Optional<struct v4l2_ext_control> GetCtrl(uint32_t ctrl_id); + protected: friend class base::RefCountedThreadSafe<V4L2Device>; V4L2Device();
diff --git a/media/gpu/v4l2/v4l2_slice_video_decoder.cc b/media/gpu/v4l2/v4l2_slice_video_decoder.cc index 7cd43f2..28e1b3b 100644 --- a/media/gpu/v4l2/v4l2_slice_video_decoder.cc +++ b/media/gpu/v4l2/v4l2_slice_video_decoder.cc
@@ -430,8 +430,7 @@ DVLOGF(3); DCHECK(continue_change_resolution_cb_); - decoder_task_runner_->PostTask(FROM_HERE, - std::move(continue_change_resolution_cb_)); + std::move(continue_change_resolution_cb_).Run(); } void V4L2SliceVideoDecoder::ContinueChangeResolution(
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc index 72f7b10f..4a581ca 100644 --- a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc +++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
@@ -2376,11 +2376,10 @@ DCHECK(output_buffer_map_.empty()); // Number of output buffers we need. - struct v4l2_control ctrl; - memset(&ctrl, 0, sizeof(ctrl)); - ctrl.id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE; - IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_G_CTRL, &ctrl); - output_dpb_size_ = ctrl.value; + auto ctrl = device_->GetCtrl(V4L2_CID_MIN_BUFFERS_FOR_CAPTURE); + if (!ctrl) + return false; + output_dpb_size_ = ctrl->value; // Output format setup in Initialize().
diff --git a/net/BUILD.gn b/net/BUILD.gn index 82f8544..38a4045 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -4289,6 +4289,7 @@ "http/http_vary_data_unittest.cc", "http/mock_allow_http_auth_preferences.cc", "http/mock_allow_http_auth_preferences.h", + "http/structured_headers_generated_unittest.cc", "http/structured_headers_unittest.cc", "http/transport_security_persister_unittest.cc", "http/transport_security_state_unittest.cc", @@ -4340,7 +4341,9 @@ "quic/quic_chromium_client_session_test.cc", "quic/quic_chromium_client_stream_test.cc", "quic/quic_chromium_connection_helper_test.cc", - "quic/quic_client_session_cache_unittests.cc", + + # Temporarily disabled due to version reordering. + # "quic/quic_client_session_cache_unittests.cc", "quic/quic_clock_skew_detector_test.cc", "quic/quic_connectivity_probing_manager_test.cc", "quic/quic_end_to_end_unittest.cc",
diff --git a/net/docs/proxy.md b/net/docs/proxy.md index 24c71c4..b55f25e 100644 --- a/net/docs/proxy.md +++ b/net/docs/proxy.md
@@ -540,8 +540,8 @@ Historical support in Chrome: -* Prior to M71 there were no implicit proxy bypass rules (except if using - `--winhttp-proxy-resolver`) +* Prior to M71 there were no implicit proxy bypass rules, except if using + [`--winhttp-proxy-resolver`](#winhttp_proxy_resolver-command-line-switch). * In M71 Chrome applied implicit proxy bypass rules to PAC scripts * In M72 Chrome generalized the implicit proxy bypass rules to manually configured proxies @@ -975,8 +975,8 @@ Skim through the Import tab and look for relevant command line flags and active field trials. A find-in-page for `proxy` is a good starting point. Be on the lookout for -`--winhttp-proxy-resolver` which has [known -problems](https://bugs.chromium.org/p/chromium/issues/detail?id=644030). +[`--winhttp-proxy-resolver`](#winhttp_proxy_resolver-command-line-switch) which +has [known problems](https://bugs.chromium.org/p/chromium/issues/detail?id=644030). ### Events tab @@ -1036,3 +1036,29 @@ private suffixes used by an enterprise can become publicly registerable. See also [WPAD Name Collision Vulnerability](https://www.us-cert.gov/ncas/alerts/TA16-144A) + +## --winhttp-proxy-resolver command line switch + +Passing the `--winhttp-proxy-resolver` command line argument instructs Chrome +to use the system libraries for *one narrow part of proxy resolution*: evaluating +a given PAC script. + +Use of this flag is NOT a supported mode, and has [known +problems](https://bugs.chromium.org/p/chromium/issues/detail?id=644030): It +can break Chrome extensions (`chrome.proxy` API), the interpretation of +Proxy policies, hurt performance, and doesn't ensure full fidelity +interpretation of system proxy settings. + +Another oddity of this switch is that it actually gets interpreted with a +smilar meaning on other platforms (macOS), despite its Windows-specific naming. + +This flag was historically exposed for debugging, and to mitigate unresolved +policy differences in PAC execution. In the future this switch [will be +removed](https://bugs.chromium.org/p/chromium/issues/detail?id=644030). + +Although Chrome would like full fidelity with Windows proxy settings, there are +limits to those integrations. Dependencies like NRPT for proxy +resolution necessitate using Windows proxy resolution libraries directly +instead of Chrome's. We hope these less common use cases will be fully +addressed by [this +feature](https://bugs.chromium.org/p/chromium/issues/detail?id=1032820)
diff --git a/net/http/structured_headers_generated_unittest.cc b/net/http/structured_headers_generated_unittest.cc new file mode 100644 index 0000000..d4f2c81 --- /dev/null +++ b/net/http/structured_headers_generated_unittest.cc
@@ -0,0 +1,7221 @@ +// 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 "net/http/structured_headers.h" + +#include <math.h> + +#include <limits> +#include <string> + +#include "testing/gtest/include/gtest/gtest.h" + +// This file contains tests cases for the Structured Header parser and +// serializer, taken from the public test case repository at +// https://github.com/httpwg/structured-header-tests. All of the tests are +// named, so a given test case can be found in the JSON files in that repository +// by searching for the test name. This file is generated, with the test cases +// being automatically translated from the JSON source to C++ unit tests. Please +// do not modify, as the contents will be overwritten when this is re-generated. + +// Generated on 2020-04-10 from structured-header-tests.git @ +// 0a8ab1b649080239abb21ecd3ca15a4aead419aa + +namespace net { +namespace structured_headers { +namespace { + +// Helpers to make test cases clearer + +Item Integer(int64_t value) { + return Item(value); +} + +std::pair<std::string, Item> BooleanParam(std::string key, bool value) { + return std::make_pair(key, Item(value)); +} + +std::pair<std::string, Item> DoubleParam(std::string key, double value) { + return std::make_pair(key, Item(value)); +} + +std::pair<std::string, Item> Param(std::string key, int64_t value) { + return std::make_pair(key, Item(value)); +} + +std::pair<std::string, Item> Param(std::string key, std::string value) { + return std::make_pair(key, Item(value)); +} + +std::pair<std::string, Item> TokenParam(std::string key, std::string value) { + return std::make_pair(key, Item(value, Item::kTokenType)); +} + +// The following tests do not pass, and are are omitted from these lists: +// TODO(https://crbug.com/1069791): Cannot test headers with embedded NUL +// characters. +// * "0x00 in dictionary key - serialise only", +// * "0x00 in dictionary key", +// * "0x00 in parameterised list key - serialise only", +// * "0x00 in parameterised list key", +// * "0x00 in string - serialise only", +// * "0x00 in string", +// * "0x00 in string", +// * "0x00 in token - serialise only", +// * "0x00 in token", +// * "0x00 starting a parameterised list key", +// * "0x00 starting a parameterised list key", +// * "0x00 starting a token - serialise only", +// * "0x00 starting an dictionary key - serialise only", +// * "0x00 starting an dictionary key", +// * "0x00 starting an token", +// TODO(https://crbug.com/1069785): Parameters and keys can start with "*". +// * "0x2a starting a parameterised list key", +// * "0x2a starting an dictionary key", +// TODO(https://crbug.com/1069784): Dictionary entries with missing values +// should be True. +// * "0x3b in dictionary key", +// * "Example-DictHeader", +// * "explicit true value with params dictionary", +// * "missing value with params dictionary", + +const struct ParameterizedItemTestCase { + const char* name; + const char* raw; + const base::Optional<ParameterizedItem> + expected; // nullopt if parse error is expected. + const char* canonical; // nullptr if parse error is expected, or if canonical + // format is identical to raw. +} parameterized_item_test_cases[] = { + {"basic binary", + ":aGVsbG8=:", + {{Item("hello", Item::kByteSequenceType), {}}}}, + {"empty binary", "::", {{Item("", Item::kByteSequenceType), {}}}}, + {"bad paddding", + ":aGVsbG8:", + {{Item("hello", Item::kByteSequenceType), {}}}, + ":aGVsbG8=:"}, + {"bad end delimiter", ":aGVsbG8=", base::nullopt}, + {"extra whitespace", ":aGVsb G8=:", base::nullopt}, + {"extra chars", ":aGVsbG!8=:", base::nullopt}, + {"suffix chars", ":aGVsbG8=!:", base::nullopt}, + {"non-zero pad bits", + ":iZ==:", + {{Item("\211", Item::kByteSequenceType), {}}}, + ":iQ==:"}, + {"non-ASCII binary", + ":/+Ah:", + {{Item("\377\340!", Item::kByteSequenceType), {}}}}, + {"base64url binary", ":_-Ah:", base::nullopt}, + {"basic true boolean", "?1", {{Item(true), {}}}}, + {"basic false boolean", "?0", {{Item(false), {}}}}, + {"unknown boolean", "?Q", base::nullopt}, + {"whitespace boolean", "? 1", base::nullopt}, + {"negative zero boolean", "?-0", base::nullopt}, + {"T boolean", "?T", base::nullopt}, + {"F boolean", "?F", base::nullopt}, + {"t boolean", "?t", base::nullopt}, + {"f boolean", "?f", base::nullopt}, + {"spelled-out True boolean", "?True", base::nullopt}, + {"spelled-out False boolean", "?False", base::nullopt}, + {"Foo-Example", + "2; foourl=\"https://foo.example.com/\"", + {{Integer(2), {Param("foourl", "https://foo.example.com/")}}}, + "2;foourl=\"https://foo.example.com/\""}, + {"Example-IntHeader", + "1; a; b=?0", + {{Integer(1), {BooleanParam("a", true), BooleanParam("b", false)}}}, + "1;a;b=?0"}, + {"Example-IntItemHeader", "5", {{Integer(5), {}}}}, + {"Example-IntItemHeader (params)", + "5; foo=bar", + {{Integer(5), {TokenParam("foo", "bar")}}}, + "5;foo=bar"}, + {"Example-IntegerHeader", "42", {{Integer(42), {}}}}, + {"Example-FloatHeader", "4.5", {{Item(4.500000), {}}}}, + {"Example-StringHeader", "\"hello world\"", {{Item("hello world"), {}}}}, + {"Example-BinaryHdr", + ":cHJldGVuZCB0aGlzIGlzIGJpbmFyeSBjb250ZW50Lg==:", + {{Item("pretend this is binary content.", Item::kByteSequenceType), {}}}}, + {"Example-BoolHdr", "?1", {{Item(true), {}}}}, + {"empty item", "", base::nullopt}, + {"leading space", " 1", {{Integer(1), {}}}, "1"}, + {"trailing space", "1 ", {{Integer(1), {}}}, "1"}, + {"leading and trailing space", " 1 ", {{Integer(1), {}}}, "1"}, + {"leading and trailing whitespace", " 1 ", {{Integer(1), {}}}, "1"}, + {"large string", + "\"=======================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "=========================================================================" + "====\"", + {{Item("==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "==================================================================" + "=================================="), + {}}}}, + {"large escaped string", + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\" + "\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\\\"\"", + {{Item("\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"" + "\""), + {}}}}, + {"large token", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "a", + {{Item("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + Item::kTokenType), + {}}}}, + {"1 digits of zero", "0", {{Integer(0), {}}}, "0"}, + {"1 digit small integer", "1", {{Integer(1), {}}}}, + {"1 digit large integer", "9", {{Integer(9), {}}}}, + {"2 digits of zero", "00", {{Integer(0), {}}}, "0"}, + {"2 digit small integer", "11", {{Integer(11), {}}}}, + {"2 digit large integer", "99", {{Integer(99), {}}}}, + {"3 digits of zero", "000", {{Integer(0), {}}}, "0"}, + {"3 digit small integer", "111", {{Integer(111), {}}}}, + {"3 digit large integer", "999", {{Integer(999), {}}}}, + {"4 digits of zero", "0000", {{Integer(0), {}}}, "0"}, + {"4 digit small integer", "1111", {{Integer(1111), {}}}}, + {"4 digit large integer", "9999", {{Integer(9999), {}}}}, + {"5 digits of zero", "00000", {{Integer(0), {}}}, "0"}, + {"5 digit small integer", "11111", {{Integer(11111), {}}}}, + {"5 digit large integer", "99999", {{Integer(99999), {}}}}, + {"6 digits of zero", "000000", {{Integer(0), {}}}, "0"}, + {"6 digit small integer", "111111", {{Integer(111111), {}}}}, + {"6 digit large integer", "999999", {{Integer(999999), {}}}}, + {"7 digits of zero", "0000000", {{Integer(0), {}}}, "0"}, + {"7 digit small integer", "1111111", {{Integer(1111111), {}}}}, + {"7 digit large integer", "9999999", {{Integer(9999999), {}}}}, + {"8 digits of zero", "00000000", {{Integer(0), {}}}, "0"}, + {"8 digit small integer", "11111111", {{Integer(11111111), {}}}}, + {"8 digit large integer", "99999999", {{Integer(99999999), {}}}}, + {"9 digits of zero", "000000000", {{Integer(0), {}}}, "0"}, + {"9 digit small integer", "111111111", {{Integer(111111111), {}}}}, + {"9 digit large integer", "999999999", {{Integer(999999999), {}}}}, + {"10 digits of zero", "0000000000", {{Integer(0), {}}}, "0"}, + {"10 digit small integer", "1111111111", {{Integer(1111111111), {}}}}, + {"10 digit large integer", "9999999999", {{Integer(9999999999), {}}}}, + {"11 digits of zero", "00000000000", {{Integer(0), {}}}, "0"}, + {"11 digit small integer", "11111111111", {{Integer(11111111111), {}}}}, + {"11 digit large integer", "99999999999", {{Integer(99999999999), {}}}}, + {"12 digits of zero", "000000000000", {{Integer(0), {}}}, "0"}, + {"12 digit small integer", "111111111111", {{Integer(111111111111), {}}}}, + {"12 digit large integer", "999999999999", {{Integer(999999999999), {}}}}, + {"13 digits of zero", "0000000000000", {{Integer(0), {}}}, "0"}, + {"13 digit small integer", "1111111111111", {{Integer(1111111111111), {}}}}, + {"13 digit large integer", "9999999999999", {{Integer(9999999999999), {}}}}, + {"14 digits of zero", "00000000000000", {{Integer(0), {}}}, "0"}, + {"14 digit small integer", + "11111111111111", + {{Integer(11111111111111), {}}}}, + {"14 digit large integer", + "99999999999999", + {{Integer(99999999999999), {}}}}, + {"15 digits of zero", "000000000000000", {{Integer(0), {}}}, "0"}, + {"15 digit small integer", + "111111111111111", + {{Integer(111111111111111), {}}}}, + {"15 digit large integer", + "999999999999999", + {{Integer(999999999999999), {}}}}, + {"2 digit 0, 1 fractional small decimal", + "0.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"2 digit, 1 fractional 0 decimal", "1.0", {{Item(1.000000), {}}}, "1.0"}, + {"2 digit, 1 fractional small decimal", "1.1", {{Item(1.100000), {}}}}, + {"2 digit, 1 fractional large decimal", "9.9", {{Item(9.900000), {}}}}, + {"3 digit 0, 2 fractional small decimal", + "0.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"3 digit, 2 fractional 0 decimal", "1.00", {{Item(1.000000), {}}}, "1.0"}, + {"3 digit, 2 fractional small decimal", "1.11", {{Item(1.110000), {}}}}, + {"3 digit, 2 fractional large decimal", "9.99", {{Item(9.990000), {}}}}, + {"4 digit 0, 3 fractional small decimal", + "0.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"4 digit, 3 fractional 0 decimal", "1.000", {{Item(1.000000), {}}}, "1.0"}, + {"4 digit, 3 fractional small decimal", "1.111", {{Item(1.111000), {}}}}, + {"4 digit, 3 fractional large decimal", "9.999", {{Item(9.999000), {}}}}, + {"3 digit 0, 1 fractional small decimal", + "00.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"3 digit, 1 fractional 0 decimal", + "11.0", + {{Item(11.000000), {}}}, + "11.0"}, + {"3 digit, 1 fractional small decimal", "11.1", {{Item(11.100000), {}}}}, + {"3 digit, 1 fractional large decimal", "99.9", {{Item(99.900000), {}}}}, + {"4 digit 0, 2 fractional small decimal", + "00.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"4 digit, 2 fractional 0 decimal", + "11.00", + {{Item(11.000000), {}}}, + "11.0"}, + {"4 digit, 2 fractional small decimal", "11.11", {{Item(11.110000), {}}}}, + {"4 digit, 2 fractional large decimal", "99.99", {{Item(99.990000), {}}}}, + {"5 digit 0, 3 fractional small decimal", + "00.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"5 digit, 3 fractional 0 decimal", + "11.000", + {{Item(11.000000), {}}}, + "11.0"}, + {"5 digit, 3 fractional small decimal", "11.111", {{Item(11.111000), {}}}}, + {"5 digit, 3 fractional large decimal", "99.999", {{Item(99.999000), {}}}}, + {"4 digit 0, 1 fractional small decimal", + "000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"4 digit, 1 fractional 0 decimal", + "111.0", + {{Item(111.000000), {}}}, + "111.0"}, + {"4 digit, 1 fractional small decimal", "111.1", {{Item(111.100000), {}}}}, + {"4 digit, 1 fractional large decimal", "999.9", {{Item(999.900000), {}}}}, + {"5 digit 0, 2 fractional small decimal", + "000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"5 digit, 2 fractional 0 decimal", + "111.00", + {{Item(111.000000), {}}}, + "111.0"}, + {"5 digit, 2 fractional small decimal", "111.11", {{Item(111.110000), {}}}}, + {"5 digit, 2 fractional large decimal", "999.99", {{Item(999.990000), {}}}}, + {"6 digit 0, 3 fractional small decimal", + "000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"6 digit, 3 fractional 0 decimal", + "111.000", + {{Item(111.000000), {}}}, + "111.0"}, + {"6 digit, 3 fractional small decimal", + "111.111", + {{Item(111.111000), {}}}}, + {"6 digit, 3 fractional large decimal", + "999.999", + {{Item(999.999000), {}}}}, + {"5 digit 0, 1 fractional small decimal", + "0000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"5 digit, 1 fractional 0 decimal", + "1111.0", + {{Item(1111.000000), {}}}, + "1111.0"}, + {"5 digit, 1 fractional small decimal", + "1111.1", + {{Item(1111.100000), {}}}}, + {"5 digit, 1 fractional large decimal", + "9999.9", + {{Item(9999.900000), {}}}}, + {"6 digit 0, 2 fractional small decimal", + "0000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"6 digit, 2 fractional 0 decimal", + "1111.00", + {{Item(1111.000000), {}}}, + "1111.0"}, + {"6 digit, 2 fractional small decimal", + "1111.11", + {{Item(1111.110000), {}}}}, + {"6 digit, 2 fractional large decimal", + "9999.99", + {{Item(9999.990000), {}}}}, + {"7 digit 0, 3 fractional small decimal", + "0000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"7 digit, 3 fractional 0 decimal", + "1111.000", + {{Item(1111.000000), {}}}, + "1111.0"}, + {"7 digit, 3 fractional small decimal", + "1111.111", + {{Item(1111.111000), {}}}}, + {"7 digit, 3 fractional large decimal", + "9999.999", + {{Item(9999.999000), {}}}}, + {"6 digit 0, 1 fractional small decimal", + "00000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"6 digit, 1 fractional 0 decimal", + "11111.0", + {{Item(11111.000000), {}}}, + "11111.0"}, + {"6 digit, 1 fractional small decimal", + "11111.1", + {{Item(11111.100000), {}}}}, + {"6 digit, 1 fractional large decimal", + "99999.9", + {{Item(99999.900000), {}}}}, + {"7 digit 0, 2 fractional small decimal", + "00000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"7 digit, 2 fractional 0 decimal", + "11111.00", + {{Item(11111.000000), {}}}, + "11111.0"}, + {"7 digit, 2 fractional small decimal", + "11111.11", + {{Item(11111.110000), {}}}}, + {"7 digit, 2 fractional large decimal", + "99999.99", + {{Item(99999.990000), {}}}}, + {"8 digit 0, 3 fractional small decimal", + "00000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"8 digit, 3 fractional 0 decimal", + "11111.000", + {{Item(11111.000000), {}}}, + "11111.0"}, + {"8 digit, 3 fractional small decimal", + "11111.111", + {{Item(11111.111000), {}}}}, + {"8 digit, 3 fractional large decimal", + "99999.999", + {{Item(99999.999000), {}}}}, + {"7 digit 0, 1 fractional small decimal", + "000000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"7 digit, 1 fractional 0 decimal", + "111111.0", + {{Item(111111.000000), {}}}, + "111111.0"}, + {"7 digit, 1 fractional small decimal", + "111111.1", + {{Item(111111.100000), {}}}}, + {"7 digit, 1 fractional large decimal", + "999999.9", + {{Item(999999.900000), {}}}}, + {"8 digit 0, 2 fractional small decimal", + "000000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"8 digit, 2 fractional 0 decimal", + "111111.00", + {{Item(111111.000000), {}}}, + "111111.0"}, + {"8 digit, 2 fractional small decimal", + "111111.11", + {{Item(111111.110000), {}}}}, + {"8 digit, 2 fractional large decimal", + "999999.99", + {{Item(999999.990000), {}}}}, + {"9 digit 0, 3 fractional small decimal", + "000000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"9 digit, 3 fractional 0 decimal", + "111111.000", + {{Item(111111.000000), {}}}, + "111111.0"}, + {"9 digit, 3 fractional small decimal", + "111111.111", + {{Item(111111.111000), {}}}}, + {"9 digit, 3 fractional large decimal", + "999999.999", + {{Item(999999.999000), {}}}}, + {"8 digit 0, 1 fractional small decimal", + "0000000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"8 digit, 1 fractional 0 decimal", + "1111111.0", + {{Item(1111111.000000), {}}}, + "1111111.0"}, + {"8 digit, 1 fractional small decimal", + "1111111.1", + {{Item(1111111.100000), {}}}}, + {"8 digit, 1 fractional large decimal", + "9999999.9", + {{Item(9999999.900000), {}}}}, + {"9 digit 0, 2 fractional small decimal", + "0000000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"9 digit, 2 fractional 0 decimal", + "1111111.00", + {{Item(1111111.000000), {}}}, + "1111111.0"}, + {"9 digit, 2 fractional small decimal", + "1111111.11", + {{Item(1111111.110000), {}}}}, + {"9 digit, 2 fractional large decimal", + "9999999.99", + {{Item(9999999.990000), {}}}}, + {"10 digit 0, 3 fractional small decimal", + "0000000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"10 digit, 3 fractional 0 decimal", + "1111111.000", + {{Item(1111111.000000), {}}}, + "1111111.0"}, + {"10 digit, 3 fractional small decimal", + "1111111.111", + {{Item(1111111.111000), {}}}}, + {"10 digit, 3 fractional large decimal", + "9999999.999", + {{Item(9999999.999000), {}}}}, + {"9 digit 0, 1 fractional small decimal", + "00000000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"9 digit, 1 fractional 0 decimal", + "11111111.0", + {{Item(11111111.000000), {}}}, + "11111111.0"}, + {"9 digit, 1 fractional small decimal", + "11111111.1", + {{Item(11111111.100000), {}}}}, + {"9 digit, 1 fractional large decimal", + "99999999.9", + {{Item(99999999.900000), {}}}}, + {"10 digit 0, 2 fractional small decimal", + "00000000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"10 digit, 2 fractional 0 decimal", + "11111111.00", + {{Item(11111111.000000), {}}}, + "11111111.0"}, + {"10 digit, 2 fractional small decimal", + "11111111.11", + {{Item(11111111.110000), {}}}}, + {"10 digit, 2 fractional large decimal", + "99999999.99", + {{Item(99999999.990000), {}}}}, + {"11 digit 0, 3 fractional small decimal", + "00000000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"11 digit, 3 fractional 0 decimal", + "11111111.000", + {{Item(11111111.000000), {}}}, + "11111111.0"}, + {"11 digit, 3 fractional small decimal", + "11111111.111", + {{Item(11111111.111000), {}}}}, + {"11 digit, 3 fractional large decimal", + "99999999.999", + {{Item(99999999.999000), {}}}}, + {"10 digit 0, 1 fractional small decimal", + "000000000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"10 digit, 1 fractional 0 decimal", + "111111111.0", + {{Item(111111111.000000), {}}}, + "111111111.0"}, + {"10 digit, 1 fractional small decimal", + "111111111.1", + {{Item(111111111.100000), {}}}}, + {"10 digit, 1 fractional large decimal", + "999999999.9", + {{Item(999999999.900000), {}}}}, + {"11 digit 0, 2 fractional small decimal", + "000000000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"11 digit, 2 fractional 0 decimal", + "111111111.00", + {{Item(111111111.000000), {}}}, + "111111111.0"}, + {"11 digit, 2 fractional small decimal", + "111111111.11", + {{Item(111111111.110000), {}}}}, + {"11 digit, 2 fractional large decimal", + "999999999.99", + {{Item(999999999.990000), {}}}}, + {"12 digit 0, 3 fractional small decimal", + "000000000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"12 digit, 3 fractional 0 decimal", + "111111111.000", + {{Item(111111111.000000), {}}}, + "111111111.0"}, + {"12 digit, 3 fractional small decimal", + "111111111.111", + {{Item(111111111.111000), {}}}}, + {"12 digit, 3 fractional large decimal", + "999999999.999", + {{Item(999999999.999000), {}}}}, + {"11 digit 0, 1 fractional small decimal", + "0000000000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"11 digit, 1 fractional 0 decimal", + "1111111111.0", + {{Item(1111111111.000000), {}}}, + "1111111111.0"}, + {"11 digit, 1 fractional small decimal", + "1111111111.1", + {{Item(1111111111.100000), {}}}}, + {"11 digit, 1 fractional large decimal", + "9999999999.9", + {{Item(9999999999.900000), {}}}}, + {"12 digit 0, 2 fractional small decimal", + "0000000000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"12 digit, 2 fractional 0 decimal", + "1111111111.00", + {{Item(1111111111.000000), {}}}, + "1111111111.0"}, + {"12 digit, 2 fractional small decimal", + "1111111111.11", + {{Item(1111111111.110000), {}}}}, + {"12 digit, 2 fractional large decimal", + "9999999999.99", + {{Item(9999999999.990000), {}}}}, + {"13 digit 0, 3 fractional small decimal", + "0000000000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"13 digit, 3 fractional 0 decimal", + "1111111111.000", + {{Item(1111111111.000000), {}}}, + "1111111111.0"}, + {"13 digit, 3 fractional small decimal", + "1111111111.111", + {{Item(1111111111.111000), {}}}}, + {"13 digit, 3 fractional large decimal", + "9999999999.999", + {{Item(9999999999.999001), {}}}}, + {"12 digit 0, 1 fractional small decimal", + "00000000000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"12 digit, 1 fractional 0 decimal", + "11111111111.0", + {{Item(11111111111.000000), {}}}, + "11111111111.0"}, + {"12 digit, 1 fractional small decimal", + "11111111111.1", + {{Item(11111111111.100000), {}}}}, + {"12 digit, 1 fractional large decimal", + "99999999999.9", + {{Item(99999999999.899994), {}}}}, + {"13 digit 0, 2 fractional small decimal", + "00000000000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"13 digit, 2 fractional 0 decimal", + "11111111111.00", + {{Item(11111111111.000000), {}}}, + "11111111111.0"}, + {"13 digit, 2 fractional small decimal", + "11111111111.11", + {{Item(11111111111.110001), {}}}}, + {"13 digit, 2 fractional large decimal", + "99999999999.99", + {{Item(99999999999.990005), {}}}}, + {"14 digit 0, 3 fractional small decimal", + "00000000000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"14 digit, 3 fractional 0 decimal", + "11111111111.000", + {{Item(11111111111.000000), {}}}, + "11111111111.0"}, + {"14 digit, 3 fractional small decimal", + "11111111111.111", + {{Item(11111111111.111000), {}}}}, + {"14 digit, 3 fractional large decimal", + "99999999999.999", + {{Item(99999999999.998993), {}}}}, + {"13 digit 0, 1 fractional small decimal", + "000000000000.1", + {{Item(0.100000), {}}}, + "0.1"}, + {"13 digit, 1 fractional 0 decimal", + "111111111111.0", + {{Item(111111111111.000000), {}}}, + "111111111111.0"}, + {"13 digit, 1 fractional small decimal", + "111111111111.1", + {{Item(111111111111.100006), {}}}}, + {"13 digit, 1 fractional large decimal", + "999999999999.9", + {{Item(999999999999.900024), {}}}}, + {"14 digit 0, 2 fractional small decimal", + "000000000000.11", + {{Item(0.110000), {}}}, + "0.11"}, + {"14 digit, 2 fractional 0 decimal", + "111111111111.00", + {{Item(111111111111.000000), {}}}, + "111111111111.0"}, + {"14 digit, 2 fractional small decimal", + "111111111111.11", + {{Item(111111111111.110001), {}}}}, + {"14 digit, 2 fractional large decimal", + "999999999999.99", + {{Item(999999999999.989990), {}}}}, + {"15 digit 0, 3 fractional small decimal", + "000000000000.111", + {{Item(0.111000), {}}}, + "0.111"}, + {"15 digit, 3 fractional 0 decimal", + "111111111111.000", + {{Item(111111111111.000000), {}}}, + "111111111111.0"}, + {"15 digit, 3 fractional small decimal", + "111111111111.111", + {{Item(111111111111.110992), {}}}}, + {"15 digit, 3 fractional large decimal", + "999999999999.999", + {{Item(999999999999.999023), {}}}}, + {"too many digit 0 decimal", "000000000000000.0", base::nullopt}, + {"too many fractional digits 0 decimal", "000000000000.0000", + base::nullopt}, + {"too many digit 9 decimal", "999999999999999.9", base::nullopt}, + {"too many fractional digits 9 decimal", "999999999999.9999", + base::nullopt}, + {"basic integer", "42", {{Integer(42), {}}}}, + {"zero integer", "0", {{Integer(0), {}}}}, + {"leading 0 zero", "00", {{Integer(0), {}}}, "0"}, + {"negative zero", "-0", {{Integer(0), {}}}, "0"}, + {"double negative zero", "--0", base::nullopt}, + {"negative integer", "-42", {{Integer(-42), {}}}}, + {"leading 0 integer", "042", {{Integer(42), {}}}, "42"}, + {"leading 0 negative integer", "-042", {{Integer(-42), {}}}, "-42"}, + {"leading 0 zero", "00", {{Integer(0), {}}}, "0"}, + {"comma", "2,3", base::nullopt}, + {"negative non-DIGIT first character", "-a23", base::nullopt}, + {"sign out of place", "4-2", base::nullopt}, + {"whitespace after sign", "- 42", base::nullopt}, + {"long integer", "123456789012345", {{Integer(123456789012345), {}}}}, + {"long negative integer", + "-123456789012345", + {{Integer(-123456789012345), {}}}}, + {"too long integer", "1234567890123456", base::nullopt}, + {"negative too long integer", "-1234567890123456", base::nullopt}, + {"simple decimal", "1.23", {{Item(1.230000), {}}}}, + {"negative decimal", "-1.23", {{Item(-1.230000), {}}}}, + {"decimal, whitespace after decimal", "1. 23", base::nullopt}, + {"decimal, whitespace before decimal", "1 .23", base::nullopt}, + {"negative decimal, whitespace after sign", "- 1.23", base::nullopt}, + {"tricky precision decimal", + "123456789012.1", + {{Item(123456789012.100006), {}}}}, + {"double decimal decimal", "1.5.4", base::nullopt}, + {"adjacent double decimal decimal", "1..4", base::nullopt}, + {"decimal with three fractional digits", "1.123", {{Item(1.123000), {}}}}, + {"negative decimal with three fractional digits", + "-1.123", + {{Item(-1.123000), {}}}}, + {"decimal with four fractional digits", "1.1234", base::nullopt}, + {"negative decimal with four fractional digits", "-1.1234", base::nullopt}, + {"decimal with thirteen integer digits", "1234567890123.0", base::nullopt}, + {"negative decimal with thirteen integer digits", "-1234567890123.0", + base::nullopt}, + {"0x01 in string", "\" \001 \"", base::nullopt}, + {"0x02 in string", "\" \002 \"", base::nullopt}, + {"0x03 in string", "\" \003 \"", base::nullopt}, + {"0x04 in string", "\" \004 \"", base::nullopt}, + {"0x05 in string", "\" \005 \"", base::nullopt}, + {"0x06 in string", "\" \006 \"", base::nullopt}, + {"0x07 in string", "\" \a \"", base::nullopt}, + {"0x08 in string", "\" \b \"", base::nullopt}, + {"0x09 in string", "\" \t \"", base::nullopt}, + {"0x0a in string", "\" \n \"", base::nullopt}, + {"0x0b in string", "\" \v \"", base::nullopt}, + {"0x0c in string", "\" \f \"", base::nullopt}, + {"0x0d in string", "\" \r \"", base::nullopt}, + {"0x0e in string", "\" \016 \"", base::nullopt}, + {"0x0f in string", "\" \017 \"", base::nullopt}, + {"0x10 in string", "\" \020 \"", base::nullopt}, + {"0x11 in string", "\" \021 \"", base::nullopt}, + {"0x12 in string", "\" \022 \"", base::nullopt}, + {"0x13 in string", "\" \023 \"", base::nullopt}, + {"0x14 in string", "\" \024 \"", base::nullopt}, + {"0x15 in string", "\" \025 \"", base::nullopt}, + {"0x16 in string", "\" \026 \"", base::nullopt}, + {"0x17 in string", "\" \027 \"", base::nullopt}, + {"0x18 in string", "\" \030 \"", base::nullopt}, + {"0x19 in string", "\" \031 \"", base::nullopt}, + {"0x1a in string", "\" \032 \"", base::nullopt}, + {"0x1b in string", "\" \033 \"", base::nullopt}, + {"0x1c in string", "\" \034 \"", base::nullopt}, + {"0x1d in string", "\" \035 \"", base::nullopt}, + {"0x1e in string", "\" \036 \"", base::nullopt}, + {"0x1f in string", "\" \037 \"", base::nullopt}, + {"0x20 in string", "\" \"", {{Item(" "), {}}}}, + {"0x21 in string", "\" ! \"", {{Item(" ! "), {}}}}, + {"0x22 in string", "\" \" \"", base::nullopt}, + {"0x23 in string", "\" # \"", {{Item(" # "), {}}}}, + {"0x24 in string", "\" $ \"", {{Item(" $ "), {}}}}, + {"0x25 in string", "\" % \"", {{Item(" % "), {}}}}, + {"0x26 in string", "\" & \"", {{Item(" & "), {}}}}, + {"0x27 in string", "\" ' \"", {{Item(" ' "), {}}}}, + {"0x28 in string", "\" ( \"", {{Item(" ( "), {}}}}, + {"0x29 in string", "\" ) \"", {{Item(" ) "), {}}}}, + {"0x2a in string", "\" * \"", {{Item(" * "), {}}}}, + {"0x2b in string", "\" + \"", {{Item(" + "), {}}}}, + {"0x2c in string", "\" , \"", {{Item(" , "), {}}}}, + {"0x2d in string", "\" - \"", {{Item(" - "), {}}}}, + {"0x2e in string", "\" . \"", {{Item(" . "), {}}}}, + {"0x2f in string", "\" / \"", {{Item(" / "), {}}}}, + {"0x30 in string", "\" 0 \"", {{Item(" 0 "), {}}}}, + {"0x31 in string", "\" 1 \"", {{Item(" 1 "), {}}}}, + {"0x32 in string", "\" 2 \"", {{Item(" 2 "), {}}}}, + {"0x33 in string", "\" 3 \"", {{Item(" 3 "), {}}}}, + {"0x34 in string", "\" 4 \"", {{Item(" 4 "), {}}}}, + {"0x35 in string", "\" 5 \"", {{Item(" 5 "), {}}}}, + {"0x36 in string", "\" 6 \"", {{Item(" 6 "), {}}}}, + {"0x37 in string", "\" 7 \"", {{Item(" 7 "), {}}}}, + {"0x38 in string", "\" 8 \"", {{Item(" 8 "), {}}}}, + {"0x39 in string", "\" 9 \"", {{Item(" 9 "), {}}}}, + {"0x3a in string", "\" : \"", {{Item(" : "), {}}}}, + {"0x3b in string", "\" ; \"", {{Item(" ; "), {}}}}, + {"0x3c in string", "\" < \"", {{Item(" < "), {}}}}, + {"0x3d in string", "\" = \"", {{Item(" = "), {}}}}, + {"0x3e in string", "\" > \"", {{Item(" > "), {}}}}, + {"0x3f in string", "\" ? \"", {{Item(" ? "), {}}}}, + {"0x40 in string", "\" @ \"", {{Item(" @ "), {}}}}, + {"0x41 in string", "\" A \"", {{Item(" A "), {}}}}, + {"0x42 in string", "\" B \"", {{Item(" B "), {}}}}, + {"0x43 in string", "\" C \"", {{Item(" C "), {}}}}, + {"0x44 in string", "\" D \"", {{Item(" D "), {}}}}, + {"0x45 in string", "\" E \"", {{Item(" E "), {}}}}, + {"0x46 in string", "\" F \"", {{Item(" F "), {}}}}, + {"0x47 in string", "\" G \"", {{Item(" G "), {}}}}, + {"0x48 in string", "\" H \"", {{Item(" H "), {}}}}, + {"0x49 in string", "\" I \"", {{Item(" I "), {}}}}, + {"0x4a in string", "\" J \"", {{Item(" J "), {}}}}, + {"0x4b in string", "\" K \"", {{Item(" K "), {}}}}, + {"0x4c in string", "\" L \"", {{Item(" L "), {}}}}, + {"0x4d in string", "\" M \"", {{Item(" M "), {}}}}, + {"0x4e in string", "\" N \"", {{Item(" N "), {}}}}, + {"0x4f in string", "\" O \"", {{Item(" O "), {}}}}, + {"0x50 in string", "\" P \"", {{Item(" P "), {}}}}, + {"0x51 in string", "\" Q \"", {{Item(" Q "), {}}}}, + {"0x52 in string", "\" R \"", {{Item(" R "), {}}}}, + {"0x53 in string", "\" S \"", {{Item(" S "), {}}}}, + {"0x54 in string", "\" T \"", {{Item(" T "), {}}}}, + {"0x55 in string", "\" U \"", {{Item(" U "), {}}}}, + {"0x56 in string", "\" V \"", {{Item(" V "), {}}}}, + {"0x57 in string", "\" W \"", {{Item(" W "), {}}}}, + {"0x58 in string", "\" X \"", {{Item(" X "), {}}}}, + {"0x59 in string", "\" Y \"", {{Item(" Y "), {}}}}, + {"0x5a in string", "\" Z \"", {{Item(" Z "), {}}}}, + {"0x5b in string", "\" [ \"", {{Item(" [ "), {}}}}, + {"0x5c in string", "\" \\ \"", base::nullopt}, + {"0x5d in string", "\" ] \"", {{Item(" ] "), {}}}}, + {"0x5e in string", "\" ^ \"", {{Item(" ^ "), {}}}}, + {"0x5f in string", "\" _ \"", {{Item(" _ "), {}}}}, + {"0x60 in string", "\" ` \"", {{Item(" ` "), {}}}}, + {"0x61 in string", "\" a \"", {{Item(" a "), {}}}}, + {"0x62 in string", "\" b \"", {{Item(" b "), {}}}}, + {"0x63 in string", "\" c \"", {{Item(" c "), {}}}}, + {"0x64 in string", "\" d \"", {{Item(" d "), {}}}}, + {"0x65 in string", "\" e \"", {{Item(" e "), {}}}}, + {"0x66 in string", "\" f \"", {{Item(" f "), {}}}}, + {"0x67 in string", "\" g \"", {{Item(" g "), {}}}}, + {"0x68 in string", "\" h \"", {{Item(" h "), {}}}}, + {"0x69 in string", "\" i \"", {{Item(" i "), {}}}}, + {"0x6a in string", "\" j \"", {{Item(" j "), {}}}}, + {"0x6b in string", "\" k \"", {{Item(" k "), {}}}}, + {"0x6c in string", "\" l \"", {{Item(" l "), {}}}}, + {"0x6d in string", "\" m \"", {{Item(" m "), {}}}}, + {"0x6e in string", "\" n \"", {{Item(" n "), {}}}}, + {"0x6f in string", "\" o \"", {{Item(" o "), {}}}}, + {"0x70 in string", "\" p \"", {{Item(" p "), {}}}}, + {"0x71 in string", "\" q \"", {{Item(" q "), {}}}}, + {"0x72 in string", "\" r \"", {{Item(" r "), {}}}}, + {"0x73 in string", "\" s \"", {{Item(" s "), {}}}}, + {"0x74 in string", "\" t \"", {{Item(" t "), {}}}}, + {"0x75 in string", "\" u \"", {{Item(" u "), {}}}}, + {"0x76 in string", "\" v \"", {{Item(" v "), {}}}}, + {"0x77 in string", "\" w \"", {{Item(" w "), {}}}}, + {"0x78 in string", "\" x \"", {{Item(" x "), {}}}}, + {"0x79 in string", "\" y \"", {{Item(" y "), {}}}}, + {"0x7a in string", "\" z \"", {{Item(" z "), {}}}}, + {"0x7b in string", "\" { \"", {{Item(" { "), {}}}}, + {"0x7c in string", "\" | \"", {{Item(" | "), {}}}}, + {"0x7d in string", "\" } \"", {{Item(" } "), {}}}}, + {"0x7e in string", "\" ~ \"", {{Item(" ~ "), {}}}}, + {"0x7f in string", "\" \177 \"", base::nullopt}, + {"0x01 in string", "\"\\\001\"", base::nullopt}, + {"0x02 in string", "\"\\\002\"", base::nullopt}, + {"0x03 in string", "\"\\\003\"", base::nullopt}, + {"0x04 in string", "\"\\\004\"", base::nullopt}, + {"0x05 in string", "\"\\\005\"", base::nullopt}, + {"0x06 in string", "\"\\\006\"", base::nullopt}, + {"0x07 in string", "\"\\\a\"", base::nullopt}, + {"0x08 in string", "\"\\\b\"", base::nullopt}, + {"0x09 in string", "\"\\\t\"", base::nullopt}, + {"0x0a in string", "\"\\\n\"", base::nullopt}, + {"0x0b in string", "\"\\\v\"", base::nullopt}, + {"0x0c in string", "\"\\\f\"", base::nullopt}, + {"0x0d in string", "\"\\\r\"", base::nullopt}, + {"0x0e in string", "\"\\\016\"", base::nullopt}, + {"0x0f in string", "\"\\\017\"", base::nullopt}, + {"0x10 in string", "\"\\\020\"", base::nullopt}, + {"0x11 in string", "\"\\\021\"", base::nullopt}, + {"0x12 in string", "\"\\\022\"", base::nullopt}, + {"0x13 in string", "\"\\\023\"", base::nullopt}, + {"0x14 in string", "\"\\\024\"", base::nullopt}, + {"0x15 in string", "\"\\\025\"", base::nullopt}, + {"0x16 in string", "\"\\\026\"", base::nullopt}, + {"0x17 in string", "\"\\\027\"", base::nullopt}, + {"0x18 in string", "\"\\\030\"", base::nullopt}, + {"0x19 in string", "\"\\\031\"", base::nullopt}, + {"0x1a in string", "\"\\\032\"", base::nullopt}, + {"0x1b in string", "\"\\\033\"", base::nullopt}, + {"0x1c in string", "\"\\\034\"", base::nullopt}, + {"0x1d in string", "\"\\\035\"", base::nullopt}, + {"0x1e in string", "\"\\\036\"", base::nullopt}, + {"0x1f in string", "\"\\\037\"", base::nullopt}, + {"0x20 in string", "\"\\ \"", base::nullopt}, + {"0x21 in string", "\"\\!\"", base::nullopt}, + {"0x22 in string", "\"\\\"\"", {{Item("\""), {}}}}, + {"0x23 in string", "\"\\#\"", base::nullopt}, + {"0x24 in string", "\"\\$\"", base::nullopt}, + {"0x25 in string", "\"\\%\"", base::nullopt}, + {"0x26 in string", "\"\\&\"", base::nullopt}, + {"0x27 in string", "\"\\'\"", base::nullopt}, + {"0x28 in string", "\"\\(\"", base::nullopt}, + {"0x29 in string", "\"\\)\"", base::nullopt}, + {"0x2a in string", "\"\\*\"", base::nullopt}, + {"0x2b in string", "\"\\+\"", base::nullopt}, + {"0x2c in string", "\"\\,\"", base::nullopt}, + {"0x2d in string", "\"\\-\"", base::nullopt}, + {"0x2e in string", "\"\\.\"", base::nullopt}, + {"0x2f in string", "\"\\/\"", base::nullopt}, + {"0x30 in string", "\"\\0\"", base::nullopt}, + {"0x31 in string", "\"\\1\"", base::nullopt}, + {"0x32 in string", "\"\\2\"", base::nullopt}, + {"0x33 in string", "\"\\3\"", base::nullopt}, + {"0x34 in string", "\"\\4\"", base::nullopt}, + {"0x35 in string", "\"\\5\"", base::nullopt}, + {"0x36 in string", "\"\\6\"", base::nullopt}, + {"0x37 in string", "\"\\7\"", base::nullopt}, + {"0x38 in string", "\"\\8\"", base::nullopt}, + {"0x39 in string", "\"\\9\"", base::nullopt}, + {"0x3a in string", "\"\\:\"", base::nullopt}, + {"0x3b in string", "\"\\;\"", base::nullopt}, + {"0x3c in string", "\"\\<\"", base::nullopt}, + {"0x3d in string", "\"\\=\"", base::nullopt}, + {"0x3e in string", "\"\\>\"", base::nullopt}, + {"0x3f in string", "\"\\?\"", base::nullopt}, + {"0x40 in string", "\"\\@\"", base::nullopt}, + {"0x41 in string", "\"\\A\"", base::nullopt}, + {"0x42 in string", "\"\\B\"", base::nullopt}, + {"0x43 in string", "\"\\C\"", base::nullopt}, + {"0x44 in string", "\"\\D\"", base::nullopt}, + {"0x45 in string", "\"\\E\"", base::nullopt}, + {"0x46 in string", "\"\\F\"", base::nullopt}, + {"0x47 in string", "\"\\G\"", base::nullopt}, + {"0x48 in string", "\"\\H\"", base::nullopt}, + {"0x49 in string", "\"\\I\"", base::nullopt}, + {"0x4a in string", "\"\\J\"", base::nullopt}, + {"0x4b in string", "\"\\K\"", base::nullopt}, + {"0x4c in string", "\"\\L\"", base::nullopt}, + {"0x4d in string", "\"\\M\"", base::nullopt}, + {"0x4e in string", "\"\\N\"", base::nullopt}, + {"0x4f in string", "\"\\O\"", base::nullopt}, + {"0x50 in string", "\"\\P\"", base::nullopt}, + {"0x51 in string", "\"\\Q\"", base::nullopt}, + {"0x52 in string", "\"\\R\"", base::nullopt}, + {"0x53 in string", "\"\\S\"", base::nullopt}, + {"0x54 in string", "\"\\T\"", base::nullopt}, + {"0x55 in string", "\"\\U\"", base::nullopt}, + {"0x56 in string", "\"\\V\"", base::nullopt}, + {"0x57 in string", "\"\\W\"", base::nullopt}, + {"0x58 in string", "\"\\X\"", base::nullopt}, + {"0x59 in string", "\"\\Y\"", base::nullopt}, + {"0x5a in string", "\"\\Z\"", base::nullopt}, + {"0x5b in string", "\"\\[\"", base::nullopt}, + {"0x5c in string", "\"\\\\\"", {{Item("\\"), {}}}}, + {"0x5d in string", "\"\\]\"", base::nullopt}, + {"0x5e in string", "\"\\^\"", base::nullopt}, + {"0x5f in string", "\"\\_\"", base::nullopt}, + {"0x60 in string", "\"\\`\"", base::nullopt}, + {"0x61 in string", "\"\\a\"", base::nullopt}, + {"0x62 in string", "\"\\b\"", base::nullopt}, + {"0x63 in string", "\"\\c\"", base::nullopt}, + {"0x64 in string", "\"\\d\"", base::nullopt}, + {"0x65 in string", "\"\\e\"", base::nullopt}, + {"0x66 in string", "\"\\f\"", base::nullopt}, + {"0x67 in string", "\"\\g\"", base::nullopt}, + {"0x68 in string", "\"\\h\"", base::nullopt}, + {"0x69 in string", "\"\\i\"", base::nullopt}, + {"0x6a in string", "\"\\j\"", base::nullopt}, + {"0x6b in string", "\"\\k\"", base::nullopt}, + {"0x6c in string", "\"\\l\"", base::nullopt}, + {"0x6d in string", "\"\\m\"", base::nullopt}, + {"0x6e in string", "\"\\n\"", base::nullopt}, + {"0x6f in string", "\"\\o\"", base::nullopt}, + {"0x70 in string", "\"\\p\"", base::nullopt}, + {"0x71 in string", "\"\\q\"", base::nullopt}, + {"0x72 in string", "\"\\r\"", base::nullopt}, + {"0x73 in string", "\"\\s\"", base::nullopt}, + {"0x74 in string", "\"\\t\"", base::nullopt}, + {"0x75 in string", "\"\\u\"", base::nullopt}, + {"0x76 in string", "\"\\v\"", base::nullopt}, + {"0x77 in string", "\"\\w\"", base::nullopt}, + {"0x78 in string", "\"\\x\"", base::nullopt}, + {"0x79 in string", "\"\\y\"", base::nullopt}, + {"0x7a in string", "\"\\z\"", base::nullopt}, + {"0x7b in string", "\"\\{\"", base::nullopt}, + {"0x7c in string", "\"\\|\"", base::nullopt}, + {"0x7d in string", "\"\\}\"", base::nullopt}, + {"0x7e in string", "\"\\~\"", base::nullopt}, + {"0x7f in string", "\"\\\177\"", base::nullopt}, + {"basic string", "\"foo bar\"", {{Item("foo bar"), {}}}}, + {"empty string", "\"\"", {{Item(""), {}}}}, + {"long string", + "\"foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " + "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " + "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " + "foo foo foo foo foo foo foo foo foo foo foo foo \"", + {{Item("foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " + "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " + "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " + "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " + "foo "), + {}}}}, + {"whitespace string", "\" \"", {{Item(" "), {}}}}, + {"non-ascii string", "\"f\374\374\"", base::nullopt}, + {"tab in string", "\"\\t\"", base::nullopt}, + {"newline in string", "\" \\n \"", base::nullopt}, + {"single quoted string", "'foo'", base::nullopt}, + {"unbalanced string", "\"foo", base::nullopt}, + {"string quoting", + "\"foo \\\"bar\\\" \\\\ baz\"", + {{Item("foo \"bar\" \\ baz"), {}}}}, + {"bad string quoting", "\"foo \\,\"", base::nullopt}, + {"ending string quote", "\"foo \\\"", base::nullopt}, + {"abruptly ending string quote", "\"foo \\", base::nullopt}, + {"0x01 in token", "a\001a", base::nullopt}, + {"0x02 in token", "a\002a", base::nullopt}, + {"0x03 in token", "a\003a", base::nullopt}, + {"0x04 in token", "a\004a", base::nullopt}, + {"0x05 in token", "a\005a", base::nullopt}, + {"0x06 in token", "a\006a", base::nullopt}, + {"0x07 in token", "a\aa", base::nullopt}, + {"0x08 in token", "a\ba", base::nullopt}, + {"0x09 in token", "a\ta", base::nullopt}, + {"0x0a in token", "a\na", base::nullopt}, + {"0x0b in token", "a\va", base::nullopt}, + {"0x0c in token", "a\fa", base::nullopt}, + {"0x0d in token", "a\ra", base::nullopt}, + {"0x0e in token", "a\016a", base::nullopt}, + {"0x0f in token", "a\017a", base::nullopt}, + {"0x10 in token", "a\020a", base::nullopt}, + {"0x11 in token", "a\021a", base::nullopt}, + {"0x12 in token", "a\022a", base::nullopt}, + {"0x13 in token", "a\023a", base::nullopt}, + {"0x14 in token", "a\024a", base::nullopt}, + {"0x15 in token", "a\025a", base::nullopt}, + {"0x16 in token", "a\026a", base::nullopt}, + {"0x17 in token", "a\027a", base::nullopt}, + {"0x18 in token", "a\030a", base::nullopt}, + {"0x19 in token", "a\031a", base::nullopt}, + {"0x1a in token", "a\032a", base::nullopt}, + {"0x1b in token", "a\033a", base::nullopt}, + {"0x1c in token", "a\034a", base::nullopt}, + {"0x1d in token", "a\035a", base::nullopt}, + {"0x1e in token", "a\036a", base::nullopt}, + {"0x1f in token", "a\037a", base::nullopt}, + {"0x20 in token", "a a", base::nullopt}, + {"0x21 in token", "a!a", {{Item("a!a", Item::kTokenType), {}}}}, + {"0x22 in token", "a\"a", base::nullopt}, + {"0x23 in token", "a#a", {{Item("a#a", Item::kTokenType), {}}}}, + {"0x24 in token", "a$a", {{Item("a$a", Item::kTokenType), {}}}}, + {"0x25 in token", "a%a", {{Item("a%a", Item::kTokenType), {}}}}, + {"0x26 in token", "a&a", {{Item("a&a", Item::kTokenType), {}}}}, + {"0x27 in token", "a'a", {{Item("a'a", Item::kTokenType), {}}}}, + {"0x28 in token", "a(a", base::nullopt}, + {"0x29 in token", "a)a", base::nullopt}, + {"0x2a in token", "a*a", {{Item("a*a", Item::kTokenType), {}}}}, + {"0x2b in token", "a+a", {{Item("a+a", Item::kTokenType), {}}}}, + {"0x2c in token", "a,a", base::nullopt}, + {"0x2d in token", "a-a", {{Item("a-a", Item::kTokenType), {}}}}, + {"0x2e in token", "a.a", {{Item("a.a", Item::kTokenType), {}}}}, + {"0x2f in token", "a/a", {{Item("a/a", Item::kTokenType), {}}}}, + {"0x30 in token", "a0a", {{Item("a0a", Item::kTokenType), {}}}}, + {"0x31 in token", "a1a", {{Item("a1a", Item::kTokenType), {}}}}, + {"0x32 in token", "a2a", {{Item("a2a", Item::kTokenType), {}}}}, + {"0x33 in token", "a3a", {{Item("a3a", Item::kTokenType), {}}}}, + {"0x34 in token", "a4a", {{Item("a4a", Item::kTokenType), {}}}}, + {"0x35 in token", "a5a", {{Item("a5a", Item::kTokenType), {}}}}, + {"0x36 in token", "a6a", {{Item("a6a", Item::kTokenType), {}}}}, + {"0x37 in token", "a7a", {{Item("a7a", Item::kTokenType), {}}}}, + {"0x38 in token", "a8a", {{Item("a8a", Item::kTokenType), {}}}}, + {"0x39 in token", "a9a", {{Item("a9a", Item::kTokenType), {}}}}, + {"0x3a in token", "a:a", {{Item("a:a", Item::kTokenType), {}}}}, + {"0x3b in token", + "a;a", + {{Item("a", Item::kTokenType), {BooleanParam("a", true)}}}}, + {"0x3c in token", "a<a", base::nullopt}, + {"0x3d in token", "a=a", base::nullopt}, + {"0x3e in token", "a>a", base::nullopt}, + {"0x3f in token", "a?a", base::nullopt}, + {"0x40 in token", "a@a", base::nullopt}, + {"0x41 in token", "aAa", {{Item("aAa", Item::kTokenType), {}}}}, + {"0x42 in token", "aBa", {{Item("aBa", Item::kTokenType), {}}}}, + {"0x43 in token", "aCa", {{Item("aCa", Item::kTokenType), {}}}}, + {"0x44 in token", "aDa", {{Item("aDa", Item::kTokenType), {}}}}, + {"0x45 in token", "aEa", {{Item("aEa", Item::kTokenType), {}}}}, + {"0x46 in token", "aFa", {{Item("aFa", Item::kTokenType), {}}}}, + {"0x47 in token", "aGa", {{Item("aGa", Item::kTokenType), {}}}}, + {"0x48 in token", "aHa", {{Item("aHa", Item::kTokenType), {}}}}, + {"0x49 in token", "aIa", {{Item("aIa", Item::kTokenType), {}}}}, + {"0x4a in token", "aJa", {{Item("aJa", Item::kTokenType), {}}}}, + {"0x4b in token", "aKa", {{Item("aKa", Item::kTokenType), {}}}}, + {"0x4c in token", "aLa", {{Item("aLa", Item::kTokenType), {}}}}, + {"0x4d in token", "aMa", {{Item("aMa", Item::kTokenType), {}}}}, + {"0x4e in token", "aNa", {{Item("aNa", Item::kTokenType), {}}}}, + {"0x4f in token", "aOa", {{Item("aOa", Item::kTokenType), {}}}}, + {"0x50 in token", "aPa", {{Item("aPa", Item::kTokenType), {}}}}, + {"0x51 in token", "aQa", {{Item("aQa", Item::kTokenType), {}}}}, + {"0x52 in token", "aRa", {{Item("aRa", Item::kTokenType), {}}}}, + {"0x53 in token", "aSa", {{Item("aSa", Item::kTokenType), {}}}}, + {"0x54 in token", "aTa", {{Item("aTa", Item::kTokenType), {}}}}, + {"0x55 in token", "aUa", {{Item("aUa", Item::kTokenType), {}}}}, + {"0x56 in token", "aVa", {{Item("aVa", Item::kTokenType), {}}}}, + {"0x57 in token", "aWa", {{Item("aWa", Item::kTokenType), {}}}}, + {"0x58 in token", "aXa", {{Item("aXa", Item::kTokenType), {}}}}, + {"0x59 in token", "aYa", {{Item("aYa", Item::kTokenType), {}}}}, + {"0x5a in token", "aZa", {{Item("aZa", Item::kTokenType), {}}}}, + {"0x5b in token", "a[a", base::nullopt}, + {"0x5c in token", "a\\a", base::nullopt}, + {"0x5d in token", "a]a", base::nullopt}, + {"0x5e in token", "a^a", {{Item("a^a", Item::kTokenType), {}}}}, + {"0x5f in token", "a_a", {{Item("a_a", Item::kTokenType), {}}}}, + {"0x60 in token", "a`a", {{Item("a`a", Item::kTokenType), {}}}}, + {"0x61 in token", "aaa", {{Item("aaa", Item::kTokenType), {}}}}, + {"0x62 in token", "aba", {{Item("aba", Item::kTokenType), {}}}}, + {"0x63 in token", "aca", {{Item("aca", Item::kTokenType), {}}}}, + {"0x64 in token", "ada", {{Item("ada", Item::kTokenType), {}}}}, + {"0x65 in token", "aea", {{Item("aea", Item::kTokenType), {}}}}, + {"0x66 in token", "afa", {{Item("afa", Item::kTokenType), {}}}}, + {"0x67 in token", "aga", {{Item("aga", Item::kTokenType), {}}}}, + {"0x68 in token", "aha", {{Item("aha", Item::kTokenType), {}}}}, + {"0x69 in token", "aia", {{Item("aia", Item::kTokenType), {}}}}, + {"0x6a in token", "aja", {{Item("aja", Item::kTokenType), {}}}}, + {"0x6b in token", "aka", {{Item("aka", Item::kTokenType), {}}}}, + {"0x6c in token", "ala", {{Item("ala", Item::kTokenType), {}}}}, + {"0x6d in token", "ama", {{Item("ama", Item::kTokenType), {}}}}, + {"0x6e in token", "ana", {{Item("ana", Item::kTokenType), {}}}}, + {"0x6f in token", "aoa", {{Item("aoa", Item::kTokenType), {}}}}, + {"0x70 in token", "apa", {{Item("apa", Item::kTokenType), {}}}}, + {"0x71 in token", "aqa", {{Item("aqa", Item::kTokenType), {}}}}, + {"0x72 in token", "ara", {{Item("ara", Item::kTokenType), {}}}}, + {"0x73 in token", "asa", {{Item("asa", Item::kTokenType), {}}}}, + {"0x74 in token", "ata", {{Item("ata", Item::kTokenType), {}}}}, + {"0x75 in token", "aua", {{Item("aua", Item::kTokenType), {}}}}, + {"0x76 in token", "ava", {{Item("ava", Item::kTokenType), {}}}}, + {"0x77 in token", "awa", {{Item("awa", Item::kTokenType), {}}}}, + {"0x78 in token", "axa", {{Item("axa", Item::kTokenType), {}}}}, + {"0x79 in token", "aya", {{Item("aya", Item::kTokenType), {}}}}, + {"0x7a in token", "aza", {{Item("aza", Item::kTokenType), {}}}}, + {"0x7b in token", "a{a", base::nullopt}, + {"0x7c in token", "a|a", {{Item("a|a", Item::kTokenType), {}}}}, + {"0x7d in token", "a}a", base::nullopt}, + {"0x7e in token", "a~a", {{Item("a~a", Item::kTokenType), {}}}}, + {"0x7f in token", "a\177a", base::nullopt}, + {"0x01 starting an token", "\001a", base::nullopt}, + {"0x02 starting an token", "\002a", base::nullopt}, + {"0x03 starting an token", "\003a", base::nullopt}, + {"0x04 starting an token", "\004a", base::nullopt}, + {"0x05 starting an token", "\005a", base::nullopt}, + {"0x06 starting an token", "\006a", base::nullopt}, + {"0x07 starting an token", "\aa", base::nullopt}, + {"0x08 starting an token", "\ba", base::nullopt}, + {"0x09 starting an token", "\ta", base::nullopt}, + {"0x0a starting an token", "\na", base::nullopt}, + {"0x0b starting an token", "\va", base::nullopt}, + {"0x0c starting an token", "\fa", base::nullopt}, + {"0x0d starting an token", "\ra", base::nullopt}, + {"0x0e starting an token", "\016a", base::nullopt}, + {"0x0f starting an token", "\017a", base::nullopt}, + {"0x10 starting an token", "\020a", base::nullopt}, + {"0x11 starting an token", "\021a", base::nullopt}, + {"0x12 starting an token", "\022a", base::nullopt}, + {"0x13 starting an token", "\023a", base::nullopt}, + {"0x14 starting an token", "\024a", base::nullopt}, + {"0x15 starting an token", "\025a", base::nullopt}, + {"0x16 starting an token", "\026a", base::nullopt}, + {"0x17 starting an token", "\027a", base::nullopt}, + {"0x18 starting an token", "\030a", base::nullopt}, + {"0x19 starting an token", "\031a", base::nullopt}, + {"0x1a starting an token", "\032a", base::nullopt}, + {"0x1b starting an token", "\033a", base::nullopt}, + {"0x1c starting an token", "\034a", base::nullopt}, + {"0x1d starting an token", "\035a", base::nullopt}, + {"0x1e starting an token", "\036a", base::nullopt}, + {"0x1f starting an token", "\037a", base::nullopt}, + {"0x20 starting an token", " a", {{Item("a", Item::kTokenType), {}}}, "a"}, + {"0x21 starting an token", "!a", base::nullopt}, + {"0x22 starting an token", "\"a", base::nullopt}, + {"0x23 starting an token", "#a", base::nullopt}, + {"0x24 starting an token", "$a", base::nullopt}, + {"0x25 starting an token", "%a", base::nullopt}, + {"0x26 starting an token", "&a", base::nullopt}, + {"0x27 starting an token", "'a", base::nullopt}, + {"0x28 starting an token", "(a", base::nullopt}, + {"0x29 starting an token", ")a", base::nullopt}, + {"0x2a starting an token", "*a", {{Item("*a", Item::kTokenType), {}}}}, + {"0x2b starting an token", "+a", base::nullopt}, + {"0x2c starting an token", ",a", base::nullopt}, + {"0x2d starting an token", "-a", base::nullopt}, + {"0x2e starting an token", ".a", base::nullopt}, + {"0x2f starting an token", "/a", base::nullopt}, + {"0x30 starting an token", "0a", base::nullopt}, + {"0x31 starting an token", "1a", base::nullopt}, + {"0x32 starting an token", "2a", base::nullopt}, + {"0x33 starting an token", "3a", base::nullopt}, + {"0x34 starting an token", "4a", base::nullopt}, + {"0x35 starting an token", "5a", base::nullopt}, + {"0x36 starting an token", "6a", base::nullopt}, + {"0x37 starting an token", "7a", base::nullopt}, + {"0x38 starting an token", "8a", base::nullopt}, + {"0x39 starting an token", "9a", base::nullopt}, + {"0x3a starting an token", ":a", base::nullopt}, + {"0x3b starting an token", ";a", base::nullopt}, + {"0x3c starting an token", "<a", base::nullopt}, + {"0x3d starting an token", "=a", base::nullopt}, + {"0x3e starting an token", ">a", base::nullopt}, + {"0x3f starting an token", "?a", base::nullopt}, + {"0x40 starting an token", "@a", base::nullopt}, + {"0x41 starting an token", "Aa", {{Item("Aa", Item::kTokenType), {}}}}, + {"0x42 starting an token", "Ba", {{Item("Ba", Item::kTokenType), {}}}}, + {"0x43 starting an token", "Ca", {{Item("Ca", Item::kTokenType), {}}}}, + {"0x44 starting an token", "Da", {{Item("Da", Item::kTokenType), {}}}}, + {"0x45 starting an token", "Ea", {{Item("Ea", Item::kTokenType), {}}}}, + {"0x46 starting an token", "Fa", {{Item("Fa", Item::kTokenType), {}}}}, + {"0x47 starting an token", "Ga", {{Item("Ga", Item::kTokenType), {}}}}, + {"0x48 starting an token", "Ha", {{Item("Ha", Item::kTokenType), {}}}}, + {"0x49 starting an token", "Ia", {{Item("Ia", Item::kTokenType), {}}}}, + {"0x4a starting an token", "Ja", {{Item("Ja", Item::kTokenType), {}}}}, + {"0x4b starting an token", "Ka", {{Item("Ka", Item::kTokenType), {}}}}, + {"0x4c starting an token", "La", {{Item("La", Item::kTokenType), {}}}}, + {"0x4d starting an token", "Ma", {{Item("Ma", Item::kTokenType), {}}}}, + {"0x4e starting an token", "Na", {{Item("Na", Item::kTokenType), {}}}}, + {"0x4f starting an token", "Oa", {{Item("Oa", Item::kTokenType), {}}}}, + {"0x50 starting an token", "Pa", {{Item("Pa", Item::kTokenType), {}}}}, + {"0x51 starting an token", "Qa", {{Item("Qa", Item::kTokenType), {}}}}, + {"0x52 starting an token", "Ra", {{Item("Ra", Item::kTokenType), {}}}}, + {"0x53 starting an token", "Sa", {{Item("Sa", Item::kTokenType), {}}}}, + {"0x54 starting an token", "Ta", {{Item("Ta", Item::kTokenType), {}}}}, + {"0x55 starting an token", "Ua", {{Item("Ua", Item::kTokenType), {}}}}, + {"0x56 starting an token", "Va", {{Item("Va", Item::kTokenType), {}}}}, + {"0x57 starting an token", "Wa", {{Item("Wa", Item::kTokenType), {}}}}, + {"0x58 starting an token", "Xa", {{Item("Xa", Item::kTokenType), {}}}}, + {"0x59 starting an token", "Ya", {{Item("Ya", Item::kTokenType), {}}}}, + {"0x5a starting an token", "Za", {{Item("Za", Item::kTokenType), {}}}}, + {"0x5b starting an token", "[a", base::nullopt}, + {"0x5c starting an token", "\\a", base::nullopt}, + {"0x5d starting an token", "]a", base::nullopt}, + {"0x5e starting an token", "^a", base::nullopt}, + {"0x5f starting an token", "_a", base::nullopt}, + {"0x60 starting an token", "`a", base::nullopt}, + {"0x61 starting an token", "aa", {{Item("aa", Item::kTokenType), {}}}}, + {"0x62 starting an token", "ba", {{Item("ba", Item::kTokenType), {}}}}, + {"0x63 starting an token", "ca", {{Item("ca", Item::kTokenType), {}}}}, + {"0x64 starting an token", "da", {{Item("da", Item::kTokenType), {}}}}, + {"0x65 starting an token", "ea", {{Item("ea", Item::kTokenType), {}}}}, + {"0x66 starting an token", "fa", {{Item("fa", Item::kTokenType), {}}}}, + {"0x67 starting an token", "ga", {{Item("ga", Item::kTokenType), {}}}}, + {"0x68 starting an token", "ha", {{Item("ha", Item::kTokenType), {}}}}, + {"0x69 starting an token", "ia", {{Item("ia", Item::kTokenType), {}}}}, + {"0x6a starting an token", "ja", {{Item("ja", Item::kTokenType), {}}}}, + {"0x6b starting an token", "ka", {{Item("ka", Item::kTokenType), {}}}}, + {"0x6c starting an token", "la", {{Item("la", Item::kTokenType), {}}}}, + {"0x6d starting an token", "ma", {{Item("ma", Item::kTokenType), {}}}}, + {"0x6e starting an token", "na", {{Item("na", Item::kTokenType), {}}}}, + {"0x6f starting an token", "oa", {{Item("oa", Item::kTokenType), {}}}}, + {"0x70 starting an token", "pa", {{Item("pa", Item::kTokenType), {}}}}, + {"0x71 starting an token", "qa", {{Item("qa", Item::kTokenType), {}}}}, + {"0x72 starting an token", "ra", {{Item("ra", Item::kTokenType), {}}}}, + {"0x73 starting an token", "sa", {{Item("sa", Item::kTokenType), {}}}}, + {"0x74 starting an token", "ta", {{Item("ta", Item::kTokenType), {}}}}, + {"0x75 starting an token", "ua", {{Item("ua", Item::kTokenType), {}}}}, + {"0x76 starting an token", "va", {{Item("va", Item::kTokenType), {}}}}, + {"0x77 starting an token", "wa", {{Item("wa", Item::kTokenType), {}}}}, + {"0x78 starting an token", "xa", {{Item("xa", Item::kTokenType), {}}}}, + {"0x79 starting an token", "ya", {{Item("ya", Item::kTokenType), {}}}}, + {"0x7a starting an token", "za", {{Item("za", Item::kTokenType), {}}}}, + {"0x7b starting an token", "{a", base::nullopt}, + {"0x7c starting an token", "|a", base::nullopt}, + {"0x7d starting an token", "}a", base::nullopt}, + {"0x7e starting an token", "~a", base::nullopt}, + {"0x7f starting an token", "\177a", base::nullopt}, + {"basic token - item", + "a_b-c.d3:f%00/*", + {{Item("a_b-c.d3:f%00/*", Item::kTokenType), {}}}}, + {"token with capitals - item", + "fooBar", + {{Item("fooBar", Item::kTokenType), {}}}}, + {"token starting with capitals - item", + "FooBar", + {{Item("FooBar", Item::kTokenType), {}}}}, + {"too big postive integer - serialize", + nullptr, + {{Integer(1000000000000000), {}}}}, + {"too big negative integer - serialize", + nullptr, + {{Integer(-1000000000000000), {}}}}, + {"too big postive decimal - serialize", + nullptr, + {{Item(1000000000000.000000), {}}}}, + {"too big negative decimal - serialize", + nullptr, + {{Item(-1000000000000.000000), {}}}}, + {"round positive odd decimal - serialize", + nullptr, + {{Item(0.001500), {}}}, + "0.002"}, + {"round positive even decimal - serialize", + nullptr, + {{Item(0.002500), {}}}, + "0.002"}, + {"round negative odd decimal - serialize", + nullptr, + {{Item(-0.001500), {}}}, + "-0.002"}, + {"round negative even decimal - serialize", + nullptr, + {{Item(-0.002500), {}}}, + "-0.002"}, + {"decimal round up to integer part - serialize", + nullptr, + {{Item(9.999500), {}}}, + "10.0"}, + {"0x01 in string - serialise only", nullptr, {{Item("\001"), {}}}}, + {"0x02 in string - serialise only", nullptr, {{Item("\002"), {}}}}, + {"0x03 in string - serialise only", nullptr, {{Item("\003"), {}}}}, + {"0x04 in string - serialise only", nullptr, {{Item("\004"), {}}}}, + {"0x05 in string - serialise only", nullptr, {{Item("\005"), {}}}}, + {"0x06 in string - serialise only", nullptr, {{Item("\006"), {}}}}, + {"0x07 in string - serialise only", nullptr, {{Item("\a"), {}}}}, + {"0x08 in string - serialise only", nullptr, {{Item("\b"), {}}}}, + {"0x09 in string - serialise only", nullptr, {{Item("\t"), {}}}}, + {"0x0a in string - serialise only", nullptr, {{Item("\n"), {}}}}, + {"0x0b in string - serialise only", nullptr, {{Item("\v"), {}}}}, + {"0x0c in string - serialise only", nullptr, {{Item("\f"), {}}}}, + {"0x0d in string - serialise only", nullptr, {{Item("\r"), {}}}}, + {"0x0e in string - serialise only", nullptr, {{Item("\016"), {}}}}, + {"0x0f in string - serialise only", nullptr, {{Item("\017"), {}}}}, + {"0x10 in string - serialise only", nullptr, {{Item("\020"), {}}}}, + {"0x11 in string - serialise only", nullptr, {{Item("\021"), {}}}}, + {"0x12 in string - serialise only", nullptr, {{Item("\022"), {}}}}, + {"0x13 in string - serialise only", nullptr, {{Item("\023"), {}}}}, + {"0x14 in string - serialise only", nullptr, {{Item("\024"), {}}}}, + {"0x15 in string - serialise only", nullptr, {{Item("\025"), {}}}}, + {"0x16 in string - serialise only", nullptr, {{Item("\026"), {}}}}, + {"0x17 in string - serialise only", nullptr, {{Item("\027"), {}}}}, + {"0x18 in string - serialise only", nullptr, {{Item("\030"), {}}}}, + {"0x19 in string - serialise only", nullptr, {{Item("\031"), {}}}}, + {"0x1a in string - serialise only", nullptr, {{Item("\032"), {}}}}, + {"0x1b in string - serialise only", nullptr, {{Item("\033"), {}}}}, + {"0x1c in string - serialise only", nullptr, {{Item("\034"), {}}}}, + {"0x1d in string - serialise only", nullptr, {{Item("\035"), {}}}}, + {"0x1e in string - serialise only", nullptr, {{Item("\036"), {}}}}, + {"0x1f in string - serialise only", nullptr, {{Item("\037"), {}}}}, + {"0x7f in string - serialise only", nullptr, {{Item("\177"), {}}}}, + {"0x01 in token - serialise only", + nullptr, + {{Item("a\001a", Item::kTokenType), {}}}}, + {"0x02 in token - serialise only", + nullptr, + {{Item("a\002a", Item::kTokenType), {}}}}, + {"0x03 in token - serialise only", + nullptr, + {{Item("a\003a", Item::kTokenType), {}}}}, + {"0x04 in token - serialise only", + nullptr, + {{Item("a\004a", Item::kTokenType), {}}}}, + {"0x05 in token - serialise only", + nullptr, + {{Item("a\005a", Item::kTokenType), {}}}}, + {"0x06 in token - serialise only", + nullptr, + {{Item("a\006a", Item::kTokenType), {}}}}, + {"0x07 in token - serialise only", + nullptr, + {{Item("a\aa", Item::kTokenType), {}}}}, + {"0x08 in token - serialise only", + nullptr, + {{Item("a\ba", Item::kTokenType), {}}}}, + {"0x09 in token - serialise only", + nullptr, + {{Item("a\ta", Item::kTokenType), {}}}}, + {"0x0a in token - serialise only", + nullptr, + {{Item("a\na", Item::kTokenType), {}}}}, + {"0x0b in token - serialise only", + nullptr, + {{Item("a\va", Item::kTokenType), {}}}}, + {"0x0c in token - serialise only", + nullptr, + {{Item("a\fa", Item::kTokenType), {}}}}, + {"0x0d in token - serialise only", + nullptr, + {{Item("a\ra", Item::kTokenType), {}}}}, + {"0x0e in token - serialise only", + nullptr, + {{Item("a\016a", Item::kTokenType), {}}}}, + {"0x0f in token - serialise only", + nullptr, + {{Item("a\017a", Item::kTokenType), {}}}}, + {"0x10 in token - serialise only", + nullptr, + {{Item("a\020a", Item::kTokenType), {}}}}, + {"0x11 in token - serialise only", + nullptr, + {{Item("a\021a", Item::kTokenType), {}}}}, + {"0x12 in token - serialise only", + nullptr, + {{Item("a\022a", Item::kTokenType), {}}}}, + {"0x13 in token - serialise only", + nullptr, + {{Item("a\023a", Item::kTokenType), {}}}}, + {"0x14 in token - serialise only", + nullptr, + {{Item("a\024a", Item::kTokenType), {}}}}, + {"0x15 in token - serialise only", + nullptr, + {{Item("a\025a", Item::kTokenType), {}}}}, + {"0x16 in token - serialise only", + nullptr, + {{Item("a\026a", Item::kTokenType), {}}}}, + {"0x17 in token - serialise only", + nullptr, + {{Item("a\027a", Item::kTokenType), {}}}}, + {"0x18 in token - serialise only", + nullptr, + {{Item("a\030a", Item::kTokenType), {}}}}, + {"0x19 in token - serialise only", + nullptr, + {{Item("a\031a", Item::kTokenType), {}}}}, + {"0x1a in token - serialise only", + nullptr, + {{Item("a\032a", Item::kTokenType), {}}}}, + {"0x1b in token - serialise only", + nullptr, + {{Item("a\033a", Item::kTokenType), {}}}}, + {"0x1c in token - serialise only", + nullptr, + {{Item("a\034a", Item::kTokenType), {}}}}, + {"0x1d in token - serialise only", + nullptr, + {{Item("a\035a", Item::kTokenType), {}}}}, + {"0x1e in token - serialise only", + nullptr, + {{Item("a\036a", Item::kTokenType), {}}}}, + {"0x1f in token - serialise only", + nullptr, + {{Item("a\037a", Item::kTokenType), {}}}}, + {"0x20 in token - serialise only", + nullptr, + {{Item("a a", Item::kTokenType), {}}}}, + {"0x22 in token - serialise only", + nullptr, + {{Item("a\"a", Item::kTokenType), {}}}}, + {"0x28 in token - serialise only", + nullptr, + {{Item("a(a", Item::kTokenType), {}}}}, + {"0x29 in token - serialise only", + nullptr, + {{Item("a)a", Item::kTokenType), {}}}}, + {"0x2c in token - serialise only", + nullptr, + {{Item("a,a", Item::kTokenType), {}}}}, + {"0x3b in token - serialise only", + nullptr, + {{Item("a;a", Item::kTokenType), {}}}}, + {"0x3c in token - serialise only", + nullptr, + {{Item("a<a", Item::kTokenType), {}}}}, + {"0x3d in token - serialise only", + nullptr, + {{Item("a=a", Item::kTokenType), {}}}}, + {"0x3e in token - serialise only", + nullptr, + {{Item("a>a", Item::kTokenType), {}}}}, + {"0x3f in token - serialise only", + nullptr, + {{Item("a?a", Item::kTokenType), {}}}}, + {"0x40 in token - serialise only", + nullptr, + {{Item("a@a", Item::kTokenType), {}}}}, + {"0x5b in token - serialise only", + nullptr, + {{Item("a[a", Item::kTokenType), {}}}}, + {"0x5c in token - serialise only", + nullptr, + {{Item("a\\a", Item::kTokenType), {}}}}, + {"0x5d in token - serialise only", + nullptr, + {{Item("a]a", Item::kTokenType), {}}}}, + {"0x7b in token - serialise only", + nullptr, + {{Item("a{a", Item::kTokenType), {}}}}, + {"0x7d in token - serialise only", + nullptr, + {{Item("a}a", Item::kTokenType), {}}}}, + {"0x7f in token - serialise only", + nullptr, + {{Item("a\177a", Item::kTokenType), {}}}}, + {"0x01 starting a token - serialise only", + nullptr, + {{Item("\001a", Item::kTokenType), {}}}}, + {"0x02 starting a token - serialise only", + nullptr, + {{Item("\002a", Item::kTokenType), {}}}}, + {"0x03 starting a token - serialise only", + nullptr, + {{Item("\003a", Item::kTokenType), {}}}}, + {"0x04 starting a token - serialise only", + nullptr, + {{Item("\004a", Item::kTokenType), {}}}}, + {"0x05 starting a token - serialise only", + nullptr, + {{Item("\005a", Item::kTokenType), {}}}}, + {"0x06 starting a token - serialise only", + nullptr, + {{Item("\006a", Item::kTokenType), {}}}}, + {"0x07 starting a token - serialise only", + nullptr, + {{Item("\aa", Item::kTokenType), {}}}}, + {"0x08 starting a token - serialise only", + nullptr, + {{Item("\ba", Item::kTokenType), {}}}}, + {"0x09 starting a token - serialise only", + nullptr, + {{Item("\ta", Item::kTokenType), {}}}}, + {"0x0a starting a token - serialise only", + nullptr, + {{Item("\na", Item::kTokenType), {}}}}, + {"0x0b starting a token - serialise only", + nullptr, + {{Item("\va", Item::kTokenType), {}}}}, + {"0x0c starting a token - serialise only", + nullptr, + {{Item("\fa", Item::kTokenType), {}}}}, + {"0x0d starting a token - serialise only", + nullptr, + {{Item("\ra", Item::kTokenType), {}}}}, + {"0x0e starting a token - serialise only", + nullptr, + {{Item("\016a", Item::kTokenType), {}}}}, + {"0x0f starting a token - serialise only", + nullptr, + {{Item("\017a", Item::kTokenType), {}}}}, + {"0x10 starting a token - serialise only", + nullptr, + {{Item("\020a", Item::kTokenType), {}}}}, + {"0x11 starting a token - serialise only", + nullptr, + {{Item("\021a", Item::kTokenType), {}}}}, + {"0x12 starting a token - serialise only", + nullptr, + {{Item("\022a", Item::kTokenType), {}}}}, + {"0x13 starting a token - serialise only", + nullptr, + {{Item("\023a", Item::kTokenType), {}}}}, + {"0x14 starting a token - serialise only", + nullptr, + {{Item("\024a", Item::kTokenType), {}}}}, + {"0x15 starting a token - serialise only", + nullptr, + {{Item("\025a", Item::kTokenType), {}}}}, + {"0x16 starting a token - serialise only", + nullptr, + {{Item("\026a", Item::kTokenType), {}}}}, + {"0x17 starting a token - serialise only", + nullptr, + {{Item("\027a", Item::kTokenType), {}}}}, + {"0x18 starting a token - serialise only", + nullptr, + {{Item("\030a", Item::kTokenType), {}}}}, + {"0x19 starting a token - serialise only", + nullptr, + {{Item("\031a", Item::kTokenType), {}}}}, + {"0x1a starting a token - serialise only", + nullptr, + {{Item("\032a", Item::kTokenType), {}}}}, + {"0x1b starting a token - serialise only", + nullptr, + {{Item("\033a", Item::kTokenType), {}}}}, + {"0x1c starting a token - serialise only", + nullptr, + {{Item("\034a", Item::kTokenType), {}}}}, + {"0x1d starting a token - serialise only", + nullptr, + {{Item("\035a", Item::kTokenType), {}}}}, + {"0x1e starting a token - serialise only", + nullptr, + {{Item("\036a", Item::kTokenType), {}}}}, + {"0x1f starting a token - serialise only", + nullptr, + {{Item("\037a", Item::kTokenType), {}}}}, + {"0x20 starting a token - serialise only", + nullptr, + {{Item(" a", Item::kTokenType), {}}}}, + {"0x21 starting a token - serialise only", + nullptr, + {{Item("!a", Item::kTokenType), {}}}}, + {"0x22 starting a token - serialise only", + nullptr, + {{Item("\"a", Item::kTokenType), {}}}}, + {"0x23 starting a token - serialise only", + nullptr, + {{Item("#a", Item::kTokenType), {}}}}, + {"0x24 starting a token - serialise only", + nullptr, + {{Item("$a", Item::kTokenType), {}}}}, + {"0x25 starting a token - serialise only", + nullptr, + {{Item("%a", Item::kTokenType), {}}}}, + {"0x26 starting a token - serialise only", + nullptr, + {{Item("&a", Item::kTokenType), {}}}}, + {"0x27 starting a token - serialise only", + nullptr, + {{Item("'a", Item::kTokenType), {}}}}, + {"0x28 starting a token - serialise only", + nullptr, + {{Item("(a", Item::kTokenType), {}}}}, + {"0x29 starting a token - serialise only", + nullptr, + {{Item(")a", Item::kTokenType), {}}}}, + {"0x2b starting a token - serialise only", + nullptr, + {{Item("+a", Item::kTokenType), {}}}}, + {"0x2c starting a token - serialise only", + nullptr, + {{Item(",a", Item::kTokenType), {}}}}, + {"0x2d starting a token - serialise only", + nullptr, + {{Item("-a", Item::kTokenType), {}}}}, + {"0x2e starting a token - serialise only", + nullptr, + {{Item(".a", Item::kTokenType), {}}}}, + {"0x2f starting a token - serialise only", + nullptr, + {{Item("/a", Item::kTokenType), {}}}}, + {"0x30 starting a token - serialise only", + nullptr, + {{Item("0a", Item::kTokenType), {}}}}, + {"0x31 starting a token - serialise only", + nullptr, + {{Item("1a", Item::kTokenType), {}}}}, + {"0x32 starting a token - serialise only", + nullptr, + {{Item("2a", Item::kTokenType), {}}}}, + {"0x33 starting a token - serialise only", + nullptr, + {{Item("3a", Item::kTokenType), {}}}}, + {"0x34 starting a token - serialise only", + nullptr, + {{Item("4a", Item::kTokenType), {}}}}, + {"0x35 starting a token - serialise only", + nullptr, + {{Item("5a", Item::kTokenType), {}}}}, + {"0x36 starting a token - serialise only", + nullptr, + {{Item("6a", Item::kTokenType), {}}}}, + {"0x37 starting a token - serialise only", + nullptr, + {{Item("7a", Item::kTokenType), {}}}}, + {"0x38 starting a token - serialise only", + nullptr, + {{Item("8a", Item::kTokenType), {}}}}, + {"0x39 starting a token - serialise only", + nullptr, + {{Item("9a", Item::kTokenType), {}}}}, + {"0x3a starting a token - serialise only", + nullptr, + {{Item(":a", Item::kTokenType), {}}}}, + {"0x3b starting a token - serialise only", + nullptr, + {{Item(";a", Item::kTokenType), {}}}}, + {"0x3c starting a token - serialise only", + nullptr, + {{Item("<a", Item::kTokenType), {}}}}, + {"0x3d starting a token - serialise only", + nullptr, + {{Item("=a", Item::kTokenType), {}}}}, + {"0x3e starting a token - serialise only", + nullptr, + {{Item(">a", Item::kTokenType), {}}}}, + {"0x3f starting a token - serialise only", + nullptr, + {{Item("?a", Item::kTokenType), {}}}}, + {"0x40 starting a token - serialise only", + nullptr, + {{Item("@a", Item::kTokenType), {}}}}, + {"0x5b starting a token - serialise only", + nullptr, + {{Item("[a", Item::kTokenType), {}}}}, + {"0x5c starting a token - serialise only", + nullptr, + {{Item("\\a", Item::kTokenType), {}}}}, + {"0x5d starting a token - serialise only", + nullptr, + {{Item("]a", Item::kTokenType), {}}}}, + {"0x5e starting a token - serialise only", + nullptr, + {{Item("^a", Item::kTokenType), {}}}}, + {"0x5f starting a token - serialise only", + nullptr, + {{Item("_a", Item::kTokenType), {}}}}, + {"0x60 starting a token - serialise only", + nullptr, + {{Item("`a", Item::kTokenType), {}}}}, + {"0x7b starting a token - serialise only", + nullptr, + {{Item("{a", Item::kTokenType), {}}}}, + {"0x7c starting a token - serialise only", + nullptr, + {{Item("|a", Item::kTokenType), {}}}}, + {"0x7d starting a token - serialise only", + nullptr, + {{Item("}a", Item::kTokenType), {}}}}, + {"0x7e starting a token - serialise only", + nullptr, + {{Item("~a", Item::kTokenType), {}}}}, + {"0x7f starting a token - serialise only", + nullptr, + {{Item("\177a", Item::kTokenType), {}}}}, +}; + +const struct ListTestCase { + const char* name; + const char* raw; + const base::Optional<List> expected; // nullopt if parse error is expected. + const char* canonical; // nullptr if parse error is expected, or if canonical + // format is identical to raw. +} list_test_cases[] = { + {"tab separated dictionary", "a=1\t,\tb=2", base::nullopt}, + {"Example-StrListHeader", + "\"foo\", \"bar\", \"It was the best of times.\"", + {{{Item("foo"), {}}, + {Item("bar"), {}}, + {Item("It was the best of times."), {}}}}}, + {"Example-Hdr (list on one line)", + "foo, bar", + {{{Item("foo", Item::kTokenType), {}}, + {Item("bar", Item::kTokenType), {}}}}}, + {"Example-Hdr (list on two lines)", + "foo, bar", + {{{Item("foo", Item::kTokenType), {}}, + {Item("bar", Item::kTokenType), {}}}}, + "foo, bar"}, + {"Example-StrListListHeader", + "(\"foo\" \"bar\"), (\"baz\"), (\"bat\" \"one\"), ()", + {{{{{Item("foo"), {}}, {Item("bar"), {}}}, {}}, + {{{Item("baz"), {}}}, {}}, + {{{Item("bat"), {}}, {Item("one"), {}}}, {}}, + {std::vector<ParameterizedItem>(), {}}}}}, + {"Example-ListListParam", + "(\"foo\"; a=1;b=2);lvl=5, (\"bar\" \"baz\");lvl=1", + {{{{{Item("foo"), {Param("a", 1), Param("b", 2)}}}, {Param("lvl", 5)}}, + {{{Item("bar"), {}}, {Item("baz"), {}}}, {Param("lvl", 1)}}}}, + "(\"foo\";a=1;b=2);lvl=5, (\"bar\" \"baz\");lvl=1"}, + {"Example-ParamListHeader", + "abc;a=1;b=2; cde_456, (ghi;jk=4 l);q=\"9\";r=w", + {{{Item("abc", Item::kTokenType), + {Param("a", 1), Param("b", 2), BooleanParam("cde_456", true)}}, + {{{Item("ghi", Item::kTokenType), {Param("jk", 4)}}, + {Item("l", Item::kTokenType), {}}}, + {Param("q", "9"), TokenParam("r", "w")}}}}, + "abc;a=1;b=2;cde_456, (ghi;jk=4 l);q=\"9\";r=w"}, + {"0x01 in parameterised list key", "foo; a\001a=1", base::nullopt}, + {"0x02 in parameterised list key", "foo; a\002a=1", base::nullopt}, + {"0x03 in parameterised list key", "foo; a\003a=1", base::nullopt}, + {"0x04 in parameterised list key", "foo; a\004a=1", base::nullopt}, + {"0x05 in parameterised list key", "foo; a\005a=1", base::nullopt}, + {"0x06 in parameterised list key", "foo; a\006a=1", base::nullopt}, + {"0x07 in parameterised list key", "foo; a\aa=1", base::nullopt}, + {"0x08 in parameterised list key", "foo; a\ba=1", base::nullopt}, + {"0x09 in parameterised list key", "foo; a\ta=1", base::nullopt}, + {"0x0a in parameterised list key", "foo; a\na=1", base::nullopt}, + {"0x0b in parameterised list key", "foo; a\va=1", base::nullopt}, + {"0x0c in parameterised list key", "foo; a\fa=1", base::nullopt}, + {"0x0d in parameterised list key", "foo; a\ra=1", base::nullopt}, + {"0x0e in parameterised list key", "foo; a\016a=1", base::nullopt}, + {"0x0f in parameterised list key", "foo; a\017a=1", base::nullopt}, + {"0x10 in parameterised list key", "foo; a\020a=1", base::nullopt}, + {"0x11 in parameterised list key", "foo; a\021a=1", base::nullopt}, + {"0x12 in parameterised list key", "foo; a\022a=1", base::nullopt}, + {"0x13 in parameterised list key", "foo; a\023a=1", base::nullopt}, + {"0x14 in parameterised list key", "foo; a\024a=1", base::nullopt}, + {"0x15 in parameterised list key", "foo; a\025a=1", base::nullopt}, + {"0x16 in parameterised list key", "foo; a\026a=1", base::nullopt}, + {"0x17 in parameterised list key", "foo; a\027a=1", base::nullopt}, + {"0x18 in parameterised list key", "foo; a\030a=1", base::nullopt}, + {"0x19 in parameterised list key", "foo; a\031a=1", base::nullopt}, + {"0x1a in parameterised list key", "foo; a\032a=1", base::nullopt}, + {"0x1b in parameterised list key", "foo; a\033a=1", base::nullopt}, + {"0x1c in parameterised list key", "foo; a\034a=1", base::nullopt}, + {"0x1d in parameterised list key", "foo; a\035a=1", base::nullopt}, + {"0x1e in parameterised list key", "foo; a\036a=1", base::nullopt}, + {"0x1f in parameterised list key", "foo; a\037a=1", base::nullopt}, + {"0x20 in parameterised list key", "foo; a a=1", base::nullopt}, + {"0x21 in parameterised list key", "foo; a!a=1", base::nullopt}, + {"0x22 in parameterised list key", "foo; a\"a=1", base::nullopt}, + {"0x23 in parameterised list key", "foo; a#a=1", base::nullopt}, + {"0x24 in parameterised list key", "foo; a$a=1", base::nullopt}, + {"0x25 in parameterised list key", "foo; a%a=1", base::nullopt}, + {"0x26 in parameterised list key", "foo; a&a=1", base::nullopt}, + {"0x27 in parameterised list key", "foo; a'a=1", base::nullopt}, + {"0x28 in parameterised list key", "foo; a(a=1", base::nullopt}, + {"0x29 in parameterised list key", "foo; a)a=1", base::nullopt}, + {"0x2a in parameterised list key", + "foo; a*a=1", + {{{Item("foo", Item::kTokenType), {Param("a*a", 1)}}}}, + "foo;a*a=1"}, + {"0x2b in parameterised list key", "foo; a+a=1", base::nullopt}, + {"0x2c in parameterised list key", "foo; a,a=1", base::nullopt}, + {"0x2d in parameterised list key", + "foo; a-a=1", + {{{Item("foo", Item::kTokenType), {Param("a-a", 1)}}}}, + "foo;a-a=1"}, + {"0x2e in parameterised list key", + "foo; a.a=1", + {{{Item("foo", Item::kTokenType), {Param("a.a", 1)}}}}, + "foo;a.a=1"}, + {"0x2f in parameterised list key", "foo; a/a=1", base::nullopt}, + {"0x30 in parameterised list key", + "foo; a0a=1", + {{{Item("foo", Item::kTokenType), {Param("a0a", 1)}}}}, + "foo;a0a=1"}, + {"0x31 in parameterised list key", + "foo; a1a=1", + {{{Item("foo", Item::kTokenType), {Param("a1a", 1)}}}}, + "foo;a1a=1"}, + {"0x32 in parameterised list key", + "foo; a2a=1", + {{{Item("foo", Item::kTokenType), {Param("a2a", 1)}}}}, + "foo;a2a=1"}, + {"0x33 in parameterised list key", + "foo; a3a=1", + {{{Item("foo", Item::kTokenType), {Param("a3a", 1)}}}}, + "foo;a3a=1"}, + {"0x34 in parameterised list key", + "foo; a4a=1", + {{{Item("foo", Item::kTokenType), {Param("a4a", 1)}}}}, + "foo;a4a=1"}, + {"0x35 in parameterised list key", + "foo; a5a=1", + {{{Item("foo", Item::kTokenType), {Param("a5a", 1)}}}}, + "foo;a5a=1"}, + {"0x36 in parameterised list key", + "foo; a6a=1", + {{{Item("foo", Item::kTokenType), {Param("a6a", 1)}}}}, + "foo;a6a=1"}, + {"0x37 in parameterised list key", + "foo; a7a=1", + {{{Item("foo", Item::kTokenType), {Param("a7a", 1)}}}}, + "foo;a7a=1"}, + {"0x38 in parameterised list key", + "foo; a8a=1", + {{{Item("foo", Item::kTokenType), {Param("a8a", 1)}}}}, + "foo;a8a=1"}, + {"0x39 in parameterised list key", + "foo; a9a=1", + {{{Item("foo", Item::kTokenType), {Param("a9a", 1)}}}}, + "foo;a9a=1"}, + {"0x3a in parameterised list key", "foo; a:a=1", base::nullopt}, + {"0x3b in parameterised list key", + "foo; a;a=1", + {{{Item("foo", Item::kTokenType), {Param("a", 1)}}}}, + "foo;a=1"}, + {"0x3c in parameterised list key", "foo; a<a=1", base::nullopt}, + {"0x3d in parameterised list key", "foo; a=a=1", base::nullopt}, + {"0x3e in parameterised list key", "foo; a>a=1", base::nullopt}, + {"0x3f in parameterised list key", "foo; a?a=1", base::nullopt}, + {"0x40 in parameterised list key", "foo; a@a=1", base::nullopt}, + {"0x41 in parameterised list key", "foo; aAa=1", base::nullopt}, + {"0x42 in parameterised list key", "foo; aBa=1", base::nullopt}, + {"0x43 in parameterised list key", "foo; aCa=1", base::nullopt}, + {"0x44 in parameterised list key", "foo; aDa=1", base::nullopt}, + {"0x45 in parameterised list key", "foo; aEa=1", base::nullopt}, + {"0x46 in parameterised list key", "foo; aFa=1", base::nullopt}, + {"0x47 in parameterised list key", "foo; aGa=1", base::nullopt}, + {"0x48 in parameterised list key", "foo; aHa=1", base::nullopt}, + {"0x49 in parameterised list key", "foo; aIa=1", base::nullopt}, + {"0x4a in parameterised list key", "foo; aJa=1", base::nullopt}, + {"0x4b in parameterised list key", "foo; aKa=1", base::nullopt}, + {"0x4c in parameterised list key", "foo; aLa=1", base::nullopt}, + {"0x4d in parameterised list key", "foo; aMa=1", base::nullopt}, + {"0x4e in parameterised list key", "foo; aNa=1", base::nullopt}, + {"0x4f in parameterised list key", "foo; aOa=1", base::nullopt}, + {"0x50 in parameterised list key", "foo; aPa=1", base::nullopt}, + {"0x51 in parameterised list key", "foo; aQa=1", base::nullopt}, + {"0x52 in parameterised list key", "foo; aRa=1", base::nullopt}, + {"0x53 in parameterised list key", "foo; aSa=1", base::nullopt}, + {"0x54 in parameterised list key", "foo; aTa=1", base::nullopt}, + {"0x55 in parameterised list key", "foo; aUa=1", base::nullopt}, + {"0x56 in parameterised list key", "foo; aVa=1", base::nullopt}, + {"0x57 in parameterised list key", "foo; aWa=1", base::nullopt}, + {"0x58 in parameterised list key", "foo; aXa=1", base::nullopt}, + {"0x59 in parameterised list key", "foo; aYa=1", base::nullopt}, + {"0x5a in parameterised list key", "foo; aZa=1", base::nullopt}, + {"0x5b in parameterised list key", "foo; a[a=1", base::nullopt}, + {"0x5c in parameterised list key", "foo; a\\a=1", base::nullopt}, + {"0x5d in parameterised list key", "foo; a]a=1", base::nullopt}, + {"0x5e in parameterised list key", "foo; a^a=1", base::nullopt}, + {"0x5f in parameterised list key", + "foo; a_a=1", + {{{Item("foo", Item::kTokenType), {Param("a_a", 1)}}}}, + "foo;a_a=1"}, + {"0x60 in parameterised list key", "foo; a`a=1", base::nullopt}, + {"0x61 in parameterised list key", + "foo; aaa=1", + {{{Item("foo", Item::kTokenType), {Param("aaa", 1)}}}}, + "foo;aaa=1"}, + {"0x62 in parameterised list key", + "foo; aba=1", + {{{Item("foo", Item::kTokenType), {Param("aba", 1)}}}}, + "foo;aba=1"}, + {"0x63 in parameterised list key", + "foo; aca=1", + {{{Item("foo", Item::kTokenType), {Param("aca", 1)}}}}, + "foo;aca=1"}, + {"0x64 in parameterised list key", + "foo; ada=1", + {{{Item("foo", Item::kTokenType), {Param("ada", 1)}}}}, + "foo;ada=1"}, + {"0x65 in parameterised list key", + "foo; aea=1", + {{{Item("foo", Item::kTokenType), {Param("aea", 1)}}}}, + "foo;aea=1"}, + {"0x66 in parameterised list key", + "foo; afa=1", + {{{Item("foo", Item::kTokenType), {Param("afa", 1)}}}}, + "foo;afa=1"}, + {"0x67 in parameterised list key", + "foo; aga=1", + {{{Item("foo", Item::kTokenType), {Param("aga", 1)}}}}, + "foo;aga=1"}, + {"0x68 in parameterised list key", + "foo; aha=1", + {{{Item("foo", Item::kTokenType), {Param("aha", 1)}}}}, + "foo;aha=1"}, + {"0x69 in parameterised list key", + "foo; aia=1", + {{{Item("foo", Item::kTokenType), {Param("aia", 1)}}}}, + "foo;aia=1"}, + {"0x6a in parameterised list key", + "foo; aja=1", + {{{Item("foo", Item::kTokenType), {Param("aja", 1)}}}}, + "foo;aja=1"}, + {"0x6b in parameterised list key", + "foo; aka=1", + {{{Item("foo", Item::kTokenType), {Param("aka", 1)}}}}, + "foo;aka=1"}, + {"0x6c in parameterised list key", + "foo; ala=1", + {{{Item("foo", Item::kTokenType), {Param("ala", 1)}}}}, + "foo;ala=1"}, + {"0x6d in parameterised list key", + "foo; ama=1", + {{{Item("foo", Item::kTokenType), {Param("ama", 1)}}}}, + "foo;ama=1"}, + {"0x6e in parameterised list key", + "foo; ana=1", + {{{Item("foo", Item::kTokenType), {Param("ana", 1)}}}}, + "foo;ana=1"}, + {"0x6f in parameterised list key", + "foo; aoa=1", + {{{Item("foo", Item::kTokenType), {Param("aoa", 1)}}}}, + "foo;aoa=1"}, + {"0x70 in parameterised list key", + "foo; apa=1", + {{{Item("foo", Item::kTokenType), {Param("apa", 1)}}}}, + "foo;apa=1"}, + {"0x71 in parameterised list key", + "foo; aqa=1", + {{{Item("foo", Item::kTokenType), {Param("aqa", 1)}}}}, + "foo;aqa=1"}, + {"0x72 in parameterised list key", + "foo; ara=1", + {{{Item("foo", Item::kTokenType), {Param("ara", 1)}}}}, + "foo;ara=1"}, + {"0x73 in parameterised list key", + "foo; asa=1", + {{{Item("foo", Item::kTokenType), {Param("asa", 1)}}}}, + "foo;asa=1"}, + {"0x74 in parameterised list key", + "foo; ata=1", + {{{Item("foo", Item::kTokenType), {Param("ata", 1)}}}}, + "foo;ata=1"}, + {"0x75 in parameterised list key", + "foo; aua=1", + {{{Item("foo", Item::kTokenType), {Param("aua", 1)}}}}, + "foo;aua=1"}, + {"0x76 in parameterised list key", + "foo; ava=1", + {{{Item("foo", Item::kTokenType), {Param("ava", 1)}}}}, + "foo;ava=1"}, + {"0x77 in parameterised list key", + "foo; awa=1", + {{{Item("foo", Item::kTokenType), {Param("awa", 1)}}}}, + "foo;awa=1"}, + {"0x78 in parameterised list key", + "foo; axa=1", + {{{Item("foo", Item::kTokenType), {Param("axa", 1)}}}}, + "foo;axa=1"}, + {"0x79 in parameterised list key", + "foo; aya=1", + {{{Item("foo", Item::kTokenType), {Param("aya", 1)}}}}, + "foo;aya=1"}, + {"0x7a in parameterised list key", + "foo; aza=1", + {{{Item("foo", Item::kTokenType), {Param("aza", 1)}}}}, + "foo;aza=1"}, + {"0x7b in parameterised list key", "foo; a{a=1", base::nullopt}, + {"0x7c in parameterised list key", "foo; a|a=1", base::nullopt}, + {"0x7d in parameterised list key", "foo; a}a=1", base::nullopt}, + {"0x7e in parameterised list key", "foo; a~a=1", base::nullopt}, + {"0x7f in parameterised list key", "foo; a\177a=1", base::nullopt}, + {"0x01 starting a parameterised list key", "foo; \001a=1", base::nullopt}, + {"0x02 starting a parameterised list key", "foo; \002a=1", base::nullopt}, + {"0x03 starting a parameterised list key", "foo; \003a=1", base::nullopt}, + {"0x04 starting a parameterised list key", "foo; \004a=1", base::nullopt}, + {"0x05 starting a parameterised list key", "foo; \005a=1", base::nullopt}, + {"0x06 starting a parameterised list key", "foo; \006a=1", base::nullopt}, + {"0x07 starting a parameterised list key", "foo; \aa=1", base::nullopt}, + {"0x08 starting a parameterised list key", "foo; \ba=1", base::nullopt}, + {"0x09 starting a parameterised list key", "foo; \ta=1", base::nullopt}, + {"0x0a starting a parameterised list key", "foo; \na=1", base::nullopt}, + {"0x0b starting a parameterised list key", "foo; \va=1", base::nullopt}, + {"0x0c starting a parameterised list key", "foo; \fa=1", base::nullopt}, + {"0x0d starting a parameterised list key", "foo; \ra=1", base::nullopt}, + {"0x0e starting a parameterised list key", "foo; \016a=1", base::nullopt}, + {"0x0f starting a parameterised list key", "foo; \017a=1", base::nullopt}, + {"0x10 starting a parameterised list key", "foo; \020a=1", base::nullopt}, + {"0x11 starting a parameterised list key", "foo; \021a=1", base::nullopt}, + {"0x12 starting a parameterised list key", "foo; \022a=1", base::nullopt}, + {"0x13 starting a parameterised list key", "foo; \023a=1", base::nullopt}, + {"0x14 starting a parameterised list key", "foo; \024a=1", base::nullopt}, + {"0x15 starting a parameterised list key", "foo; \025a=1", base::nullopt}, + {"0x16 starting a parameterised list key", "foo; \026a=1", base::nullopt}, + {"0x17 starting a parameterised list key", "foo; \027a=1", base::nullopt}, + {"0x18 starting a parameterised list key", "foo; \030a=1", base::nullopt}, + {"0x19 starting a parameterised list key", "foo; \031a=1", base::nullopt}, + {"0x1a starting a parameterised list key", "foo; \032a=1", base::nullopt}, + {"0x1b starting a parameterised list key", "foo; \033a=1", base::nullopt}, + {"0x1c starting a parameterised list key", "foo; \034a=1", base::nullopt}, + {"0x1d starting a parameterised list key", "foo; \035a=1", base::nullopt}, + {"0x1e starting a parameterised list key", "foo; \036a=1", base::nullopt}, + {"0x1f starting a parameterised list key", "foo; \037a=1", base::nullopt}, + {"0x20 starting a parameterised list key", + "foo; a=1", + {{{Item("foo", Item::kTokenType), {Param("a", 1)}}}}, + "foo;a=1"}, + {"0x21 starting a parameterised list key", "foo; !a=1", base::nullopt}, + {"0x22 starting a parameterised list key", "foo; \"a=1", base::nullopt}, + {"0x23 starting a parameterised list key", "foo; #a=1", base::nullopt}, + {"0x24 starting a parameterised list key", "foo; $a=1", base::nullopt}, + {"0x25 starting a parameterised list key", "foo; %a=1", base::nullopt}, + {"0x26 starting a parameterised list key", "foo; &a=1", base::nullopt}, + {"0x27 starting a parameterised list key", "foo; 'a=1", base::nullopt}, + {"0x28 starting a parameterised list key", "foo; (a=1", base::nullopt}, + {"0x29 starting a parameterised list key", "foo; )a=1", base::nullopt}, + {"0x2b starting a parameterised list key", "foo; +a=1", base::nullopt}, + {"0x2c starting a parameterised list key", "foo; ,a=1", base::nullopt}, + {"0x2d starting a parameterised list key", "foo; -a=1", base::nullopt}, + {"0x2e starting a parameterised list key", "foo; .a=1", base::nullopt}, + {"0x2f starting a parameterised list key", "foo; /a=1", base::nullopt}, + {"0x30 starting a parameterised list key", "foo; 0a=1", base::nullopt}, + {"0x31 starting a parameterised list key", "foo; 1a=1", base::nullopt}, + {"0x32 starting a parameterised list key", "foo; 2a=1", base::nullopt}, + {"0x33 starting a parameterised list key", "foo; 3a=1", base::nullopt}, + {"0x34 starting a parameterised list key", "foo; 4a=1", base::nullopt}, + {"0x35 starting a parameterised list key", "foo; 5a=1", base::nullopt}, + {"0x36 starting a parameterised list key", "foo; 6a=1", base::nullopt}, + {"0x37 starting a parameterised list key", "foo; 7a=1", base::nullopt}, + {"0x38 starting a parameterised list key", "foo; 8a=1", base::nullopt}, + {"0x39 starting a parameterised list key", "foo; 9a=1", base::nullopt}, + {"0x3a starting a parameterised list key", "foo; :a=1", base::nullopt}, + {"0x3b starting a parameterised list key", "foo; ;a=1", base::nullopt}, + {"0x3c starting a parameterised list key", "foo; <a=1", base::nullopt}, + {"0x3d starting a parameterised list key", "foo; =a=1", base::nullopt}, + {"0x3e starting a parameterised list key", "foo; >a=1", base::nullopt}, + {"0x3f starting a parameterised list key", "foo; ?a=1", base::nullopt}, + {"0x40 starting a parameterised list key", "foo; @a=1", base::nullopt}, + {"0x41 starting a parameterised list key", "foo; Aa=1", base::nullopt}, + {"0x42 starting a parameterised list key", "foo; Ba=1", base::nullopt}, + {"0x43 starting a parameterised list key", "foo; Ca=1", base::nullopt}, + {"0x44 starting a parameterised list key", "foo; Da=1", base::nullopt}, + {"0x45 starting a parameterised list key", "foo; Ea=1", base::nullopt}, + {"0x46 starting a parameterised list key", "foo; Fa=1", base::nullopt}, + {"0x47 starting a parameterised list key", "foo; Ga=1", base::nullopt}, + {"0x48 starting a parameterised list key", "foo; Ha=1", base::nullopt}, + {"0x49 starting a parameterised list key", "foo; Ia=1", base::nullopt}, + {"0x4a starting a parameterised list key", "foo; Ja=1", base::nullopt}, + {"0x4b starting a parameterised list key", "foo; Ka=1", base::nullopt}, + {"0x4c starting a parameterised list key", "foo; La=1", base::nullopt}, + {"0x4d starting a parameterised list key", "foo; Ma=1", base::nullopt}, + {"0x4e starting a parameterised list key", "foo; Na=1", base::nullopt}, + {"0x4f starting a parameterised list key", "foo; Oa=1", base::nullopt}, + {"0x50 starting a parameterised list key", "foo; Pa=1", base::nullopt}, + {"0x51 starting a parameterised list key", "foo; Qa=1", base::nullopt}, + {"0x52 starting a parameterised list key", "foo; Ra=1", base::nullopt}, + {"0x53 starting a parameterised list key", "foo; Sa=1", base::nullopt}, + {"0x54 starting a parameterised list key", "foo; Ta=1", base::nullopt}, + {"0x55 starting a parameterised list key", "foo; Ua=1", base::nullopt}, + {"0x56 starting a parameterised list key", "foo; Va=1", base::nullopt}, + {"0x57 starting a parameterised list key", "foo; Wa=1", base::nullopt}, + {"0x58 starting a parameterised list key", "foo; Xa=1", base::nullopt}, + {"0x59 starting a parameterised list key", "foo; Ya=1", base::nullopt}, + {"0x5a starting a parameterised list key", "foo; Za=1", base::nullopt}, + {"0x5b starting a parameterised list key", "foo; [a=1", base::nullopt}, + {"0x5c starting a parameterised list key", "foo; \\a=1", base::nullopt}, + {"0x5d starting a parameterised list key", "foo; ]a=1", base::nullopt}, + {"0x5e starting a parameterised list key", "foo; ^a=1", base::nullopt}, + {"0x5f starting a parameterised list key", "foo; _a=1", base::nullopt}, + {"0x60 starting a parameterised list key", "foo; `a=1", base::nullopt}, + {"0x61 starting a parameterised list key", + "foo; aa=1", + {{{Item("foo", Item::kTokenType), {Param("aa", 1)}}}}, + "foo;aa=1"}, + {"0x62 starting a parameterised list key", + "foo; ba=1", + {{{Item("foo", Item::kTokenType), {Param("ba", 1)}}}}, + "foo;ba=1"}, + {"0x63 starting a parameterised list key", + "foo; ca=1", + {{{Item("foo", Item::kTokenType), {Param("ca", 1)}}}}, + "foo;ca=1"}, + {"0x64 starting a parameterised list key", + "foo; da=1", + {{{Item("foo", Item::kTokenType), {Param("da", 1)}}}}, + "foo;da=1"}, + {"0x65 starting a parameterised list key", + "foo; ea=1", + {{{Item("foo", Item::kTokenType), {Param("ea", 1)}}}}, + "foo;ea=1"}, + {"0x66 starting a parameterised list key", + "foo; fa=1", + {{{Item("foo", Item::kTokenType), {Param("fa", 1)}}}}, + "foo;fa=1"}, + {"0x67 starting a parameterised list key", + "foo; ga=1", + {{{Item("foo", Item::kTokenType), {Param("ga", 1)}}}}, + "foo;ga=1"}, + {"0x68 starting a parameterised list key", + "foo; ha=1", + {{{Item("foo", Item::kTokenType), {Param("ha", 1)}}}}, + "foo;ha=1"}, + {"0x69 starting a parameterised list key", + "foo; ia=1", + {{{Item("foo", Item::kTokenType), {Param("ia", 1)}}}}, + "foo;ia=1"}, + {"0x6a starting a parameterised list key", + "foo; ja=1", + {{{Item("foo", Item::kTokenType), {Param("ja", 1)}}}}, + "foo;ja=1"}, + {"0x6b starting a parameterised list key", + "foo; ka=1", + {{{Item("foo", Item::kTokenType), {Param("ka", 1)}}}}, + "foo;ka=1"}, + {"0x6c starting a parameterised list key", + "foo; la=1", + {{{Item("foo", Item::kTokenType), {Param("la", 1)}}}}, + "foo;la=1"}, + {"0x6d starting a parameterised list key", + "foo; ma=1", + {{{Item("foo", Item::kTokenType), {Param("ma", 1)}}}}, + "foo;ma=1"}, + {"0x6e starting a parameterised list key", + "foo; na=1", + {{{Item("foo", Item::kTokenType), {Param("na", 1)}}}}, + "foo;na=1"}, + {"0x6f starting a parameterised list key", + "foo; oa=1", + {{{Item("foo", Item::kTokenType), {Param("oa", 1)}}}}, + "foo;oa=1"}, + {"0x70 starting a parameterised list key", + "foo; pa=1", + {{{Item("foo", Item::kTokenType), {Param("pa", 1)}}}}, + "foo;pa=1"}, + {"0x71 starting a parameterised list key", + "foo; qa=1", + {{{Item("foo", Item::kTokenType), {Param("qa", 1)}}}}, + "foo;qa=1"}, + {"0x72 starting a parameterised list key", + "foo; ra=1", + {{{Item("foo", Item::kTokenType), {Param("ra", 1)}}}}, + "foo;ra=1"}, + {"0x73 starting a parameterised list key", + "foo; sa=1", + {{{Item("foo", Item::kTokenType), {Param("sa", 1)}}}}, + "foo;sa=1"}, + {"0x74 starting a parameterised list key", + "foo; ta=1", + {{{Item("foo", Item::kTokenType), {Param("ta", 1)}}}}, + "foo;ta=1"}, + {"0x75 starting a parameterised list key", + "foo; ua=1", + {{{Item("foo", Item::kTokenType), {Param("ua", 1)}}}}, + "foo;ua=1"}, + {"0x76 starting a parameterised list key", + "foo; va=1", + {{{Item("foo", Item::kTokenType), {Param("va", 1)}}}}, + "foo;va=1"}, + {"0x77 starting a parameterised list key", + "foo; wa=1", + {{{Item("foo", Item::kTokenType), {Param("wa", 1)}}}}, + "foo;wa=1"}, + {"0x78 starting a parameterised list key", + "foo; xa=1", + {{{Item("foo", Item::kTokenType), {Param("xa", 1)}}}}, + "foo;xa=1"}, + {"0x79 starting a parameterised list key", + "foo; ya=1", + {{{Item("foo", Item::kTokenType), {Param("ya", 1)}}}}, + "foo;ya=1"}, + {"0x7a starting a parameterised list key", + "foo; za=1", + {{{Item("foo", Item::kTokenType), {Param("za", 1)}}}}, + "foo;za=1"}, + {"0x7b starting a parameterised list key", "foo; {a=1", base::nullopt}, + {"0x7c starting a parameterised list key", "foo; |a=1", base::nullopt}, + {"0x7d starting a parameterised list key", "foo; }a=1", base::nullopt}, + {"0x7e starting a parameterised list key", "foo; ~a=1", base::nullopt}, + {"0x7f starting a parameterised list key", "foo; \177a=1", base::nullopt}, + {"large list", + "a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, " + "a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, " + "a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, " + "a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, " + "a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, " + "a72, a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, " + "a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, " + "a100, a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, " + "a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, a123, " + "a124, a125, a126, a127, a128, a129, a130, a131, a132, a133, a134, a135, " + "a136, a137, a138, a139, a140, a141, a142, a143, a144, a145, a146, a147, " + "a148, a149, a150, a151, a152, a153, a154, a155, a156, a157, a158, a159, " + "a160, a161, a162, a163, a164, a165, a166, a167, a168, a169, a170, a171, " + "a172, a173, a174, a175, a176, a177, a178, a179, a180, a181, a182, a183, " + "a184, a185, a186, a187, a188, a189, a190, a191, a192, a193, a194, a195, " + "a196, a197, a198, a199, a200, a201, a202, a203, a204, a205, a206, a207, " + "a208, a209, a210, a211, a212, a213, a214, a215, a216, a217, a218, a219, " + "a220, a221, a222, a223, a224, a225, a226, a227, a228, a229, a230, a231, " + "a232, a233, a234, a235, a236, a237, a238, a239, a240, a241, a242, a243, " + "a244, a245, a246, a247, a248, a249, a250, a251, a252, a253, a254, a255, " + "a256, a257, a258, a259, a260, a261, a262, a263, a264, a265, a266, a267, " + "a268, a269, a270, a271, a272, a273, a274, a275, a276, a277, a278, a279, " + "a280, a281, a282, a283, a284, a285, a286, a287, a288, a289, a290, a291, " + "a292, a293, a294, a295, a296, a297, a298, a299, a300, a301, a302, a303, " + "a304, a305, a306, a307, a308, a309, a310, a311, a312, a313, a314, a315, " + "a316, a317, a318, a319, a320, a321, a322, a323, a324, a325, a326, a327, " + "a328, a329, a330, a331, a332, a333, a334, a335, a336, a337, a338, a339, " + "a340, a341, a342, a343, a344, a345, a346, a347, a348, a349, a350, a351, " + "a352, a353, a354, a355, a356, a357, a358, a359, a360, a361, a362, a363, " + "a364, a365, a366, a367, a368, a369, a370, a371, a372, a373, a374, a375, " + "a376, a377, a378, a379, a380, a381, a382, a383, a384, a385, a386, a387, " + "a388, a389, a390, a391, a392, a393, a394, a395, a396, a397, a398, a399, " + "a400, a401, a402, a403, a404, a405, a406, a407, a408, a409, a410, a411, " + "a412, a413, a414, a415, a416, a417, a418, a419, a420, a421, a422, a423, " + "a424, a425, a426, a427, a428, a429, a430, a431, a432, a433, a434, a435, " + "a436, a437, a438, a439, a440, a441, a442, a443, a444, a445, a446, a447, " + "a448, a449, a450, a451, a452, a453, a454, a455, a456, a457, a458, a459, " + "a460, a461, a462, a463, a464, a465, a466, a467, a468, a469, a470, a471, " + "a472, a473, a474, a475, a476, a477, a478, a479, a480, a481, a482, a483, " + "a484, a485, a486, a487, a488, a489, a490, a491, a492, a493, a494, a495, " + "a496, a497, a498, a499, a500, a501, a502, a503, a504, a505, a506, a507, " + "a508, a509, a510, a511, a512, a513, a514, a515, a516, a517, a518, a519, " + "a520, a521, a522, a523, a524, a525, a526, a527, a528, a529, a530, a531, " + "a532, a533, a534, a535, a536, a537, a538, a539, a540, a541, a542, a543, " + "a544, a545, a546, a547, a548, a549, a550, a551, a552, a553, a554, a555, " + "a556, a557, a558, a559, a560, a561, a562, a563, a564, a565, a566, a567, " + "a568, a569, a570, a571, a572, a573, a574, a575, a576, a577, a578, a579, " + "a580, a581, a582, a583, a584, a585, a586, a587, a588, a589, a590, a591, " + "a592, a593, a594, a595, a596, a597, a598, a599, a600, a601, a602, a603, " + "a604, a605, a606, a607, a608, a609, a610, a611, a612, a613, a614, a615, " + "a616, a617, a618, a619, a620, a621, a622, a623, a624, a625, a626, a627, " + "a628, a629, a630, a631, a632, a633, a634, a635, a636, a637, a638, a639, " + "a640, a641, a642, a643, a644, a645, a646, a647, a648, a649, a650, a651, " + "a652, a653, a654, a655, a656, a657, a658, a659, a660, a661, a662, a663, " + "a664, a665, a666, a667, a668, a669, a670, a671, a672, a673, a674, a675, " + "a676, a677, a678, a679, a680, a681, a682, a683, a684, a685, a686, a687, " + "a688, a689, a690, a691, a692, a693, a694, a695, a696, a697, a698, a699, " + "a700, a701, a702, a703, a704, a705, a706, a707, a708, a709, a710, a711, " + "a712, a713, a714, a715, a716, a717, a718, a719, a720, a721, a722, a723, " + "a724, a725, a726, a727, a728, a729, a730, a731, a732, a733, a734, a735, " + "a736, a737, a738, a739, a740, a741, a742, a743, a744, a745, a746, a747, " + "a748, a749, a750, a751, a752, a753, a754, a755, a756, a757, a758, a759, " + "a760, a761, a762, a763, a764, a765, a766, a767, a768, a769, a770, a771, " + "a772, a773, a774, a775, a776, a777, a778, a779, a780, a781, a782, a783, " + "a784, a785, a786, a787, a788, a789, a790, a791, a792, a793, a794, a795, " + "a796, a797, a798, a799, a800, a801, a802, a803, a804, a805, a806, a807, " + "a808, a809, a810, a811, a812, a813, a814, a815, a816, a817, a818, a819, " + "a820, a821, a822, a823, a824, a825, a826, a827, a828, a829, a830, a831, " + "a832, a833, a834, a835, a836, a837, a838, a839, a840, a841, a842, a843, " + "a844, a845, a846, a847, a848, a849, a850, a851, a852, a853, a854, a855, " + "a856, a857, a858, a859, a860, a861, a862, a863, a864, a865, a866, a867, " + "a868, a869, a870, a871, a872, a873, a874, a875, a876, a877, a878, a879, " + "a880, a881, a882, a883, a884, a885, a886, a887, a888, a889, a890, a891, " + "a892, a893, a894, a895, a896, a897, a898, a899, a900, a901, a902, a903, " + "a904, a905, a906, a907, a908, a909, a910, a911, a912, a913, a914, a915, " + "a916, a917, a918, a919, a920, a921, a922, a923, a924, a925, a926, a927, " + "a928, a929, a930, a931, a932, a933, a934, a935, a936, a937, a938, a939, " + "a940, a941, a942, a943, a944, a945, a946, a947, a948, a949, a950, a951, " + "a952, a953, a954, a955, a956, a957, a958, a959, a960, a961, a962, a963, " + "a964, a965, a966, a967, a968, a969, a970, a971, a972, a973, a974, a975, " + "a976, a977, a978, a979, a980, a981, a982, a983, a984, a985, a986, a987, " + "a988, a989, a990, a991, a992, a993, a994, a995, a996, a997, a998, a999, " + "a1000, a1001, a1002, a1003, a1004, a1005, a1006, a1007, a1008, a1009, " + "a1010, a1011, a1012, a1013, a1014, a1015, a1016, a1017, a1018, a1019, " + "a1020, a1021, a1022, a1023", + {{{Item("a0", Item::kTokenType), {}}, + {Item("a1", Item::kTokenType), {}}, + {Item("a2", Item::kTokenType), {}}, + {Item("a3", Item::kTokenType), {}}, + {Item("a4", Item::kTokenType), {}}, + {Item("a5", Item::kTokenType), {}}, + {Item("a6", Item::kTokenType), {}}, + {Item("a7", Item::kTokenType), {}}, + {Item("a8", Item::kTokenType), {}}, + {Item("a9", Item::kTokenType), {}}, + {Item("a10", Item::kTokenType), {}}, + {Item("a11", Item::kTokenType), {}}, + {Item("a12", Item::kTokenType), {}}, + {Item("a13", Item::kTokenType), {}}, + {Item("a14", Item::kTokenType), {}}, + {Item("a15", Item::kTokenType), {}}, + {Item("a16", Item::kTokenType), {}}, + {Item("a17", Item::kTokenType), {}}, + {Item("a18", Item::kTokenType), {}}, + {Item("a19", Item::kTokenType), {}}, + {Item("a20", Item::kTokenType), {}}, + {Item("a21", Item::kTokenType), {}}, + {Item("a22", Item::kTokenType), {}}, + {Item("a23", Item::kTokenType), {}}, + {Item("a24", Item::kTokenType), {}}, + {Item("a25", Item::kTokenType), {}}, + {Item("a26", Item::kTokenType), {}}, + {Item("a27", Item::kTokenType), {}}, + {Item("a28", Item::kTokenType), {}}, + {Item("a29", Item::kTokenType), {}}, + {Item("a30", Item::kTokenType), {}}, + {Item("a31", Item::kTokenType), {}}, + {Item("a32", Item::kTokenType), {}}, + {Item("a33", Item::kTokenType), {}}, + {Item("a34", Item::kTokenType), {}}, + {Item("a35", Item::kTokenType), {}}, + {Item("a36", Item::kTokenType), {}}, + {Item("a37", Item::kTokenType), {}}, + {Item("a38", Item::kTokenType), {}}, + {Item("a39", Item::kTokenType), {}}, + {Item("a40", Item::kTokenType), {}}, + {Item("a41", Item::kTokenType), {}}, + {Item("a42", Item::kTokenType), {}}, + {Item("a43", Item::kTokenType), {}}, + {Item("a44", Item::kTokenType), {}}, + {Item("a45", Item::kTokenType), {}}, + {Item("a46", Item::kTokenType), {}}, + {Item("a47", Item::kTokenType), {}}, + {Item("a48", Item::kTokenType), {}}, + {Item("a49", Item::kTokenType), {}}, + {Item("a50", Item::kTokenType), {}}, + {Item("a51", Item::kTokenType), {}}, + {Item("a52", Item::kTokenType), {}}, + {Item("a53", Item::kTokenType), {}}, + {Item("a54", Item::kTokenType), {}}, + {Item("a55", Item::kTokenType), {}}, + {Item("a56", Item::kTokenType), {}}, + {Item("a57", Item::kTokenType), {}}, + {Item("a58", Item::kTokenType), {}}, + {Item("a59", Item::kTokenType), {}}, + {Item("a60", Item::kTokenType), {}}, + {Item("a61", Item::kTokenType), {}}, + {Item("a62", Item::kTokenType), {}}, + {Item("a63", Item::kTokenType), {}}, + {Item("a64", Item::kTokenType), {}}, + {Item("a65", Item::kTokenType), {}}, + {Item("a66", Item::kTokenType), {}}, + {Item("a67", Item::kTokenType), {}}, + {Item("a68", Item::kTokenType), {}}, + {Item("a69", Item::kTokenType), {}}, + {Item("a70", Item::kTokenType), {}}, + {Item("a71", Item::kTokenType), {}}, + {Item("a72", Item::kTokenType), {}}, + {Item("a73", Item::kTokenType), {}}, + {Item("a74", Item::kTokenType), {}}, + {Item("a75", Item::kTokenType), {}}, + {Item("a76", Item::kTokenType), {}}, + {Item("a77", Item::kTokenType), {}}, + {Item("a78", Item::kTokenType), {}}, + {Item("a79", Item::kTokenType), {}}, + {Item("a80", Item::kTokenType), {}}, + {Item("a81", Item::kTokenType), {}}, + {Item("a82", Item::kTokenType), {}}, + {Item("a83", Item::kTokenType), {}}, + {Item("a84", Item::kTokenType), {}}, + {Item("a85", Item::kTokenType), {}}, + {Item("a86", Item::kTokenType), {}}, + {Item("a87", Item::kTokenType), {}}, + {Item("a88", Item::kTokenType), {}}, + {Item("a89", Item::kTokenType), {}}, + {Item("a90", Item::kTokenType), {}}, + {Item("a91", Item::kTokenType), {}}, + {Item("a92", Item::kTokenType), {}}, + {Item("a93", Item::kTokenType), {}}, + {Item("a94", Item::kTokenType), {}}, + {Item("a95", Item::kTokenType), {}}, + {Item("a96", Item::kTokenType), {}}, + {Item("a97", Item::kTokenType), {}}, + {Item("a98", Item::kTokenType), {}}, + {Item("a99", Item::kTokenType), {}}, + {Item("a100", Item::kTokenType), {}}, + {Item("a101", Item::kTokenType), {}}, + {Item("a102", Item::kTokenType), {}}, + {Item("a103", Item::kTokenType), {}}, + {Item("a104", Item::kTokenType), {}}, + {Item("a105", Item::kTokenType), {}}, + {Item("a106", Item::kTokenType), {}}, + {Item("a107", Item::kTokenType), {}}, + {Item("a108", Item::kTokenType), {}}, + {Item("a109", Item::kTokenType), {}}, + {Item("a110", Item::kTokenType), {}}, + {Item("a111", Item::kTokenType), {}}, + {Item("a112", Item::kTokenType), {}}, + {Item("a113", Item::kTokenType), {}}, + {Item("a114", Item::kTokenType), {}}, + {Item("a115", Item::kTokenType), {}}, + {Item("a116", Item::kTokenType), {}}, + {Item("a117", Item::kTokenType), {}}, + {Item("a118", Item::kTokenType), {}}, + {Item("a119", Item::kTokenType), {}}, + {Item("a120", Item::kTokenType), {}}, + {Item("a121", Item::kTokenType), {}}, + {Item("a122", Item::kTokenType), {}}, + {Item("a123", Item::kTokenType), {}}, + {Item("a124", Item::kTokenType), {}}, + {Item("a125", Item::kTokenType), {}}, + {Item("a126", Item::kTokenType), {}}, + {Item("a127", Item::kTokenType), {}}, + {Item("a128", Item::kTokenType), {}}, + {Item("a129", Item::kTokenType), {}}, + {Item("a130", Item::kTokenType), {}}, + {Item("a131", Item::kTokenType), {}}, + {Item("a132", Item::kTokenType), {}}, + {Item("a133", Item::kTokenType), {}}, + {Item("a134", Item::kTokenType), {}}, + {Item("a135", Item::kTokenType), {}}, + {Item("a136", Item::kTokenType), {}}, + {Item("a137", Item::kTokenType), {}}, + {Item("a138", Item::kTokenType), {}}, + {Item("a139", Item::kTokenType), {}}, + {Item("a140", Item::kTokenType), {}}, + {Item("a141", Item::kTokenType), {}}, + {Item("a142", Item::kTokenType), {}}, + {Item("a143", Item::kTokenType), {}}, + {Item("a144", Item::kTokenType), {}}, + {Item("a145", Item::kTokenType), {}}, + {Item("a146", Item::kTokenType), {}}, + {Item("a147", Item::kTokenType), {}}, + {Item("a148", Item::kTokenType), {}}, + {Item("a149", Item::kTokenType), {}}, + {Item("a150", Item::kTokenType), {}}, + {Item("a151", Item::kTokenType), {}}, + {Item("a152", Item::kTokenType), {}}, + {Item("a153", Item::kTokenType), {}}, + {Item("a154", Item::kTokenType), {}}, + {Item("a155", Item::kTokenType), {}}, + {Item("a156", Item::kTokenType), {}}, + {Item("a157", Item::kTokenType), {}}, + {Item("a158", Item::kTokenType), {}}, + {Item("a159", Item::kTokenType), {}}, + {Item("a160", Item::kTokenType), {}}, + {Item("a161", Item::kTokenType), {}}, + {Item("a162", Item::kTokenType), {}}, + {Item("a163", Item::kTokenType), {}}, + {Item("a164", Item::kTokenType), {}}, + {Item("a165", Item::kTokenType), {}}, + {Item("a166", Item::kTokenType), {}}, + {Item("a167", Item::kTokenType), {}}, + {Item("a168", Item::kTokenType), {}}, + {Item("a169", Item::kTokenType), {}}, + {Item("a170", Item::kTokenType), {}}, + {Item("a171", Item::kTokenType), {}}, + {Item("a172", Item::kTokenType), {}}, + {Item("a173", Item::kTokenType), {}}, + {Item("a174", Item::kTokenType), {}}, + {Item("a175", Item::kTokenType), {}}, + {Item("a176", Item::kTokenType), {}}, + {Item("a177", Item::kTokenType), {}}, + {Item("a178", Item::kTokenType), {}}, + {Item("a179", Item::kTokenType), {}}, + {Item("a180", Item::kTokenType), {}}, + {Item("a181", Item::kTokenType), {}}, + {Item("a182", Item::kTokenType), {}}, + {Item("a183", Item::kTokenType), {}}, + {Item("a184", Item::kTokenType), {}}, + {Item("a185", Item::kTokenType), {}}, + {Item("a186", Item::kTokenType), {}}, + {Item("a187", Item::kTokenType), {}}, + {Item("a188", Item::kTokenType), {}}, + {Item("a189", Item::kTokenType), {}}, + {Item("a190", Item::kTokenType), {}}, + {Item("a191", Item::kTokenType), {}}, + {Item("a192", Item::kTokenType), {}}, + {Item("a193", Item::kTokenType), {}}, + {Item("a194", Item::kTokenType), {}}, + {Item("a195", Item::kTokenType), {}}, + {Item("a196", Item::kTokenType), {}}, + {Item("a197", Item::kTokenType), {}}, + {Item("a198", Item::kTokenType), {}}, + {Item("a199", Item::kTokenType), {}}, + {Item("a200", Item::kTokenType), {}}, + {Item("a201", Item::kTokenType), {}}, + {Item("a202", Item::kTokenType), {}}, + {Item("a203", Item::kTokenType), {}}, + {Item("a204", Item::kTokenType), {}}, + {Item("a205", Item::kTokenType), {}}, + {Item("a206", Item::kTokenType), {}}, + {Item("a207", Item::kTokenType), {}}, + {Item("a208", Item::kTokenType), {}}, + {Item("a209", Item::kTokenType), {}}, + {Item("a210", Item::kTokenType), {}}, + {Item("a211", Item::kTokenType), {}}, + {Item("a212", Item::kTokenType), {}}, + {Item("a213", Item::kTokenType), {}}, + {Item("a214", Item::kTokenType), {}}, + {Item("a215", Item::kTokenType), {}}, + {Item("a216", Item::kTokenType), {}}, + {Item("a217", Item::kTokenType), {}}, + {Item("a218", Item::kTokenType), {}}, + {Item("a219", Item::kTokenType), {}}, + {Item("a220", Item::kTokenType), {}}, + {Item("a221", Item::kTokenType), {}}, + {Item("a222", Item::kTokenType), {}}, + {Item("a223", Item::kTokenType), {}}, + {Item("a224", Item::kTokenType), {}}, + {Item("a225", Item::kTokenType), {}}, + {Item("a226", Item::kTokenType), {}}, + {Item("a227", Item::kTokenType), {}}, + {Item("a228", Item::kTokenType), {}}, + {Item("a229", Item::kTokenType), {}}, + {Item("a230", Item::kTokenType), {}}, + {Item("a231", Item::kTokenType), {}}, + {Item("a232", Item::kTokenType), {}}, + {Item("a233", Item::kTokenType), {}}, + {Item("a234", Item::kTokenType), {}}, + {Item("a235", Item::kTokenType), {}}, + {Item("a236", Item::kTokenType), {}}, + {Item("a237", Item::kTokenType), {}}, + {Item("a238", Item::kTokenType), {}}, + {Item("a239", Item::kTokenType), {}}, + {Item("a240", Item::kTokenType), {}}, + {Item("a241", Item::kTokenType), {}}, + {Item("a242", Item::kTokenType), {}}, + {Item("a243", Item::kTokenType), {}}, + {Item("a244", Item::kTokenType), {}}, + {Item("a245", Item::kTokenType), {}}, + {Item("a246", Item::kTokenType), {}}, + {Item("a247", Item::kTokenType), {}}, + {Item("a248", Item::kTokenType), {}}, + {Item("a249", Item::kTokenType), {}}, + {Item("a250", Item::kTokenType), {}}, + {Item("a251", Item::kTokenType), {}}, + {Item("a252", Item::kTokenType), {}}, + {Item("a253", Item::kTokenType), {}}, + {Item("a254", Item::kTokenType), {}}, + {Item("a255", Item::kTokenType), {}}, + {Item("a256", Item::kTokenType), {}}, + {Item("a257", Item::kTokenType), {}}, + {Item("a258", Item::kTokenType), {}}, + {Item("a259", Item::kTokenType), {}}, + {Item("a260", Item::kTokenType), {}}, + {Item("a261", Item::kTokenType), {}}, + {Item("a262", Item::kTokenType), {}}, + {Item("a263", Item::kTokenType), {}}, + {Item("a264", Item::kTokenType), {}}, + {Item("a265", Item::kTokenType), {}}, + {Item("a266", Item::kTokenType), {}}, + {Item("a267", Item::kTokenType), {}}, + {Item("a268", Item::kTokenType), {}}, + {Item("a269", Item::kTokenType), {}}, + {Item("a270", Item::kTokenType), {}}, + {Item("a271", Item::kTokenType), {}}, + {Item("a272", Item::kTokenType), {}}, + {Item("a273", Item::kTokenType), {}}, + {Item("a274", Item::kTokenType), {}}, + {Item("a275", Item::kTokenType), {}}, + {Item("a276", Item::kTokenType), {}}, + {Item("a277", Item::kTokenType), {}}, + {Item("a278", Item::kTokenType), {}}, + {Item("a279", Item::kTokenType), {}}, + {Item("a280", Item::kTokenType), {}}, + {Item("a281", Item::kTokenType), {}}, + {Item("a282", Item::kTokenType), {}}, + {Item("a283", Item::kTokenType), {}}, + {Item("a284", Item::kTokenType), {}}, + {Item("a285", Item::kTokenType), {}}, + {Item("a286", Item::kTokenType), {}}, + {Item("a287", Item::kTokenType), {}}, + {Item("a288", Item::kTokenType), {}}, + {Item("a289", Item::kTokenType), {}}, + {Item("a290", Item::kTokenType), {}}, + {Item("a291", Item::kTokenType), {}}, + {Item("a292", Item::kTokenType), {}}, + {Item("a293", Item::kTokenType), {}}, + {Item("a294", Item::kTokenType), {}}, + {Item("a295", Item::kTokenType), {}}, + {Item("a296", Item::kTokenType), {}}, + {Item("a297", Item::kTokenType), {}}, + {Item("a298", Item::kTokenType), {}}, + {Item("a299", Item::kTokenType), {}}, + {Item("a300", Item::kTokenType), {}}, + {Item("a301", Item::kTokenType), {}}, + {Item("a302", Item::kTokenType), {}}, + {Item("a303", Item::kTokenType), {}}, + {Item("a304", Item::kTokenType), {}}, + {Item("a305", Item::kTokenType), {}}, + {Item("a306", Item::kTokenType), {}}, + {Item("a307", Item::kTokenType), {}}, + {Item("a308", Item::kTokenType), {}}, + {Item("a309", Item::kTokenType), {}}, + {Item("a310", Item::kTokenType), {}}, + {Item("a311", Item::kTokenType), {}}, + {Item("a312", Item::kTokenType), {}}, + {Item("a313", Item::kTokenType), {}}, + {Item("a314", Item::kTokenType), {}}, + {Item("a315", Item::kTokenType), {}}, + {Item("a316", Item::kTokenType), {}}, + {Item("a317", Item::kTokenType), {}}, + {Item("a318", Item::kTokenType), {}}, + {Item("a319", Item::kTokenType), {}}, + {Item("a320", Item::kTokenType), {}}, + {Item("a321", Item::kTokenType), {}}, + {Item("a322", Item::kTokenType), {}}, + {Item("a323", Item::kTokenType), {}}, + {Item("a324", Item::kTokenType), {}}, + {Item("a325", Item::kTokenType), {}}, + {Item("a326", Item::kTokenType), {}}, + {Item("a327", Item::kTokenType), {}}, + {Item("a328", Item::kTokenType), {}}, + {Item("a329", Item::kTokenType), {}}, + {Item("a330", Item::kTokenType), {}}, + {Item("a331", Item::kTokenType), {}}, + {Item("a332", Item::kTokenType), {}}, + {Item("a333", Item::kTokenType), {}}, + {Item("a334", Item::kTokenType), {}}, + {Item("a335", Item::kTokenType), {}}, + {Item("a336", Item::kTokenType), {}}, + {Item("a337", Item::kTokenType), {}}, + {Item("a338", Item::kTokenType), {}}, + {Item("a339", Item::kTokenType), {}}, + {Item("a340", Item::kTokenType), {}}, + {Item("a341", Item::kTokenType), {}}, + {Item("a342", Item::kTokenType), {}}, + {Item("a343", Item::kTokenType), {}}, + {Item("a344", Item::kTokenType), {}}, + {Item("a345", Item::kTokenType), {}}, + {Item("a346", Item::kTokenType), {}}, + {Item("a347", Item::kTokenType), {}}, + {Item("a348", Item::kTokenType), {}}, + {Item("a349", Item::kTokenType), {}}, + {Item("a350", Item::kTokenType), {}}, + {Item("a351", Item::kTokenType), {}}, + {Item("a352", Item::kTokenType), {}}, + {Item("a353", Item::kTokenType), {}}, + {Item("a354", Item::kTokenType), {}}, + {Item("a355", Item::kTokenType), {}}, + {Item("a356", Item::kTokenType), {}}, + {Item("a357", Item::kTokenType), {}}, + {Item("a358", Item::kTokenType), {}}, + {Item("a359", Item::kTokenType), {}}, + {Item("a360", Item::kTokenType), {}}, + {Item("a361", Item::kTokenType), {}}, + {Item("a362", Item::kTokenType), {}}, + {Item("a363", Item::kTokenType), {}}, + {Item("a364", Item::kTokenType), {}}, + {Item("a365", Item::kTokenType), {}}, + {Item("a366", Item::kTokenType), {}}, + {Item("a367", Item::kTokenType), {}}, + {Item("a368", Item::kTokenType), {}}, + {Item("a369", Item::kTokenType), {}}, + {Item("a370", Item::kTokenType), {}}, + {Item("a371", Item::kTokenType), {}}, + {Item("a372", Item::kTokenType), {}}, + {Item("a373", Item::kTokenType), {}}, + {Item("a374", Item::kTokenType), {}}, + {Item("a375", Item::kTokenType), {}}, + {Item("a376", Item::kTokenType), {}}, + {Item("a377", Item::kTokenType), {}}, + {Item("a378", Item::kTokenType), {}}, + {Item("a379", Item::kTokenType), {}}, + {Item("a380", Item::kTokenType), {}}, + {Item("a381", Item::kTokenType), {}}, + {Item("a382", Item::kTokenType), {}}, + {Item("a383", Item::kTokenType), {}}, + {Item("a384", Item::kTokenType), {}}, + {Item("a385", Item::kTokenType), {}}, + {Item("a386", Item::kTokenType), {}}, + {Item("a387", Item::kTokenType), {}}, + {Item("a388", Item::kTokenType), {}}, + {Item("a389", Item::kTokenType), {}}, + {Item("a390", Item::kTokenType), {}}, + {Item("a391", Item::kTokenType), {}}, + {Item("a392", Item::kTokenType), {}}, + {Item("a393", Item::kTokenType), {}}, + {Item("a394", Item::kTokenType), {}}, + {Item("a395", Item::kTokenType), {}}, + {Item("a396", Item::kTokenType), {}}, + {Item("a397", Item::kTokenType), {}}, + {Item("a398", Item::kTokenType), {}}, + {Item("a399", Item::kTokenType), {}}, + {Item("a400", Item::kTokenType), {}}, + {Item("a401", Item::kTokenType), {}}, + {Item("a402", Item::kTokenType), {}}, + {Item("a403", Item::kTokenType), {}}, + {Item("a404", Item::kTokenType), {}}, + {Item("a405", Item::kTokenType), {}}, + {Item("a406", Item::kTokenType), {}}, + {Item("a407", Item::kTokenType), {}}, + {Item("a408", Item::kTokenType), {}}, + {Item("a409", Item::kTokenType), {}}, + {Item("a410", Item::kTokenType), {}}, + {Item("a411", Item::kTokenType), {}}, + {Item("a412", Item::kTokenType), {}}, + {Item("a413", Item::kTokenType), {}}, + {Item("a414", Item::kTokenType), {}}, + {Item("a415", Item::kTokenType), {}}, + {Item("a416", Item::kTokenType), {}}, + {Item("a417", Item::kTokenType), {}}, + {Item("a418", Item::kTokenType), {}}, + {Item("a419", Item::kTokenType), {}}, + {Item("a420", Item::kTokenType), {}}, + {Item("a421", Item::kTokenType), {}}, + {Item("a422", Item::kTokenType), {}}, + {Item("a423", Item::kTokenType), {}}, + {Item("a424", Item::kTokenType), {}}, + {Item("a425", Item::kTokenType), {}}, + {Item("a426", Item::kTokenType), {}}, + {Item("a427", Item::kTokenType), {}}, + {Item("a428", Item::kTokenType), {}}, + {Item("a429", Item::kTokenType), {}}, + {Item("a430", Item::kTokenType), {}}, + {Item("a431", Item::kTokenType), {}}, + {Item("a432", Item::kTokenType), {}}, + {Item("a433", Item::kTokenType), {}}, + {Item("a434", Item::kTokenType), {}}, + {Item("a435", Item::kTokenType), {}}, + {Item("a436", Item::kTokenType), {}}, + {Item("a437", Item::kTokenType), {}}, + {Item("a438", Item::kTokenType), {}}, + {Item("a439", Item::kTokenType), {}}, + {Item("a440", Item::kTokenType), {}}, + {Item("a441", Item::kTokenType), {}}, + {Item("a442", Item::kTokenType), {}}, + {Item("a443", Item::kTokenType), {}}, + {Item("a444", Item::kTokenType), {}}, + {Item("a445", Item::kTokenType), {}}, + {Item("a446", Item::kTokenType), {}}, + {Item("a447", Item::kTokenType), {}}, + {Item("a448", Item::kTokenType), {}}, + {Item("a449", Item::kTokenType), {}}, + {Item("a450", Item::kTokenType), {}}, + {Item("a451", Item::kTokenType), {}}, + {Item("a452", Item::kTokenType), {}}, + {Item("a453", Item::kTokenType), {}}, + {Item("a454", Item::kTokenType), {}}, + {Item("a455", Item::kTokenType), {}}, + {Item("a456", Item::kTokenType), {}}, + {Item("a457", Item::kTokenType), {}}, + {Item("a458", Item::kTokenType), {}}, + {Item("a459", Item::kTokenType), {}}, + {Item("a460", Item::kTokenType), {}}, + {Item("a461", Item::kTokenType), {}}, + {Item("a462", Item::kTokenType), {}}, + {Item("a463", Item::kTokenType), {}}, + {Item("a464", Item::kTokenType), {}}, + {Item("a465", Item::kTokenType), {}}, + {Item("a466", Item::kTokenType), {}}, + {Item("a467", Item::kTokenType), {}}, + {Item("a468", Item::kTokenType), {}}, + {Item("a469", Item::kTokenType), {}}, + {Item("a470", Item::kTokenType), {}}, + {Item("a471", Item::kTokenType), {}}, + {Item("a472", Item::kTokenType), {}}, + {Item("a473", Item::kTokenType), {}}, + {Item("a474", Item::kTokenType), {}}, + {Item("a475", Item::kTokenType), {}}, + {Item("a476", Item::kTokenType), {}}, + {Item("a477", Item::kTokenType), {}}, + {Item("a478", Item::kTokenType), {}}, + {Item("a479", Item::kTokenType), {}}, + {Item("a480", Item::kTokenType), {}}, + {Item("a481", Item::kTokenType), {}}, + {Item("a482", Item::kTokenType), {}}, + {Item("a483", Item::kTokenType), {}}, + {Item("a484", Item::kTokenType), {}}, + {Item("a485", Item::kTokenType), {}}, + {Item("a486", Item::kTokenType), {}}, + {Item("a487", Item::kTokenType), {}}, + {Item("a488", Item::kTokenType), {}}, + {Item("a489", Item::kTokenType), {}}, + {Item("a490", Item::kTokenType), {}}, + {Item("a491", Item::kTokenType), {}}, + {Item("a492", Item::kTokenType), {}}, + {Item("a493", Item::kTokenType), {}}, + {Item("a494", Item::kTokenType), {}}, + {Item("a495", Item::kTokenType), {}}, + {Item("a496", Item::kTokenType), {}}, + {Item("a497", Item::kTokenType), {}}, + {Item("a498", Item::kTokenType), {}}, + {Item("a499", Item::kTokenType), {}}, + {Item("a500", Item::kTokenType), {}}, + {Item("a501", Item::kTokenType), {}}, + {Item("a502", Item::kTokenType), {}}, + {Item("a503", Item::kTokenType), {}}, + {Item("a504", Item::kTokenType), {}}, + {Item("a505", Item::kTokenType), {}}, + {Item("a506", Item::kTokenType), {}}, + {Item("a507", Item::kTokenType), {}}, + {Item("a508", Item::kTokenType), {}}, + {Item("a509", Item::kTokenType), {}}, + {Item("a510", Item::kTokenType), {}}, + {Item("a511", Item::kTokenType), {}}, + {Item("a512", Item::kTokenType), {}}, + {Item("a513", Item::kTokenType), {}}, + {Item("a514", Item::kTokenType), {}}, + {Item("a515", Item::kTokenType), {}}, + {Item("a516", Item::kTokenType), {}}, + {Item("a517", Item::kTokenType), {}}, + {Item("a518", Item::kTokenType), {}}, + {Item("a519", Item::kTokenType), {}}, + {Item("a520", Item::kTokenType), {}}, + {Item("a521", Item::kTokenType), {}}, + {Item("a522", Item::kTokenType), {}}, + {Item("a523", Item::kTokenType), {}}, + {Item("a524", Item::kTokenType), {}}, + {Item("a525", Item::kTokenType), {}}, + {Item("a526", Item::kTokenType), {}}, + {Item("a527", Item::kTokenType), {}}, + {Item("a528", Item::kTokenType), {}}, + {Item("a529", Item::kTokenType), {}}, + {Item("a530", Item::kTokenType), {}}, + {Item("a531", Item::kTokenType), {}}, + {Item("a532", Item::kTokenType), {}}, + {Item("a533", Item::kTokenType), {}}, + {Item("a534", Item::kTokenType), {}}, + {Item("a535", Item::kTokenType), {}}, + {Item("a536", Item::kTokenType), {}}, + {Item("a537", Item::kTokenType), {}}, + {Item("a538", Item::kTokenType), {}}, + {Item("a539", Item::kTokenType), {}}, + {Item("a540", Item::kTokenType), {}}, + {Item("a541", Item::kTokenType), {}}, + {Item("a542", Item::kTokenType), {}}, + {Item("a543", Item::kTokenType), {}}, + {Item("a544", Item::kTokenType), {}}, + {Item("a545", Item::kTokenType), {}}, + {Item("a546", Item::kTokenType), {}}, + {Item("a547", Item::kTokenType), {}}, + {Item("a548", Item::kTokenType), {}}, + {Item("a549", Item::kTokenType), {}}, + {Item("a550", Item::kTokenType), {}}, + {Item("a551", Item::kTokenType), {}}, + {Item("a552", Item::kTokenType), {}}, + {Item("a553", Item::kTokenType), {}}, + {Item("a554", Item::kTokenType), {}}, + {Item("a555", Item::kTokenType), {}}, + {Item("a556", Item::kTokenType), {}}, + {Item("a557", Item::kTokenType), {}}, + {Item("a558", Item::kTokenType), {}}, + {Item("a559", Item::kTokenType), {}}, + {Item("a560", Item::kTokenType), {}}, + {Item("a561", Item::kTokenType), {}}, + {Item("a562", Item::kTokenType), {}}, + {Item("a563", Item::kTokenType), {}}, + {Item("a564", Item::kTokenType), {}}, + {Item("a565", Item::kTokenType), {}}, + {Item("a566", Item::kTokenType), {}}, + {Item("a567", Item::kTokenType), {}}, + {Item("a568", Item::kTokenType), {}}, + {Item("a569", Item::kTokenType), {}}, + {Item("a570", Item::kTokenType), {}}, + {Item("a571", Item::kTokenType), {}}, + {Item("a572", Item::kTokenType), {}}, + {Item("a573", Item::kTokenType), {}}, + {Item("a574", Item::kTokenType), {}}, + {Item("a575", Item::kTokenType), {}}, + {Item("a576", Item::kTokenType), {}}, + {Item("a577", Item::kTokenType), {}}, + {Item("a578", Item::kTokenType), {}}, + {Item("a579", Item::kTokenType), {}}, + {Item("a580", Item::kTokenType), {}}, + {Item("a581", Item::kTokenType), {}}, + {Item("a582", Item::kTokenType), {}}, + {Item("a583", Item::kTokenType), {}}, + {Item("a584", Item::kTokenType), {}}, + {Item("a585", Item::kTokenType), {}}, + {Item("a586", Item::kTokenType), {}}, + {Item("a587", Item::kTokenType), {}}, + {Item("a588", Item::kTokenType), {}}, + {Item("a589", Item::kTokenType), {}}, + {Item("a590", Item::kTokenType), {}}, + {Item("a591", Item::kTokenType), {}}, + {Item("a592", Item::kTokenType), {}}, + {Item("a593", Item::kTokenType), {}}, + {Item("a594", Item::kTokenType), {}}, + {Item("a595", Item::kTokenType), {}}, + {Item("a596", Item::kTokenType), {}}, + {Item("a597", Item::kTokenType), {}}, + {Item("a598", Item::kTokenType), {}}, + {Item("a599", Item::kTokenType), {}}, + {Item("a600", Item::kTokenType), {}}, + {Item("a601", Item::kTokenType), {}}, + {Item("a602", Item::kTokenType), {}}, + {Item("a603", Item::kTokenType), {}}, + {Item("a604", Item::kTokenType), {}}, + {Item("a605", Item::kTokenType), {}}, + {Item("a606", Item::kTokenType), {}}, + {Item("a607", Item::kTokenType), {}}, + {Item("a608", Item::kTokenType), {}}, + {Item("a609", Item::kTokenType), {}}, + {Item("a610", Item::kTokenType), {}}, + {Item("a611", Item::kTokenType), {}}, + {Item("a612", Item::kTokenType), {}}, + {Item("a613", Item::kTokenType), {}}, + {Item("a614", Item::kTokenType), {}}, + {Item("a615", Item::kTokenType), {}}, + {Item("a616", Item::kTokenType), {}}, + {Item("a617", Item::kTokenType), {}}, + {Item("a618", Item::kTokenType), {}}, + {Item("a619", Item::kTokenType), {}}, + {Item("a620", Item::kTokenType), {}}, + {Item("a621", Item::kTokenType), {}}, + {Item("a622", Item::kTokenType), {}}, + {Item("a623", Item::kTokenType), {}}, + {Item("a624", Item::kTokenType), {}}, + {Item("a625", Item::kTokenType), {}}, + {Item("a626", Item::kTokenType), {}}, + {Item("a627", Item::kTokenType), {}}, + {Item("a628", Item::kTokenType), {}}, + {Item("a629", Item::kTokenType), {}}, + {Item("a630", Item::kTokenType), {}}, + {Item("a631", Item::kTokenType), {}}, + {Item("a632", Item::kTokenType), {}}, + {Item("a633", Item::kTokenType), {}}, + {Item("a634", Item::kTokenType), {}}, + {Item("a635", Item::kTokenType), {}}, + {Item("a636", Item::kTokenType), {}}, + {Item("a637", Item::kTokenType), {}}, + {Item("a638", Item::kTokenType), {}}, + {Item("a639", Item::kTokenType), {}}, + {Item("a640", Item::kTokenType), {}}, + {Item("a641", Item::kTokenType), {}}, + {Item("a642", Item::kTokenType), {}}, + {Item("a643", Item::kTokenType), {}}, + {Item("a644", Item::kTokenType), {}}, + {Item("a645", Item::kTokenType), {}}, + {Item("a646", Item::kTokenType), {}}, + {Item("a647", Item::kTokenType), {}}, + {Item("a648", Item::kTokenType), {}}, + {Item("a649", Item::kTokenType), {}}, + {Item("a650", Item::kTokenType), {}}, + {Item("a651", Item::kTokenType), {}}, + {Item("a652", Item::kTokenType), {}}, + {Item("a653", Item::kTokenType), {}}, + {Item("a654", Item::kTokenType), {}}, + {Item("a655", Item::kTokenType), {}}, + {Item("a656", Item::kTokenType), {}}, + {Item("a657", Item::kTokenType), {}}, + {Item("a658", Item::kTokenType), {}}, + {Item("a659", Item::kTokenType), {}}, + {Item("a660", Item::kTokenType), {}}, + {Item("a661", Item::kTokenType), {}}, + {Item("a662", Item::kTokenType), {}}, + {Item("a663", Item::kTokenType), {}}, + {Item("a664", Item::kTokenType), {}}, + {Item("a665", Item::kTokenType), {}}, + {Item("a666", Item::kTokenType), {}}, + {Item("a667", Item::kTokenType), {}}, + {Item("a668", Item::kTokenType), {}}, + {Item("a669", Item::kTokenType), {}}, + {Item("a670", Item::kTokenType), {}}, + {Item("a671", Item::kTokenType), {}}, + {Item("a672", Item::kTokenType), {}}, + {Item("a673", Item::kTokenType), {}}, + {Item("a674", Item::kTokenType), {}}, + {Item("a675", Item::kTokenType), {}}, + {Item("a676", Item::kTokenType), {}}, + {Item("a677", Item::kTokenType), {}}, + {Item("a678", Item::kTokenType), {}}, + {Item("a679", Item::kTokenType), {}}, + {Item("a680", Item::kTokenType), {}}, + {Item("a681", Item::kTokenType), {}}, + {Item("a682", Item::kTokenType), {}}, + {Item("a683", Item::kTokenType), {}}, + {Item("a684", Item::kTokenType), {}}, + {Item("a685", Item::kTokenType), {}}, + {Item("a686", Item::kTokenType), {}}, + {Item("a687", Item::kTokenType), {}}, + {Item("a688", Item::kTokenType), {}}, + {Item("a689", Item::kTokenType), {}}, + {Item("a690", Item::kTokenType), {}}, + {Item("a691", Item::kTokenType), {}}, + {Item("a692", Item::kTokenType), {}}, + {Item("a693", Item::kTokenType), {}}, + {Item("a694", Item::kTokenType), {}}, + {Item("a695", Item::kTokenType), {}}, + {Item("a696", Item::kTokenType), {}}, + {Item("a697", Item::kTokenType), {}}, + {Item("a698", Item::kTokenType), {}}, + {Item("a699", Item::kTokenType), {}}, + {Item("a700", Item::kTokenType), {}}, + {Item("a701", Item::kTokenType), {}}, + {Item("a702", Item::kTokenType), {}}, + {Item("a703", Item::kTokenType), {}}, + {Item("a704", Item::kTokenType), {}}, + {Item("a705", Item::kTokenType), {}}, + {Item("a706", Item::kTokenType), {}}, + {Item("a707", Item::kTokenType), {}}, + {Item("a708", Item::kTokenType), {}}, + {Item("a709", Item::kTokenType), {}}, + {Item("a710", Item::kTokenType), {}}, + {Item("a711", Item::kTokenType), {}}, + {Item("a712", Item::kTokenType), {}}, + {Item("a713", Item::kTokenType), {}}, + {Item("a714", Item::kTokenType), {}}, + {Item("a715", Item::kTokenType), {}}, + {Item("a716", Item::kTokenType), {}}, + {Item("a717", Item::kTokenType), {}}, + {Item("a718", Item::kTokenType), {}}, + {Item("a719", Item::kTokenType), {}}, + {Item("a720", Item::kTokenType), {}}, + {Item("a721", Item::kTokenType), {}}, + {Item("a722", Item::kTokenType), {}}, + {Item("a723", Item::kTokenType), {}}, + {Item("a724", Item::kTokenType), {}}, + {Item("a725", Item::kTokenType), {}}, + {Item("a726", Item::kTokenType), {}}, + {Item("a727", Item::kTokenType), {}}, + {Item("a728", Item::kTokenType), {}}, + {Item("a729", Item::kTokenType), {}}, + {Item("a730", Item::kTokenType), {}}, + {Item("a731", Item::kTokenType), {}}, + {Item("a732", Item::kTokenType), {}}, + {Item("a733", Item::kTokenType), {}}, + {Item("a734", Item::kTokenType), {}}, + {Item("a735", Item::kTokenType), {}}, + {Item("a736", Item::kTokenType), {}}, + {Item("a737", Item::kTokenType), {}}, + {Item("a738", Item::kTokenType), {}}, + {Item("a739", Item::kTokenType), {}}, + {Item("a740", Item::kTokenType), {}}, + {Item("a741", Item::kTokenType), {}}, + {Item("a742", Item::kTokenType), {}}, + {Item("a743", Item::kTokenType), {}}, + {Item("a744", Item::kTokenType), {}}, + {Item("a745", Item::kTokenType), {}}, + {Item("a746", Item::kTokenType), {}}, + {Item("a747", Item::kTokenType), {}}, + {Item("a748", Item::kTokenType), {}}, + {Item("a749", Item::kTokenType), {}}, + {Item("a750", Item::kTokenType), {}}, + {Item("a751", Item::kTokenType), {}}, + {Item("a752", Item::kTokenType), {}}, + {Item("a753", Item::kTokenType), {}}, + {Item("a754", Item::kTokenType), {}}, + {Item("a755", Item::kTokenType), {}}, + {Item("a756", Item::kTokenType), {}}, + {Item("a757", Item::kTokenType), {}}, + {Item("a758", Item::kTokenType), {}}, + {Item("a759", Item::kTokenType), {}}, + {Item("a760", Item::kTokenType), {}}, + {Item("a761", Item::kTokenType), {}}, + {Item("a762", Item::kTokenType), {}}, + {Item("a763", Item::kTokenType), {}}, + {Item("a764", Item::kTokenType), {}}, + {Item("a765", Item::kTokenType), {}}, + {Item("a766", Item::kTokenType), {}}, + {Item("a767", Item::kTokenType), {}}, + {Item("a768", Item::kTokenType), {}}, + {Item("a769", Item::kTokenType), {}}, + {Item("a770", Item::kTokenType), {}}, + {Item("a771", Item::kTokenType), {}}, + {Item("a772", Item::kTokenType), {}}, + {Item("a773", Item::kTokenType), {}}, + {Item("a774", Item::kTokenType), {}}, + {Item("a775", Item::kTokenType), {}}, + {Item("a776", Item::kTokenType), {}}, + {Item("a777", Item::kTokenType), {}}, + {Item("a778", Item::kTokenType), {}}, + {Item("a779", Item::kTokenType), {}}, + {Item("a780", Item::kTokenType), {}}, + {Item("a781", Item::kTokenType), {}}, + {Item("a782", Item::kTokenType), {}}, + {Item("a783", Item::kTokenType), {}}, + {Item("a784", Item::kTokenType), {}}, + {Item("a785", Item::kTokenType), {}}, + {Item("a786", Item::kTokenType), {}}, + {Item("a787", Item::kTokenType), {}}, + {Item("a788", Item::kTokenType), {}}, + {Item("a789", Item::kTokenType), {}}, + {Item("a790", Item::kTokenType), {}}, + {Item("a791", Item::kTokenType), {}}, + {Item("a792", Item::kTokenType), {}}, + {Item("a793", Item::kTokenType), {}}, + {Item("a794", Item::kTokenType), {}}, + {Item("a795", Item::kTokenType), {}}, + {Item("a796", Item::kTokenType), {}}, + {Item("a797", Item::kTokenType), {}}, + {Item("a798", Item::kTokenType), {}}, + {Item("a799", Item::kTokenType), {}}, + {Item("a800", Item::kTokenType), {}}, + {Item("a801", Item::kTokenType), {}}, + {Item("a802", Item::kTokenType), {}}, + {Item("a803", Item::kTokenType), {}}, + {Item("a804", Item::kTokenType), {}}, + {Item("a805", Item::kTokenType), {}}, + {Item("a806", Item::kTokenType), {}}, + {Item("a807", Item::kTokenType), {}}, + {Item("a808", Item::kTokenType), {}}, + {Item("a809", Item::kTokenType), {}}, + {Item("a810", Item::kTokenType), {}}, + {Item("a811", Item::kTokenType), {}}, + {Item("a812", Item::kTokenType), {}}, + {Item("a813", Item::kTokenType), {}}, + {Item("a814", Item::kTokenType), {}}, + {Item("a815", Item::kTokenType), {}}, + {Item("a816", Item::kTokenType), {}}, + {Item("a817", Item::kTokenType), {}}, + {Item("a818", Item::kTokenType), {}}, + {Item("a819", Item::kTokenType), {}}, + {Item("a820", Item::kTokenType), {}}, + {Item("a821", Item::kTokenType), {}}, + {Item("a822", Item::kTokenType), {}}, + {Item("a823", Item::kTokenType), {}}, + {Item("a824", Item::kTokenType), {}}, + {Item("a825", Item::kTokenType), {}}, + {Item("a826", Item::kTokenType), {}}, + {Item("a827", Item::kTokenType), {}}, + {Item("a828", Item::kTokenType), {}}, + {Item("a829", Item::kTokenType), {}}, + {Item("a830", Item::kTokenType), {}}, + {Item("a831", Item::kTokenType), {}}, + {Item("a832", Item::kTokenType), {}}, + {Item("a833", Item::kTokenType), {}}, + {Item("a834", Item::kTokenType), {}}, + {Item("a835", Item::kTokenType), {}}, + {Item("a836", Item::kTokenType), {}}, + {Item("a837", Item::kTokenType), {}}, + {Item("a838", Item::kTokenType), {}}, + {Item("a839", Item::kTokenType), {}}, + {Item("a840", Item::kTokenType), {}}, + {Item("a841", Item::kTokenType), {}}, + {Item("a842", Item::kTokenType), {}}, + {Item("a843", Item::kTokenType), {}}, + {Item("a844", Item::kTokenType), {}}, + {Item("a845", Item::kTokenType), {}}, + {Item("a846", Item::kTokenType), {}}, + {Item("a847", Item::kTokenType), {}}, + {Item("a848", Item::kTokenType), {}}, + {Item("a849", Item::kTokenType), {}}, + {Item("a850", Item::kTokenType), {}}, + {Item("a851", Item::kTokenType), {}}, + {Item("a852", Item::kTokenType), {}}, + {Item("a853", Item::kTokenType), {}}, + {Item("a854", Item::kTokenType), {}}, + {Item("a855", Item::kTokenType), {}}, + {Item("a856", Item::kTokenType), {}}, + {Item("a857", Item::kTokenType), {}}, + {Item("a858", Item::kTokenType), {}}, + {Item("a859", Item::kTokenType), {}}, + {Item("a860", Item::kTokenType), {}}, + {Item("a861", Item::kTokenType), {}}, + {Item("a862", Item::kTokenType), {}}, + {Item("a863", Item::kTokenType), {}}, + {Item("a864", Item::kTokenType), {}}, + {Item("a865", Item::kTokenType), {}}, + {Item("a866", Item::kTokenType), {}}, + {Item("a867", Item::kTokenType), {}}, + {Item("a868", Item::kTokenType), {}}, + {Item("a869", Item::kTokenType), {}}, + {Item("a870", Item::kTokenType), {}}, + {Item("a871", Item::kTokenType), {}}, + {Item("a872", Item::kTokenType), {}}, + {Item("a873", Item::kTokenType), {}}, + {Item("a874", Item::kTokenType), {}}, + {Item("a875", Item::kTokenType), {}}, + {Item("a876", Item::kTokenType), {}}, + {Item("a877", Item::kTokenType), {}}, + {Item("a878", Item::kTokenType), {}}, + {Item("a879", Item::kTokenType), {}}, + {Item("a880", Item::kTokenType), {}}, + {Item("a881", Item::kTokenType), {}}, + {Item("a882", Item::kTokenType), {}}, + {Item("a883", Item::kTokenType), {}}, + {Item("a884", Item::kTokenType), {}}, + {Item("a885", Item::kTokenType), {}}, + {Item("a886", Item::kTokenType), {}}, + {Item("a887", Item::kTokenType), {}}, + {Item("a888", Item::kTokenType), {}}, + {Item("a889", Item::kTokenType), {}}, + {Item("a890", Item::kTokenType), {}}, + {Item("a891", Item::kTokenType), {}}, + {Item("a892", Item::kTokenType), {}}, + {Item("a893", Item::kTokenType), {}}, + {Item("a894", Item::kTokenType), {}}, + {Item("a895", Item::kTokenType), {}}, + {Item("a896", Item::kTokenType), {}}, + {Item("a897", Item::kTokenType), {}}, + {Item("a898", Item::kTokenType), {}}, + {Item("a899", Item::kTokenType), {}}, + {Item("a900", Item::kTokenType), {}}, + {Item("a901", Item::kTokenType), {}}, + {Item("a902", Item::kTokenType), {}}, + {Item("a903", Item::kTokenType), {}}, + {Item("a904", Item::kTokenType), {}}, + {Item("a905", Item::kTokenType), {}}, + {Item("a906", Item::kTokenType), {}}, + {Item("a907", Item::kTokenType), {}}, + {Item("a908", Item::kTokenType), {}}, + {Item("a909", Item::kTokenType), {}}, + {Item("a910", Item::kTokenType), {}}, + {Item("a911", Item::kTokenType), {}}, + {Item("a912", Item::kTokenType), {}}, + {Item("a913", Item::kTokenType), {}}, + {Item("a914", Item::kTokenType), {}}, + {Item("a915", Item::kTokenType), {}}, + {Item("a916", Item::kTokenType), {}}, + {Item("a917", Item::kTokenType), {}}, + {Item("a918", Item::kTokenType), {}}, + {Item("a919", Item::kTokenType), {}}, + {Item("a920", Item::kTokenType), {}}, + {Item("a921", Item::kTokenType), {}}, + {Item("a922", Item::kTokenType), {}}, + {Item("a923", Item::kTokenType), {}}, + {Item("a924", Item::kTokenType), {}}, + {Item("a925", Item::kTokenType), {}}, + {Item("a926", Item::kTokenType), {}}, + {Item("a927", Item::kTokenType), {}}, + {Item("a928", Item::kTokenType), {}}, + {Item("a929", Item::kTokenType), {}}, + {Item("a930", Item::kTokenType), {}}, + {Item("a931", Item::kTokenType), {}}, + {Item("a932", Item::kTokenType), {}}, + {Item("a933", Item::kTokenType), {}}, + {Item("a934", Item::kTokenType), {}}, + {Item("a935", Item::kTokenType), {}}, + {Item("a936", Item::kTokenType), {}}, + {Item("a937", Item::kTokenType), {}}, + {Item("a938", Item::kTokenType), {}}, + {Item("a939", Item::kTokenType), {}}, + {Item("a940", Item::kTokenType), {}}, + {Item("a941", Item::kTokenType), {}}, + {Item("a942", Item::kTokenType), {}}, + {Item("a943", Item::kTokenType), {}}, + {Item("a944", Item::kTokenType), {}}, + {Item("a945", Item::kTokenType), {}}, + {Item("a946", Item::kTokenType), {}}, + {Item("a947", Item::kTokenType), {}}, + {Item("a948", Item::kTokenType), {}}, + {Item("a949", Item::kTokenType), {}}, + {Item("a950", Item::kTokenType), {}}, + {Item("a951", Item::kTokenType), {}}, + {Item("a952", Item::kTokenType), {}}, + {Item("a953", Item::kTokenType), {}}, + {Item("a954", Item::kTokenType), {}}, + {Item("a955", Item::kTokenType), {}}, + {Item("a956", Item::kTokenType), {}}, + {Item("a957", Item::kTokenType), {}}, + {Item("a958", Item::kTokenType), {}}, + {Item("a959", Item::kTokenType), {}}, + {Item("a960", Item::kTokenType), {}}, + {Item("a961", Item::kTokenType), {}}, + {Item("a962", Item::kTokenType), {}}, + {Item("a963", Item::kTokenType), {}}, + {Item("a964", Item::kTokenType), {}}, + {Item("a965", Item::kTokenType), {}}, + {Item("a966", Item::kTokenType), {}}, + {Item("a967", Item::kTokenType), {}}, + {Item("a968", Item::kTokenType), {}}, + {Item("a969", Item::kTokenType), {}}, + {Item("a970", Item::kTokenType), {}}, + {Item("a971", Item::kTokenType), {}}, + {Item("a972", Item::kTokenType), {}}, + {Item("a973", Item::kTokenType), {}}, + {Item("a974", Item::kTokenType), {}}, + {Item("a975", Item::kTokenType), {}}, + {Item("a976", Item::kTokenType), {}}, + {Item("a977", Item::kTokenType), {}}, + {Item("a978", Item::kTokenType), {}}, + {Item("a979", Item::kTokenType), {}}, + {Item("a980", Item::kTokenType), {}}, + {Item("a981", Item::kTokenType), {}}, + {Item("a982", Item::kTokenType), {}}, + {Item("a983", Item::kTokenType), {}}, + {Item("a984", Item::kTokenType), {}}, + {Item("a985", Item::kTokenType), {}}, + {Item("a986", Item::kTokenType), {}}, + {Item("a987", Item::kTokenType), {}}, + {Item("a988", Item::kTokenType), {}}, + {Item("a989", Item::kTokenType), {}}, + {Item("a990", Item::kTokenType), {}}, + {Item("a991", Item::kTokenType), {}}, + {Item("a992", Item::kTokenType), {}}, + {Item("a993", Item::kTokenType), {}}, + {Item("a994", Item::kTokenType), {}}, + {Item("a995", Item::kTokenType), {}}, + {Item("a996", Item::kTokenType), {}}, + {Item("a997", Item::kTokenType), {}}, + {Item("a998", Item::kTokenType), {}}, + {Item("a999", Item::kTokenType), {}}, + {Item("a1000", Item::kTokenType), {}}, + {Item("a1001", Item::kTokenType), {}}, + {Item("a1002", Item::kTokenType), {}}, + {Item("a1003", Item::kTokenType), {}}, + {Item("a1004", Item::kTokenType), {}}, + {Item("a1005", Item::kTokenType), {}}, + {Item("a1006", Item::kTokenType), {}}, + {Item("a1007", Item::kTokenType), {}}, + {Item("a1008", Item::kTokenType), {}}, + {Item("a1009", Item::kTokenType), {}}, + {Item("a1010", Item::kTokenType), {}}, + {Item("a1011", Item::kTokenType), {}}, + {Item("a1012", Item::kTokenType), {}}, + {Item("a1013", Item::kTokenType), {}}, + {Item("a1014", Item::kTokenType), {}}, + {Item("a1015", Item::kTokenType), {}}, + {Item("a1016", Item::kTokenType), {}}, + {Item("a1017", Item::kTokenType), {}}, + {Item("a1018", Item::kTokenType), {}}, + {Item("a1019", Item::kTokenType), {}}, + {Item("a1020", Item::kTokenType), {}}, + {Item("a1021", Item::kTokenType), {}}, + {Item("a1022", Item::kTokenType), {}}, + {Item("a1023", Item::kTokenType), {}}}}}, + {"large parameterised list", + "foo;a0=1, foo;a1=1, foo;a2=1, foo;a3=1, foo;a4=1, foo;a5=1, foo;a6=1, " + "foo;a7=1, foo;a8=1, foo;a9=1, foo;a10=1, foo;a11=1, foo;a12=1, " + "foo;a13=1, foo;a14=1, foo;a15=1, foo;a16=1, foo;a17=1, foo;a18=1, " + "foo;a19=1, foo;a20=1, foo;a21=1, foo;a22=1, foo;a23=1, foo;a24=1, " + "foo;a25=1, foo;a26=1, foo;a27=1, foo;a28=1, foo;a29=1, foo;a30=1, " + "foo;a31=1, foo;a32=1, foo;a33=1, foo;a34=1, foo;a35=1, foo;a36=1, " + "foo;a37=1, foo;a38=1, foo;a39=1, foo;a40=1, foo;a41=1, foo;a42=1, " + "foo;a43=1, foo;a44=1, foo;a45=1, foo;a46=1, foo;a47=1, foo;a48=1, " + "foo;a49=1, foo;a50=1, foo;a51=1, foo;a52=1, foo;a53=1, foo;a54=1, " + "foo;a55=1, foo;a56=1, foo;a57=1, foo;a58=1, foo;a59=1, foo;a60=1, " + "foo;a61=1, foo;a62=1, foo;a63=1, foo;a64=1, foo;a65=1, foo;a66=1, " + "foo;a67=1, foo;a68=1, foo;a69=1, foo;a70=1, foo;a71=1, foo;a72=1, " + "foo;a73=1, foo;a74=1, foo;a75=1, foo;a76=1, foo;a77=1, foo;a78=1, " + "foo;a79=1, foo;a80=1, foo;a81=1, foo;a82=1, foo;a83=1, foo;a84=1, " + "foo;a85=1, foo;a86=1, foo;a87=1, foo;a88=1, foo;a89=1, foo;a90=1, " + "foo;a91=1, foo;a92=1, foo;a93=1, foo;a94=1, foo;a95=1, foo;a96=1, " + "foo;a97=1, foo;a98=1, foo;a99=1, foo;a100=1, foo;a101=1, foo;a102=1, " + "foo;a103=1, foo;a104=1, foo;a105=1, foo;a106=1, foo;a107=1, foo;a108=1, " + "foo;a109=1, foo;a110=1, foo;a111=1, foo;a112=1, foo;a113=1, foo;a114=1, " + "foo;a115=1, foo;a116=1, foo;a117=1, foo;a118=1, foo;a119=1, foo;a120=1, " + "foo;a121=1, foo;a122=1, foo;a123=1, foo;a124=1, foo;a125=1, foo;a126=1, " + "foo;a127=1, foo;a128=1, foo;a129=1, foo;a130=1, foo;a131=1, foo;a132=1, " + "foo;a133=1, foo;a134=1, foo;a135=1, foo;a136=1, foo;a137=1, foo;a138=1, " + "foo;a139=1, foo;a140=1, foo;a141=1, foo;a142=1, foo;a143=1, foo;a144=1, " + "foo;a145=1, foo;a146=1, foo;a147=1, foo;a148=1, foo;a149=1, foo;a150=1, " + "foo;a151=1, foo;a152=1, foo;a153=1, foo;a154=1, foo;a155=1, foo;a156=1, " + "foo;a157=1, foo;a158=1, foo;a159=1, foo;a160=1, foo;a161=1, foo;a162=1, " + "foo;a163=1, foo;a164=1, foo;a165=1, foo;a166=1, foo;a167=1, foo;a168=1, " + "foo;a169=1, foo;a170=1, foo;a171=1, foo;a172=1, foo;a173=1, foo;a174=1, " + "foo;a175=1, foo;a176=1, foo;a177=1, foo;a178=1, foo;a179=1, foo;a180=1, " + "foo;a181=1, foo;a182=1, foo;a183=1, foo;a184=1, foo;a185=1, foo;a186=1, " + "foo;a187=1, foo;a188=1, foo;a189=1, foo;a190=1, foo;a191=1, foo;a192=1, " + "foo;a193=1, foo;a194=1, foo;a195=1, foo;a196=1, foo;a197=1, foo;a198=1, " + "foo;a199=1, foo;a200=1, foo;a201=1, foo;a202=1, foo;a203=1, foo;a204=1, " + "foo;a205=1, foo;a206=1, foo;a207=1, foo;a208=1, foo;a209=1, foo;a210=1, " + "foo;a211=1, foo;a212=1, foo;a213=1, foo;a214=1, foo;a215=1, foo;a216=1, " + "foo;a217=1, foo;a218=1, foo;a219=1, foo;a220=1, foo;a221=1, foo;a222=1, " + "foo;a223=1, foo;a224=1, foo;a225=1, foo;a226=1, foo;a227=1, foo;a228=1, " + "foo;a229=1, foo;a230=1, foo;a231=1, foo;a232=1, foo;a233=1, foo;a234=1, " + "foo;a235=1, foo;a236=1, foo;a237=1, foo;a238=1, foo;a239=1, foo;a240=1, " + "foo;a241=1, foo;a242=1, foo;a243=1, foo;a244=1, foo;a245=1, foo;a246=1, " + "foo;a247=1, foo;a248=1, foo;a249=1, foo;a250=1, foo;a251=1, foo;a252=1, " + "foo;a253=1, foo;a254=1, foo;a255=1, foo;a256=1, foo;a257=1, foo;a258=1, " + "foo;a259=1, foo;a260=1, foo;a261=1, foo;a262=1, foo;a263=1, foo;a264=1, " + "foo;a265=1, foo;a266=1, foo;a267=1, foo;a268=1, foo;a269=1, foo;a270=1, " + "foo;a271=1, foo;a272=1, foo;a273=1, foo;a274=1, foo;a275=1, foo;a276=1, " + "foo;a277=1, foo;a278=1, foo;a279=1, foo;a280=1, foo;a281=1, foo;a282=1, " + "foo;a283=1, foo;a284=1, foo;a285=1, foo;a286=1, foo;a287=1, foo;a288=1, " + "foo;a289=1, foo;a290=1, foo;a291=1, foo;a292=1, foo;a293=1, foo;a294=1, " + "foo;a295=1, foo;a296=1, foo;a297=1, foo;a298=1, foo;a299=1, foo;a300=1, " + "foo;a301=1, foo;a302=1, foo;a303=1, foo;a304=1, foo;a305=1, foo;a306=1, " + "foo;a307=1, foo;a308=1, foo;a309=1, foo;a310=1, foo;a311=1, foo;a312=1, " + "foo;a313=1, foo;a314=1, foo;a315=1, foo;a316=1, foo;a317=1, foo;a318=1, " + "foo;a319=1, foo;a320=1, foo;a321=1, foo;a322=1, foo;a323=1, foo;a324=1, " + "foo;a325=1, foo;a326=1, foo;a327=1, foo;a328=1, foo;a329=1, foo;a330=1, " + "foo;a331=1, foo;a332=1, foo;a333=1, foo;a334=1, foo;a335=1, foo;a336=1, " + "foo;a337=1, foo;a338=1, foo;a339=1, foo;a340=1, foo;a341=1, foo;a342=1, " + "foo;a343=1, foo;a344=1, foo;a345=1, foo;a346=1, foo;a347=1, foo;a348=1, " + "foo;a349=1, foo;a350=1, foo;a351=1, foo;a352=1, foo;a353=1, foo;a354=1, " + "foo;a355=1, foo;a356=1, foo;a357=1, foo;a358=1, foo;a359=1, foo;a360=1, " + "foo;a361=1, foo;a362=1, foo;a363=1, foo;a364=1, foo;a365=1, foo;a366=1, " + "foo;a367=1, foo;a368=1, foo;a369=1, foo;a370=1, foo;a371=1, foo;a372=1, " + "foo;a373=1, foo;a374=1, foo;a375=1, foo;a376=1, foo;a377=1, foo;a378=1, " + "foo;a379=1, foo;a380=1, foo;a381=1, foo;a382=1, foo;a383=1, foo;a384=1, " + "foo;a385=1, foo;a386=1, foo;a387=1, foo;a388=1, foo;a389=1, foo;a390=1, " + "foo;a391=1, foo;a392=1, foo;a393=1, foo;a394=1, foo;a395=1, foo;a396=1, " + "foo;a397=1, foo;a398=1, foo;a399=1, foo;a400=1, foo;a401=1, foo;a402=1, " + "foo;a403=1, foo;a404=1, foo;a405=1, foo;a406=1, foo;a407=1, foo;a408=1, " + "foo;a409=1, foo;a410=1, foo;a411=1, foo;a412=1, foo;a413=1, foo;a414=1, " + "foo;a415=1, foo;a416=1, foo;a417=1, foo;a418=1, foo;a419=1, foo;a420=1, " + "foo;a421=1, foo;a422=1, foo;a423=1, foo;a424=1, foo;a425=1, foo;a426=1, " + "foo;a427=1, foo;a428=1, foo;a429=1, foo;a430=1, foo;a431=1, foo;a432=1, " + "foo;a433=1, foo;a434=1, foo;a435=1, foo;a436=1, foo;a437=1, foo;a438=1, " + "foo;a439=1, foo;a440=1, foo;a441=1, foo;a442=1, foo;a443=1, foo;a444=1, " + "foo;a445=1, foo;a446=1, foo;a447=1, foo;a448=1, foo;a449=1, foo;a450=1, " + "foo;a451=1, foo;a452=1, foo;a453=1, foo;a454=1, foo;a455=1, foo;a456=1, " + "foo;a457=1, foo;a458=1, foo;a459=1, foo;a460=1, foo;a461=1, foo;a462=1, " + "foo;a463=1, foo;a464=1, foo;a465=1, foo;a466=1, foo;a467=1, foo;a468=1, " + "foo;a469=1, foo;a470=1, foo;a471=1, foo;a472=1, foo;a473=1, foo;a474=1, " + "foo;a475=1, foo;a476=1, foo;a477=1, foo;a478=1, foo;a479=1, foo;a480=1, " + "foo;a481=1, foo;a482=1, foo;a483=1, foo;a484=1, foo;a485=1, foo;a486=1, " + "foo;a487=1, foo;a488=1, foo;a489=1, foo;a490=1, foo;a491=1, foo;a492=1, " + "foo;a493=1, foo;a494=1, foo;a495=1, foo;a496=1, foo;a497=1, foo;a498=1, " + "foo;a499=1, foo;a500=1, foo;a501=1, foo;a502=1, foo;a503=1, foo;a504=1, " + "foo;a505=1, foo;a506=1, foo;a507=1, foo;a508=1, foo;a509=1, foo;a510=1, " + "foo;a511=1, foo;a512=1, foo;a513=1, foo;a514=1, foo;a515=1, foo;a516=1, " + "foo;a517=1, foo;a518=1, foo;a519=1, foo;a520=1, foo;a521=1, foo;a522=1, " + "foo;a523=1, foo;a524=1, foo;a525=1, foo;a526=1, foo;a527=1, foo;a528=1, " + "foo;a529=1, foo;a530=1, foo;a531=1, foo;a532=1, foo;a533=1, foo;a534=1, " + "foo;a535=1, foo;a536=1, foo;a537=1, foo;a538=1, foo;a539=1, foo;a540=1, " + "foo;a541=1, foo;a542=1, foo;a543=1, foo;a544=1, foo;a545=1, foo;a546=1, " + "foo;a547=1, foo;a548=1, foo;a549=1, foo;a550=1, foo;a551=1, foo;a552=1, " + "foo;a553=1, foo;a554=1, foo;a555=1, foo;a556=1, foo;a557=1, foo;a558=1, " + "foo;a559=1, foo;a560=1, foo;a561=1, foo;a562=1, foo;a563=1, foo;a564=1, " + "foo;a565=1, foo;a566=1, foo;a567=1, foo;a568=1, foo;a569=1, foo;a570=1, " + "foo;a571=1, foo;a572=1, foo;a573=1, foo;a574=1, foo;a575=1, foo;a576=1, " + "foo;a577=1, foo;a578=1, foo;a579=1, foo;a580=1, foo;a581=1, foo;a582=1, " + "foo;a583=1, foo;a584=1, foo;a585=1, foo;a586=1, foo;a587=1, foo;a588=1, " + "foo;a589=1, foo;a590=1, foo;a591=1, foo;a592=1, foo;a593=1, foo;a594=1, " + "foo;a595=1, foo;a596=1, foo;a597=1, foo;a598=1, foo;a599=1, foo;a600=1, " + "foo;a601=1, foo;a602=1, foo;a603=1, foo;a604=1, foo;a605=1, foo;a606=1, " + "foo;a607=1, foo;a608=1, foo;a609=1, foo;a610=1, foo;a611=1, foo;a612=1, " + "foo;a613=1, foo;a614=1, foo;a615=1, foo;a616=1, foo;a617=1, foo;a618=1, " + "foo;a619=1, foo;a620=1, foo;a621=1, foo;a622=1, foo;a623=1, foo;a624=1, " + "foo;a625=1, foo;a626=1, foo;a627=1, foo;a628=1, foo;a629=1, foo;a630=1, " + "foo;a631=1, foo;a632=1, foo;a633=1, foo;a634=1, foo;a635=1, foo;a636=1, " + "foo;a637=1, foo;a638=1, foo;a639=1, foo;a640=1, foo;a641=1, foo;a642=1, " + "foo;a643=1, foo;a644=1, foo;a645=1, foo;a646=1, foo;a647=1, foo;a648=1, " + "foo;a649=1, foo;a650=1, foo;a651=1, foo;a652=1, foo;a653=1, foo;a654=1, " + "foo;a655=1, foo;a656=1, foo;a657=1, foo;a658=1, foo;a659=1, foo;a660=1, " + "foo;a661=1, foo;a662=1, foo;a663=1, foo;a664=1, foo;a665=1, foo;a666=1, " + "foo;a667=1, foo;a668=1, foo;a669=1, foo;a670=1, foo;a671=1, foo;a672=1, " + "foo;a673=1, foo;a674=1, foo;a675=1, foo;a676=1, foo;a677=1, foo;a678=1, " + "foo;a679=1, foo;a680=1, foo;a681=1, foo;a682=1, foo;a683=1, foo;a684=1, " + "foo;a685=1, foo;a686=1, foo;a687=1, foo;a688=1, foo;a689=1, foo;a690=1, " + "foo;a691=1, foo;a692=1, foo;a693=1, foo;a694=1, foo;a695=1, foo;a696=1, " + "foo;a697=1, foo;a698=1, foo;a699=1, foo;a700=1, foo;a701=1, foo;a702=1, " + "foo;a703=1, foo;a704=1, foo;a705=1, foo;a706=1, foo;a707=1, foo;a708=1, " + "foo;a709=1, foo;a710=1, foo;a711=1, foo;a712=1, foo;a713=1, foo;a714=1, " + "foo;a715=1, foo;a716=1, foo;a717=1, foo;a718=1, foo;a719=1, foo;a720=1, " + "foo;a721=1, foo;a722=1, foo;a723=1, foo;a724=1, foo;a725=1, foo;a726=1, " + "foo;a727=1, foo;a728=1, foo;a729=1, foo;a730=1, foo;a731=1, foo;a732=1, " + "foo;a733=1, foo;a734=1, foo;a735=1, foo;a736=1, foo;a737=1, foo;a738=1, " + "foo;a739=1, foo;a740=1, foo;a741=1, foo;a742=1, foo;a743=1, foo;a744=1, " + "foo;a745=1, foo;a746=1, foo;a747=1, foo;a748=1, foo;a749=1, foo;a750=1, " + "foo;a751=1, foo;a752=1, foo;a753=1, foo;a754=1, foo;a755=1, foo;a756=1, " + "foo;a757=1, foo;a758=1, foo;a759=1, foo;a760=1, foo;a761=1, foo;a762=1, " + "foo;a763=1, foo;a764=1, foo;a765=1, foo;a766=1, foo;a767=1, foo;a768=1, " + "foo;a769=1, foo;a770=1, foo;a771=1, foo;a772=1, foo;a773=1, foo;a774=1, " + "foo;a775=1, foo;a776=1, foo;a777=1, foo;a778=1, foo;a779=1, foo;a780=1, " + "foo;a781=1, foo;a782=1, foo;a783=1, foo;a784=1, foo;a785=1, foo;a786=1, " + "foo;a787=1, foo;a788=1, foo;a789=1, foo;a790=1, foo;a791=1, foo;a792=1, " + "foo;a793=1, foo;a794=1, foo;a795=1, foo;a796=1, foo;a797=1, foo;a798=1, " + "foo;a799=1, foo;a800=1, foo;a801=1, foo;a802=1, foo;a803=1, foo;a804=1, " + "foo;a805=1, foo;a806=1, foo;a807=1, foo;a808=1, foo;a809=1, foo;a810=1, " + "foo;a811=1, foo;a812=1, foo;a813=1, foo;a814=1, foo;a815=1, foo;a816=1, " + "foo;a817=1, foo;a818=1, foo;a819=1, foo;a820=1, foo;a821=1, foo;a822=1, " + "foo;a823=1, foo;a824=1, foo;a825=1, foo;a826=1, foo;a827=1, foo;a828=1, " + "foo;a829=1, foo;a830=1, foo;a831=1, foo;a832=1, foo;a833=1, foo;a834=1, " + "foo;a835=1, foo;a836=1, foo;a837=1, foo;a838=1, foo;a839=1, foo;a840=1, " + "foo;a841=1, foo;a842=1, foo;a843=1, foo;a844=1, foo;a845=1, foo;a846=1, " + "foo;a847=1, foo;a848=1, foo;a849=1, foo;a850=1, foo;a851=1, foo;a852=1, " + "foo;a853=1, foo;a854=1, foo;a855=1, foo;a856=1, foo;a857=1, foo;a858=1, " + "foo;a859=1, foo;a860=1, foo;a861=1, foo;a862=1, foo;a863=1, foo;a864=1, " + "foo;a865=1, foo;a866=1, foo;a867=1, foo;a868=1, foo;a869=1, foo;a870=1, " + "foo;a871=1, foo;a872=1, foo;a873=1, foo;a874=1, foo;a875=1, foo;a876=1, " + "foo;a877=1, foo;a878=1, foo;a879=1, foo;a880=1, foo;a881=1, foo;a882=1, " + "foo;a883=1, foo;a884=1, foo;a885=1, foo;a886=1, foo;a887=1, foo;a888=1, " + "foo;a889=1, foo;a890=1, foo;a891=1, foo;a892=1, foo;a893=1, foo;a894=1, " + "foo;a895=1, foo;a896=1, foo;a897=1, foo;a898=1, foo;a899=1, foo;a900=1, " + "foo;a901=1, foo;a902=1, foo;a903=1, foo;a904=1, foo;a905=1, foo;a906=1, " + "foo;a907=1, foo;a908=1, foo;a909=1, foo;a910=1, foo;a911=1, foo;a912=1, " + "foo;a913=1, foo;a914=1, foo;a915=1, foo;a916=1, foo;a917=1, foo;a918=1, " + "foo;a919=1, foo;a920=1, foo;a921=1, foo;a922=1, foo;a923=1, foo;a924=1, " + "foo;a925=1, foo;a926=1, foo;a927=1, foo;a928=1, foo;a929=1, foo;a930=1, " + "foo;a931=1, foo;a932=1, foo;a933=1, foo;a934=1, foo;a935=1, foo;a936=1, " + "foo;a937=1, foo;a938=1, foo;a939=1, foo;a940=1, foo;a941=1, foo;a942=1, " + "foo;a943=1, foo;a944=1, foo;a945=1, foo;a946=1, foo;a947=1, foo;a948=1, " + "foo;a949=1, foo;a950=1, foo;a951=1, foo;a952=1, foo;a953=1, foo;a954=1, " + "foo;a955=1, foo;a956=1, foo;a957=1, foo;a958=1, foo;a959=1, foo;a960=1, " + "foo;a961=1, foo;a962=1, foo;a963=1, foo;a964=1, foo;a965=1, foo;a966=1, " + "foo;a967=1, foo;a968=1, foo;a969=1, foo;a970=1, foo;a971=1, foo;a972=1, " + "foo;a973=1, foo;a974=1, foo;a975=1, foo;a976=1, foo;a977=1, foo;a978=1, " + "foo;a979=1, foo;a980=1, foo;a981=1, foo;a982=1, foo;a983=1, foo;a984=1, " + "foo;a985=1, foo;a986=1, foo;a987=1, foo;a988=1, foo;a989=1, foo;a990=1, " + "foo;a991=1, foo;a992=1, foo;a993=1, foo;a994=1, foo;a995=1, foo;a996=1, " + "foo;a997=1, foo;a998=1, foo;a999=1, foo;a1000=1, foo;a1001=1, " + "foo;a1002=1, foo;a1003=1, foo;a1004=1, foo;a1005=1, foo;a1006=1, " + "foo;a1007=1, foo;a1008=1, foo;a1009=1, foo;a1010=1, foo;a1011=1, " + "foo;a1012=1, foo;a1013=1, foo;a1014=1, foo;a1015=1, foo;a1016=1, " + "foo;a1017=1, foo;a1018=1, foo;a1019=1, foo;a1020=1, foo;a1021=1, " + "foo;a1022=1, foo;a1023=1", + {{{Item("foo", Item::kTokenType), {Param("a0", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1", 1)}}, + {Item("foo", Item::kTokenType), {Param("a2", 1)}}, + {Item("foo", Item::kTokenType), {Param("a3", 1)}}, + {Item("foo", Item::kTokenType), {Param("a4", 1)}}, + {Item("foo", Item::kTokenType), {Param("a5", 1)}}, + {Item("foo", Item::kTokenType), {Param("a6", 1)}}, + {Item("foo", Item::kTokenType), {Param("a7", 1)}}, + {Item("foo", Item::kTokenType), {Param("a8", 1)}}, + {Item("foo", Item::kTokenType), {Param("a9", 1)}}, + {Item("foo", Item::kTokenType), {Param("a10", 1)}}, + {Item("foo", Item::kTokenType), {Param("a11", 1)}}, + {Item("foo", Item::kTokenType), {Param("a12", 1)}}, + {Item("foo", Item::kTokenType), {Param("a13", 1)}}, + {Item("foo", Item::kTokenType), {Param("a14", 1)}}, + {Item("foo", Item::kTokenType), {Param("a15", 1)}}, + {Item("foo", Item::kTokenType), {Param("a16", 1)}}, + {Item("foo", Item::kTokenType), {Param("a17", 1)}}, + {Item("foo", Item::kTokenType), {Param("a18", 1)}}, + {Item("foo", Item::kTokenType), {Param("a19", 1)}}, + {Item("foo", Item::kTokenType), {Param("a20", 1)}}, + {Item("foo", Item::kTokenType), {Param("a21", 1)}}, + {Item("foo", Item::kTokenType), {Param("a22", 1)}}, + {Item("foo", Item::kTokenType), {Param("a23", 1)}}, + {Item("foo", Item::kTokenType), {Param("a24", 1)}}, + {Item("foo", Item::kTokenType), {Param("a25", 1)}}, + {Item("foo", Item::kTokenType), {Param("a26", 1)}}, + {Item("foo", Item::kTokenType), {Param("a27", 1)}}, + {Item("foo", Item::kTokenType), {Param("a28", 1)}}, + {Item("foo", Item::kTokenType), {Param("a29", 1)}}, + {Item("foo", Item::kTokenType), {Param("a30", 1)}}, + {Item("foo", Item::kTokenType), {Param("a31", 1)}}, + {Item("foo", Item::kTokenType), {Param("a32", 1)}}, + {Item("foo", Item::kTokenType), {Param("a33", 1)}}, + {Item("foo", Item::kTokenType), {Param("a34", 1)}}, + {Item("foo", Item::kTokenType), {Param("a35", 1)}}, + {Item("foo", Item::kTokenType), {Param("a36", 1)}}, + {Item("foo", Item::kTokenType), {Param("a37", 1)}}, + {Item("foo", Item::kTokenType), {Param("a38", 1)}}, + {Item("foo", Item::kTokenType), {Param("a39", 1)}}, + {Item("foo", Item::kTokenType), {Param("a40", 1)}}, + {Item("foo", Item::kTokenType), {Param("a41", 1)}}, + {Item("foo", Item::kTokenType), {Param("a42", 1)}}, + {Item("foo", Item::kTokenType), {Param("a43", 1)}}, + {Item("foo", Item::kTokenType), {Param("a44", 1)}}, + {Item("foo", Item::kTokenType), {Param("a45", 1)}}, + {Item("foo", Item::kTokenType), {Param("a46", 1)}}, + {Item("foo", Item::kTokenType), {Param("a47", 1)}}, + {Item("foo", Item::kTokenType), {Param("a48", 1)}}, + {Item("foo", Item::kTokenType), {Param("a49", 1)}}, + {Item("foo", Item::kTokenType), {Param("a50", 1)}}, + {Item("foo", Item::kTokenType), {Param("a51", 1)}}, + {Item("foo", Item::kTokenType), {Param("a52", 1)}}, + {Item("foo", Item::kTokenType), {Param("a53", 1)}}, + {Item("foo", Item::kTokenType), {Param("a54", 1)}}, + {Item("foo", Item::kTokenType), {Param("a55", 1)}}, + {Item("foo", Item::kTokenType), {Param("a56", 1)}}, + {Item("foo", Item::kTokenType), {Param("a57", 1)}}, + {Item("foo", Item::kTokenType), {Param("a58", 1)}}, + {Item("foo", Item::kTokenType), {Param("a59", 1)}}, + {Item("foo", Item::kTokenType), {Param("a60", 1)}}, + {Item("foo", Item::kTokenType), {Param("a61", 1)}}, + {Item("foo", Item::kTokenType), {Param("a62", 1)}}, + {Item("foo", Item::kTokenType), {Param("a63", 1)}}, + {Item("foo", Item::kTokenType), {Param("a64", 1)}}, + {Item("foo", Item::kTokenType), {Param("a65", 1)}}, + {Item("foo", Item::kTokenType), {Param("a66", 1)}}, + {Item("foo", Item::kTokenType), {Param("a67", 1)}}, + {Item("foo", Item::kTokenType), {Param("a68", 1)}}, + {Item("foo", Item::kTokenType), {Param("a69", 1)}}, + {Item("foo", Item::kTokenType), {Param("a70", 1)}}, + {Item("foo", Item::kTokenType), {Param("a71", 1)}}, + {Item("foo", Item::kTokenType), {Param("a72", 1)}}, + {Item("foo", Item::kTokenType), {Param("a73", 1)}}, + {Item("foo", Item::kTokenType), {Param("a74", 1)}}, + {Item("foo", Item::kTokenType), {Param("a75", 1)}}, + {Item("foo", Item::kTokenType), {Param("a76", 1)}}, + {Item("foo", Item::kTokenType), {Param("a77", 1)}}, + {Item("foo", Item::kTokenType), {Param("a78", 1)}}, + {Item("foo", Item::kTokenType), {Param("a79", 1)}}, + {Item("foo", Item::kTokenType), {Param("a80", 1)}}, + {Item("foo", Item::kTokenType), {Param("a81", 1)}}, + {Item("foo", Item::kTokenType), {Param("a82", 1)}}, + {Item("foo", Item::kTokenType), {Param("a83", 1)}}, + {Item("foo", Item::kTokenType), {Param("a84", 1)}}, + {Item("foo", Item::kTokenType), {Param("a85", 1)}}, + {Item("foo", Item::kTokenType), {Param("a86", 1)}}, + {Item("foo", Item::kTokenType), {Param("a87", 1)}}, + {Item("foo", Item::kTokenType), {Param("a88", 1)}}, + {Item("foo", Item::kTokenType), {Param("a89", 1)}}, + {Item("foo", Item::kTokenType), {Param("a90", 1)}}, + {Item("foo", Item::kTokenType), {Param("a91", 1)}}, + {Item("foo", Item::kTokenType), {Param("a92", 1)}}, + {Item("foo", Item::kTokenType), {Param("a93", 1)}}, + {Item("foo", Item::kTokenType), {Param("a94", 1)}}, + {Item("foo", Item::kTokenType), {Param("a95", 1)}}, + {Item("foo", Item::kTokenType), {Param("a96", 1)}}, + {Item("foo", Item::kTokenType), {Param("a97", 1)}}, + {Item("foo", Item::kTokenType), {Param("a98", 1)}}, + {Item("foo", Item::kTokenType), {Param("a99", 1)}}, + {Item("foo", Item::kTokenType), {Param("a100", 1)}}, + {Item("foo", Item::kTokenType), {Param("a101", 1)}}, + {Item("foo", Item::kTokenType), {Param("a102", 1)}}, + {Item("foo", Item::kTokenType), {Param("a103", 1)}}, + {Item("foo", Item::kTokenType), {Param("a104", 1)}}, + {Item("foo", Item::kTokenType), {Param("a105", 1)}}, + {Item("foo", Item::kTokenType), {Param("a106", 1)}}, + {Item("foo", Item::kTokenType), {Param("a107", 1)}}, + {Item("foo", Item::kTokenType), {Param("a108", 1)}}, + {Item("foo", Item::kTokenType), {Param("a109", 1)}}, + {Item("foo", Item::kTokenType), {Param("a110", 1)}}, + {Item("foo", Item::kTokenType), {Param("a111", 1)}}, + {Item("foo", Item::kTokenType), {Param("a112", 1)}}, + {Item("foo", Item::kTokenType), {Param("a113", 1)}}, + {Item("foo", Item::kTokenType), {Param("a114", 1)}}, + {Item("foo", Item::kTokenType), {Param("a115", 1)}}, + {Item("foo", Item::kTokenType), {Param("a116", 1)}}, + {Item("foo", Item::kTokenType), {Param("a117", 1)}}, + {Item("foo", Item::kTokenType), {Param("a118", 1)}}, + {Item("foo", Item::kTokenType), {Param("a119", 1)}}, + {Item("foo", Item::kTokenType), {Param("a120", 1)}}, + {Item("foo", Item::kTokenType), {Param("a121", 1)}}, + {Item("foo", Item::kTokenType), {Param("a122", 1)}}, + {Item("foo", Item::kTokenType), {Param("a123", 1)}}, + {Item("foo", Item::kTokenType), {Param("a124", 1)}}, + {Item("foo", Item::kTokenType), {Param("a125", 1)}}, + {Item("foo", Item::kTokenType), {Param("a126", 1)}}, + {Item("foo", Item::kTokenType), {Param("a127", 1)}}, + {Item("foo", Item::kTokenType), {Param("a128", 1)}}, + {Item("foo", Item::kTokenType), {Param("a129", 1)}}, + {Item("foo", Item::kTokenType), {Param("a130", 1)}}, + {Item("foo", Item::kTokenType), {Param("a131", 1)}}, + {Item("foo", Item::kTokenType), {Param("a132", 1)}}, + {Item("foo", Item::kTokenType), {Param("a133", 1)}}, + {Item("foo", Item::kTokenType), {Param("a134", 1)}}, + {Item("foo", Item::kTokenType), {Param("a135", 1)}}, + {Item("foo", Item::kTokenType), {Param("a136", 1)}}, + {Item("foo", Item::kTokenType), {Param("a137", 1)}}, + {Item("foo", Item::kTokenType), {Param("a138", 1)}}, + {Item("foo", Item::kTokenType), {Param("a139", 1)}}, + {Item("foo", Item::kTokenType), {Param("a140", 1)}}, + {Item("foo", Item::kTokenType), {Param("a141", 1)}}, + {Item("foo", Item::kTokenType), {Param("a142", 1)}}, + {Item("foo", Item::kTokenType), {Param("a143", 1)}}, + {Item("foo", Item::kTokenType), {Param("a144", 1)}}, + {Item("foo", Item::kTokenType), {Param("a145", 1)}}, + {Item("foo", Item::kTokenType), {Param("a146", 1)}}, + {Item("foo", Item::kTokenType), {Param("a147", 1)}}, + {Item("foo", Item::kTokenType), {Param("a148", 1)}}, + {Item("foo", Item::kTokenType), {Param("a149", 1)}}, + {Item("foo", Item::kTokenType), {Param("a150", 1)}}, + {Item("foo", Item::kTokenType), {Param("a151", 1)}}, + {Item("foo", Item::kTokenType), {Param("a152", 1)}}, + {Item("foo", Item::kTokenType), {Param("a153", 1)}}, + {Item("foo", Item::kTokenType), {Param("a154", 1)}}, + {Item("foo", Item::kTokenType), {Param("a155", 1)}}, + {Item("foo", Item::kTokenType), {Param("a156", 1)}}, + {Item("foo", Item::kTokenType), {Param("a157", 1)}}, + {Item("foo", Item::kTokenType), {Param("a158", 1)}}, + {Item("foo", Item::kTokenType), {Param("a159", 1)}}, + {Item("foo", Item::kTokenType), {Param("a160", 1)}}, + {Item("foo", Item::kTokenType), {Param("a161", 1)}}, + {Item("foo", Item::kTokenType), {Param("a162", 1)}}, + {Item("foo", Item::kTokenType), {Param("a163", 1)}}, + {Item("foo", Item::kTokenType), {Param("a164", 1)}}, + {Item("foo", Item::kTokenType), {Param("a165", 1)}}, + {Item("foo", Item::kTokenType), {Param("a166", 1)}}, + {Item("foo", Item::kTokenType), {Param("a167", 1)}}, + {Item("foo", Item::kTokenType), {Param("a168", 1)}}, + {Item("foo", Item::kTokenType), {Param("a169", 1)}}, + {Item("foo", Item::kTokenType), {Param("a170", 1)}}, + {Item("foo", Item::kTokenType), {Param("a171", 1)}}, + {Item("foo", Item::kTokenType), {Param("a172", 1)}}, + {Item("foo", Item::kTokenType), {Param("a173", 1)}}, + {Item("foo", Item::kTokenType), {Param("a174", 1)}}, + {Item("foo", Item::kTokenType), {Param("a175", 1)}}, + {Item("foo", Item::kTokenType), {Param("a176", 1)}}, + {Item("foo", Item::kTokenType), {Param("a177", 1)}}, + {Item("foo", Item::kTokenType), {Param("a178", 1)}}, + {Item("foo", Item::kTokenType), {Param("a179", 1)}}, + {Item("foo", Item::kTokenType), {Param("a180", 1)}}, + {Item("foo", Item::kTokenType), {Param("a181", 1)}}, + {Item("foo", Item::kTokenType), {Param("a182", 1)}}, + {Item("foo", Item::kTokenType), {Param("a183", 1)}}, + {Item("foo", Item::kTokenType), {Param("a184", 1)}}, + {Item("foo", Item::kTokenType), {Param("a185", 1)}}, + {Item("foo", Item::kTokenType), {Param("a186", 1)}}, + {Item("foo", Item::kTokenType), {Param("a187", 1)}}, + {Item("foo", Item::kTokenType), {Param("a188", 1)}}, + {Item("foo", Item::kTokenType), {Param("a189", 1)}}, + {Item("foo", Item::kTokenType), {Param("a190", 1)}}, + {Item("foo", Item::kTokenType), {Param("a191", 1)}}, + {Item("foo", Item::kTokenType), {Param("a192", 1)}}, + {Item("foo", Item::kTokenType), {Param("a193", 1)}}, + {Item("foo", Item::kTokenType), {Param("a194", 1)}}, + {Item("foo", Item::kTokenType), {Param("a195", 1)}}, + {Item("foo", Item::kTokenType), {Param("a196", 1)}}, + {Item("foo", Item::kTokenType), {Param("a197", 1)}}, + {Item("foo", Item::kTokenType), {Param("a198", 1)}}, + {Item("foo", Item::kTokenType), {Param("a199", 1)}}, + {Item("foo", Item::kTokenType), {Param("a200", 1)}}, + {Item("foo", Item::kTokenType), {Param("a201", 1)}}, + {Item("foo", Item::kTokenType), {Param("a202", 1)}}, + {Item("foo", Item::kTokenType), {Param("a203", 1)}}, + {Item("foo", Item::kTokenType), {Param("a204", 1)}}, + {Item("foo", Item::kTokenType), {Param("a205", 1)}}, + {Item("foo", Item::kTokenType), {Param("a206", 1)}}, + {Item("foo", Item::kTokenType), {Param("a207", 1)}}, + {Item("foo", Item::kTokenType), {Param("a208", 1)}}, + {Item("foo", Item::kTokenType), {Param("a209", 1)}}, + {Item("foo", Item::kTokenType), {Param("a210", 1)}}, + {Item("foo", Item::kTokenType), {Param("a211", 1)}}, + {Item("foo", Item::kTokenType), {Param("a212", 1)}}, + {Item("foo", Item::kTokenType), {Param("a213", 1)}}, + {Item("foo", Item::kTokenType), {Param("a214", 1)}}, + {Item("foo", Item::kTokenType), {Param("a215", 1)}}, + {Item("foo", Item::kTokenType), {Param("a216", 1)}}, + {Item("foo", Item::kTokenType), {Param("a217", 1)}}, + {Item("foo", Item::kTokenType), {Param("a218", 1)}}, + {Item("foo", Item::kTokenType), {Param("a219", 1)}}, + {Item("foo", Item::kTokenType), {Param("a220", 1)}}, + {Item("foo", Item::kTokenType), {Param("a221", 1)}}, + {Item("foo", Item::kTokenType), {Param("a222", 1)}}, + {Item("foo", Item::kTokenType), {Param("a223", 1)}}, + {Item("foo", Item::kTokenType), {Param("a224", 1)}}, + {Item("foo", Item::kTokenType), {Param("a225", 1)}}, + {Item("foo", Item::kTokenType), {Param("a226", 1)}}, + {Item("foo", Item::kTokenType), {Param("a227", 1)}}, + {Item("foo", Item::kTokenType), {Param("a228", 1)}}, + {Item("foo", Item::kTokenType), {Param("a229", 1)}}, + {Item("foo", Item::kTokenType), {Param("a230", 1)}}, + {Item("foo", Item::kTokenType), {Param("a231", 1)}}, + {Item("foo", Item::kTokenType), {Param("a232", 1)}}, + {Item("foo", Item::kTokenType), {Param("a233", 1)}}, + {Item("foo", Item::kTokenType), {Param("a234", 1)}}, + {Item("foo", Item::kTokenType), {Param("a235", 1)}}, + {Item("foo", Item::kTokenType), {Param("a236", 1)}}, + {Item("foo", Item::kTokenType), {Param("a237", 1)}}, + {Item("foo", Item::kTokenType), {Param("a238", 1)}}, + {Item("foo", Item::kTokenType), {Param("a239", 1)}}, + {Item("foo", Item::kTokenType), {Param("a240", 1)}}, + {Item("foo", Item::kTokenType), {Param("a241", 1)}}, + {Item("foo", Item::kTokenType), {Param("a242", 1)}}, + {Item("foo", Item::kTokenType), {Param("a243", 1)}}, + {Item("foo", Item::kTokenType), {Param("a244", 1)}}, + {Item("foo", Item::kTokenType), {Param("a245", 1)}}, + {Item("foo", Item::kTokenType), {Param("a246", 1)}}, + {Item("foo", Item::kTokenType), {Param("a247", 1)}}, + {Item("foo", Item::kTokenType), {Param("a248", 1)}}, + {Item("foo", Item::kTokenType), {Param("a249", 1)}}, + {Item("foo", Item::kTokenType), {Param("a250", 1)}}, + {Item("foo", Item::kTokenType), {Param("a251", 1)}}, + {Item("foo", Item::kTokenType), {Param("a252", 1)}}, + {Item("foo", Item::kTokenType), {Param("a253", 1)}}, + {Item("foo", Item::kTokenType), {Param("a254", 1)}}, + {Item("foo", Item::kTokenType), {Param("a255", 1)}}, + {Item("foo", Item::kTokenType), {Param("a256", 1)}}, + {Item("foo", Item::kTokenType), {Param("a257", 1)}}, + {Item("foo", Item::kTokenType), {Param("a258", 1)}}, + {Item("foo", Item::kTokenType), {Param("a259", 1)}}, + {Item("foo", Item::kTokenType), {Param("a260", 1)}}, + {Item("foo", Item::kTokenType), {Param("a261", 1)}}, + {Item("foo", Item::kTokenType), {Param("a262", 1)}}, + {Item("foo", Item::kTokenType), {Param("a263", 1)}}, + {Item("foo", Item::kTokenType), {Param("a264", 1)}}, + {Item("foo", Item::kTokenType), {Param("a265", 1)}}, + {Item("foo", Item::kTokenType), {Param("a266", 1)}}, + {Item("foo", Item::kTokenType), {Param("a267", 1)}}, + {Item("foo", Item::kTokenType), {Param("a268", 1)}}, + {Item("foo", Item::kTokenType), {Param("a269", 1)}}, + {Item("foo", Item::kTokenType), {Param("a270", 1)}}, + {Item("foo", Item::kTokenType), {Param("a271", 1)}}, + {Item("foo", Item::kTokenType), {Param("a272", 1)}}, + {Item("foo", Item::kTokenType), {Param("a273", 1)}}, + {Item("foo", Item::kTokenType), {Param("a274", 1)}}, + {Item("foo", Item::kTokenType), {Param("a275", 1)}}, + {Item("foo", Item::kTokenType), {Param("a276", 1)}}, + {Item("foo", Item::kTokenType), {Param("a277", 1)}}, + {Item("foo", Item::kTokenType), {Param("a278", 1)}}, + {Item("foo", Item::kTokenType), {Param("a279", 1)}}, + {Item("foo", Item::kTokenType), {Param("a280", 1)}}, + {Item("foo", Item::kTokenType), {Param("a281", 1)}}, + {Item("foo", Item::kTokenType), {Param("a282", 1)}}, + {Item("foo", Item::kTokenType), {Param("a283", 1)}}, + {Item("foo", Item::kTokenType), {Param("a284", 1)}}, + {Item("foo", Item::kTokenType), {Param("a285", 1)}}, + {Item("foo", Item::kTokenType), {Param("a286", 1)}}, + {Item("foo", Item::kTokenType), {Param("a287", 1)}}, + {Item("foo", Item::kTokenType), {Param("a288", 1)}}, + {Item("foo", Item::kTokenType), {Param("a289", 1)}}, + {Item("foo", Item::kTokenType), {Param("a290", 1)}}, + {Item("foo", Item::kTokenType), {Param("a291", 1)}}, + {Item("foo", Item::kTokenType), {Param("a292", 1)}}, + {Item("foo", Item::kTokenType), {Param("a293", 1)}}, + {Item("foo", Item::kTokenType), {Param("a294", 1)}}, + {Item("foo", Item::kTokenType), {Param("a295", 1)}}, + {Item("foo", Item::kTokenType), {Param("a296", 1)}}, + {Item("foo", Item::kTokenType), {Param("a297", 1)}}, + {Item("foo", Item::kTokenType), {Param("a298", 1)}}, + {Item("foo", Item::kTokenType), {Param("a299", 1)}}, + {Item("foo", Item::kTokenType), {Param("a300", 1)}}, + {Item("foo", Item::kTokenType), {Param("a301", 1)}}, + {Item("foo", Item::kTokenType), {Param("a302", 1)}}, + {Item("foo", Item::kTokenType), {Param("a303", 1)}}, + {Item("foo", Item::kTokenType), {Param("a304", 1)}}, + {Item("foo", Item::kTokenType), {Param("a305", 1)}}, + {Item("foo", Item::kTokenType), {Param("a306", 1)}}, + {Item("foo", Item::kTokenType), {Param("a307", 1)}}, + {Item("foo", Item::kTokenType), {Param("a308", 1)}}, + {Item("foo", Item::kTokenType), {Param("a309", 1)}}, + {Item("foo", Item::kTokenType), {Param("a310", 1)}}, + {Item("foo", Item::kTokenType), {Param("a311", 1)}}, + {Item("foo", Item::kTokenType), {Param("a312", 1)}}, + {Item("foo", Item::kTokenType), {Param("a313", 1)}}, + {Item("foo", Item::kTokenType), {Param("a314", 1)}}, + {Item("foo", Item::kTokenType), {Param("a315", 1)}}, + {Item("foo", Item::kTokenType), {Param("a316", 1)}}, + {Item("foo", Item::kTokenType), {Param("a317", 1)}}, + {Item("foo", Item::kTokenType), {Param("a318", 1)}}, + {Item("foo", Item::kTokenType), {Param("a319", 1)}}, + {Item("foo", Item::kTokenType), {Param("a320", 1)}}, + {Item("foo", Item::kTokenType), {Param("a321", 1)}}, + {Item("foo", Item::kTokenType), {Param("a322", 1)}}, + {Item("foo", Item::kTokenType), {Param("a323", 1)}}, + {Item("foo", Item::kTokenType), {Param("a324", 1)}}, + {Item("foo", Item::kTokenType), {Param("a325", 1)}}, + {Item("foo", Item::kTokenType), {Param("a326", 1)}}, + {Item("foo", Item::kTokenType), {Param("a327", 1)}}, + {Item("foo", Item::kTokenType), {Param("a328", 1)}}, + {Item("foo", Item::kTokenType), {Param("a329", 1)}}, + {Item("foo", Item::kTokenType), {Param("a330", 1)}}, + {Item("foo", Item::kTokenType), {Param("a331", 1)}}, + {Item("foo", Item::kTokenType), {Param("a332", 1)}}, + {Item("foo", Item::kTokenType), {Param("a333", 1)}}, + {Item("foo", Item::kTokenType), {Param("a334", 1)}}, + {Item("foo", Item::kTokenType), {Param("a335", 1)}}, + {Item("foo", Item::kTokenType), {Param("a336", 1)}}, + {Item("foo", Item::kTokenType), {Param("a337", 1)}}, + {Item("foo", Item::kTokenType), {Param("a338", 1)}}, + {Item("foo", Item::kTokenType), {Param("a339", 1)}}, + {Item("foo", Item::kTokenType), {Param("a340", 1)}}, + {Item("foo", Item::kTokenType), {Param("a341", 1)}}, + {Item("foo", Item::kTokenType), {Param("a342", 1)}}, + {Item("foo", Item::kTokenType), {Param("a343", 1)}}, + {Item("foo", Item::kTokenType), {Param("a344", 1)}}, + {Item("foo", Item::kTokenType), {Param("a345", 1)}}, + {Item("foo", Item::kTokenType), {Param("a346", 1)}}, + {Item("foo", Item::kTokenType), {Param("a347", 1)}}, + {Item("foo", Item::kTokenType), {Param("a348", 1)}}, + {Item("foo", Item::kTokenType), {Param("a349", 1)}}, + {Item("foo", Item::kTokenType), {Param("a350", 1)}}, + {Item("foo", Item::kTokenType), {Param("a351", 1)}}, + {Item("foo", Item::kTokenType), {Param("a352", 1)}}, + {Item("foo", Item::kTokenType), {Param("a353", 1)}}, + {Item("foo", Item::kTokenType), {Param("a354", 1)}}, + {Item("foo", Item::kTokenType), {Param("a355", 1)}}, + {Item("foo", Item::kTokenType), {Param("a356", 1)}}, + {Item("foo", Item::kTokenType), {Param("a357", 1)}}, + {Item("foo", Item::kTokenType), {Param("a358", 1)}}, + {Item("foo", Item::kTokenType), {Param("a359", 1)}}, + {Item("foo", Item::kTokenType), {Param("a360", 1)}}, + {Item("foo", Item::kTokenType), {Param("a361", 1)}}, + {Item("foo", Item::kTokenType), {Param("a362", 1)}}, + {Item("foo", Item::kTokenType), {Param("a363", 1)}}, + {Item("foo", Item::kTokenType), {Param("a364", 1)}}, + {Item("foo", Item::kTokenType), {Param("a365", 1)}}, + {Item("foo", Item::kTokenType), {Param("a366", 1)}}, + {Item("foo", Item::kTokenType), {Param("a367", 1)}}, + {Item("foo", Item::kTokenType), {Param("a368", 1)}}, + {Item("foo", Item::kTokenType), {Param("a369", 1)}}, + {Item("foo", Item::kTokenType), {Param("a370", 1)}}, + {Item("foo", Item::kTokenType), {Param("a371", 1)}}, + {Item("foo", Item::kTokenType), {Param("a372", 1)}}, + {Item("foo", Item::kTokenType), {Param("a373", 1)}}, + {Item("foo", Item::kTokenType), {Param("a374", 1)}}, + {Item("foo", Item::kTokenType), {Param("a375", 1)}}, + {Item("foo", Item::kTokenType), {Param("a376", 1)}}, + {Item("foo", Item::kTokenType), {Param("a377", 1)}}, + {Item("foo", Item::kTokenType), {Param("a378", 1)}}, + {Item("foo", Item::kTokenType), {Param("a379", 1)}}, + {Item("foo", Item::kTokenType), {Param("a380", 1)}}, + {Item("foo", Item::kTokenType), {Param("a381", 1)}}, + {Item("foo", Item::kTokenType), {Param("a382", 1)}}, + {Item("foo", Item::kTokenType), {Param("a383", 1)}}, + {Item("foo", Item::kTokenType), {Param("a384", 1)}}, + {Item("foo", Item::kTokenType), {Param("a385", 1)}}, + {Item("foo", Item::kTokenType), {Param("a386", 1)}}, + {Item("foo", Item::kTokenType), {Param("a387", 1)}}, + {Item("foo", Item::kTokenType), {Param("a388", 1)}}, + {Item("foo", Item::kTokenType), {Param("a389", 1)}}, + {Item("foo", Item::kTokenType), {Param("a390", 1)}}, + {Item("foo", Item::kTokenType), {Param("a391", 1)}}, + {Item("foo", Item::kTokenType), {Param("a392", 1)}}, + {Item("foo", Item::kTokenType), {Param("a393", 1)}}, + {Item("foo", Item::kTokenType), {Param("a394", 1)}}, + {Item("foo", Item::kTokenType), {Param("a395", 1)}}, + {Item("foo", Item::kTokenType), {Param("a396", 1)}}, + {Item("foo", Item::kTokenType), {Param("a397", 1)}}, + {Item("foo", Item::kTokenType), {Param("a398", 1)}}, + {Item("foo", Item::kTokenType), {Param("a399", 1)}}, + {Item("foo", Item::kTokenType), {Param("a400", 1)}}, + {Item("foo", Item::kTokenType), {Param("a401", 1)}}, + {Item("foo", Item::kTokenType), {Param("a402", 1)}}, + {Item("foo", Item::kTokenType), {Param("a403", 1)}}, + {Item("foo", Item::kTokenType), {Param("a404", 1)}}, + {Item("foo", Item::kTokenType), {Param("a405", 1)}}, + {Item("foo", Item::kTokenType), {Param("a406", 1)}}, + {Item("foo", Item::kTokenType), {Param("a407", 1)}}, + {Item("foo", Item::kTokenType), {Param("a408", 1)}}, + {Item("foo", Item::kTokenType), {Param("a409", 1)}}, + {Item("foo", Item::kTokenType), {Param("a410", 1)}}, + {Item("foo", Item::kTokenType), {Param("a411", 1)}}, + {Item("foo", Item::kTokenType), {Param("a412", 1)}}, + {Item("foo", Item::kTokenType), {Param("a413", 1)}}, + {Item("foo", Item::kTokenType), {Param("a414", 1)}}, + {Item("foo", Item::kTokenType), {Param("a415", 1)}}, + {Item("foo", Item::kTokenType), {Param("a416", 1)}}, + {Item("foo", Item::kTokenType), {Param("a417", 1)}}, + {Item("foo", Item::kTokenType), {Param("a418", 1)}}, + {Item("foo", Item::kTokenType), {Param("a419", 1)}}, + {Item("foo", Item::kTokenType), {Param("a420", 1)}}, + {Item("foo", Item::kTokenType), {Param("a421", 1)}}, + {Item("foo", Item::kTokenType), {Param("a422", 1)}}, + {Item("foo", Item::kTokenType), {Param("a423", 1)}}, + {Item("foo", Item::kTokenType), {Param("a424", 1)}}, + {Item("foo", Item::kTokenType), {Param("a425", 1)}}, + {Item("foo", Item::kTokenType), {Param("a426", 1)}}, + {Item("foo", Item::kTokenType), {Param("a427", 1)}}, + {Item("foo", Item::kTokenType), {Param("a428", 1)}}, + {Item("foo", Item::kTokenType), {Param("a429", 1)}}, + {Item("foo", Item::kTokenType), {Param("a430", 1)}}, + {Item("foo", Item::kTokenType), {Param("a431", 1)}}, + {Item("foo", Item::kTokenType), {Param("a432", 1)}}, + {Item("foo", Item::kTokenType), {Param("a433", 1)}}, + {Item("foo", Item::kTokenType), {Param("a434", 1)}}, + {Item("foo", Item::kTokenType), {Param("a435", 1)}}, + {Item("foo", Item::kTokenType), {Param("a436", 1)}}, + {Item("foo", Item::kTokenType), {Param("a437", 1)}}, + {Item("foo", Item::kTokenType), {Param("a438", 1)}}, + {Item("foo", Item::kTokenType), {Param("a439", 1)}}, + {Item("foo", Item::kTokenType), {Param("a440", 1)}}, + {Item("foo", Item::kTokenType), {Param("a441", 1)}}, + {Item("foo", Item::kTokenType), {Param("a442", 1)}}, + {Item("foo", Item::kTokenType), {Param("a443", 1)}}, + {Item("foo", Item::kTokenType), {Param("a444", 1)}}, + {Item("foo", Item::kTokenType), {Param("a445", 1)}}, + {Item("foo", Item::kTokenType), {Param("a446", 1)}}, + {Item("foo", Item::kTokenType), {Param("a447", 1)}}, + {Item("foo", Item::kTokenType), {Param("a448", 1)}}, + {Item("foo", Item::kTokenType), {Param("a449", 1)}}, + {Item("foo", Item::kTokenType), {Param("a450", 1)}}, + {Item("foo", Item::kTokenType), {Param("a451", 1)}}, + {Item("foo", Item::kTokenType), {Param("a452", 1)}}, + {Item("foo", Item::kTokenType), {Param("a453", 1)}}, + {Item("foo", Item::kTokenType), {Param("a454", 1)}}, + {Item("foo", Item::kTokenType), {Param("a455", 1)}}, + {Item("foo", Item::kTokenType), {Param("a456", 1)}}, + {Item("foo", Item::kTokenType), {Param("a457", 1)}}, + {Item("foo", Item::kTokenType), {Param("a458", 1)}}, + {Item("foo", Item::kTokenType), {Param("a459", 1)}}, + {Item("foo", Item::kTokenType), {Param("a460", 1)}}, + {Item("foo", Item::kTokenType), {Param("a461", 1)}}, + {Item("foo", Item::kTokenType), {Param("a462", 1)}}, + {Item("foo", Item::kTokenType), {Param("a463", 1)}}, + {Item("foo", Item::kTokenType), {Param("a464", 1)}}, + {Item("foo", Item::kTokenType), {Param("a465", 1)}}, + {Item("foo", Item::kTokenType), {Param("a466", 1)}}, + {Item("foo", Item::kTokenType), {Param("a467", 1)}}, + {Item("foo", Item::kTokenType), {Param("a468", 1)}}, + {Item("foo", Item::kTokenType), {Param("a469", 1)}}, + {Item("foo", Item::kTokenType), {Param("a470", 1)}}, + {Item("foo", Item::kTokenType), {Param("a471", 1)}}, + {Item("foo", Item::kTokenType), {Param("a472", 1)}}, + {Item("foo", Item::kTokenType), {Param("a473", 1)}}, + {Item("foo", Item::kTokenType), {Param("a474", 1)}}, + {Item("foo", Item::kTokenType), {Param("a475", 1)}}, + {Item("foo", Item::kTokenType), {Param("a476", 1)}}, + {Item("foo", Item::kTokenType), {Param("a477", 1)}}, + {Item("foo", Item::kTokenType), {Param("a478", 1)}}, + {Item("foo", Item::kTokenType), {Param("a479", 1)}}, + {Item("foo", Item::kTokenType), {Param("a480", 1)}}, + {Item("foo", Item::kTokenType), {Param("a481", 1)}}, + {Item("foo", Item::kTokenType), {Param("a482", 1)}}, + {Item("foo", Item::kTokenType), {Param("a483", 1)}}, + {Item("foo", Item::kTokenType), {Param("a484", 1)}}, + {Item("foo", Item::kTokenType), {Param("a485", 1)}}, + {Item("foo", Item::kTokenType), {Param("a486", 1)}}, + {Item("foo", Item::kTokenType), {Param("a487", 1)}}, + {Item("foo", Item::kTokenType), {Param("a488", 1)}}, + {Item("foo", Item::kTokenType), {Param("a489", 1)}}, + {Item("foo", Item::kTokenType), {Param("a490", 1)}}, + {Item("foo", Item::kTokenType), {Param("a491", 1)}}, + {Item("foo", Item::kTokenType), {Param("a492", 1)}}, + {Item("foo", Item::kTokenType), {Param("a493", 1)}}, + {Item("foo", Item::kTokenType), {Param("a494", 1)}}, + {Item("foo", Item::kTokenType), {Param("a495", 1)}}, + {Item("foo", Item::kTokenType), {Param("a496", 1)}}, + {Item("foo", Item::kTokenType), {Param("a497", 1)}}, + {Item("foo", Item::kTokenType), {Param("a498", 1)}}, + {Item("foo", Item::kTokenType), {Param("a499", 1)}}, + {Item("foo", Item::kTokenType), {Param("a500", 1)}}, + {Item("foo", Item::kTokenType), {Param("a501", 1)}}, + {Item("foo", Item::kTokenType), {Param("a502", 1)}}, + {Item("foo", Item::kTokenType), {Param("a503", 1)}}, + {Item("foo", Item::kTokenType), {Param("a504", 1)}}, + {Item("foo", Item::kTokenType), {Param("a505", 1)}}, + {Item("foo", Item::kTokenType), {Param("a506", 1)}}, + {Item("foo", Item::kTokenType), {Param("a507", 1)}}, + {Item("foo", Item::kTokenType), {Param("a508", 1)}}, + {Item("foo", Item::kTokenType), {Param("a509", 1)}}, + {Item("foo", Item::kTokenType), {Param("a510", 1)}}, + {Item("foo", Item::kTokenType), {Param("a511", 1)}}, + {Item("foo", Item::kTokenType), {Param("a512", 1)}}, + {Item("foo", Item::kTokenType), {Param("a513", 1)}}, + {Item("foo", Item::kTokenType), {Param("a514", 1)}}, + {Item("foo", Item::kTokenType), {Param("a515", 1)}}, + {Item("foo", Item::kTokenType), {Param("a516", 1)}}, + {Item("foo", Item::kTokenType), {Param("a517", 1)}}, + {Item("foo", Item::kTokenType), {Param("a518", 1)}}, + {Item("foo", Item::kTokenType), {Param("a519", 1)}}, + {Item("foo", Item::kTokenType), {Param("a520", 1)}}, + {Item("foo", Item::kTokenType), {Param("a521", 1)}}, + {Item("foo", Item::kTokenType), {Param("a522", 1)}}, + {Item("foo", Item::kTokenType), {Param("a523", 1)}}, + {Item("foo", Item::kTokenType), {Param("a524", 1)}}, + {Item("foo", Item::kTokenType), {Param("a525", 1)}}, + {Item("foo", Item::kTokenType), {Param("a526", 1)}}, + {Item("foo", Item::kTokenType), {Param("a527", 1)}}, + {Item("foo", Item::kTokenType), {Param("a528", 1)}}, + {Item("foo", Item::kTokenType), {Param("a529", 1)}}, + {Item("foo", Item::kTokenType), {Param("a530", 1)}}, + {Item("foo", Item::kTokenType), {Param("a531", 1)}}, + {Item("foo", Item::kTokenType), {Param("a532", 1)}}, + {Item("foo", Item::kTokenType), {Param("a533", 1)}}, + {Item("foo", Item::kTokenType), {Param("a534", 1)}}, + {Item("foo", Item::kTokenType), {Param("a535", 1)}}, + {Item("foo", Item::kTokenType), {Param("a536", 1)}}, + {Item("foo", Item::kTokenType), {Param("a537", 1)}}, + {Item("foo", Item::kTokenType), {Param("a538", 1)}}, + {Item("foo", Item::kTokenType), {Param("a539", 1)}}, + {Item("foo", Item::kTokenType), {Param("a540", 1)}}, + {Item("foo", Item::kTokenType), {Param("a541", 1)}}, + {Item("foo", Item::kTokenType), {Param("a542", 1)}}, + {Item("foo", Item::kTokenType), {Param("a543", 1)}}, + {Item("foo", Item::kTokenType), {Param("a544", 1)}}, + {Item("foo", Item::kTokenType), {Param("a545", 1)}}, + {Item("foo", Item::kTokenType), {Param("a546", 1)}}, + {Item("foo", Item::kTokenType), {Param("a547", 1)}}, + {Item("foo", Item::kTokenType), {Param("a548", 1)}}, + {Item("foo", Item::kTokenType), {Param("a549", 1)}}, + {Item("foo", Item::kTokenType), {Param("a550", 1)}}, + {Item("foo", Item::kTokenType), {Param("a551", 1)}}, + {Item("foo", Item::kTokenType), {Param("a552", 1)}}, + {Item("foo", Item::kTokenType), {Param("a553", 1)}}, + {Item("foo", Item::kTokenType), {Param("a554", 1)}}, + {Item("foo", Item::kTokenType), {Param("a555", 1)}}, + {Item("foo", Item::kTokenType), {Param("a556", 1)}}, + {Item("foo", Item::kTokenType), {Param("a557", 1)}}, + {Item("foo", Item::kTokenType), {Param("a558", 1)}}, + {Item("foo", Item::kTokenType), {Param("a559", 1)}}, + {Item("foo", Item::kTokenType), {Param("a560", 1)}}, + {Item("foo", Item::kTokenType), {Param("a561", 1)}}, + {Item("foo", Item::kTokenType), {Param("a562", 1)}}, + {Item("foo", Item::kTokenType), {Param("a563", 1)}}, + {Item("foo", Item::kTokenType), {Param("a564", 1)}}, + {Item("foo", Item::kTokenType), {Param("a565", 1)}}, + {Item("foo", Item::kTokenType), {Param("a566", 1)}}, + {Item("foo", Item::kTokenType), {Param("a567", 1)}}, + {Item("foo", Item::kTokenType), {Param("a568", 1)}}, + {Item("foo", Item::kTokenType), {Param("a569", 1)}}, + {Item("foo", Item::kTokenType), {Param("a570", 1)}}, + {Item("foo", Item::kTokenType), {Param("a571", 1)}}, + {Item("foo", Item::kTokenType), {Param("a572", 1)}}, + {Item("foo", Item::kTokenType), {Param("a573", 1)}}, + {Item("foo", Item::kTokenType), {Param("a574", 1)}}, + {Item("foo", Item::kTokenType), {Param("a575", 1)}}, + {Item("foo", Item::kTokenType), {Param("a576", 1)}}, + {Item("foo", Item::kTokenType), {Param("a577", 1)}}, + {Item("foo", Item::kTokenType), {Param("a578", 1)}}, + {Item("foo", Item::kTokenType), {Param("a579", 1)}}, + {Item("foo", Item::kTokenType), {Param("a580", 1)}}, + {Item("foo", Item::kTokenType), {Param("a581", 1)}}, + {Item("foo", Item::kTokenType), {Param("a582", 1)}}, + {Item("foo", Item::kTokenType), {Param("a583", 1)}}, + {Item("foo", Item::kTokenType), {Param("a584", 1)}}, + {Item("foo", Item::kTokenType), {Param("a585", 1)}}, + {Item("foo", Item::kTokenType), {Param("a586", 1)}}, + {Item("foo", Item::kTokenType), {Param("a587", 1)}}, + {Item("foo", Item::kTokenType), {Param("a588", 1)}}, + {Item("foo", Item::kTokenType), {Param("a589", 1)}}, + {Item("foo", Item::kTokenType), {Param("a590", 1)}}, + {Item("foo", Item::kTokenType), {Param("a591", 1)}}, + {Item("foo", Item::kTokenType), {Param("a592", 1)}}, + {Item("foo", Item::kTokenType), {Param("a593", 1)}}, + {Item("foo", Item::kTokenType), {Param("a594", 1)}}, + {Item("foo", Item::kTokenType), {Param("a595", 1)}}, + {Item("foo", Item::kTokenType), {Param("a596", 1)}}, + {Item("foo", Item::kTokenType), {Param("a597", 1)}}, + {Item("foo", Item::kTokenType), {Param("a598", 1)}}, + {Item("foo", Item::kTokenType), {Param("a599", 1)}}, + {Item("foo", Item::kTokenType), {Param("a600", 1)}}, + {Item("foo", Item::kTokenType), {Param("a601", 1)}}, + {Item("foo", Item::kTokenType), {Param("a602", 1)}}, + {Item("foo", Item::kTokenType), {Param("a603", 1)}}, + {Item("foo", Item::kTokenType), {Param("a604", 1)}}, + {Item("foo", Item::kTokenType), {Param("a605", 1)}}, + {Item("foo", Item::kTokenType), {Param("a606", 1)}}, + {Item("foo", Item::kTokenType), {Param("a607", 1)}}, + {Item("foo", Item::kTokenType), {Param("a608", 1)}}, + {Item("foo", Item::kTokenType), {Param("a609", 1)}}, + {Item("foo", Item::kTokenType), {Param("a610", 1)}}, + {Item("foo", Item::kTokenType), {Param("a611", 1)}}, + {Item("foo", Item::kTokenType), {Param("a612", 1)}}, + {Item("foo", Item::kTokenType), {Param("a613", 1)}}, + {Item("foo", Item::kTokenType), {Param("a614", 1)}}, + {Item("foo", Item::kTokenType), {Param("a615", 1)}}, + {Item("foo", Item::kTokenType), {Param("a616", 1)}}, + {Item("foo", Item::kTokenType), {Param("a617", 1)}}, + {Item("foo", Item::kTokenType), {Param("a618", 1)}}, + {Item("foo", Item::kTokenType), {Param("a619", 1)}}, + {Item("foo", Item::kTokenType), {Param("a620", 1)}}, + {Item("foo", Item::kTokenType), {Param("a621", 1)}}, + {Item("foo", Item::kTokenType), {Param("a622", 1)}}, + {Item("foo", Item::kTokenType), {Param("a623", 1)}}, + {Item("foo", Item::kTokenType), {Param("a624", 1)}}, + {Item("foo", Item::kTokenType), {Param("a625", 1)}}, + {Item("foo", Item::kTokenType), {Param("a626", 1)}}, + {Item("foo", Item::kTokenType), {Param("a627", 1)}}, + {Item("foo", Item::kTokenType), {Param("a628", 1)}}, + {Item("foo", Item::kTokenType), {Param("a629", 1)}}, + {Item("foo", Item::kTokenType), {Param("a630", 1)}}, + {Item("foo", Item::kTokenType), {Param("a631", 1)}}, + {Item("foo", Item::kTokenType), {Param("a632", 1)}}, + {Item("foo", Item::kTokenType), {Param("a633", 1)}}, + {Item("foo", Item::kTokenType), {Param("a634", 1)}}, + {Item("foo", Item::kTokenType), {Param("a635", 1)}}, + {Item("foo", Item::kTokenType), {Param("a636", 1)}}, + {Item("foo", Item::kTokenType), {Param("a637", 1)}}, + {Item("foo", Item::kTokenType), {Param("a638", 1)}}, + {Item("foo", Item::kTokenType), {Param("a639", 1)}}, + {Item("foo", Item::kTokenType), {Param("a640", 1)}}, + {Item("foo", Item::kTokenType), {Param("a641", 1)}}, + {Item("foo", Item::kTokenType), {Param("a642", 1)}}, + {Item("foo", Item::kTokenType), {Param("a643", 1)}}, + {Item("foo", Item::kTokenType), {Param("a644", 1)}}, + {Item("foo", Item::kTokenType), {Param("a645", 1)}}, + {Item("foo", Item::kTokenType), {Param("a646", 1)}}, + {Item("foo", Item::kTokenType), {Param("a647", 1)}}, + {Item("foo", Item::kTokenType), {Param("a648", 1)}}, + {Item("foo", Item::kTokenType), {Param("a649", 1)}}, + {Item("foo", Item::kTokenType), {Param("a650", 1)}}, + {Item("foo", Item::kTokenType), {Param("a651", 1)}}, + {Item("foo", Item::kTokenType), {Param("a652", 1)}}, + {Item("foo", Item::kTokenType), {Param("a653", 1)}}, + {Item("foo", Item::kTokenType), {Param("a654", 1)}}, + {Item("foo", Item::kTokenType), {Param("a655", 1)}}, + {Item("foo", Item::kTokenType), {Param("a656", 1)}}, + {Item("foo", Item::kTokenType), {Param("a657", 1)}}, + {Item("foo", Item::kTokenType), {Param("a658", 1)}}, + {Item("foo", Item::kTokenType), {Param("a659", 1)}}, + {Item("foo", Item::kTokenType), {Param("a660", 1)}}, + {Item("foo", Item::kTokenType), {Param("a661", 1)}}, + {Item("foo", Item::kTokenType), {Param("a662", 1)}}, + {Item("foo", Item::kTokenType), {Param("a663", 1)}}, + {Item("foo", Item::kTokenType), {Param("a664", 1)}}, + {Item("foo", Item::kTokenType), {Param("a665", 1)}}, + {Item("foo", Item::kTokenType), {Param("a666", 1)}}, + {Item("foo", Item::kTokenType), {Param("a667", 1)}}, + {Item("foo", Item::kTokenType), {Param("a668", 1)}}, + {Item("foo", Item::kTokenType), {Param("a669", 1)}}, + {Item("foo", Item::kTokenType), {Param("a670", 1)}}, + {Item("foo", Item::kTokenType), {Param("a671", 1)}}, + {Item("foo", Item::kTokenType), {Param("a672", 1)}}, + {Item("foo", Item::kTokenType), {Param("a673", 1)}}, + {Item("foo", Item::kTokenType), {Param("a674", 1)}}, + {Item("foo", Item::kTokenType), {Param("a675", 1)}}, + {Item("foo", Item::kTokenType), {Param("a676", 1)}}, + {Item("foo", Item::kTokenType), {Param("a677", 1)}}, + {Item("foo", Item::kTokenType), {Param("a678", 1)}}, + {Item("foo", Item::kTokenType), {Param("a679", 1)}}, + {Item("foo", Item::kTokenType), {Param("a680", 1)}}, + {Item("foo", Item::kTokenType), {Param("a681", 1)}}, + {Item("foo", Item::kTokenType), {Param("a682", 1)}}, + {Item("foo", Item::kTokenType), {Param("a683", 1)}}, + {Item("foo", Item::kTokenType), {Param("a684", 1)}}, + {Item("foo", Item::kTokenType), {Param("a685", 1)}}, + {Item("foo", Item::kTokenType), {Param("a686", 1)}}, + {Item("foo", Item::kTokenType), {Param("a687", 1)}}, + {Item("foo", Item::kTokenType), {Param("a688", 1)}}, + {Item("foo", Item::kTokenType), {Param("a689", 1)}}, + {Item("foo", Item::kTokenType), {Param("a690", 1)}}, + {Item("foo", Item::kTokenType), {Param("a691", 1)}}, + {Item("foo", Item::kTokenType), {Param("a692", 1)}}, + {Item("foo", Item::kTokenType), {Param("a693", 1)}}, + {Item("foo", Item::kTokenType), {Param("a694", 1)}}, + {Item("foo", Item::kTokenType), {Param("a695", 1)}}, + {Item("foo", Item::kTokenType), {Param("a696", 1)}}, + {Item("foo", Item::kTokenType), {Param("a697", 1)}}, + {Item("foo", Item::kTokenType), {Param("a698", 1)}}, + {Item("foo", Item::kTokenType), {Param("a699", 1)}}, + {Item("foo", Item::kTokenType), {Param("a700", 1)}}, + {Item("foo", Item::kTokenType), {Param("a701", 1)}}, + {Item("foo", Item::kTokenType), {Param("a702", 1)}}, + {Item("foo", Item::kTokenType), {Param("a703", 1)}}, + {Item("foo", Item::kTokenType), {Param("a704", 1)}}, + {Item("foo", Item::kTokenType), {Param("a705", 1)}}, + {Item("foo", Item::kTokenType), {Param("a706", 1)}}, + {Item("foo", Item::kTokenType), {Param("a707", 1)}}, + {Item("foo", Item::kTokenType), {Param("a708", 1)}}, + {Item("foo", Item::kTokenType), {Param("a709", 1)}}, + {Item("foo", Item::kTokenType), {Param("a710", 1)}}, + {Item("foo", Item::kTokenType), {Param("a711", 1)}}, + {Item("foo", Item::kTokenType), {Param("a712", 1)}}, + {Item("foo", Item::kTokenType), {Param("a713", 1)}}, + {Item("foo", Item::kTokenType), {Param("a714", 1)}}, + {Item("foo", Item::kTokenType), {Param("a715", 1)}}, + {Item("foo", Item::kTokenType), {Param("a716", 1)}}, + {Item("foo", Item::kTokenType), {Param("a717", 1)}}, + {Item("foo", Item::kTokenType), {Param("a718", 1)}}, + {Item("foo", Item::kTokenType), {Param("a719", 1)}}, + {Item("foo", Item::kTokenType), {Param("a720", 1)}}, + {Item("foo", Item::kTokenType), {Param("a721", 1)}}, + {Item("foo", Item::kTokenType), {Param("a722", 1)}}, + {Item("foo", Item::kTokenType), {Param("a723", 1)}}, + {Item("foo", Item::kTokenType), {Param("a724", 1)}}, + {Item("foo", Item::kTokenType), {Param("a725", 1)}}, + {Item("foo", Item::kTokenType), {Param("a726", 1)}}, + {Item("foo", Item::kTokenType), {Param("a727", 1)}}, + {Item("foo", Item::kTokenType), {Param("a728", 1)}}, + {Item("foo", Item::kTokenType), {Param("a729", 1)}}, + {Item("foo", Item::kTokenType), {Param("a730", 1)}}, + {Item("foo", Item::kTokenType), {Param("a731", 1)}}, + {Item("foo", Item::kTokenType), {Param("a732", 1)}}, + {Item("foo", Item::kTokenType), {Param("a733", 1)}}, + {Item("foo", Item::kTokenType), {Param("a734", 1)}}, + {Item("foo", Item::kTokenType), {Param("a735", 1)}}, + {Item("foo", Item::kTokenType), {Param("a736", 1)}}, + {Item("foo", Item::kTokenType), {Param("a737", 1)}}, + {Item("foo", Item::kTokenType), {Param("a738", 1)}}, + {Item("foo", Item::kTokenType), {Param("a739", 1)}}, + {Item("foo", Item::kTokenType), {Param("a740", 1)}}, + {Item("foo", Item::kTokenType), {Param("a741", 1)}}, + {Item("foo", Item::kTokenType), {Param("a742", 1)}}, + {Item("foo", Item::kTokenType), {Param("a743", 1)}}, + {Item("foo", Item::kTokenType), {Param("a744", 1)}}, + {Item("foo", Item::kTokenType), {Param("a745", 1)}}, + {Item("foo", Item::kTokenType), {Param("a746", 1)}}, + {Item("foo", Item::kTokenType), {Param("a747", 1)}}, + {Item("foo", Item::kTokenType), {Param("a748", 1)}}, + {Item("foo", Item::kTokenType), {Param("a749", 1)}}, + {Item("foo", Item::kTokenType), {Param("a750", 1)}}, + {Item("foo", Item::kTokenType), {Param("a751", 1)}}, + {Item("foo", Item::kTokenType), {Param("a752", 1)}}, + {Item("foo", Item::kTokenType), {Param("a753", 1)}}, + {Item("foo", Item::kTokenType), {Param("a754", 1)}}, + {Item("foo", Item::kTokenType), {Param("a755", 1)}}, + {Item("foo", Item::kTokenType), {Param("a756", 1)}}, + {Item("foo", Item::kTokenType), {Param("a757", 1)}}, + {Item("foo", Item::kTokenType), {Param("a758", 1)}}, + {Item("foo", Item::kTokenType), {Param("a759", 1)}}, + {Item("foo", Item::kTokenType), {Param("a760", 1)}}, + {Item("foo", Item::kTokenType), {Param("a761", 1)}}, + {Item("foo", Item::kTokenType), {Param("a762", 1)}}, + {Item("foo", Item::kTokenType), {Param("a763", 1)}}, + {Item("foo", Item::kTokenType), {Param("a764", 1)}}, + {Item("foo", Item::kTokenType), {Param("a765", 1)}}, + {Item("foo", Item::kTokenType), {Param("a766", 1)}}, + {Item("foo", Item::kTokenType), {Param("a767", 1)}}, + {Item("foo", Item::kTokenType), {Param("a768", 1)}}, + {Item("foo", Item::kTokenType), {Param("a769", 1)}}, + {Item("foo", Item::kTokenType), {Param("a770", 1)}}, + {Item("foo", Item::kTokenType), {Param("a771", 1)}}, + {Item("foo", Item::kTokenType), {Param("a772", 1)}}, + {Item("foo", Item::kTokenType), {Param("a773", 1)}}, + {Item("foo", Item::kTokenType), {Param("a774", 1)}}, + {Item("foo", Item::kTokenType), {Param("a775", 1)}}, + {Item("foo", Item::kTokenType), {Param("a776", 1)}}, + {Item("foo", Item::kTokenType), {Param("a777", 1)}}, + {Item("foo", Item::kTokenType), {Param("a778", 1)}}, + {Item("foo", Item::kTokenType), {Param("a779", 1)}}, + {Item("foo", Item::kTokenType), {Param("a780", 1)}}, + {Item("foo", Item::kTokenType), {Param("a781", 1)}}, + {Item("foo", Item::kTokenType), {Param("a782", 1)}}, + {Item("foo", Item::kTokenType), {Param("a783", 1)}}, + {Item("foo", Item::kTokenType), {Param("a784", 1)}}, + {Item("foo", Item::kTokenType), {Param("a785", 1)}}, + {Item("foo", Item::kTokenType), {Param("a786", 1)}}, + {Item("foo", Item::kTokenType), {Param("a787", 1)}}, + {Item("foo", Item::kTokenType), {Param("a788", 1)}}, + {Item("foo", Item::kTokenType), {Param("a789", 1)}}, + {Item("foo", Item::kTokenType), {Param("a790", 1)}}, + {Item("foo", Item::kTokenType), {Param("a791", 1)}}, + {Item("foo", Item::kTokenType), {Param("a792", 1)}}, + {Item("foo", Item::kTokenType), {Param("a793", 1)}}, + {Item("foo", Item::kTokenType), {Param("a794", 1)}}, + {Item("foo", Item::kTokenType), {Param("a795", 1)}}, + {Item("foo", Item::kTokenType), {Param("a796", 1)}}, + {Item("foo", Item::kTokenType), {Param("a797", 1)}}, + {Item("foo", Item::kTokenType), {Param("a798", 1)}}, + {Item("foo", Item::kTokenType), {Param("a799", 1)}}, + {Item("foo", Item::kTokenType), {Param("a800", 1)}}, + {Item("foo", Item::kTokenType), {Param("a801", 1)}}, + {Item("foo", Item::kTokenType), {Param("a802", 1)}}, + {Item("foo", Item::kTokenType), {Param("a803", 1)}}, + {Item("foo", Item::kTokenType), {Param("a804", 1)}}, + {Item("foo", Item::kTokenType), {Param("a805", 1)}}, + {Item("foo", Item::kTokenType), {Param("a806", 1)}}, + {Item("foo", Item::kTokenType), {Param("a807", 1)}}, + {Item("foo", Item::kTokenType), {Param("a808", 1)}}, + {Item("foo", Item::kTokenType), {Param("a809", 1)}}, + {Item("foo", Item::kTokenType), {Param("a810", 1)}}, + {Item("foo", Item::kTokenType), {Param("a811", 1)}}, + {Item("foo", Item::kTokenType), {Param("a812", 1)}}, + {Item("foo", Item::kTokenType), {Param("a813", 1)}}, + {Item("foo", Item::kTokenType), {Param("a814", 1)}}, + {Item("foo", Item::kTokenType), {Param("a815", 1)}}, + {Item("foo", Item::kTokenType), {Param("a816", 1)}}, + {Item("foo", Item::kTokenType), {Param("a817", 1)}}, + {Item("foo", Item::kTokenType), {Param("a818", 1)}}, + {Item("foo", Item::kTokenType), {Param("a819", 1)}}, + {Item("foo", Item::kTokenType), {Param("a820", 1)}}, + {Item("foo", Item::kTokenType), {Param("a821", 1)}}, + {Item("foo", Item::kTokenType), {Param("a822", 1)}}, + {Item("foo", Item::kTokenType), {Param("a823", 1)}}, + {Item("foo", Item::kTokenType), {Param("a824", 1)}}, + {Item("foo", Item::kTokenType), {Param("a825", 1)}}, + {Item("foo", Item::kTokenType), {Param("a826", 1)}}, + {Item("foo", Item::kTokenType), {Param("a827", 1)}}, + {Item("foo", Item::kTokenType), {Param("a828", 1)}}, + {Item("foo", Item::kTokenType), {Param("a829", 1)}}, + {Item("foo", Item::kTokenType), {Param("a830", 1)}}, + {Item("foo", Item::kTokenType), {Param("a831", 1)}}, + {Item("foo", Item::kTokenType), {Param("a832", 1)}}, + {Item("foo", Item::kTokenType), {Param("a833", 1)}}, + {Item("foo", Item::kTokenType), {Param("a834", 1)}}, + {Item("foo", Item::kTokenType), {Param("a835", 1)}}, + {Item("foo", Item::kTokenType), {Param("a836", 1)}}, + {Item("foo", Item::kTokenType), {Param("a837", 1)}}, + {Item("foo", Item::kTokenType), {Param("a838", 1)}}, + {Item("foo", Item::kTokenType), {Param("a839", 1)}}, + {Item("foo", Item::kTokenType), {Param("a840", 1)}}, + {Item("foo", Item::kTokenType), {Param("a841", 1)}}, + {Item("foo", Item::kTokenType), {Param("a842", 1)}}, + {Item("foo", Item::kTokenType), {Param("a843", 1)}}, + {Item("foo", Item::kTokenType), {Param("a844", 1)}}, + {Item("foo", Item::kTokenType), {Param("a845", 1)}}, + {Item("foo", Item::kTokenType), {Param("a846", 1)}}, + {Item("foo", Item::kTokenType), {Param("a847", 1)}}, + {Item("foo", Item::kTokenType), {Param("a848", 1)}}, + {Item("foo", Item::kTokenType), {Param("a849", 1)}}, + {Item("foo", Item::kTokenType), {Param("a850", 1)}}, + {Item("foo", Item::kTokenType), {Param("a851", 1)}}, + {Item("foo", Item::kTokenType), {Param("a852", 1)}}, + {Item("foo", Item::kTokenType), {Param("a853", 1)}}, + {Item("foo", Item::kTokenType), {Param("a854", 1)}}, + {Item("foo", Item::kTokenType), {Param("a855", 1)}}, + {Item("foo", Item::kTokenType), {Param("a856", 1)}}, + {Item("foo", Item::kTokenType), {Param("a857", 1)}}, + {Item("foo", Item::kTokenType), {Param("a858", 1)}}, + {Item("foo", Item::kTokenType), {Param("a859", 1)}}, + {Item("foo", Item::kTokenType), {Param("a860", 1)}}, + {Item("foo", Item::kTokenType), {Param("a861", 1)}}, + {Item("foo", Item::kTokenType), {Param("a862", 1)}}, + {Item("foo", Item::kTokenType), {Param("a863", 1)}}, + {Item("foo", Item::kTokenType), {Param("a864", 1)}}, + {Item("foo", Item::kTokenType), {Param("a865", 1)}}, + {Item("foo", Item::kTokenType), {Param("a866", 1)}}, + {Item("foo", Item::kTokenType), {Param("a867", 1)}}, + {Item("foo", Item::kTokenType), {Param("a868", 1)}}, + {Item("foo", Item::kTokenType), {Param("a869", 1)}}, + {Item("foo", Item::kTokenType), {Param("a870", 1)}}, + {Item("foo", Item::kTokenType), {Param("a871", 1)}}, + {Item("foo", Item::kTokenType), {Param("a872", 1)}}, + {Item("foo", Item::kTokenType), {Param("a873", 1)}}, + {Item("foo", Item::kTokenType), {Param("a874", 1)}}, + {Item("foo", Item::kTokenType), {Param("a875", 1)}}, + {Item("foo", Item::kTokenType), {Param("a876", 1)}}, + {Item("foo", Item::kTokenType), {Param("a877", 1)}}, + {Item("foo", Item::kTokenType), {Param("a878", 1)}}, + {Item("foo", Item::kTokenType), {Param("a879", 1)}}, + {Item("foo", Item::kTokenType), {Param("a880", 1)}}, + {Item("foo", Item::kTokenType), {Param("a881", 1)}}, + {Item("foo", Item::kTokenType), {Param("a882", 1)}}, + {Item("foo", Item::kTokenType), {Param("a883", 1)}}, + {Item("foo", Item::kTokenType), {Param("a884", 1)}}, + {Item("foo", Item::kTokenType), {Param("a885", 1)}}, + {Item("foo", Item::kTokenType), {Param("a886", 1)}}, + {Item("foo", Item::kTokenType), {Param("a887", 1)}}, + {Item("foo", Item::kTokenType), {Param("a888", 1)}}, + {Item("foo", Item::kTokenType), {Param("a889", 1)}}, + {Item("foo", Item::kTokenType), {Param("a890", 1)}}, + {Item("foo", Item::kTokenType), {Param("a891", 1)}}, + {Item("foo", Item::kTokenType), {Param("a892", 1)}}, + {Item("foo", Item::kTokenType), {Param("a893", 1)}}, + {Item("foo", Item::kTokenType), {Param("a894", 1)}}, + {Item("foo", Item::kTokenType), {Param("a895", 1)}}, + {Item("foo", Item::kTokenType), {Param("a896", 1)}}, + {Item("foo", Item::kTokenType), {Param("a897", 1)}}, + {Item("foo", Item::kTokenType), {Param("a898", 1)}}, + {Item("foo", Item::kTokenType), {Param("a899", 1)}}, + {Item("foo", Item::kTokenType), {Param("a900", 1)}}, + {Item("foo", Item::kTokenType), {Param("a901", 1)}}, + {Item("foo", Item::kTokenType), {Param("a902", 1)}}, + {Item("foo", Item::kTokenType), {Param("a903", 1)}}, + {Item("foo", Item::kTokenType), {Param("a904", 1)}}, + {Item("foo", Item::kTokenType), {Param("a905", 1)}}, + {Item("foo", Item::kTokenType), {Param("a906", 1)}}, + {Item("foo", Item::kTokenType), {Param("a907", 1)}}, + {Item("foo", Item::kTokenType), {Param("a908", 1)}}, + {Item("foo", Item::kTokenType), {Param("a909", 1)}}, + {Item("foo", Item::kTokenType), {Param("a910", 1)}}, + {Item("foo", Item::kTokenType), {Param("a911", 1)}}, + {Item("foo", Item::kTokenType), {Param("a912", 1)}}, + {Item("foo", Item::kTokenType), {Param("a913", 1)}}, + {Item("foo", Item::kTokenType), {Param("a914", 1)}}, + {Item("foo", Item::kTokenType), {Param("a915", 1)}}, + {Item("foo", Item::kTokenType), {Param("a916", 1)}}, + {Item("foo", Item::kTokenType), {Param("a917", 1)}}, + {Item("foo", Item::kTokenType), {Param("a918", 1)}}, + {Item("foo", Item::kTokenType), {Param("a919", 1)}}, + {Item("foo", Item::kTokenType), {Param("a920", 1)}}, + {Item("foo", Item::kTokenType), {Param("a921", 1)}}, + {Item("foo", Item::kTokenType), {Param("a922", 1)}}, + {Item("foo", Item::kTokenType), {Param("a923", 1)}}, + {Item("foo", Item::kTokenType), {Param("a924", 1)}}, + {Item("foo", Item::kTokenType), {Param("a925", 1)}}, + {Item("foo", Item::kTokenType), {Param("a926", 1)}}, + {Item("foo", Item::kTokenType), {Param("a927", 1)}}, + {Item("foo", Item::kTokenType), {Param("a928", 1)}}, + {Item("foo", Item::kTokenType), {Param("a929", 1)}}, + {Item("foo", Item::kTokenType), {Param("a930", 1)}}, + {Item("foo", Item::kTokenType), {Param("a931", 1)}}, + {Item("foo", Item::kTokenType), {Param("a932", 1)}}, + {Item("foo", Item::kTokenType), {Param("a933", 1)}}, + {Item("foo", Item::kTokenType), {Param("a934", 1)}}, + {Item("foo", Item::kTokenType), {Param("a935", 1)}}, + {Item("foo", Item::kTokenType), {Param("a936", 1)}}, + {Item("foo", Item::kTokenType), {Param("a937", 1)}}, + {Item("foo", Item::kTokenType), {Param("a938", 1)}}, + {Item("foo", Item::kTokenType), {Param("a939", 1)}}, + {Item("foo", Item::kTokenType), {Param("a940", 1)}}, + {Item("foo", Item::kTokenType), {Param("a941", 1)}}, + {Item("foo", Item::kTokenType), {Param("a942", 1)}}, + {Item("foo", Item::kTokenType), {Param("a943", 1)}}, + {Item("foo", Item::kTokenType), {Param("a944", 1)}}, + {Item("foo", Item::kTokenType), {Param("a945", 1)}}, + {Item("foo", Item::kTokenType), {Param("a946", 1)}}, + {Item("foo", Item::kTokenType), {Param("a947", 1)}}, + {Item("foo", Item::kTokenType), {Param("a948", 1)}}, + {Item("foo", Item::kTokenType), {Param("a949", 1)}}, + {Item("foo", Item::kTokenType), {Param("a950", 1)}}, + {Item("foo", Item::kTokenType), {Param("a951", 1)}}, + {Item("foo", Item::kTokenType), {Param("a952", 1)}}, + {Item("foo", Item::kTokenType), {Param("a953", 1)}}, + {Item("foo", Item::kTokenType), {Param("a954", 1)}}, + {Item("foo", Item::kTokenType), {Param("a955", 1)}}, + {Item("foo", Item::kTokenType), {Param("a956", 1)}}, + {Item("foo", Item::kTokenType), {Param("a957", 1)}}, + {Item("foo", Item::kTokenType), {Param("a958", 1)}}, + {Item("foo", Item::kTokenType), {Param("a959", 1)}}, + {Item("foo", Item::kTokenType), {Param("a960", 1)}}, + {Item("foo", Item::kTokenType), {Param("a961", 1)}}, + {Item("foo", Item::kTokenType), {Param("a962", 1)}}, + {Item("foo", Item::kTokenType), {Param("a963", 1)}}, + {Item("foo", Item::kTokenType), {Param("a964", 1)}}, + {Item("foo", Item::kTokenType), {Param("a965", 1)}}, + {Item("foo", Item::kTokenType), {Param("a966", 1)}}, + {Item("foo", Item::kTokenType), {Param("a967", 1)}}, + {Item("foo", Item::kTokenType), {Param("a968", 1)}}, + {Item("foo", Item::kTokenType), {Param("a969", 1)}}, + {Item("foo", Item::kTokenType), {Param("a970", 1)}}, + {Item("foo", Item::kTokenType), {Param("a971", 1)}}, + {Item("foo", Item::kTokenType), {Param("a972", 1)}}, + {Item("foo", Item::kTokenType), {Param("a973", 1)}}, + {Item("foo", Item::kTokenType), {Param("a974", 1)}}, + {Item("foo", Item::kTokenType), {Param("a975", 1)}}, + {Item("foo", Item::kTokenType), {Param("a976", 1)}}, + {Item("foo", Item::kTokenType), {Param("a977", 1)}}, + {Item("foo", Item::kTokenType), {Param("a978", 1)}}, + {Item("foo", Item::kTokenType), {Param("a979", 1)}}, + {Item("foo", Item::kTokenType), {Param("a980", 1)}}, + {Item("foo", Item::kTokenType), {Param("a981", 1)}}, + {Item("foo", Item::kTokenType), {Param("a982", 1)}}, + {Item("foo", Item::kTokenType), {Param("a983", 1)}}, + {Item("foo", Item::kTokenType), {Param("a984", 1)}}, + {Item("foo", Item::kTokenType), {Param("a985", 1)}}, + {Item("foo", Item::kTokenType), {Param("a986", 1)}}, + {Item("foo", Item::kTokenType), {Param("a987", 1)}}, + {Item("foo", Item::kTokenType), {Param("a988", 1)}}, + {Item("foo", Item::kTokenType), {Param("a989", 1)}}, + {Item("foo", Item::kTokenType), {Param("a990", 1)}}, + {Item("foo", Item::kTokenType), {Param("a991", 1)}}, + {Item("foo", Item::kTokenType), {Param("a992", 1)}}, + {Item("foo", Item::kTokenType), {Param("a993", 1)}}, + {Item("foo", Item::kTokenType), {Param("a994", 1)}}, + {Item("foo", Item::kTokenType), {Param("a995", 1)}}, + {Item("foo", Item::kTokenType), {Param("a996", 1)}}, + {Item("foo", Item::kTokenType), {Param("a997", 1)}}, + {Item("foo", Item::kTokenType), {Param("a998", 1)}}, + {Item("foo", Item::kTokenType), {Param("a999", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1000", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1001", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1002", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1003", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1004", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1005", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1006", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1007", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1008", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1009", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1010", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1011", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1012", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1013", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1014", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1015", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1016", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1017", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1018", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1019", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1020", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1021", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1022", 1)}}, + {Item("foo", Item::kTokenType), {Param("a1023", 1)}}}}}, + {"large params", + "foo;a0=1;a1=1;a2=1;a3=1;a4=1;a5=1;a6=1;a7=1;a8=1;a9=1;a10=1;a11=1;a12=1;" + "a13=1;a14=1;a15=1;a16=1;a17=1;a18=1;a19=1;a20=1;a21=1;a22=1;a23=1;a24=1;" + "a25=1;a26=1;a27=1;a28=1;a29=1;a30=1;a31=1;a32=1;a33=1;a34=1;a35=1;a36=1;" + "a37=1;a38=1;a39=1;a40=1;a41=1;a42=1;a43=1;a44=1;a45=1;a46=1;a47=1;a48=1;" + "a49=1;a50=1;a51=1;a52=1;a53=1;a54=1;a55=1;a56=1;a57=1;a58=1;a59=1;a60=1;" + "a61=1;a62=1;a63=1;a64=1;a65=1;a66=1;a67=1;a68=1;a69=1;a70=1;a71=1;a72=1;" + "a73=1;a74=1;a75=1;a76=1;a77=1;a78=1;a79=1;a80=1;a81=1;a82=1;a83=1;a84=1;" + "a85=1;a86=1;a87=1;a88=1;a89=1;a90=1;a91=1;a92=1;a93=1;a94=1;a95=1;a96=1;" + "a97=1;a98=1;a99=1;a100=1;a101=1;a102=1;a103=1;a104=1;a105=1;a106=1;a107=" + "1;a108=1;a109=1;a110=1;a111=1;a112=1;a113=1;a114=1;a115=1;a116=1;a117=1;" + "a118=1;a119=1;a120=1;a121=1;a122=1;a123=1;a124=1;a125=1;a126=1;a127=1;" + "a128=1;a129=1;a130=1;a131=1;a132=1;a133=1;a134=1;a135=1;a136=1;a137=1;" + "a138=1;a139=1;a140=1;a141=1;a142=1;a143=1;a144=1;a145=1;a146=1;a147=1;" + "a148=1;a149=1;a150=1;a151=1;a152=1;a153=1;a154=1;a155=1;a156=1;a157=1;" + "a158=1;a159=1;a160=1;a161=1;a162=1;a163=1;a164=1;a165=1;a166=1;a167=1;" + "a168=1;a169=1;a170=1;a171=1;a172=1;a173=1;a174=1;a175=1;a176=1;a177=1;" + "a178=1;a179=1;a180=1;a181=1;a182=1;a183=1;a184=1;a185=1;a186=1;a187=1;" + "a188=1;a189=1;a190=1;a191=1;a192=1;a193=1;a194=1;a195=1;a196=1;a197=1;" + "a198=1;a199=1;a200=1;a201=1;a202=1;a203=1;a204=1;a205=1;a206=1;a207=1;" + "a208=1;a209=1;a210=1;a211=1;a212=1;a213=1;a214=1;a215=1;a216=1;a217=1;" + "a218=1;a219=1;a220=1;a221=1;a222=1;a223=1;a224=1;a225=1;a226=1;a227=1;" + "a228=1;a229=1;a230=1;a231=1;a232=1;a233=1;a234=1;a235=1;a236=1;a237=1;" + "a238=1;a239=1;a240=1;a241=1;a242=1;a243=1;a244=1;a245=1;a246=1;a247=1;" + "a248=1;a249=1;a250=1;a251=1;a252=1;a253=1;a254=1;a255=1", + {{{Item("foo", Item::kTokenType), + {Param("a0", 1), Param("a1", 1), Param("a2", 1), + Param("a3", 1), Param("a4", 1), Param("a5", 1), + Param("a6", 1), Param("a7", 1), Param("a8", 1), + Param("a9", 1), Param("a10", 1), Param("a11", 1), + Param("a12", 1), Param("a13", 1), Param("a14", 1), + Param("a15", 1), Param("a16", 1), Param("a17", 1), + Param("a18", 1), Param("a19", 1), Param("a20", 1), + Param("a21", 1), Param("a22", 1), Param("a23", 1), + Param("a24", 1), Param("a25", 1), Param("a26", 1), + Param("a27", 1), Param("a28", 1), Param("a29", 1), + Param("a30", 1), Param("a31", 1), Param("a32", 1), + Param("a33", 1), Param("a34", 1), Param("a35", 1), + Param("a36", 1), Param("a37", 1), Param("a38", 1), + Param("a39", 1), Param("a40", 1), Param("a41", 1), + Param("a42", 1), Param("a43", 1), Param("a44", 1), + Param("a45", 1), Param("a46", 1), Param("a47", 1), + Param("a48", 1), Param("a49", 1), Param("a50", 1), + Param("a51", 1), Param("a52", 1), Param("a53", 1), + Param("a54", 1), Param("a55", 1), Param("a56", 1), + Param("a57", 1), Param("a58", 1), Param("a59", 1), + Param("a60", 1), Param("a61", 1), Param("a62", 1), + Param("a63", 1), Param("a64", 1), Param("a65", 1), + Param("a66", 1), Param("a67", 1), Param("a68", 1), + Param("a69", 1), Param("a70", 1), Param("a71", 1), + Param("a72", 1), Param("a73", 1), Param("a74", 1), + Param("a75", 1), Param("a76", 1), Param("a77", 1), + Param("a78", 1), Param("a79", 1), Param("a80", 1), + Param("a81", 1), Param("a82", 1), Param("a83", 1), + Param("a84", 1), Param("a85", 1), Param("a86", 1), + Param("a87", 1), Param("a88", 1), Param("a89", 1), + Param("a90", 1), Param("a91", 1), Param("a92", 1), + Param("a93", 1), Param("a94", 1), Param("a95", 1), + Param("a96", 1), Param("a97", 1), Param("a98", 1), + Param("a99", 1), Param("a100", 1), Param("a101", 1), + Param("a102", 1), Param("a103", 1), Param("a104", 1), + Param("a105", 1), Param("a106", 1), Param("a107", 1), + Param("a108", 1), Param("a109", 1), Param("a110", 1), + Param("a111", 1), Param("a112", 1), Param("a113", 1), + Param("a114", 1), Param("a115", 1), Param("a116", 1), + Param("a117", 1), Param("a118", 1), Param("a119", 1), + Param("a120", 1), Param("a121", 1), Param("a122", 1), + Param("a123", 1), Param("a124", 1), Param("a125", 1), + Param("a126", 1), Param("a127", 1), Param("a128", 1), + Param("a129", 1), Param("a130", 1), Param("a131", 1), + Param("a132", 1), Param("a133", 1), Param("a134", 1), + Param("a135", 1), Param("a136", 1), Param("a137", 1), + Param("a138", 1), Param("a139", 1), Param("a140", 1), + Param("a141", 1), Param("a142", 1), Param("a143", 1), + Param("a144", 1), Param("a145", 1), Param("a146", 1), + Param("a147", 1), Param("a148", 1), Param("a149", 1), + Param("a150", 1), Param("a151", 1), Param("a152", 1), + Param("a153", 1), Param("a154", 1), Param("a155", 1), + Param("a156", 1), Param("a157", 1), Param("a158", 1), + Param("a159", 1), Param("a160", 1), Param("a161", 1), + Param("a162", 1), Param("a163", 1), Param("a164", 1), + Param("a165", 1), Param("a166", 1), Param("a167", 1), + Param("a168", 1), Param("a169", 1), Param("a170", 1), + Param("a171", 1), Param("a172", 1), Param("a173", 1), + Param("a174", 1), Param("a175", 1), Param("a176", 1), + Param("a177", 1), Param("a178", 1), Param("a179", 1), + Param("a180", 1), Param("a181", 1), Param("a182", 1), + Param("a183", 1), Param("a184", 1), Param("a185", 1), + Param("a186", 1), Param("a187", 1), Param("a188", 1), + Param("a189", 1), Param("a190", 1), Param("a191", 1), + Param("a192", 1), Param("a193", 1), Param("a194", 1), + Param("a195", 1), Param("a196", 1), Param("a197", 1), + Param("a198", 1), Param("a199", 1), Param("a200", 1), + Param("a201", 1), Param("a202", 1), Param("a203", 1), + Param("a204", 1), Param("a205", 1), Param("a206", 1), + Param("a207", 1), Param("a208", 1), Param("a209", 1), + Param("a210", 1), Param("a211", 1), Param("a212", 1), + Param("a213", 1), Param("a214", 1), Param("a215", 1), + Param("a216", 1), Param("a217", 1), Param("a218", 1), + Param("a219", 1), Param("a220", 1), Param("a221", 1), + Param("a222", 1), Param("a223", 1), Param("a224", 1), + Param("a225", 1), Param("a226", 1), Param("a227", 1), + Param("a228", 1), Param("a229", 1), Param("a230", 1), + Param("a231", 1), Param("a232", 1), Param("a233", 1), + Param("a234", 1), Param("a235", 1), Param("a236", 1), + Param("a237", 1), Param("a238", 1), Param("a239", 1), + Param("a240", 1), Param("a241", 1), Param("a242", 1), + Param("a243", 1), Param("a244", 1), Param("a245", 1), + Param("a246", 1), Param("a247", 1), Param("a248", 1), + Param("a249", 1), Param("a250", 1), Param("a251", 1), + Param("a252", 1), Param("a253", 1), Param("a254", 1), + Param("a255", 1)}}}}}, + {"large param key", + "foo;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=1", + {{{Item("foo", Item::kTokenType), + {Param( + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + 1)}}}}}, + {"basic list", "1, 42", {{{Integer(1), {}}, {Integer(42), {}}}}}, + {"empty list", "", {List()}}, + {"leading SP list", + " 42, 43", + {{{Integer(42), {}}, {Integer(43), {}}}}, + "42, 43"}, + {"single item list", "42", {{{Integer(42), {}}}}}, + {"no whitespace list", + "1,42", + {{{Integer(1), {}}, {Integer(42), {}}}}, + "1, 42"}, + {"extra whitespace list", + "1 , 42", + {{{Integer(1), {}}, {Integer(42), {}}}}, + "1, 42"}, + {"tab separated list", "1\t,\t42", base::nullopt}, + {"two line list", + "1, 42", + {{{Integer(1), {}}, {Integer(42), {}}}}, + "1, 42"}, + {"trailing comma list", "1, 42,", base::nullopt}, + {"empty item list", "1,,42", base::nullopt}, + {"basic list of lists", + "(1 2), (42 43)", + {{{{{Integer(1), {}}, {Integer(2), {}}}, {}}, + {{{Integer(42), {}}, {Integer(43), {}}}, {}}}}}, + {"single item list of lists", "(42)", {{{{{Integer(42), {}}}, {}}}}}, + {"empty item list of lists", + "()", + {{{std::vector<ParameterizedItem>(), {}}}}}, + {"empty middle item list of lists", + "(1),(),(42)", + {{{{{Integer(1), {}}}, {}}, + {std::vector<ParameterizedItem>(), {}}, + {{{Integer(42), {}}}, {}}}}, + "(1), (), (42)"}, + {"extra whitespace list of lists", + "( 1 42 )", + {{{{{Integer(1), {}}, {Integer(42), {}}}, {}}}}, + "(1 42)"}, + {"wrong whitespace list of lists", "(1\t 42)", base::nullopt}, + {"no trailing parenthesis list of lists", "(1 42", base::nullopt}, + {"no trailing parenthesis middle list of lists", "(1 2, (42 43)", + base::nullopt}, + {"no spaces in inner-list", "(abc\"def\"?0123*dXZ3*xyz)", base::nullopt}, + {"basic parameterised list", + "abc_123;a=1;b=2; cdef_456, ghi;q=9;r=\"+w\"", + {{{Item("abc_123", Item::kTokenType), + {Param("a", 1), Param("b", 2), BooleanParam("cdef_456", true)}}, + {Item("ghi", Item::kTokenType), {Param("q", 9), Param("r", "+w")}}}}, + "abc_123;a=1;b=2;cdef_456, ghi;q=9;r=\"+w\""}, + {"single item parameterised list", + "text/html;q=1.0", + {{{Item("text/html", Item::kTokenType), {DoubleParam("q", 1.000000)}}}}}, + {"missing parameter value parameterised list", + "text/html;a;q=1.0", + {{{Item("text/html", Item::kTokenType), + {BooleanParam("a", true), DoubleParam("q", 1.000000)}}}}}, + {"missing terminal parameter value parameterised list", + "text/html;q=1.0;a", + {{{Item("text/html", Item::kTokenType), + {DoubleParam("q", 1.000000), BooleanParam("a", true)}}}}}, + {"no whitespace parameterised list", + "text/html,text/plain;q=0.5", + {{{Item("text/html", Item::kTokenType), {}}, + {Item("text/plain", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}, + "text/html, text/plain;q=0.5"}, + {"whitespace before = parameterised list", "text/html, text/plain;q =0.5", + base::nullopt}, + {"whitespace after = parameterised list", "text/html, text/plain;q= 0.5", + base::nullopt}, + {"whitespace before ; parameterised list", "text/html, text/plain ;q=0.5", + base::nullopt}, + {"whitespace after ; parameterised list", + "text/html, text/plain; q=0.5", + {{{Item("text/html", Item::kTokenType), {}}, + {Item("text/plain", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}, + "text/html, text/plain;q=0.5"}, + {"extra whitespace parameterised list", + "text/html , text/plain; q=0.5; charset=utf-8", + {{{Item("text/html", Item::kTokenType), {}}, + {Item("text/plain", Item::kTokenType), + {DoubleParam("q", 0.500000), TokenParam("charset", "utf-8")}}}}, + "text/html, text/plain;q=0.5;charset=utf-8"}, + {"two lines parameterised list", + "text/html, text/plain;q=0.5", + {{{Item("text/html", Item::kTokenType), {}}, + {Item("text/plain", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}, + "text/html, text/plain;q=0.5"}, + {"trailing comma parameterised list", "text/html,text/plain;q=0.5,", + base::nullopt}, + {"empty item parameterised list", "text/html,,text/plain;q=0.5,", + base::nullopt}, + {"basic token - list", + "a_b-c3/*", + {{{Item("a_b-c3/*", Item::kTokenType), {}}}}}, + {"token with capitals - list", + "fooBar", + {{{Item("fooBar", Item::kTokenType), {}}}}}, + {"token starting with capitals - list", + "FooBar", + {{{Item("FooBar", Item::kTokenType), {}}}}}, + {"0x01 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\001a", 1)}}}}}, + {"0x02 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\002a", 1)}}}}}, + {"0x03 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\003a", 1)}}}}}, + {"0x04 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\004a", 1)}}}}}, + {"0x05 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\005a", 1)}}}}}, + {"0x06 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\006a", 1)}}}}}, + {"0x07 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\aa", 1)}}}}}, + {"0x08 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\ba", 1)}}}}}, + {"0x09 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\ta", 1)}}}}}, + {"0x0a in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\na", 1)}}}}}, + {"0x0b in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\va", 1)}}}}}, + {"0x0c in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\fa", 1)}}}}}, + {"0x0d in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\ra", 1)}}}}}, + {"0x0e in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\016a", 1)}}}}}, + {"0x0f in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\017a", 1)}}}}}, + {"0x10 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\020a", 1)}}}}}, + {"0x11 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\021a", 1)}}}}}, + {"0x12 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\022a", 1)}}}}}, + {"0x13 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\023a", 1)}}}}}, + {"0x14 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\024a", 1)}}}}}, + {"0x15 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\025a", 1)}}}}}, + {"0x16 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\026a", 1)}}}}}, + {"0x17 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\027a", 1)}}}}}, + {"0x18 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\030a", 1)}}}}}, + {"0x19 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\031a", 1)}}}}}, + {"0x1a in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\032a", 1)}}}}}, + {"0x1b in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\033a", 1)}}}}}, + {"0x1c in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\034a", 1)}}}}}, + {"0x1d in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\035a", 1)}}}}}, + {"0x1e in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\036a", 1)}}}}}, + {"0x1f in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\037a", 1)}}}}}, + {"0x20 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a a", 1)}}}}}, + {"0x21 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a!a", 1)}}}}}, + {"0x22 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\"a", 1)}}}}}, + {"0x23 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a#a", 1)}}}}}, + {"0x24 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a$a", 1)}}}}}, + {"0x25 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a%a", 1)}}}}}, + {"0x26 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a&a", 1)}}}}}, + {"0x27 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a'a", 1)}}}}}, + {"0x28 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a(a", 1)}}}}}, + {"0x29 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a)a", 1)}}}}}, + {"0x2b in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a+a", 1)}}}}}, + {"0x2c in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a,a", 1)}}}}}, + {"0x2f in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a/a", 1)}}}}}, + {"0x3a in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a:a", 1)}}}}}, + {"0x3b in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a;a", 1)}}}}}, + {"0x3c in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a<a", 1)}}}}}, + {"0x3d in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a=a", 1)}}}}}, + {"0x3e in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a>a", 1)}}}}}, + {"0x3f in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a?a", 1)}}}}}, + {"0x40 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a@a", 1)}}}}}, + {"0x41 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aAa", 1)}}}}}, + {"0x42 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aBa", 1)}}}}}, + {"0x43 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aCa", 1)}}}}}, + {"0x44 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aDa", 1)}}}}}, + {"0x45 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aEa", 1)}}}}}, + {"0x46 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aFa", 1)}}}}}, + {"0x47 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aGa", 1)}}}}}, + {"0x48 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aHa", 1)}}}}}, + {"0x49 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aIa", 1)}}}}}, + {"0x4a in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aJa", 1)}}}}}, + {"0x4b in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aKa", 1)}}}}}, + {"0x4c in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aLa", 1)}}}}}, + {"0x4d in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aMa", 1)}}}}}, + {"0x4e in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aNa", 1)}}}}}, + {"0x4f in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aOa", 1)}}}}}, + {"0x50 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aPa", 1)}}}}}, + {"0x51 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aQa", 1)}}}}}, + {"0x52 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aRa", 1)}}}}}, + {"0x53 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aSa", 1)}}}}}, + {"0x54 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aTa", 1)}}}}}, + {"0x55 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aUa", 1)}}}}}, + {"0x56 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aVa", 1)}}}}}, + {"0x57 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aWa", 1)}}}}}, + {"0x58 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aXa", 1)}}}}}, + {"0x59 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aYa", 1)}}}}}, + {"0x5a in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("aZa", 1)}}}}}, + {"0x5b in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a[a", 1)}}}}}, + {"0x5c in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\\a", 1)}}}}}, + {"0x5d in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a]a", 1)}}}}}, + {"0x5e in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a^a", 1)}}}}}, + {"0x60 in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a`a", 1)}}}}}, + {"0x7b in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a{a", 1)}}}}}, + {"0x7c in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a|a", 1)}}}}}, + {"0x7d in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a}a", 1)}}}}}, + {"0x7e in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a~a", 1)}}}}}, + {"0x7f in parameterised list key - serialise only", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("a\177a", 1)}}}}}, + {"0x01 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\001a", 1)}}}}}, + {"0x02 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\002a", 1)}}}}}, + {"0x03 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\003a", 1)}}}}}, + {"0x04 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\004a", 1)}}}}}, + {"0x05 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\005a", 1)}}}}}, + {"0x06 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\006a", 1)}}}}}, + {"0x07 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\aa", 1)}}}}}, + {"0x08 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\ba", 1)}}}}}, + {"0x09 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\ta", 1)}}}}}, + {"0x0a starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\na", 1)}}}}}, + {"0x0b starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\va", 1)}}}}}, + {"0x0c starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\fa", 1)}}}}}, + {"0x0d starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\ra", 1)}}}}}, + {"0x0e starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\016a", 1)}}}}}, + {"0x0f starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\017a", 1)}}}}}, + {"0x10 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\020a", 1)}}}}}, + {"0x11 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\021a", 1)}}}}}, + {"0x12 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\022a", 1)}}}}}, + {"0x13 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\023a", 1)}}}}}, + {"0x14 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\024a", 1)}}}}}, + {"0x15 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\025a", 1)}}}}}, + {"0x16 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\026a", 1)}}}}}, + {"0x17 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\027a", 1)}}}}}, + {"0x18 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\030a", 1)}}}}}, + {"0x19 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\031a", 1)}}}}}, + {"0x1a starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\032a", 1)}}}}}, + {"0x1b starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\033a", 1)}}}}}, + {"0x1c starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\034a", 1)}}}}}, + {"0x1d starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\035a", 1)}}}}}, + {"0x1e starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\036a", 1)}}}}}, + {"0x1f starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\037a", 1)}}}}}, + {"0x20 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param(" a", 1)}}}}}, + {"0x21 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("!a", 1)}}}}}, + {"0x22 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\"a", 1)}}}}}, + {"0x23 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("#a", 1)}}}}}, + {"0x24 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("$a", 1)}}}}}, + {"0x25 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("%a", 1)}}}}}, + {"0x26 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("&a", 1)}}}}}, + {"0x27 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("'a", 1)}}}}}, + {"0x28 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("(a", 1)}}}}}, + {"0x29 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param(")a", 1)}}}}}, + {"0x2b starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("+a", 1)}}}}}, + {"0x2c starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param(",a", 1)}}}}}, + {"0x2d starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("-a", 1)}}}}}, + {"0x2e starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param(".a", 1)}}}}}, + {"0x2f starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("/a", 1)}}}}}, + {"0x30 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("0a", 1)}}}}}, + {"0x31 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("1a", 1)}}}}}, + {"0x32 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("2a", 1)}}}}}, + {"0x33 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("3a", 1)}}}}}, + {"0x34 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("4a", 1)}}}}}, + {"0x35 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("5a", 1)}}}}}, + {"0x36 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("6a", 1)}}}}}, + {"0x37 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("7a", 1)}}}}}, + {"0x38 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("8a", 1)}}}}}, + {"0x39 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("9a", 1)}}}}}, + {"0x3a starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param(":a", 1)}}}}}, + {"0x3b starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param(";a", 1)}}}}}, + {"0x3c starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("<a", 1)}}}}}, + {"0x3d starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("=a", 1)}}}}}, + {"0x3e starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param(">a", 1)}}}}}, + {"0x3f starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("?a", 1)}}}}}, + {"0x40 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("@a", 1)}}}}}, + {"0x41 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Aa", 1)}}}}}, + {"0x42 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ba", 1)}}}}}, + {"0x43 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ca", 1)}}}}}, + {"0x44 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Da", 1)}}}}}, + {"0x45 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ea", 1)}}}}}, + {"0x46 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Fa", 1)}}}}}, + {"0x47 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ga", 1)}}}}}, + {"0x48 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ha", 1)}}}}}, + {"0x49 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ia", 1)}}}}}, + {"0x4a starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ja", 1)}}}}}, + {"0x4b starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ka", 1)}}}}}, + {"0x4c starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("La", 1)}}}}}, + {"0x4d starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ma", 1)}}}}}, + {"0x4e starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Na", 1)}}}}}, + {"0x4f starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Oa", 1)}}}}}, + {"0x50 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Pa", 1)}}}}}, + {"0x51 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Qa", 1)}}}}}, + {"0x52 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ra", 1)}}}}}, + {"0x53 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Sa", 1)}}}}}, + {"0x54 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ta", 1)}}}}}, + {"0x55 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ua", 1)}}}}}, + {"0x56 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Va", 1)}}}}}, + {"0x57 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Wa", 1)}}}}}, + {"0x58 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Xa", 1)}}}}}, + {"0x59 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Ya", 1)}}}}}, + {"0x5a starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("Za", 1)}}}}}, + {"0x5b starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("[a", 1)}}}}}, + {"0x5c starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\\a", 1)}}}}}, + {"0x5d starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("]a", 1)}}}}}, + {"0x5e starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("^a", 1)}}}}}, + {"0x5f starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("_a", 1)}}}}}, + {"0x60 starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("`a", 1)}}}}}, + {"0x7b starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("{a", 1)}}}}}, + {"0x7c starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("|a", 1)}}}}}, + {"0x7d starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("}a", 1)}}}}}, + {"0x7e starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("~a", 1)}}}}}, + {"0x7f starting a parameterised list key", + nullptr, + {{{Item("foo", Item::kTokenType), {Param("\177a", 1)}}}}}, +}; + +const struct DictionaryTestCase { + const char* name; + const char* raw; + const base::Optional<Dictionary> + expected; // nullopt if parse error is expected. + const char* canonical; // nullptr if parse error is expected, or if canonical + // format is identical to raw. +} dictionary_test_cases[] = { + {"basic dictionary", + "en=\"Applepie\", da=:w4ZibGV0w6ZydGUK:", + {Dictionary{{{"en", {Item("Applepie"), {}}}, + {"da", + {Item("\303\206blet\303\246rte\n", Item::kByteSequenceType), + {}}}}}}}, + {"empty dictionary", "", {Dictionary{{}}}}, + {"single item dictionary", "a=1", {Dictionary{{{"a", {Integer(1), {}}}}}}}, + {"list item dictionary", + "a=(1 2)", + {Dictionary{{{"a", {{{Integer(1), {}}, {Integer(2), {}}}, {}}}}}}}, + {"single list item dictionary", + "a=(1)", + {Dictionary{{{"a", {{{Integer(1), {}}}, {}}}}}}}, + {"empty list item dictionary", + "a=()", + {Dictionary{{{"a", {std::vector<ParameterizedItem>(), {}}}}}}}, + {"no whitespace dictionary", + "a=1,b=2", + {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, + "a=1, b=2"}, + {"extra whitespace dictionary", + "a=1 , b=2", + {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, + "a=1, b=2"}, + {"leading whitespace dictionary", + " a=1 , b=2", + {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, + "a=1, b=2"}, + {"whitespace before = dictionary", "a =1, b=2", base::nullopt}, + {"whitespace after = dictionary", "a=1, b= 2", base::nullopt}, + {"two lines dictionary", + "a=1, b=2", + {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Integer(2), {}}}}}}, + "a=1, b=2"}, + {"missing value dictionary", + "a=1, b, c=3", + {Dictionary{{{"a", {Integer(1), {}}}, + {"b", {Item(true), {}}}, + {"c", {Integer(3), {}}}}}}}, + {"all missing value dictionary", + "a, b, c", + {Dictionary{{{"a", {Item(true), {}}}, + {"b", {Item(true), {}}}, + {"c", {Item(true), {}}}}}}}, + {"start missing value dictionary", + "a, b=2", + {Dictionary{{{"a", {Item(true), {}}}, {"b", {Integer(2), {}}}}}}}, + {"end missing value dictionary", + "a=1, b", + {Dictionary{{{"a", {Integer(1), {}}}, {"b", {Item(true), {}}}}}}}, + {"trailing comma dictionary", "a=1, b=2,", base::nullopt}, + {"empty item dictionary", "a=1,,b=2,", base::nullopt}, + {"duplicate key dictionary", + "a=1,b=2,a=3", + {Dictionary{{{"a", {Integer(3), {}}}, {"b", {Integer(2), {}}}}}}, + "a=3, b=2"}, + {"numeric key dictionary", "a=1,1b=2,a=1", base::nullopt}, + {"uppercase key dictionary", "a=1,B=2,a=1", base::nullopt}, + {"bad key dictionary", "a=1,b!=2,a=1", base::nullopt}, + {"Example-DictListHeader", + "rating=1.5, feelings=(joy sadness)", + {Dictionary{{{"rating", {Item(1.500000), {}}}, + {"feelings", + {{{Item("joy", Item::kTokenType), {}}, + {Item("sadness", Item::kTokenType), {}}}, + {}}}}}}}, + {"Example-MixDict", + "a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid", + {Dictionary{{{"a", {{{Integer(1), {}}, {Integer(2), {}}}, {}}}, + {"b", {Integer(3), {}}}, + {"c", {Integer(4), {TokenParam("aa", "bb")}}}, + {"d", + {{{Integer(5), {}}, {Integer(6), {}}}, + {BooleanParam("valid", true)}}}}}}, + "a=(1 2), b=3, c=4;aa=bb, d=(5 6);valid"}, + {"Example-Hdr (dictionary on one line)", + "foo=1, bar=2", + {Dictionary{{{"foo", {Integer(1), {}}}, {"bar", {Integer(2), {}}}}}}}, + {"Example-Hdr (dictionary on two lines)", + "foo=1, bar=2", + {Dictionary{{{"foo", {Integer(1), {}}}, {"bar", {Integer(2), {}}}}}}, + "foo=1, bar=2"}, + {"0x01 in dictionary key", "a\001a=1", base::nullopt}, + {"0x02 in dictionary key", "a\002a=1", base::nullopt}, + {"0x03 in dictionary key", "a\003a=1", base::nullopt}, + {"0x04 in dictionary key", "a\004a=1", base::nullopt}, + {"0x05 in dictionary key", "a\005a=1", base::nullopt}, + {"0x06 in dictionary key", "a\006a=1", base::nullopt}, + {"0x07 in dictionary key", "a\aa=1", base::nullopt}, + {"0x08 in dictionary key", "a\ba=1", base::nullopt}, + {"0x09 in dictionary key", "a\ta=1", base::nullopt}, + {"0x0a in dictionary key", "a\na=1", base::nullopt}, + {"0x0b in dictionary key", "a\va=1", base::nullopt}, + {"0x0c in dictionary key", "a\fa=1", base::nullopt}, + {"0x0d in dictionary key", "a\ra=1", base::nullopt}, + {"0x0e in dictionary key", "a\016a=1", base::nullopt}, + {"0x0f in dictionary key", "a\017a=1", base::nullopt}, + {"0x10 in dictionary key", "a\020a=1", base::nullopt}, + {"0x11 in dictionary key", "a\021a=1", base::nullopt}, + {"0x12 in dictionary key", "a\022a=1", base::nullopt}, + {"0x13 in dictionary key", "a\023a=1", base::nullopt}, + {"0x14 in dictionary key", "a\024a=1", base::nullopt}, + {"0x15 in dictionary key", "a\025a=1", base::nullopt}, + {"0x16 in dictionary key", "a\026a=1", base::nullopt}, + {"0x17 in dictionary key", "a\027a=1", base::nullopt}, + {"0x18 in dictionary key", "a\030a=1", base::nullopt}, + {"0x19 in dictionary key", "a\031a=1", base::nullopt}, + {"0x1a in dictionary key", "a\032a=1", base::nullopt}, + {"0x1b in dictionary key", "a\033a=1", base::nullopt}, + {"0x1c in dictionary key", "a\034a=1", base::nullopt}, + {"0x1d in dictionary key", "a\035a=1", base::nullopt}, + {"0x1e in dictionary key", "a\036a=1", base::nullopt}, + {"0x1f in dictionary key", "a\037a=1", base::nullopt}, + {"0x20 in dictionary key", "a a=1", base::nullopt}, + {"0x21 in dictionary key", "a!a=1", base::nullopt}, + {"0x22 in dictionary key", "a\"a=1", base::nullopt}, + {"0x23 in dictionary key", "a#a=1", base::nullopt}, + {"0x24 in dictionary key", "a$a=1", base::nullopt}, + {"0x25 in dictionary key", "a%a=1", base::nullopt}, + {"0x26 in dictionary key", "a&a=1", base::nullopt}, + {"0x27 in dictionary key", "a'a=1", base::nullopt}, + {"0x28 in dictionary key", "a(a=1", base::nullopt}, + {"0x29 in dictionary key", "a)a=1", base::nullopt}, + {"0x2a in dictionary key", + "a*a=1", + {Dictionary{{{"a*a", {Integer(1), {}}}}}}}, + {"0x2b in dictionary key", "a+a=1", base::nullopt}, + {"0x2c in dictionary key", + "a,a=1", + {Dictionary{{{"a", {Integer(1), {}}}}}}, + "a=1"}, + {"0x2d in dictionary key", + "a-a=1", + {Dictionary{{{"a-a", {Integer(1), {}}}}}}}, + {"0x2e in dictionary key", + "a.a=1", + {Dictionary{{{"a.a", {Integer(1), {}}}}}}}, + {"0x2f in dictionary key", "a/a=1", base::nullopt}, + {"0x30 in dictionary key", + "a0a=1", + {Dictionary{{{"a0a", {Integer(1), {}}}}}}}, + {"0x31 in dictionary key", + "a1a=1", + {Dictionary{{{"a1a", {Integer(1), {}}}}}}}, + {"0x32 in dictionary key", + "a2a=1", + {Dictionary{{{"a2a", {Integer(1), {}}}}}}}, + {"0x33 in dictionary key", + "a3a=1", + {Dictionary{{{"a3a", {Integer(1), {}}}}}}}, + {"0x34 in dictionary key", + "a4a=1", + {Dictionary{{{"a4a", {Integer(1), {}}}}}}}, + {"0x35 in dictionary key", + "a5a=1", + {Dictionary{{{"a5a", {Integer(1), {}}}}}}}, + {"0x36 in dictionary key", + "a6a=1", + {Dictionary{{{"a6a", {Integer(1), {}}}}}}}, + {"0x37 in dictionary key", + "a7a=1", + {Dictionary{{{"a7a", {Integer(1), {}}}}}}}, + {"0x38 in dictionary key", + "a8a=1", + {Dictionary{{{"a8a", {Integer(1), {}}}}}}}, + {"0x39 in dictionary key", + "a9a=1", + {Dictionary{{{"a9a", {Integer(1), {}}}}}}}, + {"0x3a in dictionary key", "a:a=1", base::nullopt}, + {"0x3c in dictionary key", "a<a=1", base::nullopt}, + {"0x3d in dictionary key", "a=a=1", base::nullopt}, + {"0x3e in dictionary key", "a>a=1", base::nullopt}, + {"0x3f in dictionary key", "a?a=1", base::nullopt}, + {"0x40 in dictionary key", "a@a=1", base::nullopt}, + {"0x41 in dictionary key", "aAa=1", base::nullopt}, + {"0x42 in dictionary key", "aBa=1", base::nullopt}, + {"0x43 in dictionary key", "aCa=1", base::nullopt}, + {"0x44 in dictionary key", "aDa=1", base::nullopt}, + {"0x45 in dictionary key", "aEa=1", base::nullopt}, + {"0x46 in dictionary key", "aFa=1", base::nullopt}, + {"0x47 in dictionary key", "aGa=1", base::nullopt}, + {"0x48 in dictionary key", "aHa=1", base::nullopt}, + {"0x49 in dictionary key", "aIa=1", base::nullopt}, + {"0x4a in dictionary key", "aJa=1", base::nullopt}, + {"0x4b in dictionary key", "aKa=1", base::nullopt}, + {"0x4c in dictionary key", "aLa=1", base::nullopt}, + {"0x4d in dictionary key", "aMa=1", base::nullopt}, + {"0x4e in dictionary key", "aNa=1", base::nullopt}, + {"0x4f in dictionary key", "aOa=1", base::nullopt}, + {"0x50 in dictionary key", "aPa=1", base::nullopt}, + {"0x51 in dictionary key", "aQa=1", base::nullopt}, + {"0x52 in dictionary key", "aRa=1", base::nullopt}, + {"0x53 in dictionary key", "aSa=1", base::nullopt}, + {"0x54 in dictionary key", "aTa=1", base::nullopt}, + {"0x55 in dictionary key", "aUa=1", base::nullopt}, + {"0x56 in dictionary key", "aVa=1", base::nullopt}, + {"0x57 in dictionary key", "aWa=1", base::nullopt}, + {"0x58 in dictionary key", "aXa=1", base::nullopt}, + {"0x59 in dictionary key", "aYa=1", base::nullopt}, + {"0x5a in dictionary key", "aZa=1", base::nullopt}, + {"0x5b in dictionary key", "a[a=1", base::nullopt}, + {"0x5c in dictionary key", "a\\a=1", base::nullopt}, + {"0x5d in dictionary key", "a]a=1", base::nullopt}, + {"0x5e in dictionary key", "a^a=1", base::nullopt}, + {"0x5f in dictionary key", + "a_a=1", + {Dictionary{{{"a_a", {Integer(1), {}}}}}}}, + {"0x60 in dictionary key", "a`a=1", base::nullopt}, + {"0x61 in dictionary key", + "aaa=1", + {Dictionary{{{"aaa", {Integer(1), {}}}}}}}, + {"0x62 in dictionary key", + "aba=1", + {Dictionary{{{"aba", {Integer(1), {}}}}}}}, + {"0x63 in dictionary key", + "aca=1", + {Dictionary{{{"aca", {Integer(1), {}}}}}}}, + {"0x64 in dictionary key", + "ada=1", + {Dictionary{{{"ada", {Integer(1), {}}}}}}}, + {"0x65 in dictionary key", + "aea=1", + {Dictionary{{{"aea", {Integer(1), {}}}}}}}, + {"0x66 in dictionary key", + "afa=1", + {Dictionary{{{"afa", {Integer(1), {}}}}}}}, + {"0x67 in dictionary key", + "aga=1", + {Dictionary{{{"aga", {Integer(1), {}}}}}}}, + {"0x68 in dictionary key", + "aha=1", + {Dictionary{{{"aha", {Integer(1), {}}}}}}}, + {"0x69 in dictionary key", + "aia=1", + {Dictionary{{{"aia", {Integer(1), {}}}}}}}, + {"0x6a in dictionary key", + "aja=1", + {Dictionary{{{"aja", {Integer(1), {}}}}}}}, + {"0x6b in dictionary key", + "aka=1", + {Dictionary{{{"aka", {Integer(1), {}}}}}}}, + {"0x6c in dictionary key", + "ala=1", + {Dictionary{{{"ala", {Integer(1), {}}}}}}}, + {"0x6d in dictionary key", + "ama=1", + {Dictionary{{{"ama", {Integer(1), {}}}}}}}, + {"0x6e in dictionary key", + "ana=1", + {Dictionary{{{"ana", {Integer(1), {}}}}}}}, + {"0x6f in dictionary key", + "aoa=1", + {Dictionary{{{"aoa", {Integer(1), {}}}}}}}, + {"0x70 in dictionary key", + "apa=1", + {Dictionary{{{"apa", {Integer(1), {}}}}}}}, + {"0x71 in dictionary key", + "aqa=1", + {Dictionary{{{"aqa", {Integer(1), {}}}}}}}, + {"0x72 in dictionary key", + "ara=1", + {Dictionary{{{"ara", {Integer(1), {}}}}}}}, + {"0x73 in dictionary key", + "asa=1", + {Dictionary{{{"asa", {Integer(1), {}}}}}}}, + {"0x74 in dictionary key", + "ata=1", + {Dictionary{{{"ata", {Integer(1), {}}}}}}}, + {"0x75 in dictionary key", + "aua=1", + {Dictionary{{{"aua", {Integer(1), {}}}}}}}, + {"0x76 in dictionary key", + "ava=1", + {Dictionary{{{"ava", {Integer(1), {}}}}}}}, + {"0x77 in dictionary key", + "awa=1", + {Dictionary{{{"awa", {Integer(1), {}}}}}}}, + {"0x78 in dictionary key", + "axa=1", + {Dictionary{{{"axa", {Integer(1), {}}}}}}}, + {"0x79 in dictionary key", + "aya=1", + {Dictionary{{{"aya", {Integer(1), {}}}}}}}, + {"0x7a in dictionary key", + "aza=1", + {Dictionary{{{"aza", {Integer(1), {}}}}}}}, + {"0x7b in dictionary key", "a{a=1", base::nullopt}, + {"0x7c in dictionary key", "a|a=1", base::nullopt}, + {"0x7d in dictionary key", "a}a=1", base::nullopt}, + {"0x7e in dictionary key", "a~a=1", base::nullopt}, + {"0x7f in dictionary key", "a\177a=1", base::nullopt}, + {"0x01 starting an dictionary key", "\001a=1", base::nullopt}, + {"0x02 starting an dictionary key", "\002a=1", base::nullopt}, + {"0x03 starting an dictionary key", "\003a=1", base::nullopt}, + {"0x04 starting an dictionary key", "\004a=1", base::nullopt}, + {"0x05 starting an dictionary key", "\005a=1", base::nullopt}, + {"0x06 starting an dictionary key", "\006a=1", base::nullopt}, + {"0x07 starting an dictionary key", "\aa=1", base::nullopt}, + {"0x08 starting an dictionary key", "\ba=1", base::nullopt}, + {"0x09 starting an dictionary key", "\ta=1", base::nullopt}, + {"0x0a starting an dictionary key", "\na=1", base::nullopt}, + {"0x0b starting an dictionary key", "\va=1", base::nullopt}, + {"0x0c starting an dictionary key", "\fa=1", base::nullopt}, + {"0x0d starting an dictionary key", "\ra=1", base::nullopt}, + {"0x0e starting an dictionary key", "\016a=1", base::nullopt}, + {"0x0f starting an dictionary key", "\017a=1", base::nullopt}, + {"0x10 starting an dictionary key", "\020a=1", base::nullopt}, + {"0x11 starting an dictionary key", "\021a=1", base::nullopt}, + {"0x12 starting an dictionary key", "\022a=1", base::nullopt}, + {"0x13 starting an dictionary key", "\023a=1", base::nullopt}, + {"0x14 starting an dictionary key", "\024a=1", base::nullopt}, + {"0x15 starting an dictionary key", "\025a=1", base::nullopt}, + {"0x16 starting an dictionary key", "\026a=1", base::nullopt}, + {"0x17 starting an dictionary key", "\027a=1", base::nullopt}, + {"0x18 starting an dictionary key", "\030a=1", base::nullopt}, + {"0x19 starting an dictionary key", "\031a=1", base::nullopt}, + {"0x1a starting an dictionary key", "\032a=1", base::nullopt}, + {"0x1b starting an dictionary key", "\033a=1", base::nullopt}, + {"0x1c starting an dictionary key", "\034a=1", base::nullopt}, + {"0x1d starting an dictionary key", "\035a=1", base::nullopt}, + {"0x1e starting an dictionary key", "\036a=1", base::nullopt}, + {"0x1f starting an dictionary key", "\037a=1", base::nullopt}, + {"0x20 starting an dictionary key", + " a=1", + {Dictionary{{{"a", {Integer(1), {}}}}}}, + "a=1"}, + {"0x21 starting an dictionary key", "!a=1", base::nullopt}, + {"0x22 starting an dictionary key", "\"a=1", base::nullopt}, + {"0x23 starting an dictionary key", "#a=1", base::nullopt}, + {"0x24 starting an dictionary key", "$a=1", base::nullopt}, + {"0x25 starting an dictionary key", "%a=1", base::nullopt}, + {"0x26 starting an dictionary key", "&a=1", base::nullopt}, + {"0x27 starting an dictionary key", "'a=1", base::nullopt}, + {"0x28 starting an dictionary key", "(a=1", base::nullopt}, + {"0x29 starting an dictionary key", ")a=1", base::nullopt}, + {"0x2b starting an dictionary key", "+a=1", base::nullopt}, + {"0x2c starting an dictionary key", ",a=1", base::nullopt}, + {"0x2d starting an dictionary key", "-a=1", base::nullopt}, + {"0x2e starting an dictionary key", ".a=1", base::nullopt}, + {"0x2f starting an dictionary key", "/a=1", base::nullopt}, + {"0x30 starting an dictionary key", "0a=1", base::nullopt}, + {"0x31 starting an dictionary key", "1a=1", base::nullopt}, + {"0x32 starting an dictionary key", "2a=1", base::nullopt}, + {"0x33 starting an dictionary key", "3a=1", base::nullopt}, + {"0x34 starting an dictionary key", "4a=1", base::nullopt}, + {"0x35 starting an dictionary key", "5a=1", base::nullopt}, + {"0x36 starting an dictionary key", "6a=1", base::nullopt}, + {"0x37 starting an dictionary key", "7a=1", base::nullopt}, + {"0x38 starting an dictionary key", "8a=1", base::nullopt}, + {"0x39 starting an dictionary key", "9a=1", base::nullopt}, + {"0x3a starting an dictionary key", ":a=1", base::nullopt}, + {"0x3b starting an dictionary key", ";a=1", base::nullopt}, + {"0x3c starting an dictionary key", "<a=1", base::nullopt}, + {"0x3d starting an dictionary key", "=a=1", base::nullopt}, + {"0x3e starting an dictionary key", ">a=1", base::nullopt}, + {"0x3f starting an dictionary key", "?a=1", base::nullopt}, + {"0x40 starting an dictionary key", "@a=1", base::nullopt}, + {"0x41 starting an dictionary key", "Aa=1", base::nullopt}, + {"0x42 starting an dictionary key", "Ba=1", base::nullopt}, + {"0x43 starting an dictionary key", "Ca=1", base::nullopt}, + {"0x44 starting an dictionary key", "Da=1", base::nullopt}, + {"0x45 starting an dictionary key", "Ea=1", base::nullopt}, + {"0x46 starting an dictionary key", "Fa=1", base::nullopt}, + {"0x47 starting an dictionary key", "Ga=1", base::nullopt}, + {"0x48 starting an dictionary key", "Ha=1", base::nullopt}, + {"0x49 starting an dictionary key", "Ia=1", base::nullopt}, + {"0x4a starting an dictionary key", "Ja=1", base::nullopt}, + {"0x4b starting an dictionary key", "Ka=1", base::nullopt}, + {"0x4c starting an dictionary key", "La=1", base::nullopt}, + {"0x4d starting an dictionary key", "Ma=1", base::nullopt}, + {"0x4e starting an dictionary key", "Na=1", base::nullopt}, + {"0x4f starting an dictionary key", "Oa=1", base::nullopt}, + {"0x50 starting an dictionary key", "Pa=1", base::nullopt}, + {"0x51 starting an dictionary key", "Qa=1", base::nullopt}, + {"0x52 starting an dictionary key", "Ra=1", base::nullopt}, + {"0x53 starting an dictionary key", "Sa=1", base::nullopt}, + {"0x54 starting an dictionary key", "Ta=1", base::nullopt}, + {"0x55 starting an dictionary key", "Ua=1", base::nullopt}, + {"0x56 starting an dictionary key", "Va=1", base::nullopt}, + {"0x57 starting an dictionary key", "Wa=1", base::nullopt}, + {"0x58 starting an dictionary key", "Xa=1", base::nullopt}, + {"0x59 starting an dictionary key", "Ya=1", base::nullopt}, + {"0x5a starting an dictionary key", "Za=1", base::nullopt}, + {"0x5b starting an dictionary key", "[a=1", base::nullopt}, + {"0x5c starting an dictionary key", "\\a=1", base::nullopt}, + {"0x5d starting an dictionary key", "]a=1", base::nullopt}, + {"0x5e starting an dictionary key", "^a=1", base::nullopt}, + {"0x5f starting an dictionary key", "_a=1", base::nullopt}, + {"0x60 starting an dictionary key", "`a=1", base::nullopt}, + {"0x61 starting an dictionary key", + "aa=1", + {Dictionary{{{"aa", {Integer(1), {}}}}}}}, + {"0x62 starting an dictionary key", + "ba=1", + {Dictionary{{{"ba", {Integer(1), {}}}}}}}, + {"0x63 starting an dictionary key", + "ca=1", + {Dictionary{{{"ca", {Integer(1), {}}}}}}}, + {"0x64 starting an dictionary key", + "da=1", + {Dictionary{{{"da", {Integer(1), {}}}}}}}, + {"0x65 starting an dictionary key", + "ea=1", + {Dictionary{{{"ea", {Integer(1), {}}}}}}}, + {"0x66 starting an dictionary key", + "fa=1", + {Dictionary{{{"fa", {Integer(1), {}}}}}}}, + {"0x67 starting an dictionary key", + "ga=1", + {Dictionary{{{"ga", {Integer(1), {}}}}}}}, + {"0x68 starting an dictionary key", + "ha=1", + {Dictionary{{{"ha", {Integer(1), {}}}}}}}, + {"0x69 starting an dictionary key", + "ia=1", + {Dictionary{{{"ia", {Integer(1), {}}}}}}}, + {"0x6a starting an dictionary key", + "ja=1", + {Dictionary{{{"ja", {Integer(1), {}}}}}}}, + {"0x6b starting an dictionary key", + "ka=1", + {Dictionary{{{"ka", {Integer(1), {}}}}}}}, + {"0x6c starting an dictionary key", + "la=1", + {Dictionary{{{"la", {Integer(1), {}}}}}}}, + {"0x6d starting an dictionary key", + "ma=1", + {Dictionary{{{"ma", {Integer(1), {}}}}}}}, + {"0x6e starting an dictionary key", + "na=1", + {Dictionary{{{"na", {Integer(1), {}}}}}}}, + {"0x6f starting an dictionary key", + "oa=1", + {Dictionary{{{"oa", {Integer(1), {}}}}}}}, + {"0x70 starting an dictionary key", + "pa=1", + {Dictionary{{{"pa", {Integer(1), {}}}}}}}, + {"0x71 starting an dictionary key", + "qa=1", + {Dictionary{{{"qa", {Integer(1), {}}}}}}}, + {"0x72 starting an dictionary key", + "ra=1", + {Dictionary{{{"ra", {Integer(1), {}}}}}}}, + {"0x73 starting an dictionary key", + "sa=1", + {Dictionary{{{"sa", {Integer(1), {}}}}}}}, + {"0x74 starting an dictionary key", + "ta=1", + {Dictionary{{{"ta", {Integer(1), {}}}}}}}, + {"0x75 starting an dictionary key", + "ua=1", + {Dictionary{{{"ua", {Integer(1), {}}}}}}}, + {"0x76 starting an dictionary key", + "va=1", + {Dictionary{{{"va", {Integer(1), {}}}}}}}, + {"0x77 starting an dictionary key", + "wa=1", + {Dictionary{{{"wa", {Integer(1), {}}}}}}}, + {"0x78 starting an dictionary key", + "xa=1", + {Dictionary{{{"xa", {Integer(1), {}}}}}}}, + {"0x79 starting an dictionary key", + "ya=1", + {Dictionary{{{"ya", {Integer(1), {}}}}}}}, + {"0x7a starting an dictionary key", + "za=1", + {Dictionary{{{"za", {Integer(1), {}}}}}}}, + {"0x7b starting an dictionary key", "{a=1", base::nullopt}, + {"0x7c starting an dictionary key", "|a=1", base::nullopt}, + {"0x7d starting an dictionary key", "}a=1", base::nullopt}, + {"0x7e starting an dictionary key", "~a=1", base::nullopt}, + {"0x7f starting an dictionary key", "\177a=1", base::nullopt}, + {"large dictionary", + "a0=1, a1=1, a2=1, a3=1, a4=1, a5=1, a6=1, a7=1, a8=1, a9=1, a10=1, " + "a11=1, a12=1, a13=1, a14=1, a15=1, a16=1, a17=1, a18=1, a19=1, a20=1, " + "a21=1, a22=1, a23=1, a24=1, a25=1, a26=1, a27=1, a28=1, a29=1, a30=1, " + "a31=1, a32=1, a33=1, a34=1, a35=1, a36=1, a37=1, a38=1, a39=1, a40=1, " + "a41=1, a42=1, a43=1, a44=1, a45=1, a46=1, a47=1, a48=1, a49=1, a50=1, " + "a51=1, a52=1, a53=1, a54=1, a55=1, a56=1, a57=1, a58=1, a59=1, a60=1, " + "a61=1, a62=1, a63=1, a64=1, a65=1, a66=1, a67=1, a68=1, a69=1, a70=1, " + "a71=1, a72=1, a73=1, a74=1, a75=1, a76=1, a77=1, a78=1, a79=1, a80=1, " + "a81=1, a82=1, a83=1, a84=1, a85=1, a86=1, a87=1, a88=1, a89=1, a90=1, " + "a91=1, a92=1, a93=1, a94=1, a95=1, a96=1, a97=1, a98=1, a99=1, a100=1, " + "a101=1, a102=1, a103=1, a104=1, a105=1, a106=1, a107=1, a108=1, a109=1, " + "a110=1, a111=1, a112=1, a113=1, a114=1, a115=1, a116=1, a117=1, a118=1, " + "a119=1, a120=1, a121=1, a122=1, a123=1, a124=1, a125=1, a126=1, a127=1, " + "a128=1, a129=1, a130=1, a131=1, a132=1, a133=1, a134=1, a135=1, a136=1, " + "a137=1, a138=1, a139=1, a140=1, a141=1, a142=1, a143=1, a144=1, a145=1, " + "a146=1, a147=1, a148=1, a149=1, a150=1, a151=1, a152=1, a153=1, a154=1, " + "a155=1, a156=1, a157=1, a158=1, a159=1, a160=1, a161=1, a162=1, a163=1, " + "a164=1, a165=1, a166=1, a167=1, a168=1, a169=1, a170=1, a171=1, a172=1, " + "a173=1, a174=1, a175=1, a176=1, a177=1, a178=1, a179=1, a180=1, a181=1, " + "a182=1, a183=1, a184=1, a185=1, a186=1, a187=1, a188=1, a189=1, a190=1, " + "a191=1, a192=1, a193=1, a194=1, a195=1, a196=1, a197=1, a198=1, a199=1, " + "a200=1, a201=1, a202=1, a203=1, a204=1, a205=1, a206=1, a207=1, a208=1, " + "a209=1, a210=1, a211=1, a212=1, a213=1, a214=1, a215=1, a216=1, a217=1, " + "a218=1, a219=1, a220=1, a221=1, a222=1, a223=1, a224=1, a225=1, a226=1, " + "a227=1, a228=1, a229=1, a230=1, a231=1, a232=1, a233=1, a234=1, a235=1, " + "a236=1, a237=1, a238=1, a239=1, a240=1, a241=1, a242=1, a243=1, a244=1, " + "a245=1, a246=1, a247=1, a248=1, a249=1, a250=1, a251=1, a252=1, a253=1, " + "a254=1, a255=1, a256=1, a257=1, a258=1, a259=1, a260=1, a261=1, a262=1, " + "a263=1, a264=1, a265=1, a266=1, a267=1, a268=1, a269=1, a270=1, a271=1, " + "a272=1, a273=1, a274=1, a275=1, a276=1, a277=1, a278=1, a279=1, a280=1, " + "a281=1, a282=1, a283=1, a284=1, a285=1, a286=1, a287=1, a288=1, a289=1, " + "a290=1, a291=1, a292=1, a293=1, a294=1, a295=1, a296=1, a297=1, a298=1, " + "a299=1, a300=1, a301=1, a302=1, a303=1, a304=1, a305=1, a306=1, a307=1, " + "a308=1, a309=1, a310=1, a311=1, a312=1, a313=1, a314=1, a315=1, a316=1, " + "a317=1, a318=1, a319=1, a320=1, a321=1, a322=1, a323=1, a324=1, a325=1, " + "a326=1, a327=1, a328=1, a329=1, a330=1, a331=1, a332=1, a333=1, a334=1, " + "a335=1, a336=1, a337=1, a338=1, a339=1, a340=1, a341=1, a342=1, a343=1, " + "a344=1, a345=1, a346=1, a347=1, a348=1, a349=1, a350=1, a351=1, a352=1, " + "a353=1, a354=1, a355=1, a356=1, a357=1, a358=1, a359=1, a360=1, a361=1, " + "a362=1, a363=1, a364=1, a365=1, a366=1, a367=1, a368=1, a369=1, a370=1, " + "a371=1, a372=1, a373=1, a374=1, a375=1, a376=1, a377=1, a378=1, a379=1, " + "a380=1, a381=1, a382=1, a383=1, a384=1, a385=1, a386=1, a387=1, a388=1, " + "a389=1, a390=1, a391=1, a392=1, a393=1, a394=1, a395=1, a396=1, a397=1, " + "a398=1, a399=1, a400=1, a401=1, a402=1, a403=1, a404=1, a405=1, a406=1, " + "a407=1, a408=1, a409=1, a410=1, a411=1, a412=1, a413=1, a414=1, a415=1, " + "a416=1, a417=1, a418=1, a419=1, a420=1, a421=1, a422=1, a423=1, a424=1, " + "a425=1, a426=1, a427=1, a428=1, a429=1, a430=1, a431=1, a432=1, a433=1, " + "a434=1, a435=1, a436=1, a437=1, a438=1, a439=1, a440=1, a441=1, a442=1, " + "a443=1, a444=1, a445=1, a446=1, a447=1, a448=1, a449=1, a450=1, a451=1, " + "a452=1, a453=1, a454=1, a455=1, a456=1, a457=1, a458=1, a459=1, a460=1, " + "a461=1, a462=1, a463=1, a464=1, a465=1, a466=1, a467=1, a468=1, a469=1, " + "a470=1, a471=1, a472=1, a473=1, a474=1, a475=1, a476=1, a477=1, a478=1, " + "a479=1, a480=1, a481=1, a482=1, a483=1, a484=1, a485=1, a486=1, a487=1, " + "a488=1, a489=1, a490=1, a491=1, a492=1, a493=1, a494=1, a495=1, a496=1, " + "a497=1, a498=1, a499=1, a500=1, a501=1, a502=1, a503=1, a504=1, a505=1, " + "a506=1, a507=1, a508=1, a509=1, a510=1, a511=1, a512=1, a513=1, a514=1, " + "a515=1, a516=1, a517=1, a518=1, a519=1, a520=1, a521=1, a522=1, a523=1, " + "a524=1, a525=1, a526=1, a527=1, a528=1, a529=1, a530=1, a531=1, a532=1, " + "a533=1, a534=1, a535=1, a536=1, a537=1, a538=1, a539=1, a540=1, a541=1, " + "a542=1, a543=1, a544=1, a545=1, a546=1, a547=1, a548=1, a549=1, a550=1, " + "a551=1, a552=1, a553=1, a554=1, a555=1, a556=1, a557=1, a558=1, a559=1, " + "a560=1, a561=1, a562=1, a563=1, a564=1, a565=1, a566=1, a567=1, a568=1, " + "a569=1, a570=1, a571=1, a572=1, a573=1, a574=1, a575=1, a576=1, a577=1, " + "a578=1, a579=1, a580=1, a581=1, a582=1, a583=1, a584=1, a585=1, a586=1, " + "a587=1, a588=1, a589=1, a590=1, a591=1, a592=1, a593=1, a594=1, a595=1, " + "a596=1, a597=1, a598=1, a599=1, a600=1, a601=1, a602=1, a603=1, a604=1, " + "a605=1, a606=1, a607=1, a608=1, a609=1, a610=1, a611=1, a612=1, a613=1, " + "a614=1, a615=1, a616=1, a617=1, a618=1, a619=1, a620=1, a621=1, a622=1, " + "a623=1, a624=1, a625=1, a626=1, a627=1, a628=1, a629=1, a630=1, a631=1, " + "a632=1, a633=1, a634=1, a635=1, a636=1, a637=1, a638=1, a639=1, a640=1, " + "a641=1, a642=1, a643=1, a644=1, a645=1, a646=1, a647=1, a648=1, a649=1, " + "a650=1, a651=1, a652=1, a653=1, a654=1, a655=1, a656=1, a657=1, a658=1, " + "a659=1, a660=1, a661=1, a662=1, a663=1, a664=1, a665=1, a666=1, a667=1, " + "a668=1, a669=1, a670=1, a671=1, a672=1, a673=1, a674=1, a675=1, a676=1, " + "a677=1, a678=1, a679=1, a680=1, a681=1, a682=1, a683=1, a684=1, a685=1, " + "a686=1, a687=1, a688=1, a689=1, a690=1, a691=1, a692=1, a693=1, a694=1, " + "a695=1, a696=1, a697=1, a698=1, a699=1, a700=1, a701=1, a702=1, a703=1, " + "a704=1, a705=1, a706=1, a707=1, a708=1, a709=1, a710=1, a711=1, a712=1, " + "a713=1, a714=1, a715=1, a716=1, a717=1, a718=1, a719=1, a720=1, a721=1, " + "a722=1, a723=1, a724=1, a725=1, a726=1, a727=1, a728=1, a729=1, a730=1, " + "a731=1, a732=1, a733=1, a734=1, a735=1, a736=1, a737=1, a738=1, a739=1, " + "a740=1, a741=1, a742=1, a743=1, a744=1, a745=1, a746=1, a747=1, a748=1, " + "a749=1, a750=1, a751=1, a752=1, a753=1, a754=1, a755=1, a756=1, a757=1, " + "a758=1, a759=1, a760=1, a761=1, a762=1, a763=1, a764=1, a765=1, a766=1, " + "a767=1, a768=1, a769=1, a770=1, a771=1, a772=1, a773=1, a774=1, a775=1, " + "a776=1, a777=1, a778=1, a779=1, a780=1, a781=1, a782=1, a783=1, a784=1, " + "a785=1, a786=1, a787=1, a788=1, a789=1, a790=1, a791=1, a792=1, a793=1, " + "a794=1, a795=1, a796=1, a797=1, a798=1, a799=1, a800=1, a801=1, a802=1, " + "a803=1, a804=1, a805=1, a806=1, a807=1, a808=1, a809=1, a810=1, a811=1, " + "a812=1, a813=1, a814=1, a815=1, a816=1, a817=1, a818=1, a819=1, a820=1, " + "a821=1, a822=1, a823=1, a824=1, a825=1, a826=1, a827=1, a828=1, a829=1, " + "a830=1, a831=1, a832=1, a833=1, a834=1, a835=1, a836=1, a837=1, a838=1, " + "a839=1, a840=1, a841=1, a842=1, a843=1, a844=1, a845=1, a846=1, a847=1, " + "a848=1, a849=1, a850=1, a851=1, a852=1, a853=1, a854=1, a855=1, a856=1, " + "a857=1, a858=1, a859=1, a860=1, a861=1, a862=1, a863=1, a864=1, a865=1, " + "a866=1, a867=1, a868=1, a869=1, a870=1, a871=1, a872=1, a873=1, a874=1, " + "a875=1, a876=1, a877=1, a878=1, a879=1, a880=1, a881=1, a882=1, a883=1, " + "a884=1, a885=1, a886=1, a887=1, a888=1, a889=1, a890=1, a891=1, a892=1, " + "a893=1, a894=1, a895=1, a896=1, a897=1, a898=1, a899=1, a900=1, a901=1, " + "a902=1, a903=1, a904=1, a905=1, a906=1, a907=1, a908=1, a909=1, a910=1, " + "a911=1, a912=1, a913=1, a914=1, a915=1, a916=1, a917=1, a918=1, a919=1, " + "a920=1, a921=1, a922=1, a923=1, a924=1, a925=1, a926=1, a927=1, a928=1, " + "a929=1, a930=1, a931=1, a932=1, a933=1, a934=1, a935=1, a936=1, a937=1, " + "a938=1, a939=1, a940=1, a941=1, a942=1, a943=1, a944=1, a945=1, a946=1, " + "a947=1, a948=1, a949=1, a950=1, a951=1, a952=1, a953=1, a954=1, a955=1, " + "a956=1, a957=1, a958=1, a959=1, a960=1, a961=1, a962=1, a963=1, a964=1, " + "a965=1, a966=1, a967=1, a968=1, a969=1, a970=1, a971=1, a972=1, a973=1, " + "a974=1, a975=1, a976=1, a977=1, a978=1, a979=1, a980=1, a981=1, a982=1, " + "a983=1, a984=1, a985=1, a986=1, a987=1, a988=1, a989=1, a990=1, a991=1, " + "a992=1, a993=1, a994=1, a995=1, a996=1, a997=1, a998=1, a999=1, a1000=1, " + "a1001=1, a1002=1, a1003=1, a1004=1, a1005=1, a1006=1, a1007=1, a1008=1, " + "a1009=1, a1010=1, a1011=1, a1012=1, a1013=1, a1014=1, a1015=1, a1016=1, " + "a1017=1, a1018=1, a1019=1, a1020=1, a1021=1, a1022=1, a1023=1", + {Dictionary{{{"a0", {Integer(1), {}}}, {"a1", {Integer(1), {}}}, + {"a2", {Integer(1), {}}}, {"a3", {Integer(1), {}}}, + {"a4", {Integer(1), {}}}, {"a5", {Integer(1), {}}}, + {"a6", {Integer(1), {}}}, {"a7", {Integer(1), {}}}, + {"a8", {Integer(1), {}}}, {"a9", {Integer(1), {}}}, + {"a10", {Integer(1), {}}}, {"a11", {Integer(1), {}}}, + {"a12", {Integer(1), {}}}, {"a13", {Integer(1), {}}}, + {"a14", {Integer(1), {}}}, {"a15", {Integer(1), {}}}, + {"a16", {Integer(1), {}}}, {"a17", {Integer(1), {}}}, + {"a18", {Integer(1), {}}}, {"a19", {Integer(1), {}}}, + {"a20", {Integer(1), {}}}, {"a21", {Integer(1), {}}}, + {"a22", {Integer(1), {}}}, {"a23", {Integer(1), {}}}, + {"a24", {Integer(1), {}}}, {"a25", {Integer(1), {}}}, + {"a26", {Integer(1), {}}}, {"a27", {Integer(1), {}}}, + {"a28", {Integer(1), {}}}, {"a29", {Integer(1), {}}}, + {"a30", {Integer(1), {}}}, {"a31", {Integer(1), {}}}, + {"a32", {Integer(1), {}}}, {"a33", {Integer(1), {}}}, + {"a34", {Integer(1), {}}}, {"a35", {Integer(1), {}}}, + {"a36", {Integer(1), {}}}, {"a37", {Integer(1), {}}}, + {"a38", {Integer(1), {}}}, {"a39", {Integer(1), {}}}, + {"a40", {Integer(1), {}}}, {"a41", {Integer(1), {}}}, + {"a42", {Integer(1), {}}}, {"a43", {Integer(1), {}}}, + {"a44", {Integer(1), {}}}, {"a45", {Integer(1), {}}}, + {"a46", {Integer(1), {}}}, {"a47", {Integer(1), {}}}, + {"a48", {Integer(1), {}}}, {"a49", {Integer(1), {}}}, + {"a50", {Integer(1), {}}}, {"a51", {Integer(1), {}}}, + {"a52", {Integer(1), {}}}, {"a53", {Integer(1), {}}}, + {"a54", {Integer(1), {}}}, {"a55", {Integer(1), {}}}, + {"a56", {Integer(1), {}}}, {"a57", {Integer(1), {}}}, + {"a58", {Integer(1), {}}}, {"a59", {Integer(1), {}}}, + {"a60", {Integer(1), {}}}, {"a61", {Integer(1), {}}}, + {"a62", {Integer(1), {}}}, {"a63", {Integer(1), {}}}, + {"a64", {Integer(1), {}}}, {"a65", {Integer(1), {}}}, + {"a66", {Integer(1), {}}}, {"a67", {Integer(1), {}}}, + {"a68", {Integer(1), {}}}, {"a69", {Integer(1), {}}}, + {"a70", {Integer(1), {}}}, {"a71", {Integer(1), {}}}, + {"a72", {Integer(1), {}}}, {"a73", {Integer(1), {}}}, + {"a74", {Integer(1), {}}}, {"a75", {Integer(1), {}}}, + {"a76", {Integer(1), {}}}, {"a77", {Integer(1), {}}}, + {"a78", {Integer(1), {}}}, {"a79", {Integer(1), {}}}, + {"a80", {Integer(1), {}}}, {"a81", {Integer(1), {}}}, + {"a82", {Integer(1), {}}}, {"a83", {Integer(1), {}}}, + {"a84", {Integer(1), {}}}, {"a85", {Integer(1), {}}}, + {"a86", {Integer(1), {}}}, {"a87", {Integer(1), {}}}, + {"a88", {Integer(1), {}}}, {"a89", {Integer(1), {}}}, + {"a90", {Integer(1), {}}}, {"a91", {Integer(1), {}}}, + {"a92", {Integer(1), {}}}, {"a93", {Integer(1), {}}}, + {"a94", {Integer(1), {}}}, {"a95", {Integer(1), {}}}, + {"a96", {Integer(1), {}}}, {"a97", {Integer(1), {}}}, + {"a98", {Integer(1), {}}}, {"a99", {Integer(1), {}}}, + {"a100", {Integer(1), {}}}, {"a101", {Integer(1), {}}}, + {"a102", {Integer(1), {}}}, {"a103", {Integer(1), {}}}, + {"a104", {Integer(1), {}}}, {"a105", {Integer(1), {}}}, + {"a106", {Integer(1), {}}}, {"a107", {Integer(1), {}}}, + {"a108", {Integer(1), {}}}, {"a109", {Integer(1), {}}}, + {"a110", {Integer(1), {}}}, {"a111", {Integer(1), {}}}, + {"a112", {Integer(1), {}}}, {"a113", {Integer(1), {}}}, + {"a114", {Integer(1), {}}}, {"a115", {Integer(1), {}}}, + {"a116", {Integer(1), {}}}, {"a117", {Integer(1), {}}}, + {"a118", {Integer(1), {}}}, {"a119", {Integer(1), {}}}, + {"a120", {Integer(1), {}}}, {"a121", {Integer(1), {}}}, + {"a122", {Integer(1), {}}}, {"a123", {Integer(1), {}}}, + {"a124", {Integer(1), {}}}, {"a125", {Integer(1), {}}}, + {"a126", {Integer(1), {}}}, {"a127", {Integer(1), {}}}, + {"a128", {Integer(1), {}}}, {"a129", {Integer(1), {}}}, + {"a130", {Integer(1), {}}}, {"a131", {Integer(1), {}}}, + {"a132", {Integer(1), {}}}, {"a133", {Integer(1), {}}}, + {"a134", {Integer(1), {}}}, {"a135", {Integer(1), {}}}, + {"a136", {Integer(1), {}}}, {"a137", {Integer(1), {}}}, + {"a138", {Integer(1), {}}}, {"a139", {Integer(1), {}}}, + {"a140", {Integer(1), {}}}, {"a141", {Integer(1), {}}}, + {"a142", {Integer(1), {}}}, {"a143", {Integer(1), {}}}, + {"a144", {Integer(1), {}}}, {"a145", {Integer(1), {}}}, + {"a146", {Integer(1), {}}}, {"a147", {Integer(1), {}}}, + {"a148", {Integer(1), {}}}, {"a149", {Integer(1), {}}}, + {"a150", {Integer(1), {}}}, {"a151", {Integer(1), {}}}, + {"a152", {Integer(1), {}}}, {"a153", {Integer(1), {}}}, + {"a154", {Integer(1), {}}}, {"a155", {Integer(1), {}}}, + {"a156", {Integer(1), {}}}, {"a157", {Integer(1), {}}}, + {"a158", {Integer(1), {}}}, {"a159", {Integer(1), {}}}, + {"a160", {Integer(1), {}}}, {"a161", {Integer(1), {}}}, + {"a162", {Integer(1), {}}}, {"a163", {Integer(1), {}}}, + {"a164", {Integer(1), {}}}, {"a165", {Integer(1), {}}}, + {"a166", {Integer(1), {}}}, {"a167", {Integer(1), {}}}, + {"a168", {Integer(1), {}}}, {"a169", {Integer(1), {}}}, + {"a170", {Integer(1), {}}}, {"a171", {Integer(1), {}}}, + {"a172", {Integer(1), {}}}, {"a173", {Integer(1), {}}}, + {"a174", {Integer(1), {}}}, {"a175", {Integer(1), {}}}, + {"a176", {Integer(1), {}}}, {"a177", {Integer(1), {}}}, + {"a178", {Integer(1), {}}}, {"a179", {Integer(1), {}}}, + {"a180", {Integer(1), {}}}, {"a181", {Integer(1), {}}}, + {"a182", {Integer(1), {}}}, {"a183", {Integer(1), {}}}, + {"a184", {Integer(1), {}}}, {"a185", {Integer(1), {}}}, + {"a186", {Integer(1), {}}}, {"a187", {Integer(1), {}}}, + {"a188", {Integer(1), {}}}, {"a189", {Integer(1), {}}}, + {"a190", {Integer(1), {}}}, {"a191", {Integer(1), {}}}, + {"a192", {Integer(1), {}}}, {"a193", {Integer(1), {}}}, + {"a194", {Integer(1), {}}}, {"a195", {Integer(1), {}}}, + {"a196", {Integer(1), {}}}, {"a197", {Integer(1), {}}}, + {"a198", {Integer(1), {}}}, {"a199", {Integer(1), {}}}, + {"a200", {Integer(1), {}}}, {"a201", {Integer(1), {}}}, + {"a202", {Integer(1), {}}}, {"a203", {Integer(1), {}}}, + {"a204", {Integer(1), {}}}, {"a205", {Integer(1), {}}}, + {"a206", {Integer(1), {}}}, {"a207", {Integer(1), {}}}, + {"a208", {Integer(1), {}}}, {"a209", {Integer(1), {}}}, + {"a210", {Integer(1), {}}}, {"a211", {Integer(1), {}}}, + {"a212", {Integer(1), {}}}, {"a213", {Integer(1), {}}}, + {"a214", {Integer(1), {}}}, {"a215", {Integer(1), {}}}, + {"a216", {Integer(1), {}}}, {"a217", {Integer(1), {}}}, + {"a218", {Integer(1), {}}}, {"a219", {Integer(1), {}}}, + {"a220", {Integer(1), {}}}, {"a221", {Integer(1), {}}}, + {"a222", {Integer(1), {}}}, {"a223", {Integer(1), {}}}, + {"a224", {Integer(1), {}}}, {"a225", {Integer(1), {}}}, + {"a226", {Integer(1), {}}}, {"a227", {Integer(1), {}}}, + {"a228", {Integer(1), {}}}, {"a229", {Integer(1), {}}}, + {"a230", {Integer(1), {}}}, {"a231", {Integer(1), {}}}, + {"a232", {Integer(1), {}}}, {"a233", {Integer(1), {}}}, + {"a234", {Integer(1), {}}}, {"a235", {Integer(1), {}}}, + {"a236", {Integer(1), {}}}, {"a237", {Integer(1), {}}}, + {"a238", {Integer(1), {}}}, {"a239", {Integer(1), {}}}, + {"a240", {Integer(1), {}}}, {"a241", {Integer(1), {}}}, + {"a242", {Integer(1), {}}}, {"a243", {Integer(1), {}}}, + {"a244", {Integer(1), {}}}, {"a245", {Integer(1), {}}}, + {"a246", {Integer(1), {}}}, {"a247", {Integer(1), {}}}, + {"a248", {Integer(1), {}}}, {"a249", {Integer(1), {}}}, + {"a250", {Integer(1), {}}}, {"a251", {Integer(1), {}}}, + {"a252", {Integer(1), {}}}, {"a253", {Integer(1), {}}}, + {"a254", {Integer(1), {}}}, {"a255", {Integer(1), {}}}, + {"a256", {Integer(1), {}}}, {"a257", {Integer(1), {}}}, + {"a258", {Integer(1), {}}}, {"a259", {Integer(1), {}}}, + {"a260", {Integer(1), {}}}, {"a261", {Integer(1), {}}}, + {"a262", {Integer(1), {}}}, {"a263", {Integer(1), {}}}, + {"a264", {Integer(1), {}}}, {"a265", {Integer(1), {}}}, + {"a266", {Integer(1), {}}}, {"a267", {Integer(1), {}}}, + {"a268", {Integer(1), {}}}, {"a269", {Integer(1), {}}}, + {"a270", {Integer(1), {}}}, {"a271", {Integer(1), {}}}, + {"a272", {Integer(1), {}}}, {"a273", {Integer(1), {}}}, + {"a274", {Integer(1), {}}}, {"a275", {Integer(1), {}}}, + {"a276", {Integer(1), {}}}, {"a277", {Integer(1), {}}}, + {"a278", {Integer(1), {}}}, {"a279", {Integer(1), {}}}, + {"a280", {Integer(1), {}}}, {"a281", {Integer(1), {}}}, + {"a282", {Integer(1), {}}}, {"a283", {Integer(1), {}}}, + {"a284", {Integer(1), {}}}, {"a285", {Integer(1), {}}}, + {"a286", {Integer(1), {}}}, {"a287", {Integer(1), {}}}, + {"a288", {Integer(1), {}}}, {"a289", {Integer(1), {}}}, + {"a290", {Integer(1), {}}}, {"a291", {Integer(1), {}}}, + {"a292", {Integer(1), {}}}, {"a293", {Integer(1), {}}}, + {"a294", {Integer(1), {}}}, {"a295", {Integer(1), {}}}, + {"a296", {Integer(1), {}}}, {"a297", {Integer(1), {}}}, + {"a298", {Integer(1), {}}}, {"a299", {Integer(1), {}}}, + {"a300", {Integer(1), {}}}, {"a301", {Integer(1), {}}}, + {"a302", {Integer(1), {}}}, {"a303", {Integer(1), {}}}, + {"a304", {Integer(1), {}}}, {"a305", {Integer(1), {}}}, + {"a306", {Integer(1), {}}}, {"a307", {Integer(1), {}}}, + {"a308", {Integer(1), {}}}, {"a309", {Integer(1), {}}}, + {"a310", {Integer(1), {}}}, {"a311", {Integer(1), {}}}, + {"a312", {Integer(1), {}}}, {"a313", {Integer(1), {}}}, + {"a314", {Integer(1), {}}}, {"a315", {Integer(1), {}}}, + {"a316", {Integer(1), {}}}, {"a317", {Integer(1), {}}}, + {"a318", {Integer(1), {}}}, {"a319", {Integer(1), {}}}, + {"a320", {Integer(1), {}}}, {"a321", {Integer(1), {}}}, + {"a322", {Integer(1), {}}}, {"a323", {Integer(1), {}}}, + {"a324", {Integer(1), {}}}, {"a325", {Integer(1), {}}}, + {"a326", {Integer(1), {}}}, {"a327", {Integer(1), {}}}, + {"a328", {Integer(1), {}}}, {"a329", {Integer(1), {}}}, + {"a330", {Integer(1), {}}}, {"a331", {Integer(1), {}}}, + {"a332", {Integer(1), {}}}, {"a333", {Integer(1), {}}}, + {"a334", {Integer(1), {}}}, {"a335", {Integer(1), {}}}, + {"a336", {Integer(1), {}}}, {"a337", {Integer(1), {}}}, + {"a338", {Integer(1), {}}}, {"a339", {Integer(1), {}}}, + {"a340", {Integer(1), {}}}, {"a341", {Integer(1), {}}}, + {"a342", {Integer(1), {}}}, {"a343", {Integer(1), {}}}, + {"a344", {Integer(1), {}}}, {"a345", {Integer(1), {}}}, + {"a346", {Integer(1), {}}}, {"a347", {Integer(1), {}}}, + {"a348", {Integer(1), {}}}, {"a349", {Integer(1), {}}}, + {"a350", {Integer(1), {}}}, {"a351", {Integer(1), {}}}, + {"a352", {Integer(1), {}}}, {"a353", {Integer(1), {}}}, + {"a354", {Integer(1), {}}}, {"a355", {Integer(1), {}}}, + {"a356", {Integer(1), {}}}, {"a357", {Integer(1), {}}}, + {"a358", {Integer(1), {}}}, {"a359", {Integer(1), {}}}, + {"a360", {Integer(1), {}}}, {"a361", {Integer(1), {}}}, + {"a362", {Integer(1), {}}}, {"a363", {Integer(1), {}}}, + {"a364", {Integer(1), {}}}, {"a365", {Integer(1), {}}}, + {"a366", {Integer(1), {}}}, {"a367", {Integer(1), {}}}, + {"a368", {Integer(1), {}}}, {"a369", {Integer(1), {}}}, + {"a370", {Integer(1), {}}}, {"a371", {Integer(1), {}}}, + {"a372", {Integer(1), {}}}, {"a373", {Integer(1), {}}}, + {"a374", {Integer(1), {}}}, {"a375", {Integer(1), {}}}, + {"a376", {Integer(1), {}}}, {"a377", {Integer(1), {}}}, + {"a378", {Integer(1), {}}}, {"a379", {Integer(1), {}}}, + {"a380", {Integer(1), {}}}, {"a381", {Integer(1), {}}}, + {"a382", {Integer(1), {}}}, {"a383", {Integer(1), {}}}, + {"a384", {Integer(1), {}}}, {"a385", {Integer(1), {}}}, + {"a386", {Integer(1), {}}}, {"a387", {Integer(1), {}}}, + {"a388", {Integer(1), {}}}, {"a389", {Integer(1), {}}}, + {"a390", {Integer(1), {}}}, {"a391", {Integer(1), {}}}, + {"a392", {Integer(1), {}}}, {"a393", {Integer(1), {}}}, + {"a394", {Integer(1), {}}}, {"a395", {Integer(1), {}}}, + {"a396", {Integer(1), {}}}, {"a397", {Integer(1), {}}}, + {"a398", {Integer(1), {}}}, {"a399", {Integer(1), {}}}, + {"a400", {Integer(1), {}}}, {"a401", {Integer(1), {}}}, + {"a402", {Integer(1), {}}}, {"a403", {Integer(1), {}}}, + {"a404", {Integer(1), {}}}, {"a405", {Integer(1), {}}}, + {"a406", {Integer(1), {}}}, {"a407", {Integer(1), {}}}, + {"a408", {Integer(1), {}}}, {"a409", {Integer(1), {}}}, + {"a410", {Integer(1), {}}}, {"a411", {Integer(1), {}}}, + {"a412", {Integer(1), {}}}, {"a413", {Integer(1), {}}}, + {"a414", {Integer(1), {}}}, {"a415", {Integer(1), {}}}, + {"a416", {Integer(1), {}}}, {"a417", {Integer(1), {}}}, + {"a418", {Integer(1), {}}}, {"a419", {Integer(1), {}}}, + {"a420", {Integer(1), {}}}, {"a421", {Integer(1), {}}}, + {"a422", {Integer(1), {}}}, {"a423", {Integer(1), {}}}, + {"a424", {Integer(1), {}}}, {"a425", {Integer(1), {}}}, + {"a426", {Integer(1), {}}}, {"a427", {Integer(1), {}}}, + {"a428", {Integer(1), {}}}, {"a429", {Integer(1), {}}}, + {"a430", {Integer(1), {}}}, {"a431", {Integer(1), {}}}, + {"a432", {Integer(1), {}}}, {"a433", {Integer(1), {}}}, + {"a434", {Integer(1), {}}}, {"a435", {Integer(1), {}}}, + {"a436", {Integer(1), {}}}, {"a437", {Integer(1), {}}}, + {"a438", {Integer(1), {}}}, {"a439", {Integer(1), {}}}, + {"a440", {Integer(1), {}}}, {"a441", {Integer(1), {}}}, + {"a442", {Integer(1), {}}}, {"a443", {Integer(1), {}}}, + {"a444", {Integer(1), {}}}, {"a445", {Integer(1), {}}}, + {"a446", {Integer(1), {}}}, {"a447", {Integer(1), {}}}, + {"a448", {Integer(1), {}}}, {"a449", {Integer(1), {}}}, + {"a450", {Integer(1), {}}}, {"a451", {Integer(1), {}}}, + {"a452", {Integer(1), {}}}, {"a453", {Integer(1), {}}}, + {"a454", {Integer(1), {}}}, {"a455", {Integer(1), {}}}, + {"a456", {Integer(1), {}}}, {"a457", {Integer(1), {}}}, + {"a458", {Integer(1), {}}}, {"a459", {Integer(1), {}}}, + {"a460", {Integer(1), {}}}, {"a461", {Integer(1), {}}}, + {"a462", {Integer(1), {}}}, {"a463", {Integer(1), {}}}, + {"a464", {Integer(1), {}}}, {"a465", {Integer(1), {}}}, + {"a466", {Integer(1), {}}}, {"a467", {Integer(1), {}}}, + {"a468", {Integer(1), {}}}, {"a469", {Integer(1), {}}}, + {"a470", {Integer(1), {}}}, {"a471", {Integer(1), {}}}, + {"a472", {Integer(1), {}}}, {"a473", {Integer(1), {}}}, + {"a474", {Integer(1), {}}}, {"a475", {Integer(1), {}}}, + {"a476", {Integer(1), {}}}, {"a477", {Integer(1), {}}}, + {"a478", {Integer(1), {}}}, {"a479", {Integer(1), {}}}, + {"a480", {Integer(1), {}}}, {"a481", {Integer(1), {}}}, + {"a482", {Integer(1), {}}}, {"a483", {Integer(1), {}}}, + {"a484", {Integer(1), {}}}, {"a485", {Integer(1), {}}}, + {"a486", {Integer(1), {}}}, {"a487", {Integer(1), {}}}, + {"a488", {Integer(1), {}}}, {"a489", {Integer(1), {}}}, + {"a490", {Integer(1), {}}}, {"a491", {Integer(1), {}}}, + {"a492", {Integer(1), {}}}, {"a493", {Integer(1), {}}}, + {"a494", {Integer(1), {}}}, {"a495", {Integer(1), {}}}, + {"a496", {Integer(1), {}}}, {"a497", {Integer(1), {}}}, + {"a498", {Integer(1), {}}}, {"a499", {Integer(1), {}}}, + {"a500", {Integer(1), {}}}, {"a501", {Integer(1), {}}}, + {"a502", {Integer(1), {}}}, {"a503", {Integer(1), {}}}, + {"a504", {Integer(1), {}}}, {"a505", {Integer(1), {}}}, + {"a506", {Integer(1), {}}}, {"a507", {Integer(1), {}}}, + {"a508", {Integer(1), {}}}, {"a509", {Integer(1), {}}}, + {"a510", {Integer(1), {}}}, {"a511", {Integer(1), {}}}, + {"a512", {Integer(1), {}}}, {"a513", {Integer(1), {}}}, + {"a514", {Integer(1), {}}}, {"a515", {Integer(1), {}}}, + {"a516", {Integer(1), {}}}, {"a517", {Integer(1), {}}}, + {"a518", {Integer(1), {}}}, {"a519", {Integer(1), {}}}, + {"a520", {Integer(1), {}}}, {"a521", {Integer(1), {}}}, + {"a522", {Integer(1), {}}}, {"a523", {Integer(1), {}}}, + {"a524", {Integer(1), {}}}, {"a525", {Integer(1), {}}}, + {"a526", {Integer(1), {}}}, {"a527", {Integer(1), {}}}, + {"a528", {Integer(1), {}}}, {"a529", {Integer(1), {}}}, + {"a530", {Integer(1), {}}}, {"a531", {Integer(1), {}}}, + {"a532", {Integer(1), {}}}, {"a533", {Integer(1), {}}}, + {"a534", {Integer(1), {}}}, {"a535", {Integer(1), {}}}, + {"a536", {Integer(1), {}}}, {"a537", {Integer(1), {}}}, + {"a538", {Integer(1), {}}}, {"a539", {Integer(1), {}}}, + {"a540", {Integer(1), {}}}, {"a541", {Integer(1), {}}}, + {"a542", {Integer(1), {}}}, {"a543", {Integer(1), {}}}, + {"a544", {Integer(1), {}}}, {"a545", {Integer(1), {}}}, + {"a546", {Integer(1), {}}}, {"a547", {Integer(1), {}}}, + {"a548", {Integer(1), {}}}, {"a549", {Integer(1), {}}}, + {"a550", {Integer(1), {}}}, {"a551", {Integer(1), {}}}, + {"a552", {Integer(1), {}}}, {"a553", {Integer(1), {}}}, + {"a554", {Integer(1), {}}}, {"a555", {Integer(1), {}}}, + {"a556", {Integer(1), {}}}, {"a557", {Integer(1), {}}}, + {"a558", {Integer(1), {}}}, {"a559", {Integer(1), {}}}, + {"a560", {Integer(1), {}}}, {"a561", {Integer(1), {}}}, + {"a562", {Integer(1), {}}}, {"a563", {Integer(1), {}}}, + {"a564", {Integer(1), {}}}, {"a565", {Integer(1), {}}}, + {"a566", {Integer(1), {}}}, {"a567", {Integer(1), {}}}, + {"a568", {Integer(1), {}}}, {"a569", {Integer(1), {}}}, + {"a570", {Integer(1), {}}}, {"a571", {Integer(1), {}}}, + {"a572", {Integer(1), {}}}, {"a573", {Integer(1), {}}}, + {"a574", {Integer(1), {}}}, {"a575", {Integer(1), {}}}, + {"a576", {Integer(1), {}}}, {"a577", {Integer(1), {}}}, + {"a578", {Integer(1), {}}}, {"a579", {Integer(1), {}}}, + {"a580", {Integer(1), {}}}, {"a581", {Integer(1), {}}}, + {"a582", {Integer(1), {}}}, {"a583", {Integer(1), {}}}, + {"a584", {Integer(1), {}}}, {"a585", {Integer(1), {}}}, + {"a586", {Integer(1), {}}}, {"a587", {Integer(1), {}}}, + {"a588", {Integer(1), {}}}, {"a589", {Integer(1), {}}}, + {"a590", {Integer(1), {}}}, {"a591", {Integer(1), {}}}, + {"a592", {Integer(1), {}}}, {"a593", {Integer(1), {}}}, + {"a594", {Integer(1), {}}}, {"a595", {Integer(1), {}}}, + {"a596", {Integer(1), {}}}, {"a597", {Integer(1), {}}}, + {"a598", {Integer(1), {}}}, {"a599", {Integer(1), {}}}, + {"a600", {Integer(1), {}}}, {"a601", {Integer(1), {}}}, + {"a602", {Integer(1), {}}}, {"a603", {Integer(1), {}}}, + {"a604", {Integer(1), {}}}, {"a605", {Integer(1), {}}}, + {"a606", {Integer(1), {}}}, {"a607", {Integer(1), {}}}, + {"a608", {Integer(1), {}}}, {"a609", {Integer(1), {}}}, + {"a610", {Integer(1), {}}}, {"a611", {Integer(1), {}}}, + {"a612", {Integer(1), {}}}, {"a613", {Integer(1), {}}}, + {"a614", {Integer(1), {}}}, {"a615", {Integer(1), {}}}, + {"a616", {Integer(1), {}}}, {"a617", {Integer(1), {}}}, + {"a618", {Integer(1), {}}}, {"a619", {Integer(1), {}}}, + {"a620", {Integer(1), {}}}, {"a621", {Integer(1), {}}}, + {"a622", {Integer(1), {}}}, {"a623", {Integer(1), {}}}, + {"a624", {Integer(1), {}}}, {"a625", {Integer(1), {}}}, + {"a626", {Integer(1), {}}}, {"a627", {Integer(1), {}}}, + {"a628", {Integer(1), {}}}, {"a629", {Integer(1), {}}}, + {"a630", {Integer(1), {}}}, {"a631", {Integer(1), {}}}, + {"a632", {Integer(1), {}}}, {"a633", {Integer(1), {}}}, + {"a634", {Integer(1), {}}}, {"a635", {Integer(1), {}}}, + {"a636", {Integer(1), {}}}, {"a637", {Integer(1), {}}}, + {"a638", {Integer(1), {}}}, {"a639", {Integer(1), {}}}, + {"a640", {Integer(1), {}}}, {"a641", {Integer(1), {}}}, + {"a642", {Integer(1), {}}}, {"a643", {Integer(1), {}}}, + {"a644", {Integer(1), {}}}, {"a645", {Integer(1), {}}}, + {"a646", {Integer(1), {}}}, {"a647", {Integer(1), {}}}, + {"a648", {Integer(1), {}}}, {"a649", {Integer(1), {}}}, + {"a650", {Integer(1), {}}}, {"a651", {Integer(1), {}}}, + {"a652", {Integer(1), {}}}, {"a653", {Integer(1), {}}}, + {"a654", {Integer(1), {}}}, {"a655", {Integer(1), {}}}, + {"a656", {Integer(1), {}}}, {"a657", {Integer(1), {}}}, + {"a658", {Integer(1), {}}}, {"a659", {Integer(1), {}}}, + {"a660", {Integer(1), {}}}, {"a661", {Integer(1), {}}}, + {"a662", {Integer(1), {}}}, {"a663", {Integer(1), {}}}, + {"a664", {Integer(1), {}}}, {"a665", {Integer(1), {}}}, + {"a666", {Integer(1), {}}}, {"a667", {Integer(1), {}}}, + {"a668", {Integer(1), {}}}, {"a669", {Integer(1), {}}}, + {"a670", {Integer(1), {}}}, {"a671", {Integer(1), {}}}, + {"a672", {Integer(1), {}}}, {"a673", {Integer(1), {}}}, + {"a674", {Integer(1), {}}}, {"a675", {Integer(1), {}}}, + {"a676", {Integer(1), {}}}, {"a677", {Integer(1), {}}}, + {"a678", {Integer(1), {}}}, {"a679", {Integer(1), {}}}, + {"a680", {Integer(1), {}}}, {"a681", {Integer(1), {}}}, + {"a682", {Integer(1), {}}}, {"a683", {Integer(1), {}}}, + {"a684", {Integer(1), {}}}, {"a685", {Integer(1), {}}}, + {"a686", {Integer(1), {}}}, {"a687", {Integer(1), {}}}, + {"a688", {Integer(1), {}}}, {"a689", {Integer(1), {}}}, + {"a690", {Integer(1), {}}}, {"a691", {Integer(1), {}}}, + {"a692", {Integer(1), {}}}, {"a693", {Integer(1), {}}}, + {"a694", {Integer(1), {}}}, {"a695", {Integer(1), {}}}, + {"a696", {Integer(1), {}}}, {"a697", {Integer(1), {}}}, + {"a698", {Integer(1), {}}}, {"a699", {Integer(1), {}}}, + {"a700", {Integer(1), {}}}, {"a701", {Integer(1), {}}}, + {"a702", {Integer(1), {}}}, {"a703", {Integer(1), {}}}, + {"a704", {Integer(1), {}}}, {"a705", {Integer(1), {}}}, + {"a706", {Integer(1), {}}}, {"a707", {Integer(1), {}}}, + {"a708", {Integer(1), {}}}, {"a709", {Integer(1), {}}}, + {"a710", {Integer(1), {}}}, {"a711", {Integer(1), {}}}, + {"a712", {Integer(1), {}}}, {"a713", {Integer(1), {}}}, + {"a714", {Integer(1), {}}}, {"a715", {Integer(1), {}}}, + {"a716", {Integer(1), {}}}, {"a717", {Integer(1), {}}}, + {"a718", {Integer(1), {}}}, {"a719", {Integer(1), {}}}, + {"a720", {Integer(1), {}}}, {"a721", {Integer(1), {}}}, + {"a722", {Integer(1), {}}}, {"a723", {Integer(1), {}}}, + {"a724", {Integer(1), {}}}, {"a725", {Integer(1), {}}}, + {"a726", {Integer(1), {}}}, {"a727", {Integer(1), {}}}, + {"a728", {Integer(1), {}}}, {"a729", {Integer(1), {}}}, + {"a730", {Integer(1), {}}}, {"a731", {Integer(1), {}}}, + {"a732", {Integer(1), {}}}, {"a733", {Integer(1), {}}}, + {"a734", {Integer(1), {}}}, {"a735", {Integer(1), {}}}, + {"a736", {Integer(1), {}}}, {"a737", {Integer(1), {}}}, + {"a738", {Integer(1), {}}}, {"a739", {Integer(1), {}}}, + {"a740", {Integer(1), {}}}, {"a741", {Integer(1), {}}}, + {"a742", {Integer(1), {}}}, {"a743", {Integer(1), {}}}, + {"a744", {Integer(1), {}}}, {"a745", {Integer(1), {}}}, + {"a746", {Integer(1), {}}}, {"a747", {Integer(1), {}}}, + {"a748", {Integer(1), {}}}, {"a749", {Integer(1), {}}}, + {"a750", {Integer(1), {}}}, {"a751", {Integer(1), {}}}, + {"a752", {Integer(1), {}}}, {"a753", {Integer(1), {}}}, + {"a754", {Integer(1), {}}}, {"a755", {Integer(1), {}}}, + {"a756", {Integer(1), {}}}, {"a757", {Integer(1), {}}}, + {"a758", {Integer(1), {}}}, {"a759", {Integer(1), {}}}, + {"a760", {Integer(1), {}}}, {"a761", {Integer(1), {}}}, + {"a762", {Integer(1), {}}}, {"a763", {Integer(1), {}}}, + {"a764", {Integer(1), {}}}, {"a765", {Integer(1), {}}}, + {"a766", {Integer(1), {}}}, {"a767", {Integer(1), {}}}, + {"a768", {Integer(1), {}}}, {"a769", {Integer(1), {}}}, + {"a770", {Integer(1), {}}}, {"a771", {Integer(1), {}}}, + {"a772", {Integer(1), {}}}, {"a773", {Integer(1), {}}}, + {"a774", {Integer(1), {}}}, {"a775", {Integer(1), {}}}, + {"a776", {Integer(1), {}}}, {"a777", {Integer(1), {}}}, + {"a778", {Integer(1), {}}}, {"a779", {Integer(1), {}}}, + {"a780", {Integer(1), {}}}, {"a781", {Integer(1), {}}}, + {"a782", {Integer(1), {}}}, {"a783", {Integer(1), {}}}, + {"a784", {Integer(1), {}}}, {"a785", {Integer(1), {}}}, + {"a786", {Integer(1), {}}}, {"a787", {Integer(1), {}}}, + {"a788", {Integer(1), {}}}, {"a789", {Integer(1), {}}}, + {"a790", {Integer(1), {}}}, {"a791", {Integer(1), {}}}, + {"a792", {Integer(1), {}}}, {"a793", {Integer(1), {}}}, + {"a794", {Integer(1), {}}}, {"a795", {Integer(1), {}}}, + {"a796", {Integer(1), {}}}, {"a797", {Integer(1), {}}}, + {"a798", {Integer(1), {}}}, {"a799", {Integer(1), {}}}, + {"a800", {Integer(1), {}}}, {"a801", {Integer(1), {}}}, + {"a802", {Integer(1), {}}}, {"a803", {Integer(1), {}}}, + {"a804", {Integer(1), {}}}, {"a805", {Integer(1), {}}}, + {"a806", {Integer(1), {}}}, {"a807", {Integer(1), {}}}, + {"a808", {Integer(1), {}}}, {"a809", {Integer(1), {}}}, + {"a810", {Integer(1), {}}}, {"a811", {Integer(1), {}}}, + {"a812", {Integer(1), {}}}, {"a813", {Integer(1), {}}}, + {"a814", {Integer(1), {}}}, {"a815", {Integer(1), {}}}, + {"a816", {Integer(1), {}}}, {"a817", {Integer(1), {}}}, + {"a818", {Integer(1), {}}}, {"a819", {Integer(1), {}}}, + {"a820", {Integer(1), {}}}, {"a821", {Integer(1), {}}}, + {"a822", {Integer(1), {}}}, {"a823", {Integer(1), {}}}, + {"a824", {Integer(1), {}}}, {"a825", {Integer(1), {}}}, + {"a826", {Integer(1), {}}}, {"a827", {Integer(1), {}}}, + {"a828", {Integer(1), {}}}, {"a829", {Integer(1), {}}}, + {"a830", {Integer(1), {}}}, {"a831", {Integer(1), {}}}, + {"a832", {Integer(1), {}}}, {"a833", {Integer(1), {}}}, + {"a834", {Integer(1), {}}}, {"a835", {Integer(1), {}}}, + {"a836", {Integer(1), {}}}, {"a837", {Integer(1), {}}}, + {"a838", {Integer(1), {}}}, {"a839", {Integer(1), {}}}, + {"a840", {Integer(1), {}}}, {"a841", {Integer(1), {}}}, + {"a842", {Integer(1), {}}}, {"a843", {Integer(1), {}}}, + {"a844", {Integer(1), {}}}, {"a845", {Integer(1), {}}}, + {"a846", {Integer(1), {}}}, {"a847", {Integer(1), {}}}, + {"a848", {Integer(1), {}}}, {"a849", {Integer(1), {}}}, + {"a850", {Integer(1), {}}}, {"a851", {Integer(1), {}}}, + {"a852", {Integer(1), {}}}, {"a853", {Integer(1), {}}}, + {"a854", {Integer(1), {}}}, {"a855", {Integer(1), {}}}, + {"a856", {Integer(1), {}}}, {"a857", {Integer(1), {}}}, + {"a858", {Integer(1), {}}}, {"a859", {Integer(1), {}}}, + {"a860", {Integer(1), {}}}, {"a861", {Integer(1), {}}}, + {"a862", {Integer(1), {}}}, {"a863", {Integer(1), {}}}, + {"a864", {Integer(1), {}}}, {"a865", {Integer(1), {}}}, + {"a866", {Integer(1), {}}}, {"a867", {Integer(1), {}}}, + {"a868", {Integer(1), {}}}, {"a869", {Integer(1), {}}}, + {"a870", {Integer(1), {}}}, {"a871", {Integer(1), {}}}, + {"a872", {Integer(1), {}}}, {"a873", {Integer(1), {}}}, + {"a874", {Integer(1), {}}}, {"a875", {Integer(1), {}}}, + {"a876", {Integer(1), {}}}, {"a877", {Integer(1), {}}}, + {"a878", {Integer(1), {}}}, {"a879", {Integer(1), {}}}, + {"a880", {Integer(1), {}}}, {"a881", {Integer(1), {}}}, + {"a882", {Integer(1), {}}}, {"a883", {Integer(1), {}}}, + {"a884", {Integer(1), {}}}, {"a885", {Integer(1), {}}}, + {"a886", {Integer(1), {}}}, {"a887", {Integer(1), {}}}, + {"a888", {Integer(1), {}}}, {"a889", {Integer(1), {}}}, + {"a890", {Integer(1), {}}}, {"a891", {Integer(1), {}}}, + {"a892", {Integer(1), {}}}, {"a893", {Integer(1), {}}}, + {"a894", {Integer(1), {}}}, {"a895", {Integer(1), {}}}, + {"a896", {Integer(1), {}}}, {"a897", {Integer(1), {}}}, + {"a898", {Integer(1), {}}}, {"a899", {Integer(1), {}}}, + {"a900", {Integer(1), {}}}, {"a901", {Integer(1), {}}}, + {"a902", {Integer(1), {}}}, {"a903", {Integer(1), {}}}, + {"a904", {Integer(1), {}}}, {"a905", {Integer(1), {}}}, + {"a906", {Integer(1), {}}}, {"a907", {Integer(1), {}}}, + {"a908", {Integer(1), {}}}, {"a909", {Integer(1), {}}}, + {"a910", {Integer(1), {}}}, {"a911", {Integer(1), {}}}, + {"a912", {Integer(1), {}}}, {"a913", {Integer(1), {}}}, + {"a914", {Integer(1), {}}}, {"a915", {Integer(1), {}}}, + {"a916", {Integer(1), {}}}, {"a917", {Integer(1), {}}}, + {"a918", {Integer(1), {}}}, {"a919", {Integer(1), {}}}, + {"a920", {Integer(1), {}}}, {"a921", {Integer(1), {}}}, + {"a922", {Integer(1), {}}}, {"a923", {Integer(1), {}}}, + {"a924", {Integer(1), {}}}, {"a925", {Integer(1), {}}}, + {"a926", {Integer(1), {}}}, {"a927", {Integer(1), {}}}, + {"a928", {Integer(1), {}}}, {"a929", {Integer(1), {}}}, + {"a930", {Integer(1), {}}}, {"a931", {Integer(1), {}}}, + {"a932", {Integer(1), {}}}, {"a933", {Integer(1), {}}}, + {"a934", {Integer(1), {}}}, {"a935", {Integer(1), {}}}, + {"a936", {Integer(1), {}}}, {"a937", {Integer(1), {}}}, + {"a938", {Integer(1), {}}}, {"a939", {Integer(1), {}}}, + {"a940", {Integer(1), {}}}, {"a941", {Integer(1), {}}}, + {"a942", {Integer(1), {}}}, {"a943", {Integer(1), {}}}, + {"a944", {Integer(1), {}}}, {"a945", {Integer(1), {}}}, + {"a946", {Integer(1), {}}}, {"a947", {Integer(1), {}}}, + {"a948", {Integer(1), {}}}, {"a949", {Integer(1), {}}}, + {"a950", {Integer(1), {}}}, {"a951", {Integer(1), {}}}, + {"a952", {Integer(1), {}}}, {"a953", {Integer(1), {}}}, + {"a954", {Integer(1), {}}}, {"a955", {Integer(1), {}}}, + {"a956", {Integer(1), {}}}, {"a957", {Integer(1), {}}}, + {"a958", {Integer(1), {}}}, {"a959", {Integer(1), {}}}, + {"a960", {Integer(1), {}}}, {"a961", {Integer(1), {}}}, + {"a962", {Integer(1), {}}}, {"a963", {Integer(1), {}}}, + {"a964", {Integer(1), {}}}, {"a965", {Integer(1), {}}}, + {"a966", {Integer(1), {}}}, {"a967", {Integer(1), {}}}, + {"a968", {Integer(1), {}}}, {"a969", {Integer(1), {}}}, + {"a970", {Integer(1), {}}}, {"a971", {Integer(1), {}}}, + {"a972", {Integer(1), {}}}, {"a973", {Integer(1), {}}}, + {"a974", {Integer(1), {}}}, {"a975", {Integer(1), {}}}, + {"a976", {Integer(1), {}}}, {"a977", {Integer(1), {}}}, + {"a978", {Integer(1), {}}}, {"a979", {Integer(1), {}}}, + {"a980", {Integer(1), {}}}, {"a981", {Integer(1), {}}}, + {"a982", {Integer(1), {}}}, {"a983", {Integer(1), {}}}, + {"a984", {Integer(1), {}}}, {"a985", {Integer(1), {}}}, + {"a986", {Integer(1), {}}}, {"a987", {Integer(1), {}}}, + {"a988", {Integer(1), {}}}, {"a989", {Integer(1), {}}}, + {"a990", {Integer(1), {}}}, {"a991", {Integer(1), {}}}, + {"a992", {Integer(1), {}}}, {"a993", {Integer(1), {}}}, + {"a994", {Integer(1), {}}}, {"a995", {Integer(1), {}}}, + {"a996", {Integer(1), {}}}, {"a997", {Integer(1), {}}}, + {"a998", {Integer(1), {}}}, {"a999", {Integer(1), {}}}, + {"a1000", {Integer(1), {}}}, {"a1001", {Integer(1), {}}}, + {"a1002", {Integer(1), {}}}, {"a1003", {Integer(1), {}}}, + {"a1004", {Integer(1), {}}}, {"a1005", {Integer(1), {}}}, + {"a1006", {Integer(1), {}}}, {"a1007", {Integer(1), {}}}, + {"a1008", {Integer(1), {}}}, {"a1009", {Integer(1), {}}}, + {"a1010", {Integer(1), {}}}, {"a1011", {Integer(1), {}}}, + {"a1012", {Integer(1), {}}}, {"a1013", {Integer(1), {}}}, + {"a1014", {Integer(1), {}}}, {"a1015", {Integer(1), {}}}, + {"a1016", {Integer(1), {}}}, {"a1017", {Integer(1), {}}}, + {"a1018", {Integer(1), {}}}, {"a1019", {Integer(1), {}}}, + {"a1020", {Integer(1), {}}}, {"a1021", {Integer(1), {}}}, + {"a1022", {Integer(1), {}}}, {"a1023", {Integer(1), {}}}}}}}, + {"large dictionary key", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=1", + {Dictionary{ + {{"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + {Integer(1), {}}}}}}}, + {"basic parameterised dict", + "abc=123;a=1;b=2, def=456, ghi=789;q=9;r=\"+w\"", + {Dictionary{ + {{"abc", {Integer(123), {Param("a", 1), Param("b", 2)}}}, + {"def", {Integer(456), {}}}, + {"ghi", {Integer(789), {Param("q", 9), Param("r", "+w")}}}}}}}, + {"single item parameterised dict", + "a=b; q=1.0", + {Dictionary{ + {{"a", {Item("b", Item::kTokenType), {DoubleParam("q", 1.000000)}}}}}}, + "a=b;q=1.0"}, + {"list item parameterised dictionary", + "a=(1 2); q=1.0", + {Dictionary{{{"a", + {{{Integer(1), {}}, {Integer(2), {}}}, + {DoubleParam("q", 1.000000)}}}}}}, + "a=(1 2);q=1.0"}, + {"missing parameter value parameterised dict", + "a=3;c;d=5", + {Dictionary{ + {{"a", {Integer(3), {BooleanParam("c", true), Param("d", 5)}}}}}}}, + {"terminal missing parameter value parameterised dict", + "a=3;c=5;d", + {Dictionary{ + {{"a", {Integer(3), {Param("c", 5), BooleanParam("d", true)}}}}}}}, + {"no whitespace parameterised dict", + "a=b;c=1,d=e;f=2", + {Dictionary{{{"a", {Item("b", Item::kTokenType), {Param("c", 1)}}}, + {"d", {Item("e", Item::kTokenType), {Param("f", 2)}}}}}}, + "a=b;c=1, d=e;f=2"}, + {"whitespace before = parameterised dict", "a=b;q =0.5", base::nullopt}, + {"whitespace after = parameterised dict", "a=b;q= 0.5", base::nullopt}, + {"whitespace before ; parameterised dict", "a=b ;q=0.5", base::nullopt}, + {"whitespace after ; parameterised dict", + "a=b; q=0.5", + {Dictionary{ + {{"a", {Item("b", Item::kTokenType), {DoubleParam("q", 0.500000)}}}}}}, + "a=b;q=0.5"}, + {"extra whitespace parameterised dict", + "a=b; c=1 , d=e; f=2; g=3", + {Dictionary{ + {{"a", {Item("b", Item::kTokenType), {Param("c", 1)}}}, + {"d", + {Item("e", Item::kTokenType), {Param("f", 2), Param("g", 3)}}}}}}, + "a=b;c=1, d=e;f=2;g=3"}, + {"two lines parameterised list", + "a=b;c=1, d=e;f=2", + {Dictionary{{{"a", {Item("b", Item::kTokenType), {Param("c", 1)}}}, + {"d", {Item("e", Item::kTokenType), {Param("f", 2)}}}}}}, + "a=b;c=1, d=e;f=2"}, + {"trailing comma parameterised list", "a=b; q=1.0,", base::nullopt}, + {"empty item parameterised list", "a=b; q=1.0,,c=d", base::nullopt}, + {"0x01 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\001a", {Integer(1), {}}}}}}}, + {"0x02 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\002a", {Integer(1), {}}}}}}}, + {"0x03 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\003a", {Integer(1), {}}}}}}}, + {"0x04 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\004a", {Integer(1), {}}}}}}}, + {"0x05 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\005a", {Integer(1), {}}}}}}}, + {"0x06 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\006a", {Integer(1), {}}}}}}}, + {"0x07 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\aa", {Integer(1), {}}}}}}}, + {"0x08 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\ba", {Integer(1), {}}}}}}}, + {"0x09 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\ta", {Integer(1), {}}}}}}}, + {"0x0a in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\na", {Integer(1), {}}}}}}}, + {"0x0b in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\va", {Integer(1), {}}}}}}}, + {"0x0c in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\fa", {Integer(1), {}}}}}}}, + {"0x0d in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\ra", {Integer(1), {}}}}}}}, + {"0x0e in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\016a", {Integer(1), {}}}}}}}, + {"0x0f in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\017a", {Integer(1), {}}}}}}}, + {"0x10 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\020a", {Integer(1), {}}}}}}}, + {"0x11 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\021a", {Integer(1), {}}}}}}}, + {"0x12 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\022a", {Integer(1), {}}}}}}}, + {"0x13 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\023a", {Integer(1), {}}}}}}}, + {"0x14 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\024a", {Integer(1), {}}}}}}}, + {"0x15 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\025a", {Integer(1), {}}}}}}}, + {"0x16 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\026a", {Integer(1), {}}}}}}}, + {"0x17 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\027a", {Integer(1), {}}}}}}}, + {"0x18 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\030a", {Integer(1), {}}}}}}}, + {"0x19 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\031a", {Integer(1), {}}}}}}}, + {"0x1a in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\032a", {Integer(1), {}}}}}}}, + {"0x1b in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\033a", {Integer(1), {}}}}}}}, + {"0x1c in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\034a", {Integer(1), {}}}}}}}, + {"0x1d in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\035a", {Integer(1), {}}}}}}}, + {"0x1e in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\036a", {Integer(1), {}}}}}}}, + {"0x1f in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\037a", {Integer(1), {}}}}}}}, + {"0x20 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a a", {Integer(1), {}}}}}}}, + {"0x21 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a!a", {Integer(1), {}}}}}}}, + {"0x22 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\"a", {Integer(1), {}}}}}}}, + {"0x23 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a#a", {Integer(1), {}}}}}}}, + {"0x24 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a$a", {Integer(1), {}}}}}}}, + {"0x25 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a%a", {Integer(1), {}}}}}}}, + {"0x26 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a&a", {Integer(1), {}}}}}}}, + {"0x27 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a'a", {Integer(1), {}}}}}}}, + {"0x28 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a(a", {Integer(1), {}}}}}}}, + {"0x29 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a)a", {Integer(1), {}}}}}}}, + {"0x2b in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a+a", {Integer(1), {}}}}}}}, + {"0x2c in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a,a", {Integer(1), {}}}}}}}, + {"0x2f in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a/a", {Integer(1), {}}}}}}}, + {"0x3a in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a:a", {Integer(1), {}}}}}}}, + {"0x3b in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a;a", {Integer(1), {}}}}}}}, + {"0x3c in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a<a", {Integer(1), {}}}}}}}, + {"0x3d in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a=a", {Integer(1), {}}}}}}}, + {"0x3e in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a>a", {Integer(1), {}}}}}}}, + {"0x3f in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a?a", {Integer(1), {}}}}}}}, + {"0x40 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a@a", {Integer(1), {}}}}}}}, + {"0x41 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aAa", {Integer(1), {}}}}}}}, + {"0x42 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aBa", {Integer(1), {}}}}}}}, + {"0x43 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aCa", {Integer(1), {}}}}}}}, + {"0x44 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aDa", {Integer(1), {}}}}}}}, + {"0x45 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aEa", {Integer(1), {}}}}}}}, + {"0x46 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aFa", {Integer(1), {}}}}}}}, + {"0x47 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aGa", {Integer(1), {}}}}}}}, + {"0x48 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aHa", {Integer(1), {}}}}}}}, + {"0x49 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aIa", {Integer(1), {}}}}}}}, + {"0x4a in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aJa", {Integer(1), {}}}}}}}, + {"0x4b in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aKa", {Integer(1), {}}}}}}}, + {"0x4c in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aLa", {Integer(1), {}}}}}}}, + {"0x4d in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aMa", {Integer(1), {}}}}}}}, + {"0x4e in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aNa", {Integer(1), {}}}}}}}, + {"0x4f in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aOa", {Integer(1), {}}}}}}}, + {"0x50 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aPa", {Integer(1), {}}}}}}}, + {"0x51 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aQa", {Integer(1), {}}}}}}}, + {"0x52 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aRa", {Integer(1), {}}}}}}}, + {"0x53 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aSa", {Integer(1), {}}}}}}}, + {"0x54 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aTa", {Integer(1), {}}}}}}}, + {"0x55 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aUa", {Integer(1), {}}}}}}}, + {"0x56 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aVa", {Integer(1), {}}}}}}}, + {"0x57 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aWa", {Integer(1), {}}}}}}}, + {"0x58 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aXa", {Integer(1), {}}}}}}}, + {"0x59 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aYa", {Integer(1), {}}}}}}}, + {"0x5a in dictionary key - serialise only", + nullptr, + {Dictionary{{{"aZa", {Integer(1), {}}}}}}}, + {"0x5b in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a[a", {Integer(1), {}}}}}}}, + {"0x5c in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\\a", {Integer(1), {}}}}}}}, + {"0x5d in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a]a", {Integer(1), {}}}}}}}, + {"0x5e in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a^a", {Integer(1), {}}}}}}}, + {"0x60 in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a`a", {Integer(1), {}}}}}}}, + {"0x7b in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a{a", {Integer(1), {}}}}}}}, + {"0x7c in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a|a", {Integer(1), {}}}}}}}, + {"0x7d in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a}a", {Integer(1), {}}}}}}}, + {"0x7e in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a~a", {Integer(1), {}}}}}}}, + {"0x7f in dictionary key - serialise only", + nullptr, + {Dictionary{{{"a\177a", {Integer(1), {}}}}}}}, + {"0x01 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\001a", {Integer(1), {}}}}}}}, + {"0x02 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\002a", {Integer(1), {}}}}}}}, + {"0x03 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\003a", {Integer(1), {}}}}}}}, + {"0x04 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\004a", {Integer(1), {}}}}}}}, + {"0x05 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\005a", {Integer(1), {}}}}}}}, + {"0x06 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\006a", {Integer(1), {}}}}}}}, + {"0x07 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\aa", {Integer(1), {}}}}}}}, + {"0x08 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\ba", {Integer(1), {}}}}}}}, + {"0x09 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\ta", {Integer(1), {}}}}}}}, + {"0x0a starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\na", {Integer(1), {}}}}}}}, + {"0x0b starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\va", {Integer(1), {}}}}}}}, + {"0x0c starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\fa", {Integer(1), {}}}}}}}, + {"0x0d starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\ra", {Integer(1), {}}}}}}}, + {"0x0e starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\016a", {Integer(1), {}}}}}}}, + {"0x0f starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\017a", {Integer(1), {}}}}}}}, + {"0x10 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\020a", {Integer(1), {}}}}}}}, + {"0x11 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\021a", {Integer(1), {}}}}}}}, + {"0x12 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\022a", {Integer(1), {}}}}}}}, + {"0x13 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\023a", {Integer(1), {}}}}}}}, + {"0x14 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\024a", {Integer(1), {}}}}}}}, + {"0x15 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\025a", {Integer(1), {}}}}}}}, + {"0x16 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\026a", {Integer(1), {}}}}}}}, + {"0x17 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\027a", {Integer(1), {}}}}}}}, + {"0x18 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\030a", {Integer(1), {}}}}}}}, + {"0x19 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\031a", {Integer(1), {}}}}}}}, + {"0x1a starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\032a", {Integer(1), {}}}}}}}, + {"0x1b starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\033a", {Integer(1), {}}}}}}}, + {"0x1c starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\034a", {Integer(1), {}}}}}}}, + {"0x1d starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\035a", {Integer(1), {}}}}}}}, + {"0x1e starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\036a", {Integer(1), {}}}}}}}, + {"0x1f starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\037a", {Integer(1), {}}}}}}}, + {"0x20 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{" a", {Integer(1), {}}}}}}}, + {"0x21 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"!a", {Integer(1), {}}}}}}}, + {"0x22 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\"a", {Integer(1), {}}}}}}}, + {"0x23 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"#a", {Integer(1), {}}}}}}}, + {"0x24 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"$a", {Integer(1), {}}}}}}}, + {"0x25 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"%a", {Integer(1), {}}}}}}}, + {"0x26 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"&a", {Integer(1), {}}}}}}}, + {"0x27 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"'a", {Integer(1), {}}}}}}}, + {"0x28 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"(a", {Integer(1), {}}}}}}}, + {"0x29 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{")a", {Integer(1), {}}}}}}}, + {"0x2b starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"+a", {Integer(1), {}}}}}}}, + {"0x2c starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{",a", {Integer(1), {}}}}}}}, + {"0x2d starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"-a", {Integer(1), {}}}}}}}, + {"0x2e starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{".a", {Integer(1), {}}}}}}}, + {"0x2f starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"/a", {Integer(1), {}}}}}}}, + {"0x30 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"0a", {Integer(1), {}}}}}}}, + {"0x31 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"1a", {Integer(1), {}}}}}}}, + {"0x32 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"2a", {Integer(1), {}}}}}}}, + {"0x33 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"3a", {Integer(1), {}}}}}}}, + {"0x34 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"4a", {Integer(1), {}}}}}}}, + {"0x35 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"5a", {Integer(1), {}}}}}}}, + {"0x36 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"6a", {Integer(1), {}}}}}}}, + {"0x37 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"7a", {Integer(1), {}}}}}}}, + {"0x38 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"8a", {Integer(1), {}}}}}}}, + {"0x39 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"9a", {Integer(1), {}}}}}}}, + {"0x3a starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{":a", {Integer(1), {}}}}}}}, + {"0x3b starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{";a", {Integer(1), {}}}}}}}, + {"0x3c starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"<a", {Integer(1), {}}}}}}}, + {"0x3d starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"=a", {Integer(1), {}}}}}}}, + {"0x3e starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{">a", {Integer(1), {}}}}}}}, + {"0x3f starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"?a", {Integer(1), {}}}}}}}, + {"0x40 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"@a", {Integer(1), {}}}}}}}, + {"0x41 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Aa", {Integer(1), {}}}}}}}, + {"0x42 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ba", {Integer(1), {}}}}}}}, + {"0x43 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ca", {Integer(1), {}}}}}}}, + {"0x44 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Da", {Integer(1), {}}}}}}}, + {"0x45 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ea", {Integer(1), {}}}}}}}, + {"0x46 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Fa", {Integer(1), {}}}}}}}, + {"0x47 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ga", {Integer(1), {}}}}}}}, + {"0x48 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ha", {Integer(1), {}}}}}}}, + {"0x49 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ia", {Integer(1), {}}}}}}}, + {"0x4a starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ja", {Integer(1), {}}}}}}}, + {"0x4b starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ka", {Integer(1), {}}}}}}}, + {"0x4c starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"La", {Integer(1), {}}}}}}}, + {"0x4d starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ma", {Integer(1), {}}}}}}}, + {"0x4e starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Na", {Integer(1), {}}}}}}}, + {"0x4f starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Oa", {Integer(1), {}}}}}}}, + {"0x50 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Pa", {Integer(1), {}}}}}}}, + {"0x51 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Qa", {Integer(1), {}}}}}}}, + {"0x52 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ra", {Integer(1), {}}}}}}}, + {"0x53 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Sa", {Integer(1), {}}}}}}}, + {"0x54 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ta", {Integer(1), {}}}}}}}, + {"0x55 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ua", {Integer(1), {}}}}}}}, + {"0x56 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Va", {Integer(1), {}}}}}}}, + {"0x57 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Wa", {Integer(1), {}}}}}}}, + {"0x58 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Xa", {Integer(1), {}}}}}}}, + {"0x59 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Ya", {Integer(1), {}}}}}}}, + {"0x5a starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"Za", {Integer(1), {}}}}}}}, + {"0x5b starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"[a", {Integer(1), {}}}}}}}, + {"0x5c starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\\a", {Integer(1), {}}}}}}}, + {"0x5d starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"]a", {Integer(1), {}}}}}}}, + {"0x5e starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"^a", {Integer(1), {}}}}}}}, + {"0x5f starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"_a", {Integer(1), {}}}}}}}, + {"0x60 starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"`a", {Integer(1), {}}}}}}}, + {"0x7b starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"{a", {Integer(1), {}}}}}}}, + {"0x7c starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"|a", {Integer(1), {}}}}}}}, + {"0x7d starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"}a", {Integer(1), {}}}}}}}, + {"0x7e starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"~a", {Integer(1), {}}}}}}}, + {"0x7f starting an dictionary key - serialise only", + nullptr, + {Dictionary{{{"\177a", {Integer(1), {}}}}}}}, +}; +} // namespace + +TEST(StructuredHeaderGeneratedTest, ParseItem) { + for (const auto& c : parameterized_item_test_cases) { + if (c.raw) { + SCOPED_TRACE(c.name); + base::Optional<ParameterizedItem> result = ParseItem(c.raw); + EXPECT_EQ(result, c.expected); + } + } +} + +TEST(StructuredHeaderGeneratedTest, ParseList) { + for (const auto& c : list_test_cases) { + if (c.raw) { + SCOPED_TRACE(c.name); + base::Optional<List> result = ParseList(c.raw); + EXPECT_EQ(result, c.expected); + } + } +} + +TEST(StructuredHeaderGeneratedTest, ParseDictionary) { + for (const auto& c : dictionary_test_cases) { + if (c.raw) { + SCOPED_TRACE(c.name); + base::Optional<Dictionary> result = ParseDictionary(c.raw); + EXPECT_EQ(result, c.expected); + } + } +} + +TEST(StructuredHeaderGeneratedTest, SerializeParameterizedItem) { + for (const auto& c : parameterized_item_test_cases) { + SCOPED_TRACE(c.name); + if (c.expected) { + base::Optional<std::string> result = SerializeItem(*c.expected); + if (c.raw || c.canonical) { + EXPECT_TRUE(result.has_value()); + EXPECT_EQ(result.value(), + std::string(c.canonical ? c.canonical : c.raw)); + } else { + EXPECT_FALSE(result.has_value()); + } + } + } +} + +TEST(StructuredHeaderGeneratedTest, SerializeList) { + for (const auto& c : list_test_cases) { + SCOPED_TRACE(c.name); + if (c.expected) { + base::Optional<std::string> result = SerializeList(*c.expected); + if (c.raw || c.canonical) { + EXPECT_TRUE(result.has_value()); + EXPECT_EQ(result.value(), + std::string(c.canonical ? c.canonical : c.raw)); + } else { + EXPECT_FALSE(result.has_value()); + } + } + } +} + +TEST(StructuredHeaderGeneratedTest, SerializeDictionary) { + for (const auto& c : dictionary_test_cases) { + SCOPED_TRACE(c.name); + if (c.expected) { + base::Optional<std::string> result = SerializeDictionary(*c.expected); + if (c.raw || c.canonical) { + EXPECT_TRUE(result.has_value()); + EXPECT_EQ(result.value(), + std::string(c.canonical ? c.canonical : c.raw)); + } else { + EXPECT_FALSE(result.has_value()); + } + } + } +} + +} // namespace structured_headers +} // namespace net
diff --git a/net/http/structured_headers_unittest.cc b/net/http/structured_headers_unittest.cc index b49eaf9..3f93ec4 100644 --- a/net/http/structured_headers_unittest.cc +++ b/net/http/structured_headers_unittest.cc
@@ -55,8 +55,9 @@ return std::make_pair(key, Token(value)); } -// Most test cases are taken from -// https://github.com/httpwg/structured-header-tests. +// Test cases taken from https://github.com/httpwg/structured-header-tests can +// be found in structured_headers_generated_unittest.cc + const struct ItemTestCase { const char* name; const char* raw; @@ -65,350 +66,19 @@ // format is identical to raw. } item_test_cases[] = { // Token - {"basic token - item", "a_b-c.d3:f%00/*", Token("a_b-c.d3:f%00/*")}, - {"token with capitals - item", "fooBar", Token("fooBar")}, - {"token starting with capitals - item", "FooBar", Token("FooBar")}, {"bad token - item", "abc$@%!", base::nullopt}, {"leading whitespace", " foo", Token("foo"), "foo"}, {"trailing whitespace", "foo ", Token("foo"), "foo"}, {"leading asterisk", "*foo", Token("*foo")}, // Number - {"basic integer", "42", Integer(42L)}, - {"zero integer", "0", Integer(0L)}, - {"leading 0 zero", "00", Integer(0L), "0"}, - {"negative zero", "-0", Integer(0L), "0"}, - {"double negative zero", "--0", base::nullopt}, - {"negative integer", "-42", Integer(-42L)}, - {"leading zero integer", "042", Integer(42L), "42"}, - {"leading zero negative integer", "-042", Integer(-42L), "-42"}, - {"comma", "2,3", base::nullopt}, - {"negative non-DIGIT first character", "-a23", base::nullopt}, - {"sign out of place", "4-2", base::nullopt}, - {"whitespace after sign", "- 42", base::nullopt}, {"long integer", "999999999999999", Integer(999999999999999L)}, {"long negative integer", "-999999999999999", Integer(-999999999999999L)}, {"too long integer", "1000000000000000", base::nullopt}, {"negative too long integer", "-1000000000000000", base::nullopt}, - {"simple decimal", "1.23", Item(1.23)}, - {"negative decimal", "-1.23", Item(-1.23)}, {"integral decimal", "1.0", Item(1.0)}, - {"decimal, whitespace after decimal", "1. 23", base::nullopt}, - {"decimal, whitespace before decimal", "1 .23", base::nullopt}, - {"negative decimal, whitespace after sign", "- 1.23", base::nullopt}, - {"double decimal decimal", "1.5.4", base::nullopt}, - {"adjacent double decimal decimal", "1..4", base::nullopt}, - {"decimal with three fractional digits", "1.123", Item(1.123)}, - {"negative decimal with three fractional digits", "-1.123", Item(-1.123)}, - {"decimal with four fractional digits", "1.1234", base::nullopt}, - {"negative decimal with four fractional digits", "-1.1234", base::nullopt}, - {"decimal with thirteen integer digits", "1234567890123.0", base::nullopt}, - {"negative decimal with thirteen integer digits", "-1234567890123.0", - base::nullopt}, - // Generated number tests - {"1 digits of zero", "0", Integer(0), "0"}, - {"1 digit small integer", "1", Integer(1)}, - {"1 digit large integer", "9", Integer(9)}, - {"2 digits of zero", "00", Integer(0), "0"}, - {"2 digit small integer", "11", Integer(11)}, - {"2 digit large integer", "99", Integer(99)}, - {"3 digits of zero", "000", Integer(0), "0"}, - {"3 digit small integer", "111", Integer(111)}, - {"3 digit large integer", "999", Integer(999)}, - {"4 digits of zero", "0000", Integer(0), "0"}, - {"4 digit small integer", "1111", Integer(1111)}, - {"4 digit large integer", "9999", Integer(9999)}, - {"5 digits of zero", "00000", Integer(0), "0"}, - {"5 digit small integer", "11111", Integer(11111)}, - {"5 digit large integer", "99999", Integer(99999)}, - {"6 digits of zero", "000000", Integer(0), "0"}, - {"6 digit small integer", "111111", Integer(111111)}, - {"6 digit large integer", "999999", Integer(999999)}, - {"7 digits of zero", "0000000", Integer(0), "0"}, - {"7 digit small integer", "1111111", Integer(1111111)}, - {"7 digit large integer", "9999999", Integer(9999999)}, - {"8 digits of zero", "00000000", Integer(0), "0"}, - {"8 digit small integer", "11111111", Integer(11111111)}, - {"8 digit large integer", "99999999", Integer(99999999)}, - {"9 digits of zero", "000000000", Integer(0), "0"}, - {"9 digit small integer", "111111111", Integer(111111111)}, - {"9 digit large integer", "999999999", Integer(999999999)}, - {"10 digits of zero", "0000000000", Integer(0), "0"}, - {"10 digit small integer", "1111111111", Integer(1111111111)}, - {"10 digit large integer", "9999999999", Integer(9999999999)}, - {"11 digits of zero", "00000000000", Integer(0), "0"}, - {"11 digit small integer", "11111111111", Integer(11111111111)}, - {"11 digit large integer", "99999999999", Integer(99999999999)}, - {"12 digits of zero", "000000000000", Integer(0), "0"}, - {"12 digit small integer", "111111111111", Integer(111111111111)}, - {"12 digit large integer", "999999999999", Integer(999999999999)}, - {"13 digits of zero", "0000000000000", Integer(0), "0"}, - {"13 digit small integer", "1111111111111", Integer(1111111111111)}, - {"13 digit large integer", "9999999999999", Integer(9999999999999)}, - {"14 digits of zero", "00000000000000", Integer(0), "0"}, - {"14 digit small integer", "11111111111111", Integer(11111111111111)}, - {"14 digit large integer", "99999999999999", Integer(99999999999999)}, - {"15 digits of zero", "000000000000000", Integer(0), "0"}, - {"15 digit small integer", "111111111111111", Integer(111111111111111)}, - {"15 digit large integer", "999999999999999", Integer(999999999999999)}, - {"2 digit 0, 1 fractional small decimal", "0.1", Item(0.1), "0.1"}, - {"2 digit, 1 fractional 0 decimal", "1.0", Item(1.0), "1.0"}, - {"2 digit, 1 fractional small decimal", "1.1", Item(1.1)}, - {"2 digit, 1 fractional large decimal", "9.9", Item(9.9)}, - {"3 digit 0, 2 fractional small decimal", "0.11", Item(0.11), "0.11"}, - {"3 digit, 2 fractional 0 decimal", "1.00", Item(1.0), "1.0"}, - {"3 digit, 2 fractional small decimal", "1.11", Item(1.11)}, - {"3 digit, 2 fractional large decimal", "9.99", Item(9.99)}, - {"4 digit 0, 3 fractional small decimal", "0.111", Item(0.111), "0.111"}, - {"4 digit, 3 fractional 0 decimal", "1.000", Item(1.0), "1.0"}, - {"4 digit, 3 fractional small decimal", "1.111", Item(1.111)}, - {"4 digit, 3 fractional large decimal", "9.999", Item(9.999)}, - {"3 digit 0, 1 fractional small decimal", "00.1", Item(0.1), "0.1"}, - {"3 digit, 1 fractional 0 decimal", "11.0", Item(11.0), "11.0"}, - {"3 digit, 1 fractional small decimal", "11.1", Item(11.1)}, - {"3 digit, 1 fractional large decimal", "99.9", Item(99.9)}, - {"4 digit 0, 2 fractional small decimal", "00.11", Item(0.11), "0.11"}, - {"4 digit, 2 fractional 0 decimal", "11.00", Item(11.0), "11.0"}, - {"4 digit, 2 fractional small decimal", "11.11", Item(11.11)}, - {"4 digit, 2 fractional large decimal", "99.99", Item(99.99)}, - {"5 digit 0, 3 fractional small decimal", "00.111", Item(0.111), "0.111"}, - {"5 digit, 3 fractional 0 decimal", "11.000", Item(11.0), "11.0"}, - {"5 digit, 3 fractional small decimal", "11.111", Item(11.111)}, - {"5 digit, 3 fractional large decimal", "99.999", Item(99.999)}, - {"4 digit 0, 1 fractional small decimal", "000.1", Item(0.1), "0.1"}, - {"4 digit, 1 fractional 0 decimal", "111.0", Item(111.0), "111.0"}, - {"4 digit, 1 fractional small decimal", "111.1", Item(111.1)}, - {"4 digit, 1 fractional large decimal", "999.9", Item(999.9)}, - {"5 digit 0, 2 fractional small decimal", "000.11", Item(0.11), "0.11"}, - {"5 digit, 2 fractional 0 decimal", "111.00", Item(111.0), "111.0"}, - {"5 digit, 2 fractional small decimal", "111.11", Item(111.11)}, - {"5 digit, 2 fractional large decimal", "999.99", Item(999.99)}, - {"6 digit 0, 3 fractional small decimal", "000.111", Item(0.111), "0.111"}, - {"6 digit, 3 fractional 0 decimal", "111.000", Item(111.0), "111.0"}, - {"6 digit, 3 fractional small decimal", "111.111", Item(111.111)}, - {"6 digit, 3 fractional large decimal", "999.999", Item(999.999)}, - {"5 digit 0, 1 fractional small decimal", "0000.1", Item(0.1), "0.1"}, - {"5 digit, 1 fractional 0 decimal", "1111.0", Item(1111.0), "1111.0"}, - {"5 digit, 1 fractional small decimal", "1111.1", Item(1111.1)}, - {"5 digit, 1 fractional large decimal", "9999.9", Item(9999.9)}, - {"6 digit 0, 2 fractional small decimal", "0000.11", Item(0.11), "0.11"}, - {"6 digit, 2 fractional 0 decimal", "1111.00", Item(1111.0), "1111.0"}, - {"6 digit, 2 fractional small decimal", "1111.11", Item(1111.11)}, - {"6 digit, 2 fractional large decimal", "9999.99", Item(9999.99)}, - {"7 digit 0, 3 fractional small decimal", "0000.111", Item(0.111), "0.111"}, - {"7 digit, 3 fractional 0 decimal", "1111.000", Item(1111.0), "1111.0"}, - {"7 digit, 3 fractional small decimal", "1111.111", Item(1111.111)}, - {"7 digit, 3 fractional large decimal", "9999.999", Item(9999.999)}, - {"6 digit 0, 1 fractional small decimal", "00000.1", Item(0.1), "0.1"}, - {"6 digit, 1 fractional 0 decimal", "11111.0", Item(11111.0), "11111.0"}, - {"6 digit, 1 fractional small decimal", "11111.1", Item(11111.1)}, - {"6 digit, 1 fractional large decimal", "99999.9", Item(99999.9)}, - {"7 digit 0, 2 fractional small decimal", "00000.11", Item(0.11), "0.11"}, - {"7 digit, 2 fractional 0 decimal", "11111.00", Item(11111.0), "11111.0"}, - {"7 digit, 2 fractional small decimal", "11111.11", Item(11111.11)}, - {"7 digit, 2 fractional large decimal", "99999.99", Item(99999.99)}, - {"8 digit 0, 3 fractional small decimal", "00000.111", Item(0.111), - "0.111"}, - {"8 digit, 3 fractional 0 decimal", "11111.000", Item(11111.0), "11111.0"}, - {"8 digit, 3 fractional small decimal", "11111.111", Item(11111.111)}, - {"8 digit, 3 fractional large decimal", "99999.999", Item(99999.999)}, - {"7 digit 0, 1 fractional small decimal", "000000.1", Item(0.1), "0.1"}, - {"7 digit, 1 fractional 0 decimal", "111111.0", Item(111111.0), "111111.0"}, - {"7 digit, 1 fractional small decimal", "111111.1", Item(111111.1)}, - {"7 digit, 1 fractional large decimal", "999999.9", Item(999999.9)}, - {"8 digit 0, 2 fractional small decimal", "000000.11", Item(0.11), "0.11"}, - {"8 digit, 2 fractional 0 decimal", "111111.00", Item(111111.0), - "111111.0"}, - {"8 digit, 2 fractional small decimal", "111111.11", Item(111111.11)}, - {"8 digit, 2 fractional large decimal", "999999.99", Item(999999.99)}, - {"9 digit 0, 3 fractional small decimal", "000000.111", Item(0.111), - "0.111"}, - {"9 digit, 3 fractional 0 decimal", "111111.000", Item(111111.0), - "111111.0"}, - {"9 digit, 3 fractional small decimal", "111111.111", Item(111111.111)}, - {"9 digit, 3 fractional large decimal", "999999.999", Item(999999.999)}, - {"8 digit 0, 1 fractional small decimal", "0000000.1", Item(0.1), "0.1"}, - {"8 digit, 1 fractional 0 decimal", "1111111.0", Item(1111111.0), - "1111111.0"}, - {"8 digit, 1 fractional small decimal", "1111111.1", Item(1111111.1)}, - {"8 digit, 1 fractional large decimal", "9999999.9", Item(9999999.9)}, - {"9 digit 0, 2 fractional small decimal", "0000000.11", Item(0.11), "0.11"}, - {"9 digit, 2 fractional 0 decimal", "1111111.00", Item(1111111.0), - "1111111.0"}, - {"9 digit, 2 fractional small decimal", "1111111.11", Item(1111111.11)}, - {"9 digit, 2 fractional large decimal", "9999999.99", Item(9999999.99)}, - {"10 digit 0, 3 fractional small decimal", "0000000.111", Item(0.111), - "0.111"}, - {"10 digit, 3 fractional 0 decimal", "1111111.000", Item(1111111.0), - "1111111.0"}, - {"10 digit, 3 fractional small decimal", "1111111.111", Item(1111111.111)}, - {"10 digit, 3 fractional large decimal", "9999999.999", Item(9999999.999)}, - {"9 digit 0, 1 fractional small decimal", "00000000.1", Item(0.1), "0.1"}, - {"9 digit, 1 fractional 0 decimal", "11111111.0", Item(11111111.0), - "11111111.0"}, - {"9 digit, 1 fractional small decimal", "11111111.1", Item(11111111.1)}, - {"9 digit, 1 fractional large decimal", "99999999.9", Item(99999999.9)}, - {"10 digit 0, 2 fractional small decimal", "00000000.11", Item(0.11), - "0.11"}, - {"10 digit, 2 fractional 0 decimal", "11111111.00", Item(11111111.0), - "11111111.0"}, - {"10 digit, 2 fractional small decimal", "11111111.11", Item(11111111.11)}, - {"10 digit, 2 fractional large decimal", "99999999.99", Item(99999999.99)}, - {"11 digit 0, 3 fractional small decimal", "00000000.111", Item(0.111), - "0.111"}, - {"11 digit, 3 fractional 0 decimal", "11111111.000", Item(11111111.0), - "11111111.0"}, - {"11 digit, 3 fractional small decimal", "11111111.111", - Item(11111111.111)}, - {"11 digit, 3 fractional large decimal", "99999999.999", - Item(99999999.999)}, - {"10 digit 0, 1 fractional small decimal", "000000000.1", Item(0.1), "0.1"}, - {"10 digit, 1 fractional 0 decimal", "111111111.0", Item(111111111.0), - "111111111.0"}, - {"10 digit, 1 fractional small decimal", "111111111.1", Item(111111111.1)}, - {"10 digit, 1 fractional large decimal", "999999999.9", Item(999999999.9)}, - {"11 digit 0, 2 fractional small decimal", "000000000.11", Item(0.11), - "0.11"}, - {"11 digit, 2 fractional 0 decimal", "111111111.00", Item(111111111.0), - "111111111.0"}, - {"11 digit, 2 fractional small decimal", "111111111.11", - Item(111111111.11)}, - {"11 digit, 2 fractional large decimal", "999999999.99", - Item(999999999.99)}, - {"12 digit 0, 3 fractional small decimal", "000000000.111", Item(0.111), - "0.111"}, - {"12 digit, 3 fractional 0 decimal", "111111111.000", Item(111111111.0), - "111111111.0"}, - {"12 digit, 3 fractional small decimal", "111111111.111", - Item(111111111.111)}, - {"12 digit, 3 fractional large decimal", "999999999.999", - Item(999999999.999)}, - {"11 digit 0, 1 fractional small decimal", "0000000000.1", Item(0.1), - "0.1"}, - {"11 digit, 1 fractional 0 decimal", "1111111111.0", Item(1111111111.0), - "1111111111.0"}, - {"11 digit, 1 fractional small decimal", "1111111111.1", - Item(1111111111.1)}, - {"11 digit, 1 fractional large decimal", "9999999999.9", - Item(9999999999.9)}, - {"12 digit 0, 2 fractional small decimal", "0000000000.11", Item(0.11), - "0.11"}, - {"12 digit, 2 fractional 0 decimal", "1111111111.00", Item(1111111111.0), - "1111111111.0"}, - {"12 digit, 2 fractional small decimal", "1111111111.11", - Item(1111111111.11)}, - {"12 digit, 2 fractional large decimal", "9999999999.99", - Item(9999999999.99)}, - {"13 digit 0, 3 fractional small decimal", "0000000000.111", Item(0.111), - "0.111"}, - {"13 digit, 3 fractional 0 decimal", "1111111111.000", Item(1111111111.0), - "1111111111.0"}, - {"13 digit, 3 fractional small decimal", "1111111111.111", - Item(1111111111.111)}, - {"13 digit, 3 fractional large decimal", "9999999999.999", - Item(9999999999.999)}, - {"12 digit 0, 1 fractional small decimal", "00000000000.1", Item(0.1), - "0.1"}, - {"12 digit, 1 fractional 0 decimal", "11111111111.0", Item(11111111111.0), - "11111111111.0"}, - {"12 digit, 1 fractional small decimal", "11111111111.1", - Item(11111111111.1)}, - {"12 digit, 1 fractional large decimal", "99999999999.9", - Item(99999999999.9)}, - {"13 digit 0, 2 fractional small decimal", "00000000000.11", Item(0.11), - "0.11"}, - {"13 digit, 2 fractional 0 decimal", "11111111111.00", Item(11111111111.0), - "11111111111.0"}, - {"13 digit, 2 fractional small decimal", "11111111111.11", - Item(11111111111.11)}, - {"13 digit, 2 fractional large decimal", "99999999999.99", - Item(99999999999.99)}, - {"14 digit 0, 3 fractional small decimal", "00000000000.111", Item(0.111), - "0.111"}, - {"14 digit, 3 fractional 0 decimal", "11111111111.000", Item(11111111111.0), - "11111111111.0"}, - {"14 digit, 3 fractional small decimal", "11111111111.111", - Item(11111111111.111)}, - {"14 digit, 3 fractional large decimal", "99999999999.999", - Item(99999999999.999)}, - {"13 digit 0, 1 fractional small decimal", "000000000000.1", Item(0.1), - "0.1"}, - {"13 digit, 1 fractional 0 decimal", "111111111111.0", Item(111111111111.0), - "111111111111.0"}, - {"13 digit, 1 fractional small decimal", "111111111111.1", - Item(111111111111.1)}, - {"13 digit, 1 fractional large decimal", "999999999999.9", - Item(999999999999.9)}, - {"14 digit 0, 2 fractional small decimal", "000000000000.11", Item(0.11), - "0.11"}, - {"14 digit, 2 fractional 0 decimal", "111111111111.00", - Item(111111111111.0), "111111111111.0"}, - {"14 digit, 2 fractional small decimal", "111111111111.11", - Item(111111111111.11)}, - {"14 digit, 2 fractional large decimal", "999999999999.99", - Item(999999999999.99)}, - {"15 digit 0, 3 fractional small decimal", "000000000000.111", Item(0.111), - "0.111"}, - {"15 digit, 3 fractional 0 decimal", "111111111111.000", - Item(111111111111.0), "111111111111.0"}, - {"15 digit, 3 fractional small decimal", "111111111111.111", - Item(111111111111.111)}, - {"15 digit, 3 fractional large decimal", "999999999999.999", - Item(999999999999.999)}, - {"too many digit 0 decimal", "000000000000000.0", base::nullopt}, - {"too many fractional digits 0 decimal", "000000000000.0000", - base::nullopt}, - {"too many digit 9 decimal", "999999999999999.9", base::nullopt}, - {"too many fractional digits 9 decimal", "999999999999.9999", - base::nullopt}, - // Boolean - {"basic true boolean", "?1", Item(true)}, - {"basic false boolean", "?0", Item(false)}, - {"unknown boolean", "?Q", base::nullopt}, - {"whitespace boolean", "? 1", base::nullopt}, - {"negative zero boolean", "?-0", base::nullopt}, - {"T boolean", "?T", base::nullopt}, - {"F boolean", "?F", base::nullopt}, - {"t boolean", "?t", base::nullopt}, - {"f boolean", "?f", base::nullopt}, - {"spelled-out True boolean", "?True", base::nullopt}, - {"spelled-out False boolean", "?False", base::nullopt}, - // Byte Sequence - {"basic binary", ":aGVsbG8=:", Item("hello", Item::kByteSequenceType)}, - {"empty binary", "::", Item("", Item::kByteSequenceType)}, - {"bad paddding", ":aGVsbG8:", Item("hello", Item::kByteSequenceType), - ":aGVsbG8=:"}, - {"bad end delimiter", ":aGVsbG8=", base::nullopt}, - {"extra whitespace", ":aGVsb G8=:", base::nullopt}, - {"extra chars", ":aGVsbG!8=:", base::nullopt}, - {"suffix chars", ":aGVsbG8=!:", base::nullopt}, - {"non-zero pad bits", ":iZ==:", Item("\x89", Item::kByteSequenceType), - ":iQ==:"}, - {"non-ASCII binary", ":/+Ah:", Item("\xFF\xE0!", Item::kByteSequenceType)}, - {"base64url binary", ":_-Ah:", base::nullopt}, // String {"basic string", "\"foo\"", Item("foo")}, - {"empty string", "\"\"", Item("")}, - {"long string", - "\"foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo \"", - Item("foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo " - "foo ")}, - {"whitespace string", "\" \"", Item(" ")}, {"non-ascii string", "\"f\xC3\xBC\xC3\xBC\"", base::nullopt}, - {"tab in string", "\"\t\"", base::nullopt}, - {"newline in string", "\" \n \"", base::nullopt}, - {"single quoted string", "'foo'", base::nullopt}, - {"unbalanced string", "\"foo", base::nullopt}, - {"string quoting", "\"foo \\\"bar\\\" \\\\ baz\"", - Item("foo \"bar\" \\ baz")}, - {"bad string quoting", "\"foo \\,\"", base::nullopt}, - {"ending string quote", "\"foo \\\"", base::nullopt}, - {"abruptly ending string quote", "\"foo \\", base::nullopt}, // Additional tests {"valid quoting containing \\n", "\"\\\\n\"", Item("\\n")}, {"valid quoting containing \\t", "\"\\\\t\"", Item("\\t")}, @@ -497,40 +167,11 @@ const char* canonical; // nullptr if parse error is expected, or if canonical // format is identical to raw. } list_test_cases[] = { - // Basic lists - {"basic list", "1, 42", {{{Integer(1L), {}}, {Integer(42L), {}}}}}, - {"empty list", "", List()}, - {"single item list", "42", {{{Integer(42L), {}}}}}, - {"no whitespace list", - "1,42", - {{{Integer(1L), {}}, {Integer(42L), {}}}}, - "1, 42"}, - {"trailing comma list", "1, 42,", base::nullopt}, - {"empty item list", "1,,42", base::nullopt}, // Lists of lists - {"basic list of lists", - "(1 2), (42 43)", - {{{{{Integer(1L), {}}, {Integer(2L), {}}}, {}}, - {{{Integer(42L), {}}, {Integer(43L), {}}}, {}}}}}, - {"single item list of lists", - "(42)", - {{{std::vector<ParameterizedItem>{{Integer(42L), {}}}, {}}}}}, - {"empty item list of lists", - "()", - {{{std::vector<ParameterizedItem>(), {}}}}}, - {"empty middle item list of lists", - "(1),(),(42)", - {{{std::vector<ParameterizedItem>{{Integer(1L), {}}}, {}}, - {std::vector<ParameterizedItem>(), {}}, - {std::vector<ParameterizedItem>{{Integer(42L), {}}}, {}}}}, - "(1), (), (42)"}, {"extra whitespace list of lists", "(1 42)", {{{{{Integer(1L), {}}, {Integer(42L), {}}}, {}}}}, "(1 42)"}, - {"no trailing parenthesis list of lists", "(1 42", base::nullopt}, - {"no trailing parenthesis middle list of lists", "(1 2, (42 43)", - base::nullopt}, // Parameterized Lists {"basic parameterised list", "abc_123;a=1;b=2; cdef_456, ghi;q=\"9\";r=\"+w\"", @@ -538,41 +179,6 @@ {Param("a", 1), Param("b", 2), BooleanParam("cdef_456", true)}}, {Token("ghi"), {Param("q", "9"), Param("r", "+w")}}}}, "abc_123;a=1;b=2;cdef_456, ghi;q=\"9\";r=\"+w\""}, - {"single item parameterised list", - "text/html;q=1.0", - {{{Token("text/html"), {DoubleParam("q", 1)}}}}}, - {"missing parameter value parameterised list", - "text/html;a;q=1.0", - {{{Token("text/html"), {BooleanParam("a", true), DoubleParam("q", 1)}}}}}, - {"missing terminal parameter value parameterised list", - "text/html;q=1.0;a", - {{{Token("text/html"), {DoubleParam("q", 1), BooleanParam("a", true)}}}}}, - {"no whitespace parameterised list", - "text/html,text/plain;q=0.5", - {{{Token("text/html"), {}}, - {Token("text/plain"), {DoubleParam("q", 0.5)}}}}, - "text/html, text/plain;q=0.5"}, - {"whitespace before = parameterised list", "text/html, text/plain;q =0.5", - base::nullopt}, - {"whitespace after = parameterised list", "text/html, text/plain;q= 0.5", - base::nullopt}, - {"whitespace before ; parameterised list", "text/html, text/plain ;q=0.5", - base::nullopt}, - {"whitespace after ; parameterised list", - "text/html, text/plain; q=0.5", - {{{Token("text/html"), {}}, - {Token("text/plain"), {DoubleParam("q", 0.5)}}}}, - "text/html, text/plain;q=0.5"}, - {"extra whitespace parameterised list", - "text/html , text/plain; q=0.5; charset=utf-8", - {{{Token("text/html"), {}}, - {Token("text/plain"), - {DoubleParam("q", 0.5), TokenParam("charset", "utf-8")}}}}, - "text/html, text/plain;q=0.5;charset=utf-8"}, - {"trailing comma parameterised list", "text/html,text/plain;q=0.5,", - base::nullopt}, - {"empty item parameterised list", "text/html,,text/plain;q=0.5", - base::nullopt}, // Parameterized inner lists {"parameterised basic list of lists", "(1;a=1.0 2), (42 43)", @@ -630,107 +236,13 @@ "en=\"Applepie\", da=:aGVsbG8=:", {Dictionary{{{"en", {Item("Applepie"), {}}}, {"da", {Item("hello", Item::kByteSequenceType), {}}}}}}}, - {"empty dictionary", "", Dictionary()}, - {"single item dictionary", "a=1", {Dictionary{{{"a", {Integer(1L), {}}}}}}}, - {"list item dictionary", - "a=(1 2)", - {Dictionary{{{"a", {{{Integer(1L), {}}, {Integer(2L), {}}}, {}}}}}}}, - {"single list item dictionary", - "a=(1)", - {Dictionary{ - {{"a", {std::vector<ParameterizedItem>{{Integer(1L), {}}}, {}}}}}}}, - {"empty list item dictionary", - "a=()", - {Dictionary{{{"a", {std::vector<ParameterizedItem>(), {}}}}}}}, - {"no whitespace dictionary", - "a=1,b=2", - {Dictionary{{{"a", {Integer(1L), {}}}, {"b", {Integer(2L), {}}}}}}, - "a=1, b=2"}, - {"extra whitespace dictionary", - "a=1 , b=2", - {Dictionary{{{"a", {Integer(1L), {}}}, {"b", {Integer(2L), {}}}}}}, - "a=1, b=2"}, {"tab separated dictionary", "a=1\t,\tb=2", base::nullopt}, - {"leading whitespace dictionary", - " a=1 , b=2", - {Dictionary{{{"a", {Integer(1L), {}}}, {"b", {Integer(2L), {}}}}}}, - "a=1, b=2"}, - {"whitespace before = dictionary", "a =1, b=2", base::nullopt}, - {"whitespace after = dictionary", "a=1, b= 2", base::nullopt}, - {"missing value dictionary", - "a=1, b, c=3", - {Dictionary{{{"a", {Integer(1L), {}}}, - {"b", {Item(true), {}}}, - {"c", {Integer(3L), {}}}}}}}, - {"all missing value dictionary", - "a, b, c", - {Dictionary{{{"a", {Item(true), {}}}, - {"b", {Item(true), {}}}, - {"c", {Item(true), {}}}}}}}, - {"start missing value dictionary", - "a, b=2", - {Dictionary{{{"a", {Item(true), {}}}, {"b", {Integer(2L), {}}}}}}}, - {"end missing value dictionary", - "a=1, b", - {Dictionary{{{"a", {Integer(1L), {}}}, {"b", {Item(true), {}}}}}}}, {"missing value with params dictionary", "a=1, b=?1;foo=9, c=3", {Dictionary{{{"a", {Integer(1L), {}}}, {"b", {Item(true), {Param("foo", 9)}}}, {"c", {Integer(3L), {}}}}}}}, - {"trailing comma dictionary", "a=1, b=2,", base::nullopt}, - {"empty item dictionary", "a=1,,b=2,", base::nullopt}, - {"duplicate key dictionary", - "a=1,b=2,a=3", - {Dictionary{{{"a", {Integer(3L), {}}}, {"b", {Integer(2L), {}}}}}}, - "a=3, b=2"}, - {"numeric key dictionary", "a=1,1b=2,a=1", base::nullopt}, - {"uppercase key dictionary", "a=1,B=2,a=1", base::nullopt}, - {"bad key dictionary", "a=1,b!=2,a=1", base::nullopt}, // Parameterised dictionary tests - {"basic parameterised dict", - "abc=123;a=1;b=2, def=456, ghi=789;q=9;r=\"+w\"", - {Dictionary{ - {{"abc", {Integer(123), {Param("a", 1), Param("b", 2)}}}, - {"def", {Integer(456), {}}}, - {"ghi", {Integer(789), {Param("q", 9), Param("r", "+w")}}}}}}}, - {"single item parameterised dict", - "a=b; q=1.0", - {Dictionary{{{"a", {Token("b"), {DoubleParam("q", 1.0)}}}}}}, - "a=b;q=1.0"}, - {"list item parameterised dictionary", - "a=(1 2); q=1.0", - {Dictionary{{{"a", - {{{Integer(1L), {}}, {Integer(2L), {}}}, - {DoubleParam("q", 1.0)}}}}}}, - "a=(1 2);q=1.0"}, - {"missing parameter value parameterised dict", - "a=3;c;d=5", - {Dictionary{ - {{"a", {Integer(3), {BooleanParam("c", true), Param("d", 5)}}}}}}}, - {"terminal missing parameter value parameterised dict", - "a=3;c=5;d", - {Dictionary{ - {{"a", {Integer(3), {Param("c", 5), BooleanParam("d", true)}}}}}}}, - {"no whitespace parameterised dict", - "a=b;c=1,d=e;f=2", - {Dictionary{{{"a", {Token("b"), {Param("c", 1)}}}, - {"d", {Token("e"), {Param("f", 2)}}}}}}, - "a=b;c=1, d=e;f=2"}, - {"whitespace before = parameterised dict", "a=b;q =0.5", base::nullopt}, - {"whitespace after = parameterised dict", "a=b;q= 0.5", base::nullopt}, - {"whitespace before ; parameterised dict", "a=b ;q=0.5", base::nullopt}, - {"whitespace after ; parameterised dict", - "a=b; q=0.5", - {Dictionary{{{"a", {Token("b"), {DoubleParam("q", 0.5)}}}}}}, - "a=b;q=0.5"}, - {"extra whitespace parameterised dict", - "a=b; c=1 , d=e; f=2; g=3", - {Dictionary{{{"a", {Token("b"), {Param("c", 1)}}}, - {"d", {Token("e"), {Param("f", 2), Param("g", 3)}}}}}}, - "a=b;c=1, d=e;f=2;g=3"}, - {"trailing comma parameterised dict", "a=b; q=1.0,", base::nullopt}, - {"empty item parameterised dict", "a=b; q=1.0,,c=d", base::nullopt}, {"parameterised inner list member dict", "a=(\"1\";b=1;c=?0 \"2\");d=\"e\"", {Dictionary{{{"a",
diff --git a/net/quic/quic_client_session_cache.cc b/net/quic/quic_client_session_cache.cc index fc47595..7f30dae 100644 --- a/net/quic/quic_client_session_cache.cc +++ b/net/quic/quic_client_session_cache.cc
@@ -44,9 +44,13 @@ Flush(); } -void QuicClientSessionCache::Insert( - const quic::QuicServerId& server_id, - std::unique_ptr<quic::QuicResumptionState> state) { +void QuicClientSessionCache::Insert(const quic::QuicServerId& server_id, + bssl::UniquePtr<SSL_SESSION> session, + quic::TransportParameters* params, + std::vector<uint8_t>* application_states) { + auto state = std::make_unique<quic::QuicResumptionState>(); + state->tls_session = std::move(session); + // TODO: Do something with TransportParams and application_states. cache_.Put(server_id, std::move(state)); }
diff --git a/net/quic/quic_client_session_cache.h b/net/quic/quic_client_session_cache.h index c102eff..3fe1f4f8 100644 --- a/net/quic/quic_client_session_cache.h +++ b/net/quic/quic_client_session_cache.h
@@ -31,7 +31,9 @@ ~QuicClientSessionCache() override; void Insert(const quic::QuicServerId& server_id, - std::unique_ptr<quic::QuicResumptionState> state) override; + bssl::UniquePtr<SSL_SESSION> session, + quic::TransportParameters* params, + std::vector<uint8_t>* application_states) override; std::unique_ptr<quic::QuicResumptionState> Lookup( const quic::QuicServerId& server_id,
diff --git a/net/quic/quic_client_session_cache_unittests.cc b/net/quic/quic_client_session_cache_unittests.cc index d9b7312..6170abba 100644 --- a/net/quic/quic_client_session_cache_unittests.cc +++ b/net/quic/quic_client_session_cache_unittests.cc
@@ -55,12 +55,12 @@ std::unique_ptr<quic::QuicResumptionState> state1 = std::make_unique<quic::QuicResumptionState>(); - state1->application_state.push_back('a'); + state1->application_state->push_back('a'); state1->tls_session = NewSSLSession(); quic::QuicServerId id1("a.com", 443); std::unique_ptr<quic::QuicResumptionState> state2 = std::make_unique<quic::QuicResumptionState>(); - state2->application_state.push_back('b'); + state2->application_state->push_back('b'); state2->tls_session = NewSSLSession(); quic::QuicServerId id2("b.com", 443); @@ -68,21 +68,24 @@ EXPECT_EQ(nullptr, cache.Lookup(id2, ssl_ctx_.get())); EXPECT_EQ(0u, cache.size()); - cache.Insert(id1, std::move(state1)); + cache.Insert(id1, std::move(state1->tls_session), nullptr, + state1->application_state); EXPECT_EQ(1u, cache.size()); - EXPECT_EQ('a', cache.Lookup(id1, ssl_ctx_.get())->application_state.front()); + EXPECT_EQ('a', cache.Lookup(id1, ssl_ctx_.get())->application_state->front()); EXPECT_EQ(nullptr, cache.Lookup(id2, ssl_ctx_.get())); std::unique_ptr<quic::QuicResumptionState> state3 = std::make_unique<quic::QuicResumptionState>(); - state3->application_state.push_back('c'); + state3->application_state->push_back('c'); state3->tls_session = NewSSLSession(); quic::QuicServerId id3("c.com", 443); - cache.Insert(id3, std::move(state3)); - cache.Insert(id2, std::move(state2)); + cache.Insert(id3, std::move(state3->tls_session), nullptr, + state3->application_state); + cache.Insert(id2, std::move(state2->tls_session), nullptr, + state2->application_state); EXPECT_EQ(2u, cache.size()); - EXPECT_EQ('b', cache.Lookup(id2, ssl_ctx_.get())->application_state.front()); - EXPECT_EQ('c', cache.Lookup(id3, ssl_ctx_.get())->application_state.front()); + EXPECT_EQ('b', cache.Lookup(id2, ssl_ctx_.get())->application_state->front()); + EXPECT_EQ('c', cache.Lookup(id3, ssl_ctx_.get())->application_state->front()); // Verify that the cache is cleared after Lookups. EXPECT_EQ(nullptr, cache.Lookup(id1, ssl_ctx_.get())); @@ -97,29 +100,32 @@ std::unique_ptr<quic::QuicResumptionState> state1 = std::make_unique<quic::QuicResumptionState>(); - state1->application_state.push_back('a'); + state1->application_state->push_back('a'); state1->tls_session = NewSSLSession(); quic::QuicServerId id1("a.com", 443); std::unique_ptr<quic::QuicResumptionState> state2 = std::make_unique<quic::QuicResumptionState>(); - state2->application_state.push_back('b'); + state2->application_state->push_back('b'); state2->tls_session = NewSSLSession(); quic::QuicServerId id2("b.com", 443); std::unique_ptr<quic::QuicResumptionState> state3 = std::make_unique<quic::QuicResumptionState>(); - state3->application_state.push_back('c'); + state3->application_state->push_back('c'); state3->tls_session = NewSSLSession(); quic::QuicServerId id3("c.com", 443); - cache.Insert(id1, std::move(state1)); - cache.Insert(id2, std::move(state2)); - cache.Insert(id3, std::move(state3)); + cache.Insert(id1, std::move(state1->tls_session), nullptr, + state1->application_state); + cache.Insert(id2, std::move(state2->tls_session), nullptr, + state2->application_state); + cache.Insert(id3, std::move(state3->tls_session), nullptr, + state3->application_state); EXPECT_EQ(2u, cache.size()); - EXPECT_EQ('b', cache.Lookup(id2, ssl_ctx_.get())->application_state.front()); - EXPECT_EQ('c', cache.Lookup(id3, ssl_ctx_.get())->application_state.front()); + EXPECT_EQ('b', cache.Lookup(id2, ssl_ctx_.get())->application_state->front()); + EXPECT_EQ('c', cache.Lookup(id3, ssl_ctx_.get())->application_state->front()); EXPECT_EQ(nullptr, cache.Lookup(id1, ssl_ctx_.get())); } @@ -140,11 +146,13 @@ std::make_unique<quic::QuicResumptionState>(); state2->tls_session = MakeTestSession(clock->Now(), 3 * kTimeout); ; - state2->application_state.push_back('b'); + state2->application_state->push_back('b'); quic::QuicServerId id2("b.com", 443); - cache.Insert(id1, std::move(state1)); - cache.Insert(id2, std::move(state2)); + cache.Insert(id1, std::move(state1->tls_session), nullptr, + state1->application_state); + cache.Insert(id2, std::move(state2->tls_session), nullptr, + state2->application_state); EXPECT_EQ(2u, cache.size()); // Expire the session. @@ -154,7 +162,7 @@ EXPECT_EQ(nullptr, cache.Lookup(id1, ssl_ctx_.get())); EXPECT_EQ(1u, cache.size()); - EXPECT_EQ('b', cache.Lookup(id2, ssl_ctx_.get())->application_state.front()); + EXPECT_EQ('b', cache.Lookup(id2, ssl_ctx_.get())->application_state->front()); EXPECT_EQ(0u, cache.size()); } @@ -173,12 +181,14 @@ std::unique_ptr<quic::QuicResumptionState> state2 = std::make_unique<quic::QuicResumptionState>(); state2->tls_session = MakeTestSession(clock->Now(), 3 * kTimeout); - ; - state2->application_state.push_back('b'); + + state2->application_state->push_back('b'); quic::QuicServerId id2("b.com", 443); - cache.Insert(id1, std::move(state1)); - cache.Insert(id2, std::move(state2)); + cache.Insert(id1, std::move(state1->tls_session), nullptr, + state1->application_state); + cache.Insert(id2, std::move(state2->tls_session), nullptr, + state2->application_state); EXPECT_EQ(2u, cache.size()); // Expire the session. @@ -202,4 +212,4 @@ EXPECT_EQ(0u, cache.size()); } -} // namespace net \ No newline at end of file +} // namespace net
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h index e187862..c4a70ed4 100644 --- a/net/quic/quic_flags_list.h +++ b/net/quic/quic_flags_list.h
@@ -240,7 +240,7 @@ QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_disable_version_q050, false) // If true, enable QUIC version T050. -QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_t050, true) +QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_t050_v2, true) // A testonly reloadable flag that will always default to false. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_testonly_default_false, false) @@ -266,12 +266,6 @@ // If true, use predictable grease settings identifiers and values. QUIC_FLAG(bool, FLAGS_quic_enable_http3_grease_randomness, true) -// When the EACK connection option is sent by the client, an ack-eliciting frame -// is bundled with ACKs sent after the PTO fires. -QUIC_FLAG(bool, - FLAGS_quic_reloadable_flag_quic_bundle_retransmittable_with_pto_ack, - true) - // If true, enable QUIC version h3-25. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_draft_25_v3, @@ -295,16 +289,6 @@ FLAGS_quic_reloadable_flag_spdy_enable_granular_decompress_errors, true) -// If true, arm the 1st PTO with earliest in flight sent time. -QUIC_FLAG(bool, - FLAGS_quic_reloadable_flag_quic_arm_pto_with_earliest_sent_time, - true) - -// If true, QUIC BBRv2 to avoid unnecessary PROBE_RTTs after quiescence. -QUIC_FLAG(bool, - FLAGS_quic_reloadable_flag_quic_bbr2_avoid_unnecessary_probe_rtt, - true) - // If true, use passed in ack_frame to calculate minimum size of the serialized // ACK frame. QUIC_FLAG(bool, @@ -376,7 +360,7 @@ // copy the bandwidth sampler states from BbrSender. QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_copy_sampler_state_from_v1_to_v2, - false) + true) // If true, QUIC will enable connection options LRTT+BBQ2 by default. QUIC_FLAG(bool, @@ -385,3 +369,19 @@ // If true, server push will be allowed in QUIC versions using HTTP/3. QUIC_FLAG(bool, FLAGS_quic_enable_http3_server_push, false) + +// If true, disable QuicDispatcher workaround that replies to invalid QUIC +// packets from the Android Conformance Test. +QUIC_FLAG( + bool, + FLAGS_quic_reloadable_flag_quic_remove_android_conformance_test_workaround, + false) + +// If true, lower the CWND gain in BBRv2 STARTUP to 2 when BBQ2 is in connection +// options. +QUIC_FLAG(bool, + FLAGS_quic_reloadable_flag_quic_bbr2_lower_startup_cwnd_gain, + false) + +// The divisor that controls how often MAX_STREAMS frames are sent. +QUIC_FLAG(int32_t, FLAGS_quic_max_streams_window_divisor, 2)
diff --git a/net/spdy/platform/impl/spdy_flags_impl.cc b/net/spdy/platform/impl/spdy_flags_impl.cc index e6c2803..f83316e29 100644 --- a/net/spdy/platform/impl/spdy_flags_impl.cc +++ b/net/spdy/platform/impl/spdy_flags_impl.cc
@@ -6,4 +6,8 @@ bool spdy_enable_granular_decompress_errors = true; +// If true, use indexed name if possible when sending +// Literal Header Field without Indexing instruction. +bool spdy_hpack_use_indexed_name = true; + namespace spdy {} // namespace spdy
diff --git a/net/spdy/platform/impl/spdy_flags_impl.h b/net/spdy/platform/impl/spdy_flags_impl.h index 9dd6fb4..bf9d8410 100644 --- a/net/spdy/platform/impl/spdy_flags_impl.h +++ b/net/spdy/platform/impl/spdy_flags_impl.h
@@ -8,6 +8,7 @@ #include "net/base/net_export.h" NET_EXPORT_PRIVATE extern bool spdy_enable_granular_decompress_errors; +NET_EXPORT_PRIVATE extern bool spdy_hpack_use_indexed_name; inline bool GetSpdyReloadableFlagImpl(bool flag) { return flag;
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn index 5585047..a5c4d598 100644 --- a/net/third_party/quiche/BUILD.gn +++ b/net/third_party/quiche/BUILD.gn
@@ -1344,7 +1344,6 @@ "src/quic/core/quic_time_test.cc", "src/quic/core/quic_time_wait_list_manager_test.cc", "src/quic/core/quic_trace_visitor_test.cc", - "src/quic/core/quic_types_test.cc", "src/quic/core/quic_unacked_packet_map_test.cc", "src/quic/core/quic_utils_test.cc", "src/quic/core/quic_version_manager_test.cc",
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 65fcd744..7897846 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -663,6 +663,21 @@ return params_ && params_->skip_reporting_send_permission_check; } +void NetworkContext::ClearTrustTokenData(mojom::ClearDataFilterPtr filter, + base::OnceClosure done) { + if (!trust_token_store_) { + std::move(done).Run(); + return; + } + trust_token_store_->ExecuteOrEnqueue(base::BindOnce( + [](mojom::ClearDataFilterPtr filter, base::OnceClosure done, + TrustTokenStore* store) { + ignore_result(store->ClearDataForFilter(std::move(filter))); + std::move(done).Run(); + }, + std::move(filter), std::move(done))); +} + void NetworkContext::ClearNetworkingHistorySince( base::Time time, base::OnceClosure completion_callback) {
diff --git a/services/network/network_context.h b/services/network/network_context.h index 1c1446d..bdda02b 100644 --- a/services/network/network_context.h +++ b/services/network/network_context.h
@@ -198,6 +198,8 @@ void GetHasTrustTokensAnswerer( mojo::PendingReceiver<mojom::HasTrustTokensAnswerer> receiver, const url::Origin& top_frame_origin) override; + void ClearTrustTokenData(mojom::ClearDataFilterPtr filter, + base::OnceClosure done) override; void ClearNetworkingHistorySince( base::Time time, base::OnceClosure completion_callback) override;
diff --git a/services/network/network_service.cc b/services/network/network_service.cc index 7847522..b289d86 100644 --- a/services/network/network_service.cc +++ b/services/network/network_service.cc
@@ -712,9 +712,10 @@ } void NetworkService::SetTrustTokenKeyCommitments( - base::flat_map<url::Origin, mojom::TrustTokenKeyCommitmentResultPtr> - commitments) { - trust_token_key_commitments_->Set(std::move(commitments)); + const std::string& raw_commitments, + base::OnceClosure done) { + trust_token_key_commitments_->ParseAndSet(raw_commitments); + std::move(done).Run(); } #if defined(OS_ANDROID)
diff --git a/services/network/network_service.h b/services/network/network_service.h index 0d5ffd8..c69c3a7 100644 --- a/services/network/network_service.h +++ b/services/network/network_service.h
@@ -175,9 +175,8 @@ #endif void SetEnvironment( std::vector<mojom::EnvironmentVariablePtr> environment) override; - void SetTrustTokenKeyCommitments( - base::flat_map<url::Origin, mojom::TrustTokenKeyCommitmentResultPtr> - commitments) override; + void SetTrustTokenKeyCommitments(const std::string& raw_commitments, + base::OnceClosure done) override; #if defined(OS_ANDROID) void DumpWithoutCrashing(base::Time dump_request_time) override;
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc index a445ba8..f4331e7 100644 --- a/services/network/network_service_unittest.cc +++ b/services/network/network_service_unittest.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "base/base64.h" #include "base/bind.h" #include "base/containers/span.h" #include "base/files/file_util.h" @@ -1230,25 +1231,25 @@ ASSERT_TRUE(service_->trust_token_key_commitments()); auto expectation = mojom::TrustTokenKeyCommitmentResult::New(); - expectation->batch_size = mojom::TrustTokenKeyCommitmentBatchSize::New(5); + ASSERT_TRUE(base::Base64Decode( + "aaaa", &expectation->signed_redemption_record_verification_key)); - url::Origin issuer_origin = - url::Origin::Create(GURL("https://issuer.example")); - - base::flat_map<url::Origin, mojom::TrustTokenKeyCommitmentResultPtr> to_set; - to_set.insert_or_assign(issuer_origin, expectation.Clone()); - network_service_->SetTrustTokenKeyCommitments(std::move(to_set)); - network_service_.FlushForTesting(); + base::RunLoop run_loop; + network_service_->SetTrustTokenKeyCommitments( + R"( { "https://issuer.example": { "srrkey": "aaaa" } } )", + run_loop.QuitClosure()); + run_loop.Run(); mojom::TrustTokenKeyCommitmentResultPtr result; bool ran = false; service_->trust_token_key_commitments()->Get( - issuer_origin, base::BindLambdaForTesting( - [&](mojom::TrustTokenKeyCommitmentResultPtr ptr) { - result = std::move(ptr); - ran = true; - })); + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.example")), + base::BindLambdaForTesting( + [&](mojom::TrustTokenKeyCommitmentResultPtr ptr) { + result = std::move(ptr); + ran = true; + })); ASSERT_TRUE(ran);
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom index 02675e0c..cb96bae3 100644 --- a/services/network/public/mojom/network_context.mojom +++ b/services/network/public/mojom/network_context.mojom
@@ -883,6 +883,12 @@ pending_receiver<HasTrustTokensAnswerer> has_trust_tokens_answerer, url.mojom.Origin top_frame_origin); + // Clears persistent Trust Tokens data keyed by the origins in |filter|, and + // by origins corresponding to the domains in |filter|. + // + // A null |filter| indicates that all Trust Tokens data should be cleared. + ClearTrustTokenData(ClearDataFilter? filter) => (); + // Clears network objects with implicit URL history information. Data related // to events that happened prior to |start_time| may be retained. Only applies // to network objects without more specific methods (Cookies,
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom index 4ed52a1f..8e61b7e6 100644 --- a/services/network/public/mojom/network_service.mojom +++ b/services/network/public/mojom/network_service.mojom
@@ -387,11 +387,12 @@ // |environment| array. SetEnvironment(array<EnvironmentVariable> environment); - // Sets Trust Tokens key commitment state. |commitments| is a map from issuer - // origins to key commitment results (each result contains a collection of - // keys and some associated metadata). - SetTrustTokenKeyCommitments( - map<url.mojom.Origin, TrustTokenKeyCommitmentResult> commitments); + // Sets Trust Tokens key commitment state. |raw_commitments| is the + // JSON-encoded string representation of a collection of issuers' key + // commitments according to the format specified, for now, in the Trust + // Tokens design doc: + // https://docs.google.com/document/d/1TNnya6B8pyomDK2F1R9CL3dY10OAmqWlnCxsWyOBDVQ/edit#heading=h.z52drgpfgulz. + SetTrustTokenKeyCommitments(string raw_commitments) => (); // Calls base::debug::DumpWithoutCrashing for the network process. // TODO(http://crbug.com/934317): Remove this once done debugging renderer
diff --git a/services/network/test/test_network_context.h b/services/network/test/test_network_context.h index 51593e2..30463e8 100644 --- a/services/network/test/test_network_context.h +++ b/services/network/test/test_network_context.h
@@ -89,6 +89,8 @@ mojom::ClearDataFilterPtr filter, DomainReliabilityClearMode mode, ClearDomainReliabilityCallback callback) override {} + void ClearTrustTokenData(mojom::ClearDataFilterPtr filter, + ClearTrustTokenDataCallback callback) override {} void GetDomainReliabilityJSON( GetDomainReliabilityJSONCallback callback) override {} void QueueReport(const std::string& type,
diff --git a/services/network/trust_tokens/BUILD.gn b/services/network/trust_tokens/BUILD.gn index 6227942..e2ae1b8 100644 --- a/services/network/trust_tokens/BUILD.gn +++ b/services/network/trust_tokens/BUILD.gn
@@ -3,6 +3,7 @@ # found in the LICENSE file. import("//services/network/public/cpp/features.gni") +import("//testing/libfuzzer/fuzzer_test.gni") import("//third_party/protobuf/proto_library.gni") source_set("trust_tokens") { @@ -158,3 +159,14 @@ extra_configs = [ "//build/config/compiler:wexit_time_destructors" ] } + +fuzzer_test("trust_token_key_commitment_parser_fuzzer") { + sources = [ "test/trust_token_key_commitment_parser_fuzzer.cc" ] + deps = [ + ":trust_tokens", + "//base", + "//services/network/public/mojom", + ] + dict = "test/trust_token_key_commitment_parser_fuzzer.dict" + seed_corpus = "//third_party/grpc/src/test/core/json/corpus/" +}
diff --git a/services/network/trust_tokens/test/trust_token_key_commitment_parser_fuzzer.cc b/services/network/trust_tokens/test/trust_token_key_commitment_parser_fuzzer.cc new file mode 100644 index 0000000..54245b03 --- /dev/null +++ b/services/network/trust_tokens/test/trust_token_key_commitment_parser_fuzzer.cc
@@ -0,0 +1,20 @@ +// 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 "services/network/trust_tokens/trust_token_key_commitment_parser.h" + +#include <memory> + +#include "services/network/public/mojom/trust_tokens.mojom.h" + +namespace network { + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + base::StringPiece string_input(reinterpret_cast<const char*>(data), size); + TrustTokenKeyCommitmentParser().Parse(string_input); + TrustTokenKeyCommitmentParser().ParseMultipleIssuers(string_input); + return 0; +} + +} // namespace network
diff --git a/services/network/trust_tokens/test/trust_token_key_commitment_parser_fuzzer.dict b/services/network/trust_tokens/test/trust_token_key_commitment_parser_fuzzer.dict new file mode 100644 index 0000000..c7037fda --- /dev/null +++ b/services/network/trust_tokens/test/trust_token_key_commitment_parser_fuzzer.dict
@@ -0,0 +1,38 @@ +# 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. + +"{" +"}" +"[" +"]" +"\"" +"'" +"\\" +"//" +":" +"," +" " +"\\n" +"\\r" +"/*" +"*/" +"true" +"false" +"null" +"\\u" +"\\b" +"\\f" +"\\t" +"." +"e" +"e+" +"e-" +"E" +"E+" +"E-" +"srrkey" +"batchsize" +"Y" +"expiry" +"https"
diff --git a/services/network/trust_tokens/trust_token_key_commitment_parser.cc b/services/network/trust_tokens/trust_token_key_commitment_parser.cc index d0d3240..03c0b25b 100644 --- a/services/network/trust_tokens/trust_token_key_commitment_parser.cc +++ b/services/network/trust_tokens/trust_token_key_commitment_parser.cc
@@ -10,7 +10,9 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_piece.h" #include "base/values.h" +#include "services/network/public/mojom/trust_tokens.mojom-forward.h" #include "services/network/public/mojom/trust_tokens.mojom.h" +#include "services/network/trust_tokens/suitable_trust_token_origin.h" namespace network { @@ -70,6 +72,74 @@ return ParseKeyResult::kSucceed; } +mojom::TrustTokenKeyCommitmentResultPtr ParseSingleIssuer( + const base::Value& value) { + if (!value.is_dict()) + return nullptr; + + auto result = mojom::TrustTokenKeyCommitmentResult::New(); + + // Confirm that the batchsize field is type-safe, if it's present. + if (value.FindKey(kTrustTokenKeyCommitmentBatchsizeField) && + !value.FindIntKey(kTrustTokenKeyCommitmentBatchsizeField)) { + return nullptr; + } + if (base::Optional<int> maybe_batch_size = + value.FindIntKey(kTrustTokenKeyCommitmentBatchsizeField)) { + result->batch_size = + mojom::TrustTokenKeyCommitmentBatchSize::New(*maybe_batch_size); + } + + // Confirm that the srrkey field is present and base64-encoded. + const std::string* maybe_srrkey = + value.FindStringKey(kTrustTokenKeyCommitmentSrrkeyField); + if (!maybe_srrkey) + return nullptr; + if (!base::Base64Decode(*maybe_srrkey, + &result->signed_redemption_record_verification_key)) { + return nullptr; + } + + // Parse the key commitments in the result (these are exactly the + // key-value pairs in the dictionary with dictionary-typed values). + for (const auto& kv : value.DictItems()) { + const base::Value& item = kv.second; + if (!item.is_dict()) + continue; + + auto key = mojom::TrustTokenVerificationKey::New(); + + if (!ParseSingleKeyLabel(kv.first, &key->label)) + return nullptr; + + switch (ParseSingleKeyExceptLabel(item, key.get())) { + case ParseKeyResult::kFail: + return nullptr; + case ParseKeyResult::kIgnore: + continue; + case ParseKeyResult::kSucceed: + result->keys.push_back(std::move(key)); + } + } + + return result; +} + +// Entry is a convenience struct used as an intermediate representation when +// parsing multiple issuers. In addition to a parsed canonicalized issuer, it +// preserves the raw JSON string key (the second entry) in order +// deterministically to deduplicate entries with keys canonicalizing to the same +// issuer. +using Entry = std::tuple<SuitableTrustTokenOrigin, // canonicalized issuer + std::string, // raw key from the JSON + mojom::TrustTokenKeyCommitmentResultPtr>; +SuitableTrustTokenOrigin& canonicalized_issuer(Entry& e) { + return std::get<0>(e); +} +mojom::TrustTokenKeyCommitmentResultPtr& commitment(Entry& e) { + return std::get<2>(e); +} + } // namespace const char kTrustTokenKeyCommitmentBatchsizeField[] = "batchsize"; @@ -101,55 +171,71 @@ if (!maybe_value) return nullptr; + return ParseSingleIssuer(std::move(*maybe_value)); +} + +std::unique_ptr<base::flat_map<SuitableTrustTokenOrigin, + mojom::TrustTokenKeyCommitmentResultPtr>> +TrustTokenKeyCommitmentParser::ParseMultipleIssuers( + base::StringPiece response_body) { + base::Optional<base::Value> maybe_value = + base::JSONReader::Read(response_body); + if (!maybe_value) + return nullptr; + if (!maybe_value->is_dict()) return nullptr; - auto result = mojom::TrustTokenKeyCommitmentResult::New(); + // The configuration might contain conflicting lists of keys for issuers with + // the same canonicalized URLs but different string representations provided + // by the server. In order to handle these deterministically, first transfer + // the entries to intermediate storage while maintaining the initial JSON + // keys; then deduplicate based on identical entries' JSON keys' lexicographic + // value. - // Confirm that the batchsize field is type-safe, if it's present. - if (maybe_value->FindKey(kTrustTokenKeyCommitmentBatchsizeField) && - !maybe_value->FindIntKey(kTrustTokenKeyCommitmentBatchsizeField)) { - return nullptr; - } - if (base::Optional<int> maybe_batch_size = - maybe_value->FindIntKey(kTrustTokenKeyCommitmentBatchsizeField)) { - result->batch_size = - mojom::TrustTokenKeyCommitmentBatchSize::New(*maybe_batch_size); - } + std::vector<Entry> parsed_entries; - // Confirm that the srrkey field is present and base64-encoded. - const std::string* maybe_srrkey = - maybe_value->FindStringKey(kTrustTokenKeyCommitmentSrrkeyField); - if (!maybe_srrkey) - return nullptr; - if (!base::Base64Decode(*maybe_srrkey, - &result->signed_redemption_record_verification_key)) { - return nullptr; - } - - // Parse the key commitments in the result (these are exactly the - // key-value pairs in the dictionary with dictionary-typed values). for (const auto& kv : maybe_value->DictItems()) { - const base::Value& item = kv.second; - if (!item.is_dict()) + const std::string& raw_key_from_json = kv.first; + base::Optional<SuitableTrustTokenOrigin> maybe_issuer = + SuitableTrustTokenOrigin::Create(GURL(raw_key_from_json)); + + if (!maybe_issuer) continue; - auto key = mojom::TrustTokenVerificationKey::New(); + mojom::TrustTokenKeyCommitmentResultPtr commitment_result = + ParseSingleIssuer(kv.second); - if (!ParseSingleKeyLabel(kv.first, &key->label)) - return nullptr; + if (!commitment_result) + continue; - switch (ParseSingleKeyExceptLabel(item, key.get())) { - case ParseKeyResult::kFail: - return nullptr; - case ParseKeyResult::kIgnore: - continue; - case ParseKeyResult::kSucceed: - result->keys.push_back(std::move(key)); - } + parsed_entries.emplace_back(Entry(std::move(*maybe_issuer), + raw_key_from_json, + std::move(commitment_result))); } - return result; + // Deterministically deduplicate entries corresponding to the same issuer, + // with the largest JSON key lexicographically winning. + std::sort(parsed_entries.begin(), parsed_entries.end(), std::greater<>()); + parsed_entries.erase(std::unique(parsed_entries.begin(), parsed_entries.end(), + [](Entry& lhs, Entry& rhs) -> bool { + return canonicalized_issuer(lhs) == + canonicalized_issuer(rhs); + }), + parsed_entries.end()); + + // Finally, discard the raw JSON strings and construct a map to return. + std::vector<std::pair<SuitableTrustTokenOrigin, + mojom::TrustTokenKeyCommitmentResultPtr>> + map_storage; + map_storage.reserve(parsed_entries.size()); + for (Entry& e : parsed_entries) { + map_storage.emplace_back(std::move(canonicalized_issuer(e)), + std::move(commitment(e))); + } + return std::make_unique<base::flat_map< + SuitableTrustTokenOrigin, mojom::TrustTokenKeyCommitmentResultPtr>>( + std::move(map_storage)); } } // namespace network
diff --git a/services/network/trust_tokens/trust_token_key_commitment_parser.h b/services/network/trust_tokens/trust_token_key_commitment_parser.h index 3d5f46c..2131ce8 100644 --- a/services/network/trust_tokens/trust_token_key_commitment_parser.h +++ b/services/network/trust_tokens/trust_token_key_commitment_parser.h
@@ -9,6 +9,7 @@ #include "base/strings/string_piece_forward.h" #include "services/network/public/mojom/trust_tokens.mojom-forward.h" +#include "services/network/trust_tokens/suitable_trust_token_origin.h" #include "services/network/trust_tokens/trust_token_key_commitment_controller.h" namespace network { @@ -46,6 +47,30 @@ // epoch) storing a time in the future. mojom::TrustTokenKeyCommitmentResultPtr Parse( base::StringPiece response_body) override; + + // Like |Parse|, except that the input is expected to be of the form + // { "https://some-issuer.example": <JSON in the form expected by |Parse|> + // "https://some-other-issuer.example": + // <JSON in the form expected by |Parse|>, + // ... } + // + // Returns nullptr if the input is not a dictionary. + // + // WARNING: If there are multiple keys that are exactly equal strings, + // deduplicates these entries arbitrarily (due to the behavior of + // base::JSONReader). For instance, if these keys are arriving through the + // component updater, you might want to guarantee that the server-side logic + // producing these structures guarantees no duplicate keys. + // + // If there are multiple keys that are not exact duplicates but correspond to + // the same issuer, drops all but the entry with the largest key + // lexicographically. + // + // Skips key-value pairs where the key is not a suitable Trust Tokens origin + // or the value fails to parse. + std::unique_ptr<base::flat_map<SuitableTrustTokenOrigin, + mojom::TrustTokenKeyCommitmentResultPtr>> + ParseMultipleIssuers(base::StringPiece response_body); }; } // namespace network
diff --git a/services/network/trust_tokens/trust_token_key_commitment_parser_unittest.cc b/services/network/trust_tokens/trust_token_key_commitment_parser_unittest.cc index 53c6a21..4e858f9 100644 --- a/services/network/trust_tokens/trust_token_key_commitment_parser_unittest.cc +++ b/services/network/trust_tokens/trust_token_key_commitment_parser_unittest.cc
@@ -36,7 +36,7 @@ } // namespace -TEST(TrustTokenKeyCommitmentParsing, RejectsEmpty) { +TEST(TrustTokenKeyCommitmentParser, RejectsEmpty) { // If the input isn't valid JSON, we should // reject it. In particular, we should reject // empty input. @@ -44,7 +44,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse("")); } -TEST(TrustTokenKeyCommitmentParsing, RejectsNonemptyMalformed) { +TEST(TrustTokenKeyCommitmentParser, RejectsNonemptyMalformed) { // If the input isn't valid JSON, we should // reject it. const char input[] = "certainly not valid JSON"; @@ -55,7 +55,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsNonDictionaryInput) { +TEST(TrustTokenKeyCommitmentParser, RejectsNonDictionaryInput) { // The outermost value should be a dictionary. // Valid JSON, but not a dictionary. @@ -67,7 +67,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, AcceptsMinimal) { +TEST(TrustTokenKeyCommitmentParser, AcceptsMinimal) { std::string input = R"( { "srrkey": "aaaa" } )"; // Sanity check that the input is actually valid JSON. @@ -81,7 +81,7 @@ EqualsMojo(expectation)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsMissingSrrkey) { +TEST(TrustTokenKeyCommitmentParser, RejectsMissingSrrkey) { std::string input = R"( {} )"; // Sanity check that the input is actually valid JSON. @@ -92,7 +92,7 @@ EXPECT_FALSE(result); } -TEST(TrustTokenKeyCommitmentParsing, RejectsTypeUnsafeSrrkey) { +TEST(TrustTokenKeyCommitmentParser, RejectsTypeUnsafeSrrkey) { std::string input = R"( { "srrkey": 5 } )"; // Sanity check that the input is actually valid JSON. @@ -103,7 +103,7 @@ EXPECT_FALSE(result); } -TEST(TrustTokenKeyCommitmentParsing, RejectsNonBase64Srrkey) { +TEST(TrustTokenKeyCommitmentParser, RejectsNonBase64Srrkey) { std::string input = R"( { "srrkey": "spaces aren't valid base64" } )"; // Sanity check that the input is actually valid JSON. @@ -114,7 +114,7 @@ EXPECT_FALSE(result); } -TEST(TrustTokenKeyCommitmentParsing, RejectsKeyWithTypeUnsafeKeyLabel) { +TEST(TrustTokenKeyCommitmentParser, RejectsKeyWithTypeUnsafeKeyLabel) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -143,7 +143,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsKeyWithKeyLabelTooSmall) { +TEST(TrustTokenKeyCommitmentParser, RejectsKeyWithKeyLabelTooSmall) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -170,7 +170,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsKeyWithKeyLabelTooLarge) { +TEST(TrustTokenKeyCommitmentParser, RejectsKeyWithKeyLabelTooLarge) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -197,7 +197,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsOtherwiseValidButNonBase64Key) { +TEST(TrustTokenKeyCommitmentParser, RejectsOtherwiseValidButNonBase64Key) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -223,7 +223,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, AcceptsKeyWithExpiryAndBody) { +TEST(TrustTokenKeyCommitmentParser, AcceptsKeyWithExpiryAndBody) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -253,7 +253,7 @@ EXPECT_THAT(result->keys, ElementsAre(EqualsMojo(my_key))); } -TEST(TrustTokenKeyCommitmentParsing, AcceptsMultipleKeys) { +TEST(TrustTokenKeyCommitmentParser, AcceptsMultipleKeys) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -296,7 +296,7 @@ UnorderedElementsAre(EqualsMojo(a_key), EqualsMojo(another_key))); } -TEST(TrustTokenKeyCommitmentParsing, RejectsKeyWithNoExpiry) { +TEST(TrustTokenKeyCommitmentParser, RejectsKeyWithNoExpiry) { // If a key has a missing "expiry" field, we should reject the entire // record. const std::string input = R"( { "srrkey": "aaaa", @@ -309,7 +309,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsKeyWithMalformedExpiry) { +TEST(TrustTokenKeyCommitmentParser, RejectsKeyWithMalformedExpiry) { // If a key has a malformed "expiry" field, we should reject the entire // record. const std::string input = @@ -329,7 +329,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, IgnoreKeyWithExpiryInThePast) { +TEST(TrustTokenKeyCommitmentParser, IgnoreKeyWithExpiryInThePast) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -363,7 +363,7 @@ mojo::Equals(TrustTokenKeyCommitmentParser().Parse(input), expectation)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsKeyWithNoBody) { +TEST(TrustTokenKeyCommitmentParser, RejectsKeyWithNoBody) { base::test::TaskEnvironment env( base::test::TaskEnvironment::TimeSource::MOCK_TIME); @@ -386,7 +386,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, RejectsEmptyKey) { +TEST(TrustTokenKeyCommitmentParser, RejectsEmptyKey) { // If a key has neither an expiry or a body, // we should reject the entire result. @@ -400,7 +400,7 @@ EXPECT_FALSE(TrustTokenKeyCommitmentParser().Parse(input)); } -TEST(TrustTokenKeyCommitmentParsing, ParsesBatchSize) { +TEST(TrustTokenKeyCommitmentParser, ParsesBatchSize) { std::string input = R"({ "srrkey": "aaaa", @@ -414,7 +414,7 @@ EXPECT_EQ(result->batch_size->value, 5); } -TEST(TrustTokenKeyCommitmentParsing, RejectsTypeUnsafeBatchSize) { +TEST(TrustTokenKeyCommitmentParser, RejectsTypeUnsafeBatchSize) { std::string input = R"({ "srrkey": "aaaa", @@ -426,4 +426,154 @@ EXPECT_FALSE(result); } +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, InvalidJson) { + std::string input = ""; + ASSERT_FALSE( + base::JSONReader::Read(input)); // Make sure it's really not valid JSON. + + auto result = TrustTokenKeyCommitmentParser().ParseMultipleIssuers(input); + EXPECT_FALSE(result); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, NotADictionary) { + std::string input = "3"; + + auto result = TrustTokenKeyCommitmentParser().ParseMultipleIssuers(input); + EXPECT_FALSE(result); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, Empty) { + std::string input = "{}"; + + // Make sure the input is actually valid JSON. + ASSERT_TRUE(base::JSONReader::Read(input)); + + auto result = TrustTokenKeyCommitmentParser().ParseMultipleIssuers(input); + ASSERT_TRUE(result); + EXPECT_TRUE(result->empty()); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, UnsuitableKey) { + // Test that a key with an unsuitable Trust Tokens origin gets skipped. + std::string input = + R"( { "http://insecure.example/": { "srrkey": "aaaa" } } )"; + + // Make sure the input is actually valid JSON. + ASSERT_TRUE(base::JSONReader::Read(input)); + + auto result = TrustTokenKeyCommitmentParser().ParseMultipleIssuers(input); + ASSERT_TRUE(result); + EXPECT_TRUE(result->empty()); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, SuitableKeyInvalidValue) { + // Test that a key-value pair with a malformed value gets skipped. + std::string input = + R"( { "https://insecure.example/": + "not a valid encoding of a key commitment result" } )"; + + // Make sure the input is actually valid JSON. + ASSERT_TRUE(base::JSONReader::Read(input)); + + auto result = TrustTokenKeyCommitmentParser().ParseMultipleIssuers(input); + ASSERT_TRUE(result); + EXPECT_TRUE(result->empty()); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, SingleIssuer) { + std::string input = + R"( { "https://issuer.example/": { "srrkey": "aaaa" } } )"; + + // Make sure the input is actually valid JSON. + ASSERT_TRUE(base::JSONReader::Read(input)); + + TrustTokenKeyCommitmentParser parser; + + auto result = parser.ParseMultipleIssuers(input); + ASSERT_TRUE(result); + auto issuer = + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.example")); + ASSERT_TRUE(result->count(issuer)); + EXPECT_TRUE(mojo::Equals(result->at(issuer), + parser.Parse(R"({ "srrkey": "aaaa" })"))); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, DuplicateIssuer) { + std::string input = R"( { "https://issuer.example/": { "srrkey": "aaaa" }, + "https://other.example/": { "srrkey": "aaab" }, + "https://issuer.example/this-is-really-the-same-issuer-as-the-first-entry": + { "srrkey": "aaac" } + } )"; + + // Make sure the input is actually valid JSON. + ASSERT_TRUE(base::JSONReader::Read(input)); + + TrustTokenKeyCommitmentParser parser; + + auto result = parser.ParseMultipleIssuers(input); + ASSERT_TRUE(result); + + // The result should have been deduplicated. Moreover, the entry with the + // largest issuer JSON string lexicographically should win. + ASSERT_EQ(result->size(), 2u); + + auto issuer = + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.example")); + ASSERT_TRUE(result->count(issuer)); + EXPECT_TRUE(mojo::Equals(result->at(issuer), + parser.Parse(R"({ "srrkey": "aaac" })"))); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, DuplicateIssuerFirstWins) { + // This is the same as DuplicateIssuer, except this time the first entry + // position-wise is the longest lexicographically, so deduplication should + // favor it. + + std::string input = + R"( { "https://issuer.example/longer": { "srrkey": "aaaa" }, + "https://other.example/": { "srrkey": "aaab" }, + "https://issuer.example/": + { "srrkey": "aaac" } + } )"; + + // Make sure the input is actually valid JSON. + ASSERT_TRUE(base::JSONReader::Read(input)); + + TrustTokenKeyCommitmentParser parser; + + auto result = parser.ParseMultipleIssuers(input); + ASSERT_TRUE(result); + + // The result should have been deduplicated. Moreover, the entry with the + // largest issuer JSON string lexicographically should win. + ASSERT_EQ(result->size(), 2u); + + auto issuer = + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.example")); + ASSERT_TRUE(result->count(issuer)); + EXPECT_TRUE(mojo::Equals(result->at(issuer), + parser.Parse(R"({ "srrkey": "aaaa" })"))); +} + +TEST(TrustTokenKeyCommitmentParserMultipleIssuers, + MixOfSuitableAndUnsuitableIssuers) { + std::string input = R"( { "https://issuer.example/": { "srrkey": "aaaa" }, + "http://insecure.example": { "srrkey": "bbbb" } } )"; + + // Make sure the input is actually valid JSON. + ASSERT_TRUE(base::JSONReader::Read(input)); + + TrustTokenKeyCommitmentParser parser; + + auto result = parser.ParseMultipleIssuers(input); + ASSERT_TRUE(result); + EXPECT_EQ(result->size(), 1u); + + auto issuer = + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.example")); + ASSERT_TRUE(result->count(issuer)); + EXPECT_TRUE(mojo::Equals(result->at(issuer), + parser.Parse(R"({ "srrkey": "aaaa" })"))); +} + } // namespace network
diff --git a/services/network/trust_tokens/trust_token_key_commitments.cc b/services/network/trust_tokens/trust_token_key_commitments.cc index 6642d64..98ccd7ea 100644 --- a/services/network/trust_tokens/trust_token_key_commitments.cc +++ b/services/network/trust_tokens/trust_token_key_commitments.cc
@@ -9,6 +9,7 @@ #include "base/optional.h" #include "services/network/public/mojom/trust_tokens.mojom-forward.h" #include "services/network/trust_tokens/suitable_trust_token_origin.h" +#include "services/network/trust_tokens/trust_token_key_commitment_parser.h" namespace network { @@ -43,6 +44,13 @@ map_.replace(std::move(filtered)); } +void TrustTokenKeyCommitments::ParseAndSet(base::StringPiece raw_commitments) { + TrustTokenKeyCommitmentParser parser; + if (auto commitments = parser.ParseMultipleIssuers(raw_commitments)) { + map_.swap(*commitments); + } +} + void TrustTokenKeyCommitments::Get( const url::Origin& origin, base::OnceCallback<void(mojom::TrustTokenKeyCommitmentResultPtr)> done)
diff --git a/services/network/trust_tokens/trust_token_key_commitments.h b/services/network/trust_tokens/trust_token_key_commitments.h index 8d89790..18d17b9 100644 --- a/services/network/trust_tokens/trust_token_key_commitments.h +++ b/services/network/trust_tokens/trust_token_key_commitments.h
@@ -33,6 +33,13 @@ void Set( base::flat_map<url::Origin, mojom::TrustTokenKeyCommitmentResultPtr> map); + // Overwrites the current issuers-to-commitments map with the values in + // |raw_commitments|, which should be the JSON-encoded string representation + // of a collection of issuers' key commitments according to the format + // specified, for now, in the Trust Tokens design doc: + // https://docs.google.com/document/d/1TNnya6B8pyomDK2F1R9CL3dY10OAmqWlnCxsWyOBDVQ/edit#heading=h.z52drgpfgulz. + void ParseAndSet(base::StringPiece raw_commitments); + // TrustTokenKeyCommitmentGetter implementation: // // If |origin| is a suitable Trust Tokens origin (in the sense of
diff --git a/services/network/trust_tokens/trust_token_key_commitments_unittest.cc b/services/network/trust_tokens/trust_token_key_commitments_unittest.cc index 2613229..67277433 100644 --- a/services/network/trust_tokens/trust_token_key_commitments_unittest.cc +++ b/services/network/trust_tokens/trust_token_key_commitments_unittest.cc
@@ -7,6 +7,7 @@ #include "base/test/bind_test_util.h" #include "services/network/public/mojom/trust_tokens.mojom-forward.h" #include "services/network/public/mojom/trust_tokens.mojom.h" +#include "services/network/trust_tokens/suitable_trust_token_origin.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" #include "url/origin.h" @@ -122,4 +123,14 @@ } } +TEST(TrustTokenKeyCommitments, ParseAndSet) { + TrustTokenKeyCommitments commitments; + commitments.ParseAndSet( + R"( { "https://issuer.example": { "srrkey": "aaaa" } } )"); + + EXPECT_TRUE(GetCommitmentForOrigin( + commitments, + *SuitableTrustTokenOrigin::Create(GURL("https://issuer.example")))); +} + } // namespace network
diff --git a/services/network/trust_tokens/trust_token_store.cc b/services/network/trust_tokens/trust_token_store.cc index 8cbf0cb..0c6ba61 100644 --- a/services/network/trust_tokens/trust_token_store.cc +++ b/services/network/trust_tokens/trust_token_store.cc
@@ -268,16 +268,20 @@ } bool TrustTokenStore::ClearDataForFilter(mojom::ClearDataFilterPtr filter) { - DCHECK(filter); + if (!filter) { + return persister_->DeleteForOrigins(base::BindRepeating( + [](const SuitableTrustTokenOrigin&) { return true; })); + } // Returns whether |storage_key|'s data should be deleted, based on the logic - // |filter| specifies. + // |filter| specifies. (Default to deleting everything, because a null + // |filter| is a wildcard.) auto matcher = base::BindRepeating( [](const mojom::ClearDataFilter& filter, const SuitableTrustTokenOrigin& storage_key) -> bool { // Match an origin if - // - it is an eTLD+1 (aka "domain and registry") match with anything on - // |filter|'s domain list, or + // - it is an eTLD+1 (aka "domain and registry") match with anything + // on |filter|'s domain list, or // - it is an origin match with anything on |filter|'s origin list. bool is_match = base::Contains(filter.origins, storage_key.origin());
diff --git a/services/network/trust_tokens/trust_token_store.h b/services/network/trust_tokens/trust_token_store.h index 6e8a4b3..52faaaa9 100644 --- a/services/network/trust_tokens/trust_token_store.h +++ b/services/network/trust_tokens/trust_token_store.h
@@ -200,6 +200,9 @@ // matching the filter. (In particular, this will still delete data keyed by // a pair of origins, one of which matches and one of which does not.) // + // |filter| is allowed to be null: nullptr is a wildcard filter indicating + // that all data should be cleared. + // // Returns whether any data was deleted. WARN_UNUSED_RESULT virtual bool ClearDataForFilter( mojom::ClearDataFilterPtr filter);
diff --git a/services/network/trust_tokens/trust_token_store_unittest.cc b/services/network/trust_tokens/trust_token_store_unittest.cc index 245bc31..44cf8d6 100644 --- a/services/network/trust_tokens/trust_token_store_unittest.cc +++ b/services/network/trust_tokens/trust_token_store_unittest.cc
@@ -642,5 +642,28 @@ EXPECT_FALSE(store->RetrieveNonstaleRedemptionRecord(issuer, toplevel)); } +TEST(TrustTokenStore, RemovesDataForNullFilter) { + // A null filter is a "clear all data" wildcard. + + auto store = TrustTokenStore::CreateInMemory(); + auto issuer = + *SuitableTrustTokenOrigin::Create(GURL("https://www.issuer.com")); + auto toplevel = + *SuitableTrustTokenOrigin::Create(GURL("https://www.toplevel.com")); + + // Add some issuer-keyed state, + store->AddTokens(issuer, std::vector<std::string>{"token"}, "key"); + // some top level-keyed state, + ASSERT_TRUE(store->SetAssociation(issuer, toplevel)); + // and some (issuer, top level) pair-keyed state. + store->SetRedemptionRecord(issuer, toplevel, + SignedTrustTokenRedemptionRecord{}); + + EXPECT_TRUE(store->ClearDataForFilter(nullptr)); + EXPECT_FALSE(store->CountTokens(issuer)); + EXPECT_FALSE(store->IsAssociated(issuer, toplevel)); + EXPECT_FALSE(store->RetrieveNonstaleRedemptionRecord(issuer, toplevel)); +} + } // namespace trust_tokens } // namespace network
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc index da03acd..017193c 100644 --- a/services/network/url_loader.cc +++ b/services/network/url_loader.cc
@@ -25,6 +25,7 @@ #include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" +#include "base/trace_event/trace_event.h" #include "mojo/public/cpp/system/simple_watcher.h" #include "net/base/elements_upload_data_stream.h" #include "net/base/ip_endpoint.h" @@ -1676,6 +1677,8 @@ } void URLLoader::SendResponseToClient() { + TRACE_EVENT1("loading", "network::URLLoader::SendResponseToClient", "url", + url_request_->url().possibly_invalid_spec()); url_loader_client_->OnReceiveResponse(std::move(response_)); net::IOBufferWithSize* metadata =
diff --git a/services/service_manager/sandbox/fuchsia/OWNERS b/services/service_manager/sandbox/fuchsia/OWNERS index e7034ea..7632a21 100644 --- a/services/service_manager/sandbox/fuchsia/OWNERS +++ b/services/service_manager/sandbox/fuchsia/OWNERS
@@ -1 +1 @@ -file://build/fuchsia/OWNERS +file://fuchsia/SECURITY_OWNERS
diff --git a/services/service_manager/sandbox/mac/common.sb b/services/service_manager/sandbox/mac/common.sb index ec14e48..e15e9d9 100644 --- a/services/service_manager/sandbox/mac/common.sb +++ b/services/service_manager/sandbox/mac/common.sb
@@ -271,7 +271,14 @@ (syscall-number SYS_proc_info) (syscall-number SYS_psynch_mutexdrop) (syscall-number SYS_psynch_mutexwait) + (syscall-number SYS_psynch_rw_downgrade) + (syscall-number SYS_psynch_rw_longrdlock) (syscall-number SYS_psynch_rw_rdlock) + (syscall-number SYS_psynch_rw_unlock) + (syscall-number SYS_psynch_rw_unlock2) + (syscall-number SYS_psynch_rw_upgrade) + (syscall-number SYS_psynch_rw_wrlock) + (syscall-number SYS_psynch_rw_yieldwrlock) (syscall-number SYS_read) (syscall-number SYS_read_nocancel) (syscall-number SYS_readlink)
diff --git a/services/service_manager/sandbox/win/sandbox_diagnostics.cc b/services/service_manager/sandbox/win/sandbox_diagnostics.cc index 7649390..140a9b1 100644 --- a/services/service_manager/sandbox/win/sandbox_diagnostics.cc +++ b/services/service_manager/sandbox/win/sandbox_diagnostics.cc
@@ -26,7 +26,7 @@ for (auto&& item : *policies) { auto snapshot = base::JSONReader::ReadAndReturnValueWithError( item->JsonString(), base::JSON_PARSE_RFC); - CHECK(base::JSONReader::JSON_NO_ERROR == snapshot.error_code); + CHECK(snapshot.value); policy_values.Append(std::move(snapshot.value.value())); } std::move(response).Run(std::move(policy_values));
diff --git a/services/tracing/public/cpp/perfetto/posix_system_producer.cc b/services/tracing/public/cpp/perfetto/posix_system_producer.cc index cf7aaed..d0b75c7 100644 --- a/services/tracing/public/cpp/perfetto/posix_system_producer.cc +++ b/services/tracing/public/cpp/perfetto/posix_system_producer.cc
@@ -363,13 +363,30 @@ void PosixSystemProducer::ConnectSocket() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); state_ = State::kConnecting; + const char* host_package_name = nullptr; +#if defined(OS_ANDROID) + host_package_name = + base::android::BuildInfo::GetInstance()->host_package_name(); +#endif // defined(OS_ANDROID) + + // On android we want to include if this is webview inside of an app or + // Android Chrome. To aid this we add the host_package_name to differentiate + // the various apps and sources. + std::string producer_name; + if (host_package_name) { + producer_name = base::StrCat( + {mojom::kPerfettoProducerNamePrefix, host_package_name, "-", + base::NumberToString( + base::trace_event::TraceLog::GetInstance()->process_id())}); + } else { + producer_name = base::StrCat( + {mojom::kPerfettoProducerNamePrefix, + base::NumberToString( + base::trace_event::TraceLog::GetInstance()->process_id())}); + } + auto service = perfetto::ProducerIPCClient::Connect( - socket_name_.c_str(), this, - base::StrCat( - {mojom::kPerfettoProducerNamePrefix, - base::NumberToString( - base::trace_event::TraceLog::GetInstance()->process_id())}), - task_runner(), + socket_name_.c_str(), this, std::move(producer_name), task_runner(), perfetto::TracingService::ProducerSMBScrapingMode::kEnabled); base::AutoLock lock(lock_);
diff --git a/services/tracing/public/mojom/perfetto_service.mojom b/services/tracing/public/mojom/perfetto_service.mojom index 7dc5b024..170d6f2 100644 --- a/services/tracing/public/mojom/perfetto_service.mojom +++ b/services/tracing/public/mojom/perfetto_service.mojom
@@ -4,7 +4,13 @@ module tracing.mojom; -const string kPerfettoProducerNamePrefix = "org.chromium.perfetto_producer."; +// Producer processes register with the format +// "kPerfettoProducerNamePrefix-PID" when connecting to Chrome's internal +// tracing service. Note that system producers use a different but similar +// naming scheme to disambiguate between different apps on the same system, +// see SystemProducer::ConnectToSystemService() implementations. Of +// particular interest is PosixSystemProducer::ConnectSocket(). +const string kPerfettoProducerNamePrefix = "org.chromium-"; const string kTraceEventDataSourceName = "org.chromium.trace_event"; const string kMetaDataSourceName = "org.chromium.trace_metadata"; const string kSystemTraceDataSourceName = "org.chromium.trace_system";
diff --git a/storage/browser/blob/blob_url_loader.cc b/storage/browser/blob/blob_url_loader.cc index 1330ca7..2e63d73 100644 --- a/storage/browser/blob/blob_url_loader.cc +++ b/storage/browser/blob/blob_url_loader.cc
@@ -45,34 +45,30 @@ status.append(net::GetHttpReasonPhrase(status_code)); status.append("\0\0", 2); scoped_refptr<net::HttpResponseHeaders> headers = - new net::HttpResponseHeaders(status); + base::MakeRefCounted<net::HttpResponseHeaders>(status); if (status_code == net::HTTP_OK || status_code == net::HTTP_PARTIAL_CONTENT) { - std::string content_length_header(net::HttpRequestHeaders::kContentLength); - content_length_header.append(": "); - content_length_header.append(base::NumberToString(content_size)); - headers->AddHeader(content_length_header); + headers->SetHeader(net::HttpRequestHeaders::kContentLength, + base::NumberToString(content_size)); if (status_code == net::HTTP_PARTIAL_CONTENT) { DCHECK(byte_range->IsValid()); - std::string content_range_header(net::HttpResponseHeaders::kContentRange); - content_range_header.append(": bytes "); + std::string content_range_header; + content_range_header.append("bytes "); content_range_header.append(base::StringPrintf( "%" PRId64 "-%" PRId64, byte_range->first_byte_position(), byte_range->last_byte_position())); content_range_header.append("/"); content_range_header.append(base::StringPrintf("%" PRId64, total_size)); - headers->AddHeader(content_range_header); + headers->SetHeader(net::HttpResponseHeaders::kContentRange, + content_range_header); } if (!blob_handle->content_type().empty()) { - std::string content_type_header(net::HttpRequestHeaders::kContentType); - content_type_header.append(": "); - content_type_header.append(blob_handle->content_type()); - headers->AddHeader(content_type_header); + headers->SetHeader(net::HttpRequestHeaders::kContentType, + blob_handle->content_type()); } if (!blob_handle->content_disposition().empty()) { - std::string content_disposition_header("Content-Disposition: "); - content_disposition_header.append(blob_handle->content_disposition()); - headers->AddHeader(content_disposition_header); + headers->SetHeader("Content-Disposition", + blob_handle->content_disposition()); } }
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 81ccad5e..228108d 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -5140,5 +5140,68 @@ "test_target": "//chrome/test:telemetry_perf_unittests" } ] + }, + "android-weblayer-pie-x86-fyi-rel": { + "gtest_tests": [ + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-16.04", + "pool": "chromium.tests.avd.template", + "ssd": "1" + } + ], + "named_caches": [ + { + "name": "avd_generic_android28", + "path": ".android" + }, + { + "name": "system_images_android_28_google_apis_x86", + "path": ".emulator_sdk" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "weblayer_instrumentation_test_apk", + "test_target": "//weblayer/browser/android/javatests:weblayer_instrumentation_test_apk" + } + ] } }
diff --git a/testing/buildbot/chromium.ci.json b/testing/buildbot/chromium.ci.json index 6faa1a7..6dbfe0b 100644 --- a/testing/buildbot/chromium.ci.json +++ b/testing/buildbot/chromium.ci.json
@@ -193988,6 +193988,69 @@ } ] }, + "android-weblayer-pie-x86-fyi-rel": { + "gtest_tests": [ + { + "args": [ + "--gs-results-bucket=chromium-result-details", + "--recover-devices", + "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" + ], + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "weblayer_instrumentation_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/luci/logdog/butler/${platform}", + "location": "bin", + "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-16.04", + "pool": "chromium.tests.avd.template", + "ssd": "1" + } + ], + "named_caches": [ + { + "name": "avd_generic_android28", + "path": ".android" + }, + { + "name": "system_images_android_28_google_apis_x86", + "path": ".emulator_sdk" + } + ], + "output_links": [ + { + "link": [ + "https://luci-logdog.appspot.com/v/?s", + "=android%2Fswarming%2Flogcats%2F", + "${TASK_ID}%2F%2B%2Funified_logcats" + ], + "name": "shard #${SHARD_INDEX} logcats" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "weblayer_instrumentation_test_apk", + "test_target": "//weblayer/browser/android/javatests:weblayer_instrumentation_test_apk" + } + ] + }, "chromeos-amd64-generic-asan-rel": { "additional_compile_targets": [ "chromiumos_preflight" @@ -195022,7 +195085,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -195043,6 +195107,9 @@ "test_target": "//ui/accessibility:accessibility_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195062,6 +195129,9 @@ "test_target": "//third_party/angle/src/tests:angle_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195081,6 +195151,9 @@ "test_target": "//base:base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195100,6 +195173,9 @@ "test_target": "//base/util:base_util_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195119,6 +195195,9 @@ "test_target": "//third_party/blink/common:blink_common_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195138,6 +195217,9 @@ "test_target": "//third_party/blink/renderer/platform/heap:blink_heap_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195157,6 +195239,9 @@ "test_target": "//third_party/blink/renderer/platform:blink_platform_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195176,6 +195261,9 @@ "test_target": "//third_party/boringssl:boringssl_crypto_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195195,6 +195283,9 @@ "test_target": "//third_party/boringssl:boringssl_ssl_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195214,6 +195305,9 @@ "test_target": "//fuchsia/runners:cast_runner_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195233,6 +195327,9 @@ "test_target": "//fuchsia/runners:cast_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195253,7 +195350,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -195274,6 +195372,9 @@ "test_target": "//content/test:content_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195293,6 +195394,9 @@ "test_target": "//fuchsia/base:cr_fuchsia_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195312,6 +195416,9 @@ "test_target": "//components/cronet:cronet_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195331,6 +195438,9 @@ "test_target": "//components/cronet:cronet_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195350,6 +195460,9 @@ "test_target": "//crypto:crypto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195369,6 +195482,9 @@ "test_target": "//ui/events:events_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195388,6 +195504,9 @@ "test_target": "//ui/gfx:gfx_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195407,6 +195526,9 @@ "test_target": "//google_apis:google_apis_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195426,6 +195548,9 @@ "test_target": "//gpu:gpu_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195445,6 +195570,9 @@ "test_target": "//fuchsia/http:http_service_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195464,6 +195592,9 @@ "test_target": "//ipc:ipc_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195484,7 +195615,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -195505,6 +195637,9 @@ "test_target": "//mojo:mojo_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195524,6 +195659,9 @@ "test_target": "//third_party/perfetto:perfetto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195544,7 +195682,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -195565,6 +195704,9 @@ "test_target": "//services:services_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195584,6 +195726,9 @@ "test_target": "//skia:skia_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195604,7 +195749,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -195625,6 +195771,9 @@ "test_target": "//ui/base:ui_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195645,7 +195794,8 @@ }, { "args": [ - "--child-arg=--ozone-platform=headless" + "--child-arg=--ozone-platform=headless", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -195666,6 +195816,9 @@ "test_target": "//components/viz:viz_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195685,6 +195838,9 @@ "test_target": "//fuchsia/engine:web_engine_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195704,6 +195860,9 @@ "test_target": "//fuchsia/engine:web_engine_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195723,6 +195882,9 @@ "test_target": "//fuchsia/engine:web_engine_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195742,6 +195904,9 @@ "test_target": "//fuchsia/runners:web_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195769,7 +195934,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -195789,6 +195955,9 @@ "test_target": "//ui/accessibility:accessibility_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195807,6 +195976,9 @@ "test_target": "//third_party/angle/src/tests:angle_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195825,6 +195997,9 @@ "test_target": "//base:base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195843,6 +196018,9 @@ "test_target": "//base/util:base_util_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195861,6 +196039,9 @@ "test_target": "//third_party/blink/common:blink_common_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195879,6 +196060,9 @@ "test_target": "//third_party/blink/renderer/platform/heap:blink_heap_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195897,6 +196081,9 @@ "test_target": "//third_party/blink/renderer/platform:blink_platform_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195915,6 +196102,9 @@ "test_target": "//third_party/boringssl:boringssl_crypto_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195933,6 +196123,9 @@ "test_target": "//third_party/boringssl:boringssl_ssl_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195951,6 +196144,9 @@ "test_target": "//fuchsia/runners:cast_runner_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195969,6 +196165,9 @@ "test_target": "//fuchsia/runners:cast_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -195988,7 +196187,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196010,7 +196210,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196030,6 +196231,9 @@ "test_target": "//content/test:content_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196048,6 +196252,9 @@ "test_target": "//fuchsia/base:cr_fuchsia_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196066,6 +196273,9 @@ "test_target": "//components/cronet:cronet_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196084,6 +196294,9 @@ "test_target": "//components/cronet:cronet_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196102,6 +196315,9 @@ "test_target": "//crypto:crypto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196120,6 +196336,9 @@ "test_target": "//ui/events:events_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196138,6 +196357,9 @@ "test_target": "//ui/gfx:gfx_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196156,6 +196378,9 @@ "test_target": "//google_apis:google_apis_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196174,6 +196399,9 @@ "test_target": "//gpu:gpu_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196192,6 +196420,9 @@ "test_target": "//fuchsia/http:http_service_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196210,6 +196441,9 @@ "test_target": "//ipc:ipc_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196229,7 +196463,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196249,6 +196484,9 @@ "test_target": "//mojo:mojo_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196267,6 +196505,9 @@ "test_target": "//third_party/perfetto:perfetto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196286,7 +196527,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196306,6 +196548,9 @@ "test_target": "//services:services_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196324,6 +196569,9 @@ "test_target": "//skia:skia_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196343,7 +196591,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196363,6 +196612,9 @@ "test_target": "//ui/base:ui_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196382,7 +196634,8 @@ }, { "args": [ - "--child-arg=--ozone-platform=headless" + "--child-arg=--ozone-platform=headless", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196402,6 +196655,9 @@ "test_target": "//components/viz:viz_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196420,6 +196676,9 @@ "test_target": "//fuchsia/engine:web_engine_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196438,6 +196697,9 @@ "test_target": "//fuchsia/engine:web_engine_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196456,6 +196718,9 @@ "test_target": "//fuchsia/engine:web_engine_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196474,6 +196739,9 @@ "test_target": "//fuchsia/runners:web_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196500,7 +196768,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196520,6 +196789,9 @@ "test_target": "//ui/accessibility:accessibility_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196538,6 +196810,9 @@ "test_target": "//third_party/angle/src/tests:angle_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196556,6 +196831,9 @@ "test_target": "//base:base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196574,6 +196852,9 @@ "test_target": "//base/util:base_util_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196592,6 +196873,9 @@ "test_target": "//third_party/blink/common:blink_common_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196610,6 +196894,9 @@ "test_target": "//third_party/blink/renderer/platform/heap:blink_heap_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196628,6 +196915,9 @@ "test_target": "//third_party/blink/renderer/platform:blink_platform_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196646,6 +196936,9 @@ "test_target": "//third_party/boringssl:boringssl_crypto_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196664,6 +196957,9 @@ "test_target": "//third_party/boringssl:boringssl_ssl_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196682,6 +196978,9 @@ "test_target": "//fuchsia/runners:cast_runner_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196700,6 +196999,9 @@ "test_target": "//fuchsia/runners:cast_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196719,7 +197021,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196741,7 +197044,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196761,6 +197065,9 @@ "test_target": "//content/test:content_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196779,6 +197086,9 @@ "test_target": "//fuchsia/base:cr_fuchsia_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196797,6 +197107,9 @@ "test_target": "//components/cronet:cronet_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196815,6 +197128,9 @@ "test_target": "//components/cronet:cronet_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196833,6 +197149,9 @@ "test_target": "//crypto:crypto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196851,6 +197170,9 @@ "test_target": "//ui/events:events_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196869,6 +197191,9 @@ "test_target": "//ui/gfx:gfx_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196887,6 +197212,9 @@ "test_target": "//google_apis:google_apis_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196905,6 +197233,9 @@ "test_target": "//gpu:gpu_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196923,6 +197254,9 @@ "test_target": "//fuchsia/http:http_service_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196941,6 +197275,9 @@ "test_target": "//ipc:ipc_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -196960,7 +197297,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -196981,7 +197319,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -197001,6 +197340,9 @@ "test_target": "//net:net_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197019,6 +197361,9 @@ "test_target": "//third_party/perfetto:perfetto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197038,7 +197383,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -197058,6 +197404,9 @@ "test_target": "//services:services_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197076,6 +197425,9 @@ "test_target": "//skia:skia_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197095,7 +197447,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -197115,6 +197468,9 @@ "test_target": "//ui/base:ui_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197134,7 +197490,8 @@ }, { "args": [ - "--child-arg=--ozone-platform=headless" + "--child-arg=--ozone-platform=headless", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -197154,6 +197511,9 @@ "test_target": "//components/viz:viz_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197172,6 +197532,9 @@ "test_target": "//fuchsia/engine:web_engine_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197190,6 +197553,9 @@ "test_target": "//fuchsia/engine:web_engine_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197208,6 +197574,9 @@ "test_target": "//fuchsia/engine:web_engine_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197226,6 +197595,9 @@ "test_target": "//fuchsia/runners:web_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -197248,6 +197620,7 @@ { "args": [ "--num-retries=3", + "--enable-fuchsia-system-log", "--platform=fuchsia" ], "isolate_name": "blink_web_tests", @@ -197278,7 +197651,8 @@ "--browser=web-engine-shell", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--enable-fuchsia-system-log" ], "isolate_name": "fuchsia_telemetry_gpu_integration_test", "merge": { @@ -197311,7 +197685,8 @@ "--expected-vendor-id", "0", "--expected-device-id", - "0" + "0", + "--enable-fuchsia-system-log" ], "isolate_name": "fuchsia_telemetry_gpu_integration_test", "merge": { @@ -213186,7 +213561,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { @@ -213205,12 +213580,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213223,18 +213598,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone 6s 13.3", + "name": "base_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213246,12 +213621,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213268,7 +213643,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { @@ -213287,12 +213662,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213305,18 +213680,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone 6s Plus 13.3", + "name": "base_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213328,12 +213703,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213350,7 +213725,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { @@ -213369,12 +213744,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213387,18 +213762,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_crypto_tests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests_iPhone 6s 13.3", + "name": "boringssl_crypto_tests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213410,12 +213785,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213432,7 +213807,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_crypto_tests", "merge": { @@ -213451,12 +213826,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213469,18 +213844,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_ssl_tests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests_iPhone 6s 13.3", + "name": "boringssl_ssl_tests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213492,12 +213867,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213514,7 +213889,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_ssl_tests", "merge": { @@ -213533,12 +213908,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213555,7 +213930,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { @@ -213574,12 +213949,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213592,18 +213967,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone 6s 13.3", + "name": "components_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213615,12 +213990,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213637,7 +214012,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { @@ -213656,12 +214031,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213674,18 +214049,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone 6s Plus 13.3", + "name": "components_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213697,12 +214072,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213719,7 +214094,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { @@ -213738,12 +214113,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213756,18 +214131,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "crypto_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests_iPhone 6s 13.3", + "name": "crypto_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213779,12 +214154,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213801,7 +214176,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "crypto_unittests", "merge": { @@ -213820,12 +214195,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213842,7 +214217,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { @@ -213861,12 +214236,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213879,18 +214254,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone 6s 13.3", + "name": "gfx_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213902,12 +214277,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213924,7 +214299,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { @@ -213943,12 +214318,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -213961,18 +214336,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone 6s Plus 13.3", + "name": "gfx_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -213984,12 +214359,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214006,7 +214381,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { @@ -214025,12 +214400,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214043,18 +214418,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "google_apis_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests_iPhone 6s 13.3", + "name": "google_apis_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -214066,12 +214441,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214088,7 +214463,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "google_apis_unittests", "merge": { @@ -214107,12 +214482,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214129,7 +214504,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_eg2tests_module", "merge": { @@ -214148,12 +214523,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214170,7 +214545,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_eg2tests_module", "merge": { @@ -214189,12 +214564,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214211,7 +214586,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { @@ -214230,12 +214605,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214248,18 +214623,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_egtests_iPad Air 2 13.3", + "name": "ios_chrome_bookmarks_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -214271,12 +214646,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214289,18 +214664,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_egtests_iPhone 7 13.3", + "name": "ios_chrome_bookmarks_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -214312,12 +214687,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214334,7 +214709,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { @@ -214353,12 +214728,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214375,7 +214750,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { @@ -214394,12 +214769,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214416,7 +214791,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_eg2tests_module", "merge": { @@ -214435,12 +214810,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214458,7 +214833,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_eg2tests_module", "merge": { @@ -214477,12 +214852,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214496,18 +214871,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_egtests_iPad Air 2 13.3", + "name": "ios_chrome_integration_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -214519,12 +214894,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214542,7 +214917,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { @@ -214561,12 +214936,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214584,7 +214959,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { @@ -214603,12 +214978,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214622,18 +214997,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_egtests_iPhone X 13.3", + "name": "ios_chrome_integration_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -214645,12 +215020,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214668,7 +215043,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { @@ -214687,12 +215062,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214705,18 +215080,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_reading_list_egtests_iPad Air 2 13.3", + "name": "ios_chrome_reading_list_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -214728,12 +215103,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214746,18 +215121,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_reading_list_egtests_iPhone 7 13.3", + "name": "ios_chrome_reading_list_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -214769,12 +215144,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214791,7 +215166,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { @@ -214810,12 +215185,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214832,7 +215207,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { @@ -214851,12 +215226,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214873,7 +215248,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_eg2tests_module", "merge": { @@ -214892,12 +215267,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214914,7 +215289,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_eg2tests_module", "merge": { @@ -214933,12 +215308,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214955,7 +215330,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { @@ -214974,12 +215349,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -214993,18 +215368,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_egtests_iPad Air 2 13.3", + "name": "ios_chrome_settings_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215016,12 +215391,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215035,18 +215410,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_egtests_iPhone 7 13.3", + "name": "ios_chrome_settings_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215058,12 +215433,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215081,7 +215456,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { @@ -215100,12 +215475,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215123,7 +215498,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { @@ -215142,12 +215517,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215165,7 +215540,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_eg2tests_module", "merge": { @@ -215184,12 +215559,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215206,7 +215581,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_eg2tests_module", "merge": { @@ -215225,12 +215600,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215243,18 +215618,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_egtests_iPad Air 2 13.3", + "name": "ios_chrome_signin_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215266,12 +215641,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215288,7 +215663,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { @@ -215307,12 +215682,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215329,7 +215704,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { @@ -215348,12 +215723,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215366,18 +215741,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_egtests_iPhone X 13.3", + "name": "ios_chrome_signin_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215389,12 +215764,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215411,7 +215786,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_smoke_eg2tests_module", "merge": { @@ -215430,12 +215805,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215452,7 +215827,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_smoke_eg2tests_module", "merge": { @@ -215471,12 +215846,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215493,7 +215868,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { @@ -215512,12 +215887,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215530,18 +215905,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_translate_egtests_iPad Air 2 13.3", + "name": "ios_chrome_translate_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215553,12 +215928,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215571,18 +215946,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_translate_egtests_iPhone 7 13.3", + "name": "ios_chrome_translate_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215594,12 +215969,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215616,7 +215991,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { @@ -215635,12 +216010,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215657,7 +216032,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { @@ -215676,12 +216051,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215698,7 +216073,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_eg2tests_module", "merge": { @@ -215717,12 +216092,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215740,7 +216115,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_eg2tests_module", "merge": { @@ -215759,12 +216134,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215778,18 +216153,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_egtests_iPad Air 2 13.3", + "name": "ios_chrome_ui_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215801,12 +216176,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215824,7 +216199,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { @@ -215843,12 +216218,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215866,7 +216241,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { @@ -215885,12 +216260,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215904,18 +216279,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_egtests_iPhone X 13.3", + "name": "ios_chrome_ui_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -215927,12 +216302,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215950,7 +216325,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { @@ -215969,12 +216344,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -215987,18 +216362,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone 6s 13.3", + "name": "ios_chrome_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216010,12 +216385,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216032,7 +216407,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { @@ -216051,12 +216426,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216069,18 +216444,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone 6s Plus 13.3", + "name": "ios_chrome_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216092,12 +216467,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216114,7 +216489,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { @@ -216133,12 +216508,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216155,7 +216530,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_eg2tests_module", "merge": { @@ -216174,12 +216549,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216196,7 +216571,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_eg2tests_module", "merge": { @@ -216215,12 +216590,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216237,7 +216612,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { @@ -216256,12 +216631,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216274,18 +216649,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_egtests_iPad Air 2 13.3", + "name": "ios_chrome_web_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216297,12 +216672,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216315,18 +216690,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_egtests_iPhone 7 13.3", + "name": "ios_chrome_web_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216338,12 +216713,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216360,7 +216735,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { @@ -216379,12 +216754,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216401,7 +216776,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { @@ -216420,12 +216795,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216438,18 +216813,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_components_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests_iPhone 6s 13.3", + "name": "ios_components_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216461,12 +216836,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216483,7 +216858,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_components_unittests", "merge": { @@ -216502,12 +216877,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216520,18 +216895,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_net_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests_iPhone 6s 13.3", + "name": "ios_net_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216543,12 +216918,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216565,7 +216940,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_net_unittests", "merge": { @@ -216584,12 +216959,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216602,18 +216977,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_remoting_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_remoting_unittests_iPhone 6s 13.3", + "name": "ios_remoting_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216625,12 +217000,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216647,7 +217022,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_remoting_unittests", "merge": { @@ -216666,12 +217041,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216688,7 +217063,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_eg2tests_module", "merge": { @@ -216707,12 +217082,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216729,7 +217104,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_eg2tests_module", "merge": { @@ -216748,12 +217123,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216770,7 +217145,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { @@ -216789,12 +217164,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216807,18 +217182,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_egtests_iPad Air 2 13.3", + "name": "ios_showcase_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216830,12 +217205,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216848,18 +217223,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_egtests_iPhone 7 13.3", + "name": "ios_showcase_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216871,12 +217246,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216893,7 +217268,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { @@ -216912,12 +217287,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216934,7 +217309,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { @@ -216953,12 +217328,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -216971,18 +217346,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_testing_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests_iPhone 6s 13.3", + "name": "ios_testing_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -216994,12 +217369,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217016,7 +217391,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_testing_unittests", "merge": { @@ -217035,12 +217410,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217057,7 +217432,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { @@ -217076,12 +217451,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217094,18 +217469,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone 6s 13.3", + "name": "ios_web_inttests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217117,12 +217492,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217139,7 +217514,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { @@ -217158,12 +217533,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217176,18 +217551,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone 6s Plus 13.3", + "name": "ios_web_inttests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217199,12 +217574,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217221,7 +217596,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { @@ -217240,12 +217615,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217262,7 +217637,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_eg2tests_module", "merge": { @@ -217281,12 +217656,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217303,7 +217678,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_eg2tests_module", "merge": { @@ -217322,12 +217697,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217340,18 +217715,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_egtests_iPad Air 2 13.3", + "name": "ios_web_shell_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217363,12 +217738,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217385,7 +217760,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { @@ -217404,12 +217779,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217426,7 +217801,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { @@ -217445,12 +217820,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217463,18 +217838,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_egtests_iPhone X 13.3", + "name": "ios_web_shell_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217486,12 +217861,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217508,7 +217883,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { @@ -217527,12 +217902,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217545,18 +217920,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone 6s 13.3", + "name": "ios_web_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217568,12 +217943,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217590,7 +217965,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { @@ -217609,12 +217984,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217627,18 +218002,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone 6s Plus 13.3", + "name": "ios_web_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217650,12 +218025,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217672,7 +218047,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { @@ -217691,12 +218066,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217713,7 +218088,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { @@ -217732,12 +218107,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217750,18 +218125,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone 6s 13.3", + "name": "ios_web_view_inttests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217773,12 +218148,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217795,7 +218170,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { @@ -217814,12 +218189,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217832,18 +218207,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone 6s Plus 13.3", + "name": "ios_web_view_inttests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217855,12 +218230,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217877,7 +218252,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { @@ -217896,12 +218271,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217918,7 +218293,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { @@ -217937,12 +218312,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -217955,18 +218330,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone 6s 13.3", + "name": "ios_web_view_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -217978,12 +218353,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218000,7 +218375,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { @@ -218019,12 +218394,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218037,18 +218412,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone 6s Plus 13.3", + "name": "ios_web_view_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218060,12 +218435,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218082,7 +218457,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { @@ -218101,12 +218476,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218119,18 +218494,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "net_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests_iPhone 6s 13.3", + "name": "net_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218142,12 +218517,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218164,7 +218539,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "net_unittests", "merge": { @@ -218183,12 +218558,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218201,18 +218576,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "services_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests_iPhone 6s 13.3", + "name": "services_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218224,12 +218599,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218246,7 +218621,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "services_unittests", "merge": { @@ -218265,12 +218640,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218287,7 +218662,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { @@ -218306,12 +218681,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218324,18 +218699,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone 6s 13.3", + "name": "skia_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218347,12 +218722,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218369,7 +218744,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { @@ -218388,12 +218763,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218406,18 +218781,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone 6s Plus 13.3", + "name": "skia_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218429,12 +218804,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218451,7 +218826,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { @@ -218470,12 +218845,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218488,18 +218863,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "sql_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests_iPhone 6s 13.3", + "name": "sql_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218511,12 +218886,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218533,7 +218908,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "sql_unittests", "merge": { @@ -218552,12 +218927,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218574,7 +218949,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { @@ -218593,12 +218968,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218611,18 +218986,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone 6s 13.3", + "name": "ui_base_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218634,12 +219009,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218656,7 +219031,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { @@ -218675,12 +219050,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218693,18 +219068,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone 6s Plus 13.3", + "name": "ui_base_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218716,12 +219091,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218738,7 +219113,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { @@ -218757,12 +219132,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218775,18 +219150,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "url_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests_iPhone 6s 13.3", + "name": "url_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -218798,12 +219173,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -218820,7 +219195,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "url_unittests", "merge": { @@ -218839,12 +219214,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ],
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 691086e..e1c2e1f 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -12282,7 +12282,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -12303,6 +12304,9 @@ "test_target": "//ui/accessibility:accessibility_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12322,6 +12326,9 @@ "test_target": "//third_party/angle/src/tests:angle_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12341,6 +12348,9 @@ "test_target": "//base:base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12360,6 +12370,9 @@ "test_target": "//base/util:base_util_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12379,6 +12392,9 @@ "test_target": "//third_party/blink/common:blink_common_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12398,6 +12414,9 @@ "test_target": "//third_party/blink/renderer/platform/heap:blink_heap_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12417,6 +12436,9 @@ "test_target": "//third_party/blink/renderer/platform:blink_platform_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12436,6 +12458,9 @@ "test_target": "//third_party/boringssl:boringssl_crypto_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12455,6 +12480,9 @@ "test_target": "//third_party/boringssl:boringssl_ssl_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12474,6 +12502,9 @@ "test_target": "//fuchsia/runners:cast_runner_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12493,6 +12524,9 @@ "test_target": "//fuchsia/runners:cast_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12513,7 +12547,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -12534,6 +12569,9 @@ "test_target": "//content/test:content_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12553,6 +12591,9 @@ "test_target": "//fuchsia/base:cr_fuchsia_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12572,6 +12613,9 @@ "test_target": "//components/cronet:cronet_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12591,6 +12635,9 @@ "test_target": "//components/cronet:cronet_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12610,6 +12657,9 @@ "test_target": "//crypto:crypto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12629,6 +12679,9 @@ "test_target": "//ui/events:events_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12648,6 +12701,9 @@ "test_target": "//ui/gfx:gfx_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12667,6 +12723,9 @@ "test_target": "//google_apis:google_apis_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12686,6 +12745,9 @@ "test_target": "//gpu:gpu_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12705,6 +12767,9 @@ "test_target": "//fuchsia/http:http_service_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12724,6 +12789,9 @@ "test_target": "//ipc:ipc_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12744,7 +12812,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -12765,6 +12834,9 @@ "test_target": "//mojo:mojo_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12784,6 +12856,9 @@ "test_target": "//third_party/perfetto:perfetto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12804,7 +12879,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -12825,6 +12901,9 @@ "test_target": "//services:services_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12844,6 +12923,9 @@ "test_target": "//skia:skia_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12864,7 +12946,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -12885,6 +12968,9 @@ "test_target": "//ui/base:ui_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12905,7 +12991,8 @@ }, { "args": [ - "--child-arg=--ozone-platform=headless" + "--child-arg=--ozone-platform=headless", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -12926,6 +13013,9 @@ "test_target": "//components/viz:viz_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12945,6 +13035,9 @@ "test_target": "//fuchsia/engine:web_engine_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12964,6 +13057,9 @@ "test_target": "//fuchsia/engine:web_engine_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -12983,6 +13079,9 @@ "test_target": "//fuchsia/engine:web_engine_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13002,6 +13101,9 @@ "test_target": "//fuchsia/runners:web_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13029,7 +13131,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13049,6 +13152,9 @@ "test_target": "//ui/accessibility:accessibility_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13067,6 +13173,9 @@ "test_target": "//third_party/angle/src/tests:angle_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13085,6 +13194,9 @@ "test_target": "//base:base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13103,6 +13215,9 @@ "test_target": "//base/util:base_util_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13121,6 +13236,9 @@ "test_target": "//third_party/blink/common:blink_common_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13139,6 +13257,9 @@ "test_target": "//third_party/blink/renderer/platform/heap:blink_heap_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13157,6 +13278,9 @@ "test_target": "//third_party/blink/renderer/platform:blink_platform_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13175,6 +13299,9 @@ "test_target": "//third_party/boringssl:boringssl_crypto_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13193,6 +13320,9 @@ "test_target": "//third_party/boringssl:boringssl_ssl_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13211,6 +13341,9 @@ "test_target": "//fuchsia/runners:cast_runner_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13229,6 +13362,9 @@ "test_target": "//fuchsia/runners:cast_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13248,7 +13384,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13270,7 +13407,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13290,6 +13428,9 @@ "test_target": "//content/test:content_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13308,6 +13449,9 @@ "test_target": "//fuchsia/base:cr_fuchsia_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13326,6 +13470,9 @@ "test_target": "//components/cronet:cronet_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13344,6 +13491,9 @@ "test_target": "//components/cronet:cronet_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13362,6 +13512,9 @@ "test_target": "//crypto:crypto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13380,6 +13533,9 @@ "test_target": "//ui/events:events_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13398,6 +13554,9 @@ "test_target": "//ui/gfx:gfx_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13416,6 +13575,9 @@ "test_target": "//google_apis:google_apis_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13434,6 +13596,9 @@ "test_target": "//gpu:gpu_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13452,6 +13617,9 @@ "test_target": "//fuchsia/http:http_service_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13470,6 +13638,9 @@ "test_target": "//ipc:ipc_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13489,7 +13660,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13509,6 +13681,9 @@ "test_target": "//mojo:mojo_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13527,6 +13702,9 @@ "test_target": "//third_party/perfetto:perfetto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13546,7 +13724,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13566,6 +13745,9 @@ "test_target": "//services:services_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13584,6 +13766,9 @@ "test_target": "//skia:skia_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13603,7 +13788,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13623,6 +13809,9 @@ "test_target": "//ui/base:ui_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13642,7 +13831,8 @@ }, { "args": [ - "--child-arg=--ozone-platform=headless" + "--child-arg=--ozone-platform=headless", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13662,6 +13852,9 @@ "test_target": "//components/viz:viz_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13680,6 +13873,9 @@ "test_target": "//fuchsia/engine:web_engine_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13698,6 +13894,9 @@ "test_target": "//fuchsia/engine:web_engine_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13716,6 +13915,9 @@ "test_target": "//fuchsia/engine:web_engine_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13734,6 +13936,9 @@ "test_target": "//fuchsia/runners:web_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13760,7 +13965,8 @@ "gtest_tests": [ { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.accessibility_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -13780,6 +13986,9 @@ "test_target": "//ui/accessibility:accessibility_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13798,6 +14007,9 @@ "test_target": "//third_party/angle/src/tests:angle_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13816,6 +14028,9 @@ "test_target": "//base:base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13834,6 +14049,9 @@ "test_target": "//base/util:base_util_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13852,6 +14070,9 @@ "test_target": "//third_party/blink/common:blink_common_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13870,6 +14091,9 @@ "test_target": "//third_party/blink/renderer/platform/heap:blink_heap_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13888,6 +14112,9 @@ "test_target": "//third_party/blink/renderer/platform:blink_platform_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13906,6 +14133,9 @@ "test_target": "//third_party/boringssl:boringssl_crypto_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13924,6 +14154,9 @@ "test_target": "//third_party/boringssl:boringssl_ssl_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13942,6 +14175,9 @@ "test_target": "//fuchsia/runners:cast_runner_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13960,6 +14196,9 @@ "test_target": "//fuchsia/runners:cast_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -13979,7 +14218,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.cc_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -14001,7 +14241,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.content_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -14021,6 +14262,9 @@ "test_target": "//content/test:content_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14039,6 +14283,9 @@ "test_target": "//fuchsia/base:cr_fuchsia_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14057,6 +14304,9 @@ "test_target": "//components/cronet:cronet_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14075,6 +14325,9 @@ "test_target": "//components/cronet:cronet_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14093,6 +14346,9 @@ "test_target": "//crypto:crypto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14111,6 +14367,9 @@ "test_target": "//ui/events:events_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14129,6 +14388,9 @@ "test_target": "//ui/gfx:gfx_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14147,6 +14409,9 @@ "test_target": "//google_apis:google_apis_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14165,6 +14430,9 @@ "test_target": "//gpu:gpu_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14183,6 +14451,9 @@ "test_target": "//fuchsia/http:http_service_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14201,6 +14472,9 @@ "test_target": "//ipc:ipc_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14220,7 +14494,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.mojo_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -14241,7 +14516,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.net_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -14261,6 +14537,9 @@ "test_target": "//net:net_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14279,6 +14558,9 @@ "test_target": "//third_party/perfetto:perfetto_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14298,7 +14580,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.services_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -14318,6 +14601,9 @@ "test_target": "//services:services_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14336,6 +14622,9 @@ "test_target": "//skia:skia_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14355,7 +14644,8 @@ }, { "args": [ - "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter" + "--test-launcher-filter-file=../../testing/buildbot/filters/fuchsia.ui_base_unittests.filter", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -14375,6 +14665,9 @@ "test_target": "//ui/base:ui_base_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14394,7 +14687,8 @@ }, { "args": [ - "--child-arg=--ozone-platform=headless" + "--child-arg=--ozone-platform=headless", + "--enable-fuchsia-system-log" ], "merge": { "args": [], @@ -14414,6 +14708,9 @@ "test_target": "//components/viz:viz_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14432,6 +14729,9 @@ "test_target": "//fuchsia/engine:web_engine_browsertests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14450,6 +14750,9 @@ "test_target": "//fuchsia/engine:web_engine_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14468,6 +14771,9 @@ "test_target": "//fuchsia/engine:web_engine_unittests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14486,6 +14792,9 @@ "test_target": "//fuchsia/runners:web_runner_integration_tests" }, { + "args": [ + "--enable-fuchsia-system-log" + ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -14508,6 +14817,7 @@ { "args": [ "--num-retries=3", + "--enable-fuchsia-system-log", "--platform=fuchsia" ], "isolate_name": "blink_web_tests", @@ -14538,7 +14848,8 @@ "--browser=web-engine-shell", "--passthrough", "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", + "--enable-fuchsia-system-log" ], "isolate_name": "fuchsia_telemetry_gpu_integration_test", "merge": { @@ -14571,7 +14882,8 @@ "--expected-vendor-id", "0", "--expected-device-id", - "0" + "0", + "--enable-fuchsia-system-log" ], "isolate_name": "fuchsia_telemetry_gpu_integration_test", "merge": { @@ -25728,7 +26040,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { @@ -25747,12 +26059,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -25765,18 +26077,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone 6s 13.3", + "name": "base_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -25788,12 +26100,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -25810,7 +26122,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { @@ -25829,12 +26141,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -25847,18 +26159,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "base_unittests_iPhone 6s Plus 13.3", + "name": "base_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -25870,12 +26182,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -25892,7 +26204,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "base_unittests", "merge": { @@ -25911,12 +26223,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -25929,18 +26241,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_crypto_tests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_crypto_tests_iPhone 6s 13.3", + "name": "boringssl_crypto_tests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -25952,12 +26264,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -25974,7 +26286,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_crypto_tests", "merge": { @@ -25993,12 +26305,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26011,18 +26323,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_ssl_tests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "boringssl_ssl_tests_iPhone 6s 13.3", + "name": "boringssl_ssl_tests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26034,12 +26346,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26056,7 +26368,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "boringssl_ssl_tests", "merge": { @@ -26075,12 +26387,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26097,7 +26409,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { @@ -26116,12 +26428,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26134,18 +26446,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone 6s 13.3", + "name": "components_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26157,12 +26469,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26179,7 +26491,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { @@ -26198,12 +26510,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26216,18 +26528,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "components_unittests_iPhone 6s Plus 13.3", + "name": "components_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26239,12 +26551,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26261,7 +26573,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "components_unittests", "merge": { @@ -26280,12 +26592,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26298,18 +26610,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "crypto_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "crypto_unittests_iPhone 6s 13.3", + "name": "crypto_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26321,12 +26633,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26343,7 +26655,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "crypto_unittests", "merge": { @@ -26362,12 +26674,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26384,7 +26696,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { @@ -26403,12 +26715,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26421,18 +26733,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone 6s 13.3", + "name": "gfx_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26444,12 +26756,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26466,7 +26778,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { @@ -26485,12 +26797,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26503,18 +26815,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "gfx_unittests_iPhone 6s Plus 13.3", + "name": "gfx_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26526,12 +26838,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26548,7 +26860,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "gfx_unittests", "merge": { @@ -26567,12 +26879,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26585,18 +26897,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "google_apis_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "google_apis_unittests_iPhone 6s 13.3", + "name": "google_apis_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26608,12 +26920,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26630,7 +26942,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "google_apis_unittests", "merge": { @@ -26649,12 +26961,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26671,7 +26983,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_eg2tests_module", "merge": { @@ -26690,12 +27002,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26712,7 +27024,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_eg2tests_module", "merge": { @@ -26731,12 +27043,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26753,7 +27065,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { @@ -26772,12 +27084,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26790,18 +27102,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_egtests_iPad Air 2 13.3", + "name": "ios_chrome_bookmarks_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26813,12 +27125,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26831,18 +27143,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_bookmarks_egtests_iPhone 7 13.3", + "name": "ios_chrome_bookmarks_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -26854,12 +27166,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26876,7 +27188,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { @@ -26895,12 +27207,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26917,7 +27229,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_bookmarks_egtests", "merge": { @@ -26936,12 +27248,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -26958,7 +27270,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_eg2tests_module", "merge": { @@ -26977,12 +27289,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27000,7 +27312,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_eg2tests_module", "merge": { @@ -27019,12 +27331,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27038,18 +27350,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_egtests_iPad Air 2 13.3", + "name": "ios_chrome_integration_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27061,12 +27373,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27084,7 +27396,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { @@ -27103,12 +27415,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27126,7 +27438,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { @@ -27145,12 +27457,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27164,18 +27476,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_integration_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_integration_egtests_iPhone X 13.3", + "name": "ios_chrome_integration_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27187,12 +27499,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27210,7 +27522,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { @@ -27229,12 +27541,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27247,18 +27559,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_reading_list_egtests_iPad Air 2 13.3", + "name": "ios_chrome_reading_list_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27270,12 +27582,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27288,18 +27600,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_reading_list_egtests_iPhone 7 13.3", + "name": "ios_chrome_reading_list_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27311,12 +27623,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27333,7 +27645,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { @@ -27352,12 +27664,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27374,7 +27686,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_reading_list_egtests", "merge": { @@ -27393,12 +27705,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27415,7 +27727,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_eg2tests_module", "merge": { @@ -27434,12 +27746,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27456,7 +27768,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_eg2tests_module", "merge": { @@ -27475,12 +27787,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27497,7 +27809,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { @@ -27516,12 +27828,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27535,18 +27847,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_egtests_iPad Air 2 13.3", + "name": "ios_chrome_settings_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27558,12 +27870,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27577,18 +27889,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_settings_egtests_iPhone 7 13.3", + "name": "ios_chrome_settings_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27600,12 +27912,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27623,7 +27935,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { @@ -27642,12 +27954,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27665,7 +27977,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_settings_egtests", "merge": { @@ -27684,12 +27996,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27707,7 +28019,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_eg2tests_module", "merge": { @@ -27726,12 +28038,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27748,7 +28060,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_eg2tests_module", "merge": { @@ -27767,12 +28079,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27785,18 +28097,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_egtests_iPad Air 2 13.3", + "name": "ios_chrome_signin_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27808,12 +28120,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27830,7 +28142,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { @@ -27849,12 +28161,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27871,7 +28183,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { @@ -27890,12 +28202,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27908,18 +28220,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_signin_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_signin_egtests_iPhone X 13.3", + "name": "ios_chrome_signin_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -27931,12 +28243,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27953,7 +28265,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_smoke_eg2tests_module", "merge": { @@ -27972,12 +28284,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -27994,7 +28306,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_smoke_eg2tests_module", "merge": { @@ -28013,12 +28325,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28035,7 +28347,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { @@ -28054,12 +28366,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28072,18 +28384,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_translate_egtests_iPad Air 2 13.3", + "name": "ios_chrome_translate_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28095,12 +28407,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28113,18 +28425,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_translate_egtests_iPhone 7 13.3", + "name": "ios_chrome_translate_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28136,12 +28448,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28158,7 +28470,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { @@ -28177,12 +28489,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28199,7 +28511,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_translate_egtests", "merge": { @@ -28218,12 +28530,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28240,7 +28552,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_eg2tests_module", "merge": { @@ -28259,12 +28571,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28282,7 +28594,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_eg2tests_module", "merge": { @@ -28301,12 +28613,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28320,18 +28632,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_egtests_iPad Air 2 13.3", + "name": "ios_chrome_ui_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28343,12 +28655,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28366,7 +28678,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { @@ -28385,12 +28697,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28408,7 +28720,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { @@ -28427,12 +28739,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28446,18 +28758,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_ui_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_ui_egtests_iPhone X 13.3", + "name": "ios_chrome_ui_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28469,12 +28781,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28492,7 +28804,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { @@ -28511,12 +28823,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28529,18 +28841,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone 6s 13.3", + "name": "ios_chrome_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28552,12 +28864,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28574,7 +28886,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { @@ -28593,12 +28905,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28611,18 +28923,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_unittests_iPhone 6s Plus 13.3", + "name": "ios_chrome_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28634,12 +28946,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28656,7 +28968,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_unittests", "merge": { @@ -28675,12 +28987,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28697,7 +29009,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_eg2tests_module", "merge": { @@ -28716,12 +29028,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28738,7 +29050,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_eg2tests_module", "merge": { @@ -28757,12 +29069,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28779,7 +29091,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { @@ -28798,12 +29110,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28816,18 +29128,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_egtests_iPad Air 2 13.3", + "name": "ios_chrome_web_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28839,12 +29151,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28857,18 +29169,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_chrome_web_egtests_iPhone 7 13.3", + "name": "ios_chrome_web_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -28880,12 +29192,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28902,7 +29214,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { @@ -28921,12 +29233,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28943,7 +29255,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_chrome_web_egtests", "merge": { @@ -28962,12 +29274,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -28980,18 +29292,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_components_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_components_unittests_iPhone 6s 13.3", + "name": "ios_components_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29003,12 +29315,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29025,7 +29337,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_components_unittests", "merge": { @@ -29044,12 +29356,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29062,18 +29374,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_net_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_net_unittests_iPhone 6s 13.3", + "name": "ios_net_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29085,12 +29397,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29107,7 +29419,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_net_unittests", "merge": { @@ -29126,12 +29438,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29144,18 +29456,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_remoting_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_remoting_unittests_iPhone 6s 13.3", + "name": "ios_remoting_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29167,12 +29479,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29189,7 +29501,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_remoting_unittests", "merge": { @@ -29208,12 +29520,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29230,7 +29542,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_eg2tests_module", "merge": { @@ -29249,12 +29561,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29271,7 +29583,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_eg2tests_module", "merge": { @@ -29290,12 +29602,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29312,7 +29624,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { @@ -29331,12 +29643,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29349,18 +29661,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_egtests_iPad Air 2 13.3", + "name": "ios_showcase_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29372,12 +29684,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29390,18 +29702,18 @@ "--platform", "iPhone 7", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_showcase_egtests_iPhone 7 13.3", + "name": "ios_showcase_egtests_iPhone 7 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29413,12 +29725,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29435,7 +29747,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { @@ -29454,12 +29766,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29476,7 +29788,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_showcase_egtests", "merge": { @@ -29495,12 +29807,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29513,18 +29825,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_testing_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_testing_unittests_iPhone 6s 13.3", + "name": "ios_testing_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29536,12 +29848,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29558,7 +29870,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_testing_unittests", "merge": { @@ -29577,12 +29889,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29599,7 +29911,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { @@ -29618,12 +29930,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29636,18 +29948,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone 6s 13.3", + "name": "ios_web_inttests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29659,12 +29971,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29681,7 +29993,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { @@ -29700,12 +30012,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29718,18 +30030,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_inttests_iPhone 6s Plus 13.3", + "name": "ios_web_inttests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29741,12 +30053,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29763,7 +30075,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_inttests", "merge": { @@ -29782,12 +30094,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29804,7 +30116,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_eg2tests_module", "merge": { @@ -29823,12 +30135,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29845,7 +30157,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_eg2tests_module", "merge": { @@ -29864,12 +30176,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29882,18 +30194,18 @@ "--platform", "iPad Air 2", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_egtests_iPad Air 2 13.3", + "name": "ios_web_shell_egtests_iPad Air 2 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -29905,12 +30217,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29927,7 +30239,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { @@ -29946,12 +30258,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -29968,7 +30280,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { @@ -29987,12 +30299,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30005,18 +30317,18 @@ "--platform", "iPhone X", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_shell_egtests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_shell_egtests_iPhone X 13.3", + "name": "ios_web_shell_egtests_iPhone X 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30028,12 +30340,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30050,7 +30362,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { @@ -30069,12 +30381,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30087,18 +30399,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone 6s 13.3", + "name": "ios_web_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30110,12 +30422,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30132,7 +30444,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { @@ -30151,12 +30463,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30169,18 +30481,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_unittests_iPhone 6s Plus 13.3", + "name": "ios_web_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30192,12 +30504,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30214,7 +30526,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_unittests", "merge": { @@ -30233,12 +30545,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30255,7 +30567,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { @@ -30274,12 +30586,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30292,18 +30604,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone 6s 13.3", + "name": "ios_web_view_inttests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30315,12 +30627,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30337,7 +30649,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { @@ -30356,12 +30668,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30374,18 +30686,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_inttests_iPhone 6s Plus 13.3", + "name": "ios_web_view_inttests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30397,12 +30709,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30419,7 +30731,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_inttests", "merge": { @@ -30438,12 +30750,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30460,7 +30772,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { @@ -30479,12 +30791,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30497,18 +30809,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone 6s 13.3", + "name": "ios_web_view_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30520,12 +30832,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30542,7 +30854,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { @@ -30561,12 +30873,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30579,18 +30891,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ios_web_view_unittests_iPhone 6s Plus 13.3", + "name": "ios_web_view_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30602,12 +30914,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30624,7 +30936,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ios_web_view_unittests", "merge": { @@ -30643,12 +30955,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30661,18 +30973,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "net_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "net_unittests_iPhone 6s 13.3", + "name": "net_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30684,12 +30996,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30706,7 +31018,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "net_unittests", "merge": { @@ -30725,12 +31037,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30743,18 +31055,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "services_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "services_unittests_iPhone 6s 13.3", + "name": "services_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30766,12 +31078,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30788,7 +31100,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "services_unittests", "merge": { @@ -30807,12 +31119,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30829,7 +31141,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { @@ -30848,12 +31160,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30866,18 +31178,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone 6s 13.3", + "name": "skia_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30889,12 +31201,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30911,7 +31223,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { @@ -30930,12 +31242,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30948,18 +31260,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "skia_unittests_iPhone 6s Plus 13.3", + "name": "skia_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -30971,12 +31283,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -30993,7 +31305,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "skia_unittests", "merge": { @@ -31012,12 +31324,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31030,18 +31342,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "sql_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "sql_unittests_iPhone 6s 13.3", + "name": "sql_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -31053,12 +31365,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31075,7 +31387,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "sql_unittests", "merge": { @@ -31094,12 +31406,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31116,7 +31428,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { @@ -31135,12 +31447,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31153,18 +31465,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone 6s 13.3", + "name": "ui_base_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -31176,12 +31488,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31198,7 +31510,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { @@ -31217,12 +31529,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31235,18 +31547,18 @@ "--platform", "iPhone 6s Plus", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "ui_base_unittests_iPhone 6s Plus 13.3", + "name": "ui_base_unittests_iPhone 6s Plus 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -31258,12 +31570,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31280,7 +31592,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "ui_base_unittests", "merge": { @@ -31299,12 +31611,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31317,18 +31629,18 @@ "--platform", "iPhone 6s", "--version", - "13.3", + "13.4", "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "url_unittests", "merge": { "args": [], "script": "//testing/merge_scripts/standard_isolated_script_merge.py" }, - "name": "url_unittests_iPhone 6s 13.3", + "name": "url_unittests_iPhone 6s 13.4", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ @@ -31340,12 +31652,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ], @@ -31362,7 +31674,7 @@ "--out-dir", "${ISOLATED_OUTDIR}", "--xcode-build-version", - "11c29" + "11e146" ], "isolate_name": "url_unittests", "merge": { @@ -31381,12 +31693,12 @@ ], "dimension_sets": [ { - "os": "Mac-10.14.6" + "os": "Mac-10.15" } ], "named_caches": [ { - "name": "xcode_ios_11c29", + "name": "xcode_ios_11e146", "path": "Xcode.app" } ],
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index 0893b78..225017ab 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -234,6 +234,13 @@ ], }, }, + 'fuchsia_system_log': { + '$mixin_append': { + 'args': [ + '--enable-fuchsia-system-log', + ], + }, + }, 'gpu_pool': { 'swarming': { 'dimensions': { @@ -804,4 +811,20 @@ ], }, }, + 'xcode_11e146': { + '$mixin_append': { + 'args': [ + '--xcode-build-version', + '11e146' + ], + }, + 'swarming': { + 'named_caches': [ + { + 'name': 'xcode_ios_11e146', + 'path': 'Xcode.app', + }, + ], + }, + }, }
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 4bbc7239..1ba8aab7 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -3563,6 +3563,12 @@ }, }, + 'weblayer_android_x86_gtests': { + # TODO(crbug/1041619): Add weblayer skew tests here. + 'weblayer_instrumentation_test_apk': { + }, + }, + 'weblayer_gtests': { 'weblayer_browsertests': { }, @@ -3932,6 +3938,10 @@ 'webview_ui_instrumentation_tests', ], + 'android_weblayer_x86_gtests': [ + 'weblayer_android_x86_gtests', + ], + 'android_wpt_scripts': [ 'chrome_public_wpt', 'system_webview_wpt', @@ -4718,7 +4728,7 @@ 'ios13_sdk_simulator_tests': { 'ios_common_tests': { 'variants': [ - 'SIM_IPHONE_6S_13_3', + 'SIM_IPHONE_6S_13_4', 'SIM_IPHONE_X_12_4', ], }, @@ -4730,16 +4740,16 @@ }, 'ios_eg_cq_tests': { 'variants': [ - 'SIM_IPHONE_X_13_3', - 'SIM_IPAD_AIR_2_13_3', + 'SIM_IPHONE_X_13_4', + 'SIM_IPAD_AIR_2_13_4', 'SIM_IPHONE_X_12_4', 'SIM_IPAD_PRO_12_4', ] }, 'ios_eg_tests': { 'variants': [ - 'SIM_IPHONE_7_13_3', - 'SIM_IPAD_AIR_2_13_3', + 'SIM_IPHONE_7_13_4', + 'SIM_IPAD_AIR_2_13_4', 'SIM_IPHONE_X_13_3', 'SIM_IPHONE_X_12_4', 'SIM_IPAD_AIR_3RD_GEN_12_4', @@ -4747,8 +4757,8 @@ }, 'ios_screen_size_dependent_tests': { 'variants': [ - 'SIM_IPHONE_6S_PLUS_13_3', - 'SIM_IPHONE_6S_13_3', + 'SIM_IPHONE_6S_PLUS_13_4', + 'SIM_IPHONE_6S_13_4', 'SIM_IPHONE_6S_PLUS_12_4', 'SIM_IPHONE_X_12_4', 'SIM_IPAD_AIR_2_12_4',
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 6fe2f7dd..b39daad 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -59,6 +59,15 @@ ], 'identifier': 'iPad Air 2 13.3' }, + 'SIM_IPAD_AIR_2_13_4': { + 'args': [ + '--platform', + 'iPad Air 2', + '--version', + '13.4' + ], + 'identifier': 'iPad Air 2 13.4' + }, 'SIM_IPAD_AIR_3RD_GEN_12_4': { 'args': [ '--platform', @@ -131,6 +140,15 @@ ], 'identifier': 'iPhone 6s 13.3' }, + 'SIM_IPHONE_6S_13_4': { + 'args': [ + '--platform', + 'iPhone 6s', + '--version', + '13.4', + ], + 'identifier': 'iPhone 6s 13.4' + }, 'SIM_IPHONE_6S_PLUS_12_4': { 'args': [ '--platform', @@ -149,6 +167,15 @@ ], 'identifier': 'iPhone 6s Plus 13.3' }, + 'SIM_IPHONE_6S_PLUS_13_4': { + 'args': [ + '--platform', + 'iPhone 6s Plus', + '--version', + '13.4', + ], + 'identifier': 'iPhone 6s Plus 13.4' + }, 'SIM_IPHONE_7_13_3': { 'args': [ '--platform', @@ -158,6 +185,15 @@ ], 'identifier': 'iPhone 7 13.3' }, + 'SIM_IPHONE_7_13_4': { + 'args': [ + '--platform', + 'iPhone 7', + '--version', + '13.4', + ], + 'identifier': 'iPhone 7 13.4' + }, 'SIM_IPHONE_SE_13_3': { 'args': [ '--platform', @@ -185,4 +221,13 @@ ], 'identifier': 'iPhone X 13.3' }, + 'SIM_IPHONE_X_13_4': { + 'args': [ + '--platform', + 'iPhone X', + '--version', + '13.4', + ], + 'identifier': 'iPhone X 13.4' + }, }
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index d7435a6..e0eb775 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -816,6 +816,17 @@ 'isolated_scripts': 'marshmallow_pie_isolated_scripts_with_proguard', } }, + 'android-weblayer-pie-x86-fyi-rel': { + 'mixins': [ + 'pie-x86-emulator', + 'linux-xenial', + 'x86-64', + ], + 'os_type': 'android', + 'test_suites': { + 'gtest_tests': 'android_weblayer_x86_gtests', + } + }, }, }, { @@ -1864,6 +1875,7 @@ 'mixins': [ 'arm64', 'docker', + 'fuchsia_system_log', 'linux-xenial', ], }, @@ -1872,6 +1884,7 @@ 'all', ], 'mixins': [ + 'fuchsia_system_log', 'linux-xenial', ], 'swarming': { @@ -1892,6 +1905,7 @@ 'browser_config': 'web-engine-shell', 'os_type': 'linux', 'mixins': [ + 'fuchsia_system_log', 'linux-xenial', ], 'swarming': { @@ -1966,10 +1980,10 @@ 'all', ], 'mixins': [ - 'mac_10.14', + 'mac_10.15', 'mac_toolchain', 'out_dir_arg', - 'xcode_11c29', + 'xcode_11e146', ], 'test_suites': { 'isolated_scripts': 'ios13_sdk_simulator_tests'
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index bcf1960c..4690988 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -5897,27 +5897,6 @@ ] } ], - "TranslateDesktopRefresh": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "EnabledTab", - "params": { - "translate_ui_bubble_style": "tab" - }, - "enable_features": [ - "UseButtonTranslateBubbleUI" - ] - } - ] - } - ], "TranslateRankerModel": [ { "platforms": [
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn index 4e213e8..f2dac11 100644 --- a/third_party/android_deps/BUILD.gn +++ b/third_party/android_deps/BUILD.gn
@@ -49,6 +49,14 @@ ] } +# TODO (bjoyce): Double group of jsr305 to prevent downstream bots from +# breaking when migrating to com_google_code_findbugs_jsr305. Can be +# removed once downstream bots move off of third_party/jsr_305. +java_group("com_google_code_findbugs_jsr305_java_temp") { + deps = [ "//third_party/jsr-305:jsr_305_javalib" ] + input_jars_paths = [ "libs/com_google_code_findbugs_jsr305/jsr305-3.0.2.jar" ] +} + # TODO (bjoyce): Remove when downstream bots can call this directly. java_group("com_android_support_animated_vector_drawable_java_temp") { deps = [ ":com_android_support_animated_vector_drawable_java" ]
diff --git a/third_party/blink/common/loader/throttling_url_loader.cc b/third_party/blink/common/loader/throttling_url_loader.cc index b741d93a..8e9f2fee 100644 --- a/third_party/blink/common/loader/throttling_url_loader.cc +++ b/third_party/blink/common/loader/throttling_url_loader.cc
@@ -8,6 +8,7 @@ #include "base/single_thread_task_runner.h" #include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/trace_event/trace_event.h" #include "net/http/http_status_code.h" #include "net/http/http_util.h" #include "net/url_request/redirect_util.h" @@ -529,6 +530,8 @@ DCHECK_EQ(DEFERRED_NONE, deferred_stage_); DCHECK(!loader_completed_); DCHECK(deferring_throttles_.empty()); + TRACE_EVENT1("loading", "ThrottlingURLLoader::OnReceiveResponse", "url", + response_url_.possibly_invalid_spec()); // Dispatch BeforeWillProcessResponse(). if (!throttles_.empty()) { @@ -672,6 +675,8 @@ mojo::ScopedDataPipeConsumerHandle body) { DCHECK_EQ(DEFERRED_NONE, deferred_stage_); DCHECK(!loader_completed_); + TRACE_EVENT1("loading", "ThrottlingURLLoader::OnStartLoadingResponseBody", + "url", response_url_.possibly_invalid_spec()); forwarding_client_->OnStartLoadingResponseBody(std::move(body)); }
diff --git a/third_party/blink/common/scheduler/web_scheduler_tracked_feature.cc b/third_party/blink/common/scheduler/web_scheduler_tracked_feature.cc index 0363733f..771b0b1 100644 --- a/third_party/blink/common/scheduler/web_scheduler_tracked_feature.cc +++ b/third_party/blink/common/scheduler/web_scheduler_tracked_feature.cc
@@ -91,6 +91,8 @@ return "WebFileSystem"; case WebSchedulerTrackedFeature::kAppBanner: return "AppBanner"; + case WebSchedulerTrackedFeature::kPrinting: + return "Printing"; } }
diff --git a/third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h b/third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h index 736fd04..a71ad8cb 100644 --- a/third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h +++ b/third_party/blink/public/common/scheduler/web_scheduler_tracked_feature.h
@@ -85,9 +85,10 @@ kOutstandingNetworkRequestXHR = 41, kAppBanner = 42, + kPrinting = 43, // NB: This enum is used in a bitmask, so kMaxValue must be less than 64. - kMaxValue = kAppBanner + kMaxValue = kPrinting }; static_assert(static_cast<uint32_t>(WebSchedulerTrackedFeature::kMaxValue) < 64,
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 18c7020f..f6a8827 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -700,21 +700,21 @@ # Set permission settings for given origin. experimental command setPermission parameters - # Origin the permission applies to, all origins if not specified. - optional string origin # Descriptor of permission to override. PermissionDescriptor permission # Setting of the permission. PermissionSetting setting + # Origin the permission applies to, all origins if not specified. + optional string origin # Context to override. When omitted, default browser context is used. optional BrowserContextID browserContextId # Grant specific permissions to the given origin and reject all others. experimental command grantPermissions parameters + array of PermissionType permissions # Origin the permission applies to, all origins if not specified. optional string origin - array of PermissionType permissions # BrowserContext to override permissions. When omitted, default browser context is used. optional BrowserContextID browserContextId
diff --git a/third_party/blink/public/mojom/feature_policy/document_policy_feature.mojom b/third_party/blink/public/mojom/feature_policy/document_policy_feature.mojom index ca03424..f388dc7 100644 --- a/third_party/blink/public/mojom/feature_policy/document_policy_feature.mojom +++ b/third_party/blink/public/mojom/feature_policy/document_policy_feature.mojom
@@ -27,4 +27,6 @@ kLayoutAnimations = 8, // Don't change assigned numbers of any item, and don't reuse removed slots. // Add new features at the end of the enum. + // Also, run update_document_policy_enum.py in + // chromium/src/tools/metrics/histograms/ to update the UMA mapping. };
diff --git a/third_party/blink/public/mojom/permissions/permission.mojom b/third_party/blink/public/mojom/permissions/permission.mojom index 19ab20e..27cebf74 100644 --- a/third_party/blink/public/mojom/permissions/permission.mojom +++ b/third_party/blink/public/mojom/permissions/permission.mojom
@@ -38,10 +38,15 @@ bool allowWithoutSanitization; }; +struct CameraDevicePermissionDescriptor { + bool panTiltZoom; +}; + // Union of possible extensions to the base PermissionDescriptor type. union PermissionDescriptorExtension { MidiPermissionDescriptor midi; ClipboardPermissionDescriptor clipboard; + CameraDevicePermissionDescriptor camera_device; }; // This struct roughly corresponds to the PermissionDescriptor dictionary as
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom index 5132b21..4a738ad 100644 --- a/third_party/blink/public/mojom/web_feature/web_feature.mojom +++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2562,6 +2562,12 @@ kLegacyLayoutByVTTCue = 3222, kLegacyLayoutByWebkitBoxWithoutVerticalLineClamp = 3223, kLegacyLayoutByTableFlexGridBlockInNGFragmentationContext = 3224, + kDocumentPolicyHeader = 3225, + kDocumentPolicyReportOnlyHeader = 3226, + kRequireDocumentPolicyHeader = 3227, + kDocumentPolicyIframePolicyAttribute = 3228, + kDocumentPolicyCausedPageUnload = 3229, + kRequiredDocumentPolicy = 3230, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/strings/translations/blink_strings_ca.xtb b/third_party/blink/public/strings/translations/blink_strings_ca.xtb index 01057fa..96f89ff 100644 --- a/third_party/blink/public/strings/translations/blink_strings_ca.xtb +++ b/third_party/blink/public/strings/translations/blink_strings_ca.xtb
@@ -178,7 +178,7 @@ <translation id="6643016212128521049">Esborra</translation> <translation id="668171684555832681">Altres...</translation> <translation id="6692633176391053278">desplaçador</translation> -<translation id="6709570249143506788">Mala qualitat de reproducció</translation> +<translation id="6709570249143506788">Qualitat de reproducció deficient</translation> <translation id="6755330956360078551">descripció emergent</translation> <translation id="6790428901817661496">Reprodueix</translation> <translation id="6820355525329141109">El connector no s'ha pogut carregar.</translation>
diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index 8a545fca..afbed96 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h
@@ -746,6 +746,10 @@ // empty ((0,0), (0,0)). virtual WebRect GetSelectionBoundsRectForTesting() const = 0; + // Returns the position of the frame's origin relative to the viewport (ie the + // local root). + virtual gfx::Point GetPositionInViewportForTesting() const = 0; + virtual void SetLifecycleState(mojom::FrameLifecycleState state) = 0; virtual void WasHidden() = 0;
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index 0578bb1..1a47c33 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -520,6 +520,7 @@ "//third_party/blink/renderer/modules/permissions/permission_descriptor.idl", "//third_party/blink/renderer/modules/permissions/permission_status.idl", "//third_party/blink/renderer/modules/permissions/permissions.idl", + "//third_party/blink/renderer/modules/permissions/camera_device_permission_descriptor.idl", "//third_party/blink/renderer/modules/permissions/push_permission_descriptor.idl", "//third_party/blink/renderer/modules/permissions/testing/internals_permission.idl", "//third_party/blink/renderer/modules/permissions/worker_navigator_permissions.idl",
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc index bcdb6ea..8218626b 100644 --- a/third_party/blink/renderer/core/animation/animation.cc +++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -37,7 +37,9 @@ #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/core/animation/animation_timeline.h" +#include "third_party/blink/renderer/core/animation/css/css_animation.h" #include "third_party/blink/renderer/core/animation/css/css_animations.h" +#include "third_party/blink/renderer/core/animation/css/css_transition.h" #include "third_party/blink/renderer/core/animation/document_timeline.h" #include "third_party/blink/renderer/core/animation/element_animations.h" #include "third_party/blink/renderer/core/animation/keyframe_effect.h" @@ -214,6 +216,7 @@ has_queued_microtask_(false), outdated_(false), finished_(true), + committed_finish_notification_(false), compositor_state_(nullptr), compositor_pending_(false), compositor_group_(0), @@ -493,10 +496,10 @@ const Animation* animation1, const Animation* animation2, CompareAnimationsOrdering compare_animation_type) { - AnimationClassPriority priority1 = AnimationPriority(*animation1); - AnimationClassPriority priority2 = AnimationPriority(*animation2); - if (priority1 != priority2) - return priority1 < priority2; + AnimationClassPriority anim_priority1 = AnimationPriority(*animation1); + AnimationClassPriority anim_priority2 = AnimationPriority(*animation2); + if (anim_priority1 != anim_priority2) + return anim_priority1 < anim_priority2; // If the the animation class is CssAnimation or CssTransition, then first // compare the owning element of animation1 and animation2, sort two of them @@ -504,7 +507,7 @@ // The specs: // https://drafts.csswg.org/css-animations-2/#animation-composite-order // https://drafts.csswg.org/css-transitions-2/#animation-composite-order - if (priority1 != kDefaultPriority && animation1->effect() && + if (anim_priority1 != kDefaultPriority && animation1->effect() && animation2->effect()) { // TODO(crbug.com/1043778): Implement and use OwningElement on CSSAnimation // and CSSTransition. @@ -513,7 +516,7 @@ Element* target1 = effect1->target(); Element* target2 = effect2->target(); - // The tree position comparison would take a longer time, thus affec the + // The tree position comparison would take a longer time, thus affect the // performance. We only do it when it comes to getAnimation. if (*target1 != *target2) { if (compare_animation_type == CompareAnimationsOrdering::kTreeOrder) { @@ -542,11 +545,13 @@ if (priority1 == kOther && pseudo1 != pseudo2) return CodeUnitCompareLessThan(pseudo1, pseudo2); - // For two animatiions with the same target (including the pseudo-element - // selector) compare the SequenceNumber for now. - // TODO(crbug.com/1045835): Sort animation1 and animation2 based on their - // position in the computed value of "animation-name" property for - // CSSAnimations and transition property for CSSTransitions. + if (anim_priority1 == kCssAnimationPriority) { + // When comparing two CSSAnimations with the same owning element, we sort + // A and B based on their position in the computed value of the + // animation-name property of the (common) owning element. + return To<CSSAnimation>(animation1)->AnimationIndex() < + To<CSSAnimation>(animation2)->AnimationIndex(); + } return animation1->SequenceNumber() < animation2->SequenceNumber(); } // If the anmiations are not-CSS WebAnimation just compare them via generation @@ -1167,6 +1172,7 @@ // 8. Schedule a task to run as soon as animation is ready. pending_play_ = true; finished_ = false; + committed_finish_notification_ = false; SetOutdated(); SetCompositorPending(/*effect_changed=*/false); @@ -1312,15 +1318,18 @@ // 4. Set the current finished state. AnimationPlayState play_state = CalculateAnimationPlayState(); if (play_state == kFinished) { - // 5. Setup finished notification. - if (notification_type == NotificationType::kSync) - CommitFinishNotification(); - else - ScheduleAsyncFinish(); + if (!committed_finish_notification_) { + // 5. Setup finished notification. + if (notification_type == NotificationType::kSync) + CommitFinishNotification(); + else + ScheduleAsyncFinish(); + } } else { // 6. If not finished but the current finished promise is already resolved, // create a new promise. - finished_ = pending_finish_notification_ = false; + finished_ = pending_finish_notification_ = committed_finish_notification_ = + false; if (finished_promise_ && finished_promise_->GetState() == AnimationPromise::kResolved) { finished_promise_->Reset(); @@ -1359,6 +1368,9 @@ // Refer to 'finished notification steps' in // https://drafts.csswg.org/web-animations-1/#updating-the-finished-state void Animation::CommitFinishNotification() { + if (committed_finish_notification_) + return; + pending_finish_notification_ = false; // 1. If animation’s play state is not equal to finished, abort these steps. @@ -1373,6 +1385,8 @@ // 3. Create an AnimationPlaybackEvent, finishEvent. QueueFinishedEvent(); + + committed_finish_notification_ = true; } // https://drafts.csswg.org/web-animations/#setting-the-playback-rate-of-an-animation @@ -1824,7 +1838,12 @@ DCHECK(!outdated_); NotifyProbe(); - return !finished_ || TimeToEffectChange(); + return !finished_ || TimeToEffectChange() || + // Always return true for not idle animations attached to not + // monotonically increasing timelines even if the animation is + // finished. This is required to accommodate cases where timeline ticks + // back in time. + (!idle && !timeline_->IsMonotonicallyIncreasing()); } void Animation::QueueFinishedEvent() { @@ -2170,7 +2189,7 @@ return false; // 4. The animation is associated with a monotonically increasing timeline. - if (!timeline_ || timeline_->IsScrollTimeline()) + if (!timeline_ || !timeline_->IsMonotonicallyIncreasing()) return false; // 5. The animation has an associated effect.
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h index a71d09d7..55d0f93 100644 --- a/third_party/blink/renderer/core/animation/animation.h +++ b/third_party/blink/renderer/core/animation/animation.h
@@ -422,6 +422,7 @@ // control. bool pending_pause_; bool pending_play_; + // Indicates finish notification queued but not processed. bool pending_finish_notification_; bool has_queued_microtask_; @@ -429,7 +430,11 @@ // has changed by means other than the ordinary progression of time bool outdated_; + // Indicates the animation is no longer active. Cancelled animation is marked + // as finished_. bool finished_; + // Indicates finish notification has been handled. + bool committed_finish_notification_; // Holds a 'finished' event queued for asynchronous dispatch via the // ScriptedAnimationController. This object remains active until the // event is actually dispatched.
diff --git a/third_party/blink/renderer/core/animation/animation_test_helper.cc b/third_party/blink/renderer/core/animation/animation_test_helper.cc index 88cc4e0..5fd3f692 100644 --- a/third_party/blink/renderer/core/animation/animation_test_helper.cc +++ b/third_party/blink/renderer/core/animation/animation_test_helper.cc
@@ -36,6 +36,31 @@ .ToChecked(); } +KeyframeEffect* CreateSimpleKeyframeEffectForTest(Element* target, + CSSPropertyID property, + String value_start, + String value_end) { + Timing timing; + timing.iteration_duration = AnimationTimeDelta::FromSecondsD(1000); + + StringKeyframe* start_keyframe = MakeGarbageCollected<StringKeyframe>(); + start_keyframe->SetOffset(0.0); + start_keyframe->SetCSSPropertyValue( + property, value_start, SecureContextMode::kSecureContext, nullptr); + + StringKeyframe* end_keyframe = MakeGarbageCollected<StringKeyframe>(); + end_keyframe->SetOffset(1.0); + end_keyframe->SetCSSPropertyValue(property, value_end, + SecureContextMode::kSecureContext, nullptr); + + StringKeyframeVector keyframes; + keyframes.push_back(start_keyframe); + keyframes.push_back(end_keyframe); + + auto* model = MakeGarbageCollected<StringKeyframeEffectModel>(keyframes); + return MakeGarbageCollected<KeyframeEffect>(target, model, timing); +} + void EnsureInterpolatedValueCached(const ActiveInterpolations& interpolations, Document& document, Element* element) {
diff --git a/third_party/blink/renderer/core/animation/animation_test_helper.h b/third_party/blink/renderer/core/animation/animation_test_helper.h index 516eb7e6..d1ba4a8 100644 --- a/third_party/blink/renderer/core/animation/animation_test_helper.h +++ b/third_party/blink/renderer/core/animation/animation_test_helper.h
@@ -14,6 +14,7 @@ class Document; class Element; +class KeyframeEffect; void SetV8ObjectPropertyAsString(v8::Isolate*, v8::Local<v8::Object>, @@ -24,6 +25,14 @@ const StringView& name, double value); +// Creates a KeyframeEffect with two keyframes corresponding to +// value_start (offset 0.0) and value_end (offset 1.0). Default blink::Timing +// values are used, except for iteration_duration which is set to 1000ms. +KeyframeEffect* CreateSimpleKeyframeEffectForTest(Element*, + CSSPropertyID, + String value_start, + String value_end); + // Ensures that a set of interpolations actually computes and caches their // internal interpolated value, so that tests can retrieve them. //
diff --git a/third_party/blink/renderer/core/animation/animation_timeline.h b/third_party/blink/renderer/core/animation/animation_timeline.h index 1c024f2..6ac1b10 100644 --- a/third_party/blink/renderer/core/animation/animation_timeline.h +++ b/third_party/blink/renderer/core/animation/animation_timeline.h
@@ -45,6 +45,10 @@ virtual bool IsDocumentTimeline() const { return false; } virtual bool IsScrollTimeline() const { return false; } virtual bool IsActive() const = 0; + // https://drafts.csswg.org/web-animations/#monotonically-increasing-timeline + // A timeline is monotonically increasing if its reported current time is + // always greater than or equal than its previously reported current time. + bool IsMonotonicallyIncreasing() const { return IsDocumentTimeline(); } // Returns the initial start time for animations that are linked to this // timeline. This method gets invoked when initializing the start time of an // animation on this timeline for the first time. It exists because the
diff --git a/third_party/blink/renderer/core/animation/css/css_animation.cc b/third_party/blink/renderer/core/animation/css/css_animation.cc index a6724f1..ecf80c2d 100644 --- a/third_party/blink/renderer/core/animation/css/css_animation.cc +++ b/third_party/blink/renderer/core/animation/css/css_animation.cc
@@ -13,8 +13,10 @@ CSSAnimation::CSSAnimation(ExecutionContext* execution_context, AnimationTimeline* timeline, AnimationEffect* content, + int animation_index, const String& animation_name) : Animation(execution_context, timeline, content), + animation_index_(animation_index), animation_name_(animation_name), ignore_css_play_state_(false) { // The owning_element does not always equal to the target element of an
diff --git a/third_party/blink/renderer/core/animation/css/css_animation.h b/third_party/blink/renderer/core/animation/css/css_animation.h index b9ac7401..74d8594 100644 --- a/third_party/blink/renderer/core/animation/css/css_animation.h +++ b/third_party/blink/renderer/core/animation/css/css_animation.h
@@ -19,6 +19,7 @@ CSSAnimation(ExecutionContext*, AnimationTimeline*, AnimationEffect*, + int animation_index, const String& animation_name); bool IsCSSAnimation() const final { return true; } @@ -27,6 +28,10 @@ Element* OwningElement() const override { return owning_element_; } const String& animationName() const { return animation_name_; } + int AnimationIndex() const { return animation_index_; } + void SetAnimationIndex(wtf_size_t absolute_position) { + animation_index_ = absolute_position; + } // Animation overrides. // Various operations may affect the computed values of properties on @@ -82,6 +87,10 @@ bool was_paused_; }; + // animation_index_ represents the absolute position of an animation within + // the same owning element. This index helps resolve the animation ordering + // when comparing two animations with the same owning element. + int animation_index_; AtomicString animation_name_; // When set, the web-animation API is overruling the animation-play-state
diff --git a/third_party/blink/renderer/core/animation/css/css_animation_update.h b/third_party/blink/renderer/core/animation/css/css_animation_update.h index 1d9d400a..9f0ce355 100644 --- a/third_party/blink/renderer/core/animation/css/css_animation_update.h +++ b/third_party/blink/renderer/core/animation/css/css_animation_update.h
@@ -28,12 +28,14 @@ public: NewCSSAnimation(AtomicString name, size_t name_index, + size_t position_index, const InertEffect& effect, Timing timing, StyleRuleKeyframes* style_rule, const Vector<EAnimPlayState>& play_state_list) : name(name), name_index(name_index), + position_index(position_index), effect(effect), timing(timing), style_rule(style_rule), @@ -47,6 +49,7 @@ AtomicString name; size_t name_index; + size_t position_index; Member<const InertEffect> effect; Timing timing; Member<StyleRuleKeyframes> style_rule; @@ -109,13 +112,14 @@ void StartAnimation(const AtomicString& animation_name, size_t name_index, + wtf_size_t position_index, const InertEffect& effect, const Timing& timing, StyleRuleKeyframes* style_rule, const Vector<EAnimPlayState>& play_state_list) { new_animations_.push_back(NewCSSAnimation(animation_name, name_index, - effect, timing, style_rule, - play_state_list)); + position_index, effect, timing, + style_rule, play_state_list)); } void CancelAnimation(wtf_size_t index, const Animation& animation) { cancelled_animation_indices_.push_back(index);
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc index fe50ab9c..21361fc 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -422,7 +422,7 @@ CSSAnimation* animation = DynamicTo<CSSAnimation>(existing_animation->animation.Get()); - + animation->SetAnimationIndex(i); const bool was_paused = CSSTimingData::GetRepeated(existing_animation->play_state_list, i) == EAnimPlayState::kPaused; @@ -460,7 +460,7 @@ } else { DCHECK(!is_animation_style_change); update.StartAnimation( - name, name_index, + name, name_index, i, *MakeGarbageCollected<InertEffect>( CreateKeyframeEffectModel(resolver, animating_element, element, &style, parent_style, name, @@ -608,7 +608,7 @@ auto* animation = MakeGarbageCollected<CSSAnimation>( element->GetExecutionContext(), &(element->GetDocument().Timeline()), - effect, entry.name); + effect, entry.position_index, entry.name); animation->play(); if (inert_animation->Paused()) animation->pause(); @@ -1056,6 +1056,12 @@ return property.IsCSSCustomProperty(); } +bool IsFontAffectingPropertyHandle(const PropertyHandle& property) { + if (property.IsCSSCustomProperty() || !property.IsCSSProperty()) + return false; + return property.GetCSSProperty().AffectsFont(); +} + // TODO(alancutter): CSS properties and presentation attributes may have // identical effects. By grouping them in the same set we introduce a bug where // arbitrary hash iteration will determine the order the apply in and thus which @@ -1459,6 +1465,13 @@ IsCustomPropertyHandle); } +bool CSSAnimations::IsAnimatingFontAffectingProperties( + const ElementAnimations* element_animations) { + return element_animations && + element_animations->GetEffectStack().AffectsProperties( + IsFontAffectingPropertyHandle); +} + bool CSSAnimations::IsAnimatingRevert( const ElementAnimations* element_animations) { return element_animations && element_animations->GetEffectStack().HasRevert();
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.h b/third_party/blink/renderer/core/animation/css/css_animations.h index 0cf61f87..7073775 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.h +++ b/third_party/blink/renderer/core/animation/css/css_animations.h
@@ -61,6 +61,7 @@ static bool IsAnimationAffectingProperty(const CSSProperty&); static bool IsAffectedByKeyframesFromScope(const Element&, const TreeScope&); static bool IsAnimatingCustomProperties(const ElementAnimations*); + static bool IsAnimatingFontAffectingProperties(const ElementAnimations*); static bool IsAnimatingRevert(const ElementAnimations*); static void CalculateAnimationUpdate(CSSAnimationUpdate&, const Element* animating_element,
diff --git a/third_party/blink/renderer/core/animation/element_animations.cc b/third_party/blink/renderer/core/animation/element_animations.cc index 57d14159..caea8c9 100644 --- a/third_party/blink/renderer/core/animation/element_animations.cc +++ b/third_party/blink/renderer/core/animation/element_animations.cc
@@ -114,13 +114,7 @@ } bool ElementAnimations::IsBaseComputedStyleUsable() const { - if (has_important_overrides_) - return false; - if (has_font_affecting_animation_ && base_computed_style_ && - base_computed_style_->HasFontRelativeUnits()) { - return false; - } - return true; + return !has_important_overrides_; } const ComputedStyle* ElementAnimations::BaseComputedStyle() const {
diff --git a/third_party/blink/renderer/core/animation/element_animations.h b/third_party/blink/renderer/core/animation/element_animations.h index 9dded60..bd4198e8 100644 --- a/third_party/blink/renderer/core/animation/element_animations.h +++ b/third_party/blink/renderer/core/animation/element_animations.h
@@ -80,7 +80,6 @@ animation_style_change_ = animation_style_change; } void SetHasImportantOverrides() { has_important_overrides_ = true; } - void SetHasFontAffectingAnimation() { has_font_affecting_animation_ = true; } const ComputedStyle* BaseComputedStyle() const; void UpdateBaseComputedStyle(const ComputedStyle*); @@ -111,10 +110,6 @@ // optimization, since we have no way of knowing the cascade origins used // to construct the various parts of the base style. bool has_important_overrides_ = false; - // If a font-affecting property is undergoing an animation, we can't use - // the base computed style optimization, because font-relative units - // (such as 'em') present in the base should respond to the animation. - bool has_font_affecting_animation_ = false; scoped_refptr<ComputedStyle> base_computed_style_; // CSSAnimations checks if a style change is due to animation.
diff --git a/third_party/blink/renderer/core/animation/scroll_timeline_test.cc b/third_party/blink/renderer/core/animation/scroll_timeline_test.cc index a9df0f7..0527917 100644 --- a/third_party/blink/renderer/core/animation/scroll_timeline_test.cc +++ b/third_party/blink/renderer/core/animation/scroll_timeline_test.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/animation/keyframe_effect.h" #include "third_party/blink/renderer/core/animation/keyframe_effect_model.h" #include "third_party/blink/renderer/core/css/css_numeric_literal_value.h" +#include "third_party/blink/renderer/core/dom/events/native_event_listener.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" @@ -531,4 +532,168 @@ ASSERT_FALSE(current_time_is_null); } +TEST_F(ScrollTimelineTest, FinishedAnimationPlaysOnReversedScrolling) { + SetBodyInnerHTML(R"HTML( + <style> + #scroller { overflow: scroll; width: 100px; height: 100px; } + #spacer { width: 200px; height: 200px; } + </style> + <div id='scroller'> + <div id ='spacer'></div> + </div> + )HTML"); + Element* scroller_element = GetElementById("scroller"); + LayoutBoxModelObject* scroller = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("scroller")); + PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); + TestScrollTimeline* scroll_timeline = + MakeGarbageCollected<TestScrollTimeline>(&GetDocument(), + scroller_element); + NonThrowableExceptionState exception_state; + Timing timing; + timing.iteration_duration = AnimationTimeDelta::FromSecondsD(0.1); + Animation* scroll_animation = + Animation::Create(MakeGarbageCollected<KeyframeEffect>( + nullptr, + MakeGarbageCollected<StringKeyframeEffectModel>( + StringKeyframeVector()), + timing), + scroll_timeline, exception_state); + scroll_animation->play(); + UpdateAllLifecyclePhasesForTest(); + // Scroll to finished state. + scrollable_area->SetScrollOffset(ScrollOffset(0, 91), + mojom::blink::ScrollType::kProgrammatic); + // Simulate a new animation frame which allows the timeline to compute a new + // current time. + SimulateFrame(); + ASSERT_EQ("finished", scroll_animation->playState()); + // Verify that the animation was not removed from animations needing update + // list. + EXPECT_EQ(1u, scroll_timeline->AnimationsNeedingUpdateCount()); + + // Scroll back. + scrollable_area->SetScrollOffset(ScrollOffset(0, 80), + mojom::blink::ScrollType::kProgrammatic); + SimulateFrame(); + // Verify that the animation as back to running. + EXPECT_EQ("running", scroll_animation->playState()); +} + +TEST_F(ScrollTimelineTest, CancelledAnimationDetachedFromTimeline) { + SetBodyInnerHTML(R"HTML( + <style> + #scroller { overflow: scroll; width: 100px; height: 100px; } + #spacer { width: 200px; height: 200px; } + </style> + <div id='scroller'> + <div id ='spacer'></div> + </div> + )HTML"); + TestScrollTimeline* scroll_timeline = + MakeGarbageCollected<TestScrollTimeline>(&GetDocument(), + GetElementById("scroller")); + NonThrowableExceptionState exception_state; + Timing timing; + timing.iteration_duration = AnimationTimeDelta::FromSecondsD(0.1); + Animation* scroll_animation = + Animation::Create(MakeGarbageCollected<KeyframeEffect>( + nullptr, + MakeGarbageCollected<StringKeyframeEffectModel>( + StringKeyframeVector()), + timing), + scroll_timeline, exception_state); + scroll_animation->play(); + UpdateAllLifecyclePhasesForTest(); + ASSERT_EQ(1u, scroll_timeline->AnimationsNeedingUpdateCount()); + + scroll_animation->cancel(); + // Simulate a new animation frame which allows the timeline to compute a new + // current time. + SimulateFrame(); + ASSERT_EQ("idle", scroll_animation->playState()); + // Verify that the animation is removed from animations needing update + // list. + EXPECT_EQ(0u, scroll_timeline->AnimationsNeedingUpdateCount()); +} + +class AnimationEventListener final : public NativeEventListener { + public: + void Invoke(ExecutionContext*, Event* event) override { + event_received_ = true; + } + bool EventReceived() const { return event_received_; } + void ResetEventReceived() { event_received_ = false; } + + private: + bool event_received_ = false; +}; + +TEST_F(ScrollTimelineTest, + FiringAnimationEventsByFinishedAnimationOnReversedScrolling) { + SetBodyInnerHTML(R"HTML( + <style> + #scroller { overflow: scroll; width: 100px; height: 100px; } + #spacer { width: 200px; height: 200px; } + </style> + <div id='scroller'> + <div id ='spacer'></div> + </div> + )HTML"); + LayoutBoxModelObject* scroller = + ToLayoutBoxModelObject(GetLayoutObjectByElementId("scroller")); + PaintLayerScrollableArea* scrollable_area = scroller->GetScrollableArea(); + TestScrollTimeline* scroll_timeline = + MakeGarbageCollected<TestScrollTimeline>(&GetDocument(), + GetElementById("scroller")); + NonThrowableExceptionState exception_state; + Timing timing; + timing.iteration_duration = AnimationTimeDelta::FromSecondsD(0.1); + Animation* scroll_animation = + Animation::Create(MakeGarbageCollected<KeyframeEffect>( + nullptr, + MakeGarbageCollected<StringKeyframeEffectModel>( + StringKeyframeVector()), + timing), + scroll_timeline, exception_state); + auto* event_listener = MakeGarbageCollected<AnimationEventListener>(); + scroll_animation->addEventListener(event_type_names::kFinish, event_listener); + + scroll_animation->play(); + UpdateAllLifecyclePhasesForTest(); + // Scroll to finished state. + scrollable_area->SetScrollOffset(ScrollOffset(0, 91), + mojom::blink::ScrollType::kProgrammatic); + // Simulate a new animation frame which allows the timeline to compute a new + // current time. + SimulateFrame(); + ASSERT_TRUE(event_listener->EventReceived()); + event_listener->ResetEventReceived(); + + // Verify finished event does not re-fire. + SimulateFrame(); + EXPECT_FALSE(event_listener->EventReceived()); + + // Scroll back. + scrollable_area->SetScrollOffset(ScrollOffset(0, 80), + mojom::blink::ScrollType::kProgrammatic); + SimulateFrame(); + // Verify finished event is not fired on reverse scroll from finished state. + EXPECT_FALSE(event_listener->EventReceived()); + + // Scroll forward to finished state. + scrollable_area->SetScrollOffset(ScrollOffset(0, 91), + mojom::blink::ScrollType::kProgrammatic); + SimulateFrame(); + // Verify animation finished event is fired. + EXPECT_TRUE(event_listener->EventReceived()); + event_listener->ResetEventReceived(); + + scrollable_area->SetScrollOffset(ScrollOffset(0, 95), + mojom::blink::ScrollType::kProgrammatic); + SimulateFrame(); + // Verify animation finished event is fired only once in finished state. + EXPECT_FALSE(event_listener->EventReceived()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/active_style_sheets_test.cc b/third_party/blink/renderer/core/css/active_style_sheets_test.cc index 4f38ad0a..9e5fa7c5 100644 --- a/third_party/blink/renderer/core/css/active_style_sheets_test.cc +++ b/third_party/blink/renderer/core/css/active_style_sheets_test.cc
@@ -470,8 +470,12 @@ GetStyleEngine().ApplyRuleSetChanges(GetDocument(), ActiveStyleSheetVector(), new_style_sheets); - EXPECT_EQ(kSubtreeStyleChange, - GetDocument().documentElement()->GetStyleChangeType()); + StyleChangeType expected = + RuntimeEnabledFeatures::CSSReducedFontLoadingInvalidationsEnabled() + ? kNoStyleChange + : kSubtreeStyleChange; + + EXPECT_EQ(expected, GetDocument().documentElement()->GetStyleChangeType()); } TEST_F(ApplyRulesetsTest, AddFontFaceRuleToShadowTree) {
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc index 57500996..2e0c4449 100644 --- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc +++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -383,9 +383,6 @@ To<TransitionInterpolation>(interpolation).Apply(state_); } - if (property.AffectsFont()) - state_.SetHasFontAffectingAnimation(); - // Applying a color property interpolation will also unconditionally apply // the -internal-visited- counterpart (see CSSColorInterpolationType:: // ApplyStandardPropertyValue). To make sure !important rules in :visited
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index 6c42718..04c53223 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -118,8 +118,6 @@ state.AnimationUpdate()); if (state.HasImportantOverrides()) element_animations.SetHasImportantOverrides(); - if (state.HasFontAffectingAnimation()) - element_animations.SetHasFontAffectingAnimation(); } } @@ -788,6 +786,14 @@ return nullptr; } + if (CSSAnimations::IsAnimatingFontAffectingProperties(element_animations)) { + state.SetHasFontAffectingAnimation(); + if (element_animations->BaseComputedStyle() && + element_animations->BaseComputedStyle()->HasFontRelativeUnits()) { + return nullptr; + } + } + return element_animations->BaseComputedStyle(); } @@ -798,7 +804,9 @@ ElementAnimations* element_animations = state.GetAnimatingElement()->GetElementAnimations(); if (element_animations) { - if (state.IsAnimatingCustomProperties() || state.IsAnimatingRevert()) { + if (state.IsAnimatingCustomProperties() || state.IsAnimatingRevert() || + (state.HasFontAffectingAnimation() && + state.Style()->HasFontRelativeUnits())) { element_animations->ClearBaseComputedStyle(); } else { element_animations->UpdateBaseComputedStyle(state.Style());
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc index 7f95770..238c633 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver_test.cc
@@ -5,7 +5,10 @@ #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/animation/animation_test_helper.h" +#include "third_party/blink/renderer/core/animation/document_timeline.h" #include "third_party/blink/renderer/core/animation/element_animations.h" +#include "third_party/blink/renderer/core/css/properties/css_property_ref.h" #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" @@ -27,6 +30,14 @@ return style; } + String ComputedValue(String name, const ComputedStyle& style) { + CSSPropertyRef ref(name, GetDocument()); + DCHECK(ref.IsValid()); + return ref.GetProperty() + .CSSValueFromComputedStyle(style, nullptr, false) + ->CssText(); + } + protected: }; @@ -112,19 +123,20 @@ TEST_F(StyleResolverTest, BasePresentIfFontRelativeUnitsAbsent) { GetDocument().documentElement()->setInnerHTML("<div id=div>Test</div>"); UpdateAllLifecyclePhasesForTest(); - Element* div = GetDocument().getElementById("div"); - StyleResolver* resolver = GetStyleEngine().Resolver(); - ASSERT_TRUE(resolver); - ElementAnimations& animations = div->EnsureElementAnimations(); - animations.SetAnimationStyleChange(true); - // We're animating a font affecting property, but we should still be able to - // use the base computed style optimization, since no font-relative units - // exist in the base. - animations.SetHasFontAffectingAnimation(); - EXPECT_TRUE(resolver->StyleForElement(div)); - EXPECT_TRUE(animations.BaseComputedStyle()); + auto* effect = CreateSimpleKeyframeEffectForTest( + div, CSSPropertyID::kFontSize, "50px", "100px"); + GetDocument().Timeline().Play(effect); + UpdateAllLifecyclePhasesForTest(); + + EXPECT_EQ("50px", ComputedValue("font-size", *StyleForId("div"))); + + div->SetNeedsAnimationStyleRecalc(); + StyleForId("div"); + + ASSERT_TRUE(div->GetElementAnimations()); + EXPECT_TRUE(div->GetElementAnimations()->BaseComputedStyle()); } TEST_F(StyleResolverTest, NoCrashWhenAnimatingWithoutCascade) { @@ -155,12 +167,18 @@ UpdateAllLifecyclePhasesForTest(); Element* div = GetDocument().getElementById("div"); - ElementAnimations& animations = div->EnsureElementAnimations(); - animations.SetAnimationStyleChange(true); - animations.SetHasFontAffectingAnimation(); + auto* effect = CreateSimpleKeyframeEffectForTest( + div, CSSPropertyID::kFontSize, "50px", "100px"); + GetDocument().Timeline().Play(effect); + UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ("50px", ComputedValue("font-size", *StyleForId("div"))); - EXPECT_TRUE(StyleForId("div")->HasFontRelativeUnits()); - EXPECT_FALSE(animations.BaseComputedStyle()); + div->SetNeedsAnimationStyleRecalc(); + auto computed_style = StyleForId("div"); + + EXPECT_TRUE(computed_style->HasFontRelativeUnits()); + ASSERT_TRUE(div->GetElementAnimations()); + EXPECT_FALSE(div->GetElementAnimations()->BaseComputedStyle()); } TEST_P(StyleResolverFontRelativeUnitTest, @@ -170,11 +188,18 @@ UpdateAllLifecyclePhasesForTest(); Element* div = GetDocument().getElementById("div"); - ElementAnimations& animations = div->EnsureElementAnimations(); - animations.SetAnimationStyleChange(true); + auto* effect = CreateSimpleKeyframeEffectForTest(div, CSSPropertyID::kHeight, + "50px", "100px"); + GetDocument().Timeline().Play(effect); + UpdateAllLifecyclePhasesForTest(); + EXPECT_EQ("50px", ComputedValue("height", *StyleForId("div"))); - EXPECT_TRUE(StyleForId("div")->HasFontRelativeUnits()); - EXPECT_TRUE(animations.BaseComputedStyle()); + div->SetNeedsAnimationStyleRecalc(); + auto computed_style = StyleForId("div"); + + EXPECT_TRUE(computed_style->HasFontRelativeUnits()); + ASSERT_TRUE(div->GetElementAnimations()); + EXPECT_TRUE(div->GetElementAnimations()->BaseComputedStyle()); } INSTANTIATE_TEST_SUITE_P(All,
diff --git a/third_party/blink/renderer/core/css/style_engine.cc b/third_party/blink/renderer/core/css/style_engine.cc index 4d43087..b313966d 100644 --- a/third_party/blink/renderer/core/css/style_engine.cc +++ b/third_party/blink/renderer/core/css/style_engine.cc
@@ -738,7 +738,7 @@ environment_variables_ = nullptr; } -bool StyleEngine::ClearFontCacheAndAddUserFonts() { +bool StyleEngine::ClearFontFaceCacheAndAddUserFonts() { bool fonts_changed = false; if (font_selector_ && @@ -1515,29 +1515,18 @@ return flags; } -bool NeedsFullRecalcForRuleSetChanges(TreeScope& tree_scope, - unsigned changed_rule_flags, - bool has_rebuilt_font_cache) { - if (changed_rule_flags & kFullRecalcRules) - return true; - if (!tree_scope.RootNode().IsDocumentNode()) - return false; - return (changed_rule_flags & kFontFaceRules) || has_rebuilt_font_cache; -} - } // namespace void StyleEngine::InvalidateForRuleSetChanges( TreeScope& tree_scope, const HeapHashSet<Member<RuleSet>>& changed_rule_sets, unsigned changed_rule_flags, - InvalidationScope invalidation_scope, - bool has_rebuilt_font_cache) { + InvalidationScope invalidation_scope) { if (tree_scope.GetDocument().HasPendingForcedStyleRecalc()) return; if (!tree_scope.GetDocument().documentElement()) return; - if (changed_rule_sets.IsEmpty() && !has_rebuilt_font_cache) + if (changed_rule_sets.IsEmpty()) return; Element& invalidation_root = @@ -1545,8 +1534,7 @@ if (invalidation_root.GetStyleChangeType() == kSubtreeStyleChange) return; - if (NeedsFullRecalcForRuleSetChanges(tree_scope, changed_rule_flags, - has_rebuilt_font_cache)) { + if (changed_rule_flags & kFullRecalcRules) { invalidation_root.SetNeedsStyleRecalc( kSubtreeStyleChange, StyleChangeReasonForTracing::Create( @@ -1581,7 +1569,7 @@ global_rule_set_->MarkDirty(); unsigned changed_rule_flags = GetRuleSetFlags(changed_rule_sets); - bool has_rebuilt_font_cache = false; + bool has_rebuilt_font_face_cache = false; if (changed_rule_flags & kFontFaceRules) { if (ScopedStyleResolver* scoped_resolver = GetDocument().GetScopedStyleResolver()) { @@ -1592,7 +1580,7 @@ scoped_resolver->SetNeedsAppendAllSheets(); MarkDocumentDirty(); } else { - has_rebuilt_font_cache = ClearFontCacheAndAddUserFonts(); + has_rebuilt_font_face_cache = ClearFontFaceCacheAndAddUserFonts(); } } @@ -1608,9 +1596,11 @@ ScopedStyleResolver::KeyframesRulesAdded(GetDocument()); } + if ((changed_rule_flags & kFontFaceRules) || has_rebuilt_font_face_cache) + GetFontSelector()->FontFaceInvalidated(); + InvalidateForRuleSetChanges(GetDocument(), changed_rule_sets, - changed_rule_flags, kInvalidateAllScopes, - has_rebuilt_font_cache); + changed_rule_flags, kInvalidateAllScopes); } void StyleEngine::ApplyRuleSetChanges( @@ -1626,12 +1616,12 @@ unsigned changed_rule_flags = GetRuleSetFlags(changed_rule_sets); - bool rebuild_font_cache = change == kActiveSheetsChanged && - (changed_rule_flags & kFontFaceRules) && - tree_scope.RootNode().IsDocumentNode(); + bool rebuild_font_face_cache = change == kActiveSheetsChanged && + (changed_rule_flags & kFontFaceRules) && + tree_scope.RootNode().IsDocumentNode(); ScopedStyleResolver* scoped_resolver = tree_scope.GetScopedStyleResolver(); if (scoped_resolver && scoped_resolver->NeedsAppendAllSheets()) { - rebuild_font_cache = true; + rebuild_font_face_cache = true; change = kActiveSheetsChanged; } @@ -1658,9 +1648,9 @@ } } - bool has_rebuilt_font_cache = false; - if (rebuild_font_cache) - has_rebuilt_font_cache = ClearFontCacheAndAddUserFonts(); + bool has_rebuilt_font_face_cache = false; + if (rebuild_font_face_cache) + has_rebuilt_font_face_cache = ClearFontFaceCacheAndAddUserFonts(); unsigned append_start_index = 0; if (scoped_resolver) { @@ -1682,8 +1672,13 @@ append_start_index, new_style_sheets); } + if (tree_scope.RootNode().IsDocumentNode()) { + if ((changed_rule_flags & kFontFaceRules) || has_rebuilt_font_face_cache) + GetFontSelector()->FontFaceInvalidated(); + } + InvalidateForRuleSetChanges(tree_scope, changed_rule_sets, changed_rule_flags, - kInvalidateCurrentScope, has_rebuilt_font_cache); + kInvalidateCurrentScope); } void StyleEngine::LoadVisionDeficiencyFilter() {
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h index e33a320..85bbce4 100644 --- a/third_party/blink/renderer/core/css/style_engine.h +++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -464,8 +464,7 @@ TreeScope& tree_scope, const HeapHashSet<Member<RuleSet>>& changed_rule_sets, unsigned changed_rule_flags, - InvalidationScope invalidation_scope, - bool rebuild_font_cache); + InvalidationScope invalidation_scope); void InvalidateInitialData(); void UpdateViewport(); @@ -480,7 +479,7 @@ void UpdateStyleSheetList(TreeScope&); // Returns true if any @font-face rules are added or removed. - bool ClearFontCacheAndAddUserFonts(); + bool ClearFontFaceCacheAndAddUserFonts(); void ClearKeyframeRules() { keyframes_rule_map_.clear(); } void ClearPropertyRules();
diff --git a/third_party/blink/renderer/core/dom/aria_attributes.idl b/third_party/blink/renderer/core/dom/aria_attributes.idl index 31bee8c..9f6a22b 100644 --- a/third_party/blink/renderer/core/dom/aria_attributes.idl +++ b/third_party/blink/renderer/core/dom/aria_attributes.idl
@@ -39,7 +39,8 @@ [CEReactions, Reflect=aria_rowcount] attribute DOMString? ariaRowCount; [CEReactions, Reflect=aria_rowindex] attribute DOMString? ariaRowIndex; [CEReactions, Reflect=aria_rowspan] attribute DOMString? ariaRowSpan; - [CEReactions, Reflect=aria_setsize] attribute DOMString? ariaSelected; + [CEReactions, Reflect=aria_selected] attribute DOMString? ariaSelected; + [CEReactions, Reflect=aria_setsize] attribute DOMString? ariaSetSize; [CEReactions, Reflect=aria_sort] attribute DOMString? ariaSort; [CEReactions, Reflect=aria_valuemax] attribute DOMString? ariaValueMax; [CEReactions, Reflect=aria_valuemin] attribute DOMString? ariaValueMin;
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 0026339..6cf11c7 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -1027,6 +1027,21 @@ return false; } +bool Document::DocumentPolicyFeatureObserved( + mojom::blink::DocumentPolicyFeature feature) { + wtf_size_t feature_index = static_cast<wtf_size_t>(feature); + if (parsed_document_policies_.size() == 0) { + parsed_document_policies_.resize( + static_cast<wtf_size_t>( + mojom::blink::DocumentPolicyFeature::kMaxValue) + + 1); + } else if (parsed_document_policies_[feature_index]) { + return true; + } + parsed_document_policies_[feature_index] = true; + return false; +} + const SecurityOrigin* Document::GetSecurityOrigin() const { return GetSecurityContext().GetSecurityOrigin(); } @@ -8530,6 +8545,14 @@ const base::Optional<std::string> endpoint = relevant_document_policy->GetFeatureEndpoint(feature); + if (is_report_only) { + UMA_HISTOGRAM_ENUMERATION("Blink.UseCounter.DocumentPolicy.ReportOnly", + feature); + } else { + UMA_HISTOGRAM_ENUMERATION("Blink.UseCounter.DocumentPolicy.Enforced", + feature); + } + reporting_context->QueueReport( report, endpoint ? Vector<String>{endpoint->c_str()} : Vector<String>{});
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h index 7245627..061b7c1 100644 --- a/third_party/blink/renderer/core/dom/document.h +++ b/third_party/blink/renderer/core/dom/document.h
@@ -344,6 +344,9 @@ bool FeaturePolicyFeatureObserved( mojom::blink::FeaturePolicyFeature feature) override; + bool DocumentPolicyFeatureObserved( + mojom::blink::DocumentPolicyFeature feature); + SecurityContext& GetSecurityContext() { return security_context_; } const SecurityContext& GetSecurityContext() const { return security_context_; @@ -2279,6 +2282,8 @@ // The size of this vector is 0 until FeaturePolicyFeatureObserved is called. Vector<bool> parsed_feature_policies_; + Vector<bool> parsed_document_policies_; + AtomicString override_last_modified_; // Map from isolated world IDs to their ContentSecurityPolicy instances.
diff --git a/third_party/blink/renderer/core/dom/events/event_target.cc b/third_party/blink/renderer/core/dom/events/event_target.cc index 2c506ac3..6edd8b3 100644 --- a/third_party/blink/renderer/core/dom/events/event_target.cc +++ b/third_party/blink/renderer/core/dom/events/event_target.cc
@@ -366,11 +366,9 @@ executing_window->document(), WebFeature::kAddDocumentLevelPassiveDefaultWheelEventListener); } - if (RuntimeEnabledFeatures::PassiveDocumentWheelEventListenersEnabled()) { - options->setPassive(true); - options->SetPassiveForcedForDocumentTarget(true); - return; - } + options->setPassive(true); + options->SetPassiveForcedForDocumentTarget(true); + return; } }
diff --git a/third_party/blink/renderer/core/execution_context/security_context_init.cc b/third_party/blink/renderer/core/execution_context/security_context_init.cc index 561b8d4..3ac03ab5 100644 --- a/third_party/blink/renderer/core/execution_context/security_context_init.cc +++ b/third_party/blink/renderer/core/execution_context/security_context_init.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/execution_context/security_context_init.h" +#include "base/metrics/histogram_macros.h" #include "services/network/public/cpp/web_sandbox_flags.h" #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h" #include "third_party/blink/renderer/core/dom/document_init.h" @@ -135,6 +136,17 @@ } if (!report_only_feature_policy_header_.empty()) UseCounter::Count(document, WebFeature::kFeaturePolicyReportOnlyHeader); + + if (!document_policy_.feature_state.empty()) + UseCounter::Count(document, WebFeature::kDocumentPolicyHeader); + + if (!report_only_document_policy_.feature_state.empty()) + UseCounter::Count(document, WebFeature::kDocumentPolicyReportOnlyHeader); + + for (const auto& policy_entry : document_policy_.feature_state) { + UMA_HISTOGRAM_ENUMERATION("Blink.UseCounter.DocumentPolicy.Header", + policy_entry.first); + } } void SecurityContextInit::InitializeContentSecurityPolicy(
diff --git a/third_party/blink/renderer/core/feature_policy/document_policy_parser.cc b/third_party/blink/renderer/core/feature_policy/document_policy_parser.cc index 0d398fe..55cd1f4 100644 --- a/third_party/blink/renderer/core/feature_policy/document_policy_parser.cc +++ b/third_party/blink/renderer/core/feature_policy/document_policy_parser.cc
@@ -44,20 +44,15 @@ base::Optional<ParsedFeature> ParseWildcardFeature( const net::structured_headers::ParameterizedMember& directive) { - // Wildcard feature can only have 1 param, which is 'report-to'. - if (directive.params.size() != 1) - return base::nullopt; + base::Optional<std::string> endpoint_group; - const auto& param = directive.params.front(); - - // Wildcard feature can only have 1 param, which is 'report-to'. - if (param.first != kReportTo) - return base::nullopt; - - base::Optional<std::string> endpoint_group = ItemToString(param.second); - - if (!endpoint_group) - return base::nullopt; + for (const auto& param : directive.params) { + if (param.first == kReportTo) { + endpoint_group = ItemToString(param.second); + if (!endpoint_group) + return base::nullopt; + } + } return base::make_optional<ParsedFeature>( {mojom::blink::DocumentPolicyFeature::kDefault, PolicyValue(), @@ -81,11 +76,6 @@ if (!feature_token.is_token()) return base::nullopt; - // No directive can currently have more than two parameters, including - // 'report-to'. - if (directive.params.size() > 2) - return base::nullopt; - std::string feature_name = feature_token.GetString(); if (feature_name == kWildCard) @@ -124,6 +114,8 @@ mojom::blink::PolicyValueType::kNull) parsed_feature.policy_value = PolicyValue(true); + const std::string& feature_param_name = + feature_info_map.at(parsed_feature.feature).feature_param_name; for (const auto& param : directive.params) { const std::string& param_name = param.first; // Handle "report-to" param. "report-to" is an optional param for @@ -131,19 +123,14 @@ // should send report to. If left unspecified, no report will be send upon // policy violation. if (param_name == kReportTo) { - base::Optional<std::string> endpoint_group = ItemToString(param.second); - if (!endpoint_group) + parsed_feature.endpoint_group = ItemToString(param.second); + if (!parsed_feature.endpoint_group) return base::nullopt; - parsed_feature.endpoint_group = *endpoint_group; - } else { + } else if (param_name == feature_param_name) { // Handle policy value. For all non-boolean policy value types, they // should be specified as FeatureX;f=xxx, with f representing the // |feature_param_name| and xxx representing policy value. - // |param_name| does not match param_name in config. - if (param_name != - feature_info_map.at(parsed_feature.feature).feature_param_name) - return base::nullopt; // |parsed_feature.policy_value| should not be assigned yet. DCHECK(parsed_feature.policy_value.Type() == mojom::blink::PolicyValueType::kNull);
diff --git a/third_party/blink/renderer/core/feature_policy/document_policy_parser_test.cc b/third_party/blink/renderer/core/feature_policy/document_policy_parser_test.cc index f13f639..78d281a 100644 --- a/third_party/blink/renderer/core/feature_policy/document_policy_parser_test.cc +++ b/third_party/blink/renderer/core/feature_policy/document_policy_parser_test.cc
@@ -67,13 +67,13 @@ "*;report-to=default", // An empty policy. "no-f-bool;report-to=none, f-double;value=2.0, *;report-to=default", "no-f-bool;report-to=none, f-double;value=2.0, *;report-to=none", + "f-double;value=2;another_value=4", // excessive param should be + // acceptable. }; const char* const kInvalidPolicies[] = { "bad-feature-name", "no-bad-feature-name", - "f-bool;value=true", // unnecessary param "f-double;value=?0", // wrong type of param - "f-double;ppb=2", // wrong param key "\"f-bool\"", // policy member should be token instead of // string "();value=2", // empty feature token @@ -113,6 +113,11 @@ {{{kBoolFeature, PolicyValue(false)}, {kDoubleFeature, PolicyValue(1.0)}}, {} /* endpoint_map */}}, + // Unrecognized params are ignored for forwards compatibility. + {"no-f-bool,f-double;value=1;unknown_param=xxx", + {{{kBoolFeature, PolicyValue(false)}, + {kDoubleFeature, PolicyValue(1.0)}}, + {} /* endpoint_map */}}, {"no-f-bool,f-double;value=1;report-to=default", {{{kBoolFeature, PolicyValue(false)}, {kDoubleFeature, PolicyValue(1.0)}},
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 8944b0e..bef9aa2e 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -256,6 +256,7 @@ #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h" #include "third_party/blink/renderer/platform/loader/fetch/resource_request.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h" +#include "third_party/blink/renderer/platform/scheduler/public/scheduling_policy.h" #include "third_party/blink/renderer/platform/text/text_direction.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" #include "third_party/blink/renderer/platform/weborigin/scheme_registry.h" @@ -1493,6 +1494,13 @@ is_in_printing_ = true; #endif + // Disable BackForwardCache when printing API is used for now. When the page + // navigates with BackForwardCache, we currently do not close the printing + // popup properly. + GetFrame()->GetFrameScheduler()->RegisterStickyFeature( + blink::SchedulingPolicy::Feature::kPrinting, + {blink::SchedulingPolicy::RecordMetricsForBackForwardCache()}); + GetFrame()->GetDocument()->SetPrinting(Document::kBeforePrinting); DispatchPrintEventRecursively(event_type_names::kBeforeprint); } @@ -1642,6 +1650,11 @@ : WebRect(); } +gfx::Point WebLocalFrameImpl::GetPositionInViewportForTesting() const { + LocalFrameView* view = GetFrameView(); + return view->ConvertToRootFrame(IntPoint()); +} + // WebLocalFrameImpl public -------------------------------------------------- WebLocalFrame* WebLocalFrame::CreateMainFrame(
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index 27ede277..7f031166c 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h
@@ -295,6 +295,7 @@ void WaitForDebuggerWhenShown() override; void PrintPagesForTesting(cc::PaintCanvas*, const WebSize&) override; WebRect GetSelectionBoundsRectForTesting() const override; + gfx::Point GetPositionInViewportForTesting() const override; void SetLifecycleState(mojom::FrameLifecycleState state) override; void WasHidden() override; void WasShown() override;
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc index e4307f3..acf170a 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.cc +++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -24,6 +24,7 @@ #include "third_party/blink/renderer/core/html/html_iframe_element.h" +#include "base/metrics/histogram_macros.h" #include "services/network/public/cpp/web_sandbox_flags.h" #include "services/network/public/mojom/trust_tokens.mojom-blink.h" #include "services/network/public/mojom/web_sandbox_flags.mojom-blink.h" @@ -299,9 +300,20 @@ // on iframe attribute.'. DocumentPolicy::FeatureState HTMLIFrameElement::ConstructRequiredPolicy() const { - return DocumentPolicyParser::Parse(required_policy_) - .value_or(DocumentPolicy::ParsedDocumentPolicy{}) - .feature_state; + DocumentPolicy::FeatureState new_required_policy = + DocumentPolicyParser::Parse(required_policy_) + .value_or(DocumentPolicy::ParsedDocumentPolicy{}) + .feature_state; + + for (const auto& policy_entry : new_required_policy) { + mojom::blink::DocumentPolicyFeature feature = policy_entry.first; + if (!GetDocument().DocumentPolicyFeatureObserved(feature)) { + UMA_HISTOGRAM_ENUMERATION( + "Blink.UseCounter.DocumentPolicy.PolicyAttribute", feature); + } + } + + return new_required_policy; } ParsedFeaturePolicy HTMLIFrameElement::ConstructContainerPolicy(
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.idl b/third_party/blink/renderer/core/html/html_iframe_element.idl index 99283b0..79678b2 100644 --- a/third_party/blink/renderer/core/html/html_iframe_element.idl +++ b/third_party/blink/renderer/core/html/html_iframe_element.idl
@@ -50,7 +50,7 @@ [RuntimeEnabled=FeaturePolicyJavaScriptInterface] readonly attribute FeaturePolicy featurePolicy; // Document Policy - [RuntimeEnabled=DocumentPolicy, CEReactions, Reflect] attribute DOMString policy; + [RuntimeEnabled=DocumentPolicy, CEReactions, Reflect, MeasureAs=DocumentPolicyIframePolicyAttribute] attribute DOMString policy; [RuntimeEnabled=LazyFrameLoading, CEReactions, Reflect, ReflectOnly=("lazy", "eager", "auto"), ReflectMissing="auto", ReflectInvalid="auto"] attribute DOMString loading;
diff --git a/third_party/blink/renderer/core/html/html_ruby_element.cc b/third_party/blink/renderer/core/html/html_ruby_element.cc index e2f1d7c..8bdf875 100644 --- a/third_party/blink/renderer/core/html/html_ruby_element.cc +++ b/third_party/blink/renderer/core/html/html_ruby_element.cc
@@ -5,23 +5,28 @@ #include "third_party/blink/renderer/core/html/html_ruby_element.h" #include "third_party/blink/renderer/core/html_names.h" +#include "third_party/blink/renderer/core/layout/layout_object_factory.h" #include "third_party/blink/renderer/core/layout/layout_ruby.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" namespace blink { HTMLRubyElement::HTMLRubyElement(Document& document) : HTMLElement(html_names::kRubyTag, document) {} +bool HTMLRubyElement::TypeShouldForceLegacyLayout() const { + if (RuntimeEnabledFeatures::LayoutNGRubyEnabled()) + return false; + UseCounter::Count(GetDocument(), WebFeature::kLegacyLayoutByRuby); + return true; +} + LayoutObject* HTMLRubyElement::CreateLayoutObject(const ComputedStyle& style, LegacyLayout legacy) { - if (style.Display() == EDisplay::kInline) { - UseCounter::Count(GetDocument(), WebFeature::kLegacyLayoutByRuby); + if (style.Display() == EDisplay::kInline) return new LayoutRubyAsInline(this); - } - if (style.Display() == EDisplay::kBlock) { - UseCounter::Count(GetDocument(), WebFeature::kLegacyLayoutByRuby); - return new LayoutRubyAsBlock(this); - } + if (style.Display() == EDisplay::kBlock) + return LayoutObjectFactory::CreateRubyAsBlock(this, style, legacy); return LayoutObject::CreateObject(this, style, legacy); }
diff --git a/third_party/blink/renderer/core/html/html_ruby_element.h b/third_party/blink/renderer/core/html/html_ruby_element.h index 7f05b0fd..71a4df0 100644 --- a/third_party/blink/renderer/core/html/html_ruby_element.h +++ b/third_party/blink/renderer/core/html/html_ruby_element.h
@@ -17,7 +17,7 @@ private: LayoutObject* CreateLayoutObject(const ComputedStyle&, LegacyLayout) override; - bool TypeShouldForceLegacyLayout() const final { return true; } + bool TypeShouldForceLegacyLayout() const final; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/BUILD.gn b/third_party/blink/renderer/core/layout/BUILD.gn index 6f4035bb..232f30a 100644 --- a/third_party/blink/renderer/core/layout/BUILD.gn +++ b/third_party/blink/renderer/core/layout/BUILD.gn
@@ -402,6 +402,8 @@ "ng/layout_ng_mixin.h", "ng/layout_ng_progress.cc", "ng/layout_ng_progress.h", + "ng/layout_ng_ruby_as_block.cc", + "ng/layout_ng_ruby_as_block.h", "ng/layout_ng_table_caption.cc", "ng/layout_ng_table_caption.h", "ng/layout_ng_table_cell.cc",
diff --git a/third_party/blink/renderer/core/layout/layout_object_factory.cc b/third_party/blink/renderer/core/layout/layout_object_factory.cc index 49df1d2..65c1494 100644 --- a/third_party/blink/renderer/core/layout/layout_object_factory.cc +++ b/third_party/blink/renderer/core/layout/layout_object_factory.cc
@@ -27,6 +27,7 @@ #include "third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.h" #include "third_party/blink/renderer/core/layout/ng/layout_ng_grid.h" #include "third_party/blink/renderer/core/layout/ng/layout_ng_progress.h" +#include "third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.h" #include "third_party/blink/renderer/core/layout/ng/layout_ng_table_caption.h" #include "third_party/blink/renderer/core/layout/ng/layout_ng_table_cell.h" #include "third_party/blink/renderer/core/layout/ng/list/layout_ng_inside_list_marker.h" @@ -210,4 +211,12 @@ return CreateObject<LayoutProgress, LayoutNGProgress>(*node, style, legacy); } +LayoutRubyAsBlock* LayoutObjectFactory::CreateRubyAsBlock( + Node* node, + const ComputedStyle& style, + LegacyLayout legacy) { + return CreateObject<LayoutRubyAsBlock, LayoutNGRubyAsBlock>(*node, style, + legacy); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_object_factory.h b/third_party/blink/renderer/core/layout/layout_object_factory.h index 2307e220a..ee7c9e2 100644 --- a/third_party/blink/renderer/core/layout/layout_object_factory.h +++ b/third_party/blink/renderer/core/layout/layout_object_factory.h
@@ -17,6 +17,7 @@ class LayoutObject; enum class LegacyLayout; class LayoutProgress; +class LayoutRubyAsBlock; class LayoutTableCaption; class LayoutTableCell; class LayoutText; @@ -67,6 +68,9 @@ static LayoutProgress* CreateProgress(Node* node, const ComputedStyle& style, LegacyLayout legacy); + static LayoutRubyAsBlock* CreateRubyAsBlock(Node* node, + const ComputedStyle& style, + LegacyLayout legacy); }; } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_ruby.h b/third_party/blink/renderer/core/layout/layout_ruby.h index d28c25ba..66747efa 100644 --- a/third_party/blink/renderer/core/layout/layout_ruby.h +++ b/third_party/blink/renderer/core/layout/layout_ruby.h
@@ -77,7 +77,7 @@ }; // <ruby> when used as 'display:block' or 'display:inline-block' -class LayoutRubyAsBlock final : public LayoutBlockFlow { +class LayoutRubyAsBlock : public LayoutBlockFlow { public: LayoutRubyAsBlock(Element*); ~LayoutRubyAsBlock() override; @@ -90,11 +90,11 @@ protected: void StyleDidChange(StyleDifference, const ComputedStyle* old_style) override; - - private: bool IsOfType(LayoutObjectType type) const override { return type == kLayoutObjectRuby || LayoutBlockFlow::IsOfType(type); } + + private: bool CreatesAnonymousWrapper() const override { return true; } void RemoveLeftoverAnonymousBlock(LayoutBlock*) override { NOTREACHED(); } };
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc index ef990b7c..3e3dd5381 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
@@ -341,6 +341,7 @@ template class CORE_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutBlockFlow>; template class CORE_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutProgress>; +template class CORE_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutRubyAsBlock>; template class CORE_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutTableCaption>; template class CORE_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutTableCell>;
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h index 2e808c03..b53d056 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/layout/layout_block_flow.h" #include "third_party/blink/renderer/core/layout/layout_box_model_object.h" #include "third_party/blink/renderer/core/layout/layout_progress.h" +#include "third_party/blink/renderer/core/layout/layout_ruby.h" #include "third_party/blink/renderer/core/layout/layout_table_caption.h" #include "third_party/blink/renderer/core/layout/layout_table_cell.h" #include "third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h" @@ -97,6 +98,8 @@ extern template class CORE_EXTERN_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutProgress>; extern template class CORE_EXTERN_TEMPLATE_EXPORT + LayoutNGBlockFlowMixin<LayoutRubyAsBlock>; +extern template class CORE_EXTERN_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutTableCaption>; extern template class CORE_EXTERN_TEMPLATE_EXPORT LayoutNGBlockFlowMixin<LayoutTableCell>;
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc index 04449aa..666fabe 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.cc
@@ -278,6 +278,7 @@ template class CORE_TEMPLATE_EXPORT LayoutNGMixin<LayoutBlock>; template class CORE_TEMPLATE_EXPORT LayoutNGMixin<LayoutBlockFlow>; template class CORE_TEMPLATE_EXPORT LayoutNGMixin<LayoutProgress>; +template class CORE_TEMPLATE_EXPORT LayoutNGMixin<LayoutRubyAsBlock>; template class CORE_TEMPLATE_EXPORT LayoutNGMixin<LayoutTableCaption>; template class CORE_TEMPLATE_EXPORT LayoutNGMixin<LayoutTableCell>;
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h index a6194724..0697883 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_mixin.h
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/layout_block_flow.h" #include "third_party/blink/renderer/core/layout/layout_progress.h" +#include "third_party/blink/renderer/core/layout/layout_ruby.h" #include "third_party/blink/renderer/core/layout/layout_table_caption.h" #include "third_party/blink/renderer/core/layout/layout_table_cell.h" @@ -49,6 +50,8 @@ LayoutNGMixin<LayoutBlockFlow>; extern template class CORE_EXTERN_TEMPLATE_EXPORT LayoutNGMixin<LayoutProgress>; extern template class CORE_EXTERN_TEMPLATE_EXPORT + LayoutNGMixin<LayoutRubyAsBlock>; +extern template class CORE_EXTERN_TEMPLATE_EXPORT LayoutNGMixin<LayoutTableCaption>; extern template class CORE_EXTERN_TEMPLATE_EXPORT LayoutNGMixin<LayoutTableCell>;
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.cc new file mode 100644 index 0000000..3da5af1b --- /dev/null +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.cc
@@ -0,0 +1,18 @@ +// 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 "third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.h" + +namespace blink { + +LayoutNGRubyAsBlock::LayoutNGRubyAsBlock(Element* element) + : LayoutNGBlockFlowMixin<LayoutRubyAsBlock>(element) {} + +LayoutNGRubyAsBlock::~LayoutNGRubyAsBlock() = default; + +void LayoutNGRubyAsBlock::UpdateBlockLayout(bool relayout_children) { + UpdateNGBlockLayout(); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.h b/third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.h new file mode 100644 index 0000000..7dff53b --- /dev/null +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_ruby_as_block.h
@@ -0,0 +1,28 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_LAYOUT_NG_RUBY_AS_BLOCK_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_LAYOUT_NG_RUBY_AS_BLOCK_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/layout_ruby.h" +#include "third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h" + +namespace blink { + +// A NG version of LayoutRubyAsBlock. +// This adds anonymous block building to LayoutNGBlockFlow. +class CORE_EXPORT LayoutNGRubyAsBlock + : public LayoutNGBlockFlowMixin<LayoutRubyAsBlock> { + public: + explicit LayoutNGRubyAsBlock(Element*); + ~LayoutNGRubyAsBlock() override; + + const char* GetName() const override { return "LayoutNGRubyAsBlock"; } + void UpdateBlockLayout(bool relayout_children) override; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_LAYOUT_NG_RUBY_AS_BLOCK_H_
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc index 1e495e2..0c49005 100644 --- a/third_party/blink/renderer/core/loader/document_loader.cc +++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1384,6 +1384,17 @@ ? WebFeature::kSignedExchangeInnerResponseInMainFrame : WebFeature::kSignedExchangeInnerResponseInSubFrame); } + + if (!response_.HttpHeaderField(http_names::kRequireDocumentPolicy).IsNull()) + UseCounter::Count(*document, WebFeature::kRequireDocumentPolicyHeader); + + if (was_blocked_by_document_policy_) + UseCounter::Count(*document, WebFeature::kDocumentPolicyCausedPageUnload); + + // Required document policy can either come from iframe attribute or HTTP + // header 'Require-Document-Policy'. + if (!frame_policy_.required_document_policy.empty()) + UseCounter::Count(*document, WebFeature::kRequiredDocumentPolicy); } void DocumentLoader::WillCommitNavigation() {
diff --git a/third_party/blink/renderer/core/loader/preload_helper.cc b/third_party/blink/renderer/core/loader/preload_helper.cc index 7bd7378..27acc453a 100644 --- a/third_party/blink/renderer/core/loader/preload_helper.cc +++ b/third_party/blink/renderer/core/loader/preload_helper.cc
@@ -581,12 +581,14 @@ continue; LinkLoadParameters params(header, base_url); + bool change_rel_to_prefetch = false; + if (params.rel.IsLinkPreload() && recursive_prefetch_token) { // Only preload headers are expected to have a recursive prefetch token // In response to that token's existence, we treat the request as a // prefetch. params.recursive_prefetch_token = *recursive_prefetch_token; - params.rel = LinkRelAttribute("prefetch"); + change_rel_to_prefetch = true; } if (alternate_resource_info && params.rel.IsLinkPreload()) { @@ -629,9 +631,13 @@ // navigation, but can only populate things in the cache that can be // used by the next navigation only when they requested the same URL // with the same association mapping. - params.rel = LinkRelAttribute("prefetch"); + change_rel_to_prefetch = true; } } + + if (change_rel_to_prefetch) + params.rel = LinkRelAttribute("prefetch"); + // Sanity check to avoid re-entrancy here. if (params.href == base_url) continue;
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc index 236fee1..2dcae67 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -39,7 +39,6 @@ #include "third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h" #include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h" #include "third_party/blink/renderer/core/html/html_iframe_element.h" -#include "third_party/blink/renderer/core/html/html_image_element.h" #include "third_party/blink/renderer/core/html/media/html_media_element.h" #include "third_party/blink/renderer/core/html/media/html_video_element.h" #include "third_party/blink/renderer/core/html_names.h" @@ -48,12 +47,10 @@ #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/layout/layout_embedded_object.h" #include "third_party/blink/renderer/core/layout/layout_html_canvas.h" -#include "third_party/blink/renderer/core/layout/layout_image.h" #include "third_party/blink/renderer/core/layout/layout_inline.h" #include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" #include "third_party/blink/renderer/core/layout/layout_video.h" #include "third_party/blink/renderer/core/layout/layout_view.h" -#include "third_party/blink/renderer/core/loader/resource/image_resource_content.h" #include "third_party/blink/renderer/core/page/chrome_client.h" #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.h" @@ -72,7 +69,6 @@ #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/platform/fonts/font_cache.h" #include "third_party/blink/renderer/platform/geometry/length_functions.h" -#include "third_party/blink/renderer/platform/graphics/bitmap_image.h" #include "third_party/blink/renderer/platform/graphics/compositor_filter_operations.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" #include "third_party/blink/renderer/platform/graphics/paint/cull_rect.h" @@ -403,14 +399,6 @@ UpdateBackgroundColor(); - if (layout_object.IsImage()) { - if (IsDirectlyCompositedImage()) { - UpdateImageContents(); - } else if (graphics_layer_->HasContentsLayer()) { - graphics_layer_->SetContentsToImage(nullptr, Image::kUnspecifiedDecode); - } - } - if (layout_object.IsLayoutEmbeddedContent()) { if (WebPluginContainerImpl* plugin = GetPluginContainer(layout_object)) { graphics_layer_->SetContentsToCcLayer( @@ -1475,9 +1463,6 @@ if (CompositedBounds().IsEmpty()) return false; - if (GetLayoutObject().IsImage() && IsDirectlyCompositedImage()) - return false; - LayoutObject& layout_object = GetLayoutObject(); // FIXME: we could optimize cases where the image, video or canvas is known to // fill the border box entirely, and set background color on the layer in that @@ -1526,43 +1511,7 @@ return PaintsChildren(); } -// An image can be directly composited if it's the sole content of the layer, -// and has no box decorations or clipping that require painting. Direct -// compositing saves a backing store. -bool CompositedLayerMapping::IsDirectlyCompositedImage() const { - DCHECK(GetLayoutObject().IsImage()); - - LayoutImage& image_layout_object = ToLayoutImage(GetLayoutObject()); - - if (owning_layer_.HasBoxDecorationsOrBackground() || - image_layout_object.HasClip() || image_layout_object.HasClipPath() || - image_layout_object.HasObjectFit()) - return false; - - if (ImageResourceContent* cached_image = image_layout_object.CachedImage()) { - if (!cached_image->HasImage()) - return false; - - if (!IsA<BitmapImage>(cached_image->GetImage())) - return false; - - UseCounter::Count(GetLayoutObject().GetDocument(), - WebFeature::kDirectlyCompositedImage); - return true; - } - - return false; -} - void CompositedLayerMapping::ContentChanged(ContentChangeType change_type) { - if ((change_type == kImageChanged) && GetLayoutObject().IsImage() && - IsDirectlyCompositedImage()) { - SetNeedsGraphicsLayerUpdate(kGraphicsLayerUpdateLocal); - Compositor()->SetNeedsCompositingUpdate( - kCompositingUpdateAfterGeometryChange); - return; - } - if (change_type == kCanvasChanged && IsTextureLayerCanvas(GetLayoutObject())) { graphics_layer_->SetContentsNeedsDisplay(); @@ -1570,49 +1519,6 @@ } } -void CompositedLayerMapping::UpdateImageContents() { - DCHECK_EQ(owning_layer_.Compositor()->Lifecycle().GetState(), - DocumentLifecycle::kInCompositingUpdate); - - DCHECK(GetLayoutObject().IsImage()); - LayoutImage& image_layout_object = ToLayoutImage(GetLayoutObject()); - - ImageResourceContent* cached_image = image_layout_object.CachedImage(); - if (!cached_image) - return; - - Image* image = cached_image->GetImage(); - if (!image) - return; - - auto* html_image_element = - DynamicTo<HTMLImageElement>(image_layout_object.GetNode()); - Image::ImageDecodingMode decode_mode = - html_image_element ? html_image_element->GetDecodingModeForPainting( - image->paint_image_id()) - : Image::kUnspecifiedDecode; - - // This is a no-op if the layer doesn't have an inner layer for the image. - graphics_layer_->SetContentsToImage( - image, decode_mode, - LayoutObject::ShouldRespectImageOrientation(&image_layout_object)); - - graphics_layer_->SetFilterQuality( - GetLayoutObject().StyleRef().ImageRendering() == - EImageRendering::kPixelated - ? kNone_SkFilterQuality - : kLow_SkFilterQuality); - - // Prevent double-drawing: https://bugs.webkit.org/show_bug.cgi?id=58632 - UpdateDrawsContentAndPaintsHitTest(); - - // Image animation is "lazy", in that it automatically stops unless someone is - // drawing the image. So we have to kick the animation each time; this has the - // downside that the image will keep animating, even if its layer is not - // visible. - image->StartAnimation(); -} - FloatPoint3D CompositedLayerMapping::ComputeTransformOrigin( const IntRect& border_box) const { const ComputedStyle& style = GetLayoutObject().StyleRef();
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h index bb399d8..5a4ed36f 100644 --- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h +++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.h
@@ -367,10 +367,6 @@ // Returns true if this layer has content that needs to be displayed by // painting into the backing store. bool ContainsPaintedContent() const; - // Returns true if the Layer just contains an image that we can composite - // directly. - bool IsDirectlyCompositedImage() const; - void UpdateImageContents(); Color LayoutObjectBackgroundColor() const; void UpdateBackgroundColor();
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.cc b/third_party/blink/renderer/core/svg/svg_use_element.cc index 8cd5633..ff056f4 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.cc +++ b/third_party/blink/renderer/core/svg/svg_use_element.cc
@@ -133,6 +133,11 @@ } } +void SVGUseElement::DidMoveToNewDocument(Document& old_document) { + SVGGraphicsElement::DidMoveToNewDocument(old_document); + UpdateTargetReference(); +} + static void TransferUseWidthAndHeightIfNeeded( const SVGUseElement& use, SVGElement& shadow_element, @@ -190,7 +195,7 @@ const String& url_string = HrefString(); element_url_ = GetDocument().CompleteURL(url_string); element_url_is_local_ = url_string.StartsWith('#'); - if (!IsStructurallyExternal()) { + if (!IsStructurallyExternal() || !GetDocument().IsActive()) { ClearResource(); return; }
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.h b/third_party/blink/renderer/core/svg/svg_use_element.h index 6d20db0d..233587a 100644 --- a/third_party/blink/renderer/core/svg/svg_use_element.h +++ b/third_party/blink/renderer/core/svg/svg_use_element.h
@@ -78,6 +78,7 @@ InsertionNotificationRequest InsertedInto(ContainerNode&) override; void RemovedFrom(ContainerNode&) override; + void DidMoveToNewDocument(Document&) override; void SvgAttributeChanged(const QualifiedName&) override;
diff --git a/third_party/blink/renderer/core/timing/memory_info.h b/third_party/blink/renderer/core/timing/memory_info.h index 7cc0704a..63cb4024 100644 --- a/third_party/blink/renderer/core/timing/memory_info.h +++ b/third_party/blink/renderer/core/timing/memory_info.h
@@ -62,9 +62,9 @@ explicit MemoryInfo(Precision precision); - size_t totalJSHeapSize() const { return info_.total_js_heap_size; } - size_t usedJSHeapSize() const { return info_.used_js_heap_size; } - size_t jsHeapSizeLimit() const { return info_.js_heap_size_limit; } + uint64_t totalJSHeapSize() const { return info_.total_js_heap_size; } + uint64_t usedJSHeapSize() const { return info_.used_js_heap_size; } + uint64_t jsHeapSizeLimit() const { return info_.js_heap_size_limit; } private: FRIEND_TEST_ALL_PREFIXES(MemoryInfoTest, Bucketized);
diff --git a/third_party/blink/renderer/modules/nfc/ndef_reader.cc b/third_party/blink/renderer/modules/nfc/ndef_reader.cc index 013b5e0..d2812e76 100644 --- a/third_party/blink/renderer/modules/nfc/ndef_reader.cc +++ b/third_party/blink/renderer/modules/nfc/ndef_reader.cc
@@ -92,24 +92,21 @@ return ScriptPromise(); } - // TODO(https://crbug.com/520391): With the note in + // With the note in // https://w3c.github.io/web-nfc/#the-ndefreader-and-ndefwriter-objects, // successive invocations of NDEFReader.scan() with new options should replace - // existing filters. For now we just reject this new scan() when there is an - // ongoing filter active. + // existing filters. So stop current reading for this case. if (GetNfcProxy()->IsReading(this)) { - exception_state.ThrowDOMException( - DOMExceptionCode::kInvalidStateError, - "There is already a scan() operation ongoing."); - return ScriptPromise(); + Abort(signal_.Get()); } resolver_ = MakeGarbageCollected<ScriptPromiseResolver>(script_state); // 8. If reader.[[Signal]] is not null, then add the following abort steps to // reader.[[Signal]]: if (options->hasSignal()) { - options->signal()->AddAlgorithm( - WTF::Bind(&NDEFReader::Abort, WrapPersistent(this))); + signal_ = options->signal(); + signal_->AddAlgorithm(WTF::Bind(&NDEFReader::Abort, WrapPersistent(this), + WrapPersistent(options->signal()))); } GetPermissionService()->RequestPermission( @@ -173,6 +170,7 @@ void NDEFReader::Trace(Visitor* visitor) { visitor->Trace(resolver_); + visitor->Trace(signal_); EventTargetWithInlineData::Trace(visitor); ActiveScriptWrappable::Trace(visitor); ExecutionContextLifecycleObserver::Trace(visitor); @@ -216,7 +214,14 @@ GetNfcProxy()->StopReading(this); } -void NDEFReader::Abort() { +void NDEFReader::Abort(AbortSignal* signal) { + // In the case of successive invocations of NDEFReader.scan() with + // different signals, we should make sure aborting on previous signal + // won't abort current reading. + // If this is not triggered by the current signal, just ignore it. + if (signal && signal != signal_) + return; + if (resolver_) { resolver_->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kAbortError, "The NFC operation was cancelled."));
diff --git a/third_party/blink/renderer/modules/nfc/ndef_reader.h b/third_party/blink/renderer/modules/nfc/ndef_reader.h index f485439..53e053e 100644 --- a/third_party/blink/renderer/modules/nfc/ndef_reader.h +++ b/third_party/blink/renderer/modules/nfc/ndef_reader.h
@@ -17,6 +17,7 @@ namespace blink { +class AbortSignal; class ExecutionContext; class NFCProxy; class NDEFScanOptions; @@ -59,7 +60,7 @@ // ExecutionContextLifecycleObserver overrides. void ContextDestroyed() override; - void Abort(); + void Abort(AbortSignal* signal); NFCProxy* GetNfcProxy() const; @@ -75,6 +76,11 @@ // case the callback passed to Watch() won't be called and // mojo::WrapCallbackWithDefaultInvokeIfNotRun() is forbidden in Blink. Member<ScriptPromiseResolver> resolver_; + + // Currently AbortSignal has no method to remove an algorithm so this + // field tracks the most recently configured AbortSignal so that others + // can be ignored. + Member<AbortSignal> signal_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/nfc/ndef_writer.cc b/third_party/blink/renderer/modules/nfc/ndef_writer.cc index 5c3503e..e248c3a 100644 --- a/third_party/blink/renderer/modules/nfc/ndef_writer.cc +++ b/third_party/blink/renderer/modules/nfc/ndef_writer.cc
@@ -39,11 +39,12 @@ } NDEFWriter::NDEFWriter(ExecutionContext* context) - : ExecutionContextClient(context) {} + : ExecutionContextClient(context), permission_service_(context) {} void NDEFWriter::Trace(Visitor* visitor) { - visitor->Trace(nfc_proxy_); + visitor->Trace(permission_service_); visitor->Trace(requests_); + visitor->Trace(nfc_proxy_); ScriptWrappable::Trace(visitor); ExecutionContextClient::Trace(visitor); } @@ -98,10 +99,11 @@ } PermissionService* NDEFWriter::GetPermissionService() { - if (!permission_service_) { + if (!permission_service_.is_bound()) { ConnectToPermissionService( GetExecutionContext(), - permission_service_.BindNewPipeAndPassReceiver()); + permission_service_.BindNewPipeAndPassReceiver( + GetExecutionContext()->GetTaskRunner(TaskType::kMiscPlatformAPI))); } return permission_service_.get(); }
diff --git a/third_party/blink/renderer/modules/nfc/ndef_writer.h b/third_party/blink/renderer/modules/nfc/ndef_writer.h index b53fefc..89f12a7 100644 --- a/third_party/blink/renderer/modules/nfc/ndef_writer.h +++ b/third_party/blink/renderer/modules/nfc/ndef_writer.h
@@ -5,13 +5,14 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_NFC_NDEF_WRITER_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_NFC_NDEF_WRITER_H_ -#include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" #include "third_party/blink/renderer/modules/nfc/nfc_proxy.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/heap_allocator.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h" namespace blink { @@ -57,7 +58,9 @@ mojom::blink::PermissionStatus status); mojom::blink::PermissionService* GetPermissionService(); - mojo::Remote<mojom::blink::PermissionService> permission_service_; + HeapMojoRemote<mojom::blink::PermissionService, + HeapMojoWrapperMode::kWithoutContextObserver> + permission_service_; // |requests_| are kept here to handle Mojo connection failures because // in that case the callback passed to Push() won't be called and
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc index 1ffe37f..d8325ae 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_stream_unittest.cc
@@ -32,13 +32,13 @@ // us to isolate testing the behaviors of reading a writing. class P2PQuicStreamTest : public testing::Test { public: - P2PQuicStreamTest() - : connection_( - new quic::test::MockQuicConnection(&connection_helper_, - &alarm_factory_, - quic::Perspective::IS_CLIENT)), - session_(connection_) { - session_.Initialize(); + P2PQuicStreamTest() { + // TODO(crbug/1070747): Fix tests for IETF QUIC. + quic::test::DisableQuicVersionsWithTls(); + connection_ = new quic::test::MockQuicConnection( + &connection_helper_, &alarm_factory_, quic::Perspective::IS_CLIENT); + session_ = std::make_unique<quic::test::MockQuicSession>(connection_); + session_->Initialize(); // DCHECKS get hit when the clock is at 0. connection_helper_.AdvanceTime(quic::QuicTime::Delta::FromSeconds(1)); } @@ -48,11 +48,12 @@ void InitializeStream( uint32_t delegate_read_buffer_size = kDefaultStreamDelegateReadBufferSize, uint32_t write_buffer_size = kDefaultStreamWriteBufferSize) { - stream_ = new P2PQuicStreamImpl( - kStreamId, &session_, delegate_read_buffer_size, write_buffer_size); + stream_ = + new P2PQuicStreamImpl(kStreamId, session_.get(), + delegate_read_buffer_size, write_buffer_size); stream_->SetDelegate(&delegate_); // The session takes the ownership of the stream. - session_.ActivateStream(std::unique_ptr<P2PQuicStreamImpl>(stream_)); + session_->ActivateStream(std::unique_ptr<P2PQuicStreamImpl>(stream_)); } template <wtf_size_t Size> @@ -75,7 +76,7 @@ quic::test::MockQuicConnection* connection_; // The MockQuicSession allows us to see data that is being written and control // whether the data is being "sent across" or blocked. - quic::test::MockQuicSession session_; + std::unique_ptr<quic::test::MockQuicSession> session_; MockP2PQuicStreamDelegate delegate_; // Owned by |session_|. P2PQuicStreamImpl* stream_; @@ -83,13 +84,13 @@ TEST_F(P2PQuicStreamTest, StreamSendsFinAndCanNoLongerWrite) { InitializeStream(); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, 0u, 0u, quic::StreamSendingState::FIN, quic::NOT_RETRANSMISSION, _)) .WillOnce(InvokeWithoutArgs([this]() { - return session_.ConsumeData(stream_->id(), 0u, 0u, - quic::StreamSendingState::FIN, - quic::NOT_RETRANSMISSION, QuicheNullOpt); + return session_->ConsumeData(stream_->id(), 0u, 0u, + quic::StreamSendingState::FIN, + quic::NOT_RETRANSMISSION, QuicheNullOpt); })); stream_->WriteData({}, /*fin=*/true); @@ -101,7 +102,7 @@ TEST_F(P2PQuicStreamTest, StreamResetSendsRst) { InitializeStream(); - EXPECT_CALL(session_, SendRstStream(kStreamId, _, _)); + EXPECT_CALL(*session_, SendRstStream(kStreamId, _, _)); stream_->Reset(); EXPECT_TRUE(stream_->rst_sent()); } @@ -123,12 +124,12 @@ // it has written the FIN bit, then the stream will close. TEST_F(P2PQuicStreamTest, StreamClosedAfterSendingThenReceivingFin) { InitializeStream(); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, 0u, 0u, _, quic::NOT_RETRANSMISSION, _)) .WillOnce(InvokeWithoutArgs([this]() { - return session_.ConsumeData(stream_->id(), 0u, 0u, - quic::StreamSendingState::FIN, - quic::NOT_RETRANSMISSION, QuicheNullOpt); + return session_->ConsumeData(stream_->id(), 0u, 0u, + quic::StreamSendingState::FIN, + quic::NOT_RETRANSMISSION, QuicheNullOpt); })); stream_->WriteData({}, /*fin=*/true); @@ -150,13 +151,13 @@ stream_->OnStreamFrame(fin_frame); EXPECT_FALSE(stream_->IsClosedForTesting()); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, 0u, 0u, quic::StreamSendingState::FIN, quic::NOT_RETRANSMISSION, _)) .WillOnce(InvokeWithoutArgs([this]() { - return session_.ConsumeData(stream_->id(), 0u, 0u, - quic::StreamSendingState::FIN, - quic::NOT_RETRANSMISSION, QuicheNullOpt); + return session_->ConsumeData(stream_->id(), 0u, 0u, + quic::StreamSendingState::FIN, + quic::NOT_RETRANSMISSION, QuicheNullOpt); })); stream_->WriteData({}, /*fin=*/true); @@ -168,7 +169,7 @@ // data with the FIN bit set it will become closed. TEST_F(P2PQuicStreamTest, StreamClosedAfterWritingAndReceivingDataWithFin) { InitializeStream(); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, /*write_length=*/base::size(kSomeData), _, _, _, _)) .WillOnce(Invoke( @@ -214,7 +215,7 @@ if (!VersionHasIetfQuicFrames(connection_->version().transport_version)) { // Google RST_STREAM closes the stream in both directions. A RST_STREAM // is then sent to the peer to communicate the final byte offset. - EXPECT_CALL(session_, + EXPECT_CALL(*session_, SendRstStream(kStreamId, quic::QUIC_RST_ACKNOWLEDGEMENT, 0)); } stream_->OnStreamReset(rst_frame); @@ -226,7 +227,7 @@ EXPECT_CALL(*connection_, OnStreamReset(kStreamId, testing::_)); quic::QuicStopSendingFrame stop_sending_frame(quic::kInvalidControlFrameId, kStreamId, 0); - session_.OnStopSendingFrame(stop_sending_frame); + session_->OnStopSendingFrame(stop_sending_frame); } EXPECT_TRUE(stream_->IsClosedForTesting()); @@ -236,7 +237,7 @@ // to the underlying QUIC library. TEST_F(P2PQuicStreamTest, StreamWritesData) { InitializeStream(); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, /*write_length=*/base::size(kSomeData), _, _, _, _)) .WillOnce(Invoke( @@ -266,7 +267,7 @@ // to the underlying QUIC library with the FIN bit set. TEST_F(P2PQuicStreamTest, StreamWritesDataWithFin) { InitializeStream(); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, /*write_length=*/base::size(kSomeData), _, _, _, _)) .WillOnce(Invoke( @@ -297,7 +298,7 @@ TEST_F(P2PQuicStreamTest, StreamWritesDataAndNotConsumedByQuic) { InitializeStream(); EXPECT_CALL(delegate_, OnWriteDataConsumed(_)).Times(0); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, /*write_length=*/base::size(kSomeData), _, _, _, _)) .WillOnce(Invoke([](quic::QuicStreamId id, size_t write_length, @@ -324,7 +325,7 @@ InitializeStream(); size_t amount_consumed_by_quic = 2; EXPECT_CALL(delegate_, OnWriteDataConsumed(amount_consumed_by_quic)); - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, /*write_length=*/base::size(kSomeData), _, _, _, _)) .WillOnce(Invoke( @@ -508,7 +509,7 @@ stream_->SetDelegate(nullptr); // Mock out the QuicSession to get the QuicStream::OnStreamDataConsumed // callback to fire. - EXPECT_CALL(session_, + EXPECT_CALL(*session_, WritevData(kStreamId, /*write_length=*/base::size(kSomeData), _, _, _, _)) .WillOnce(Invoke([](quic::QuicStreamId id, size_t write_length,
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc index 18d85df7..d3c007fe1 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/p2p_quic_transport_test.cc
@@ -550,6 +550,8 @@ class P2PQuicTransportTest : public testing::Test { public: P2PQuicTransportTest() { + // TODO(crbug/1070747): Fix tests for IETF QUIC. + quic::test::DisableQuicVersionsWithTls(); // Quic crashes if packets are sent at time 0, and the clock defaults to 0. clock_.AdvanceTime(quic::QuicTime::Delta::FromMilliseconds(1000)); quic_random_ = quic::QuicRandom::GetInstance();
diff --git a/third_party/blink/renderer/modules/permissions/camera_device_permission_descriptor.idl b/third_party/blink/renderer/modules/permissions/camera_device_permission_descriptor.idl new file mode 100644 index 0000000..5885ac5 --- /dev/null +++ b/third_party/blink/renderer/modules/permissions/camera_device_permission_descriptor.idl
@@ -0,0 +1,9 @@ +// 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. + +// TODO: Inherit from DevicePermissionDescriptor. +dictionary CameraDevicePermissionDescriptor : PermissionDescriptor { + // https://w3c.github.io/permissions/#dom-cameradevicepermissiondescriptor-pantiltzoom + boolean panTiltZoom = false; +}; \ No newline at end of file
diff --git a/third_party/blink/renderer/modules/permissions/idls.gni b/third_party/blink/renderer/modules/permissions/idls.gni index 4033d8b3..7512276 100644 --- a/third_party/blink/renderer/modules/permissions/idls.gni +++ b/third_party/blink/renderer/modules/permissions/idls.gni
@@ -12,6 +12,7 @@ "midi_permission_descriptor.idl", "permission_descriptor.idl", "push_permission_descriptor.idl", + "camera_device_permission_descriptor.idl", ] modules_dependency_idl_files = [
diff --git a/third_party/blink/renderer/modules/permissions/permission_utils.cc b/third_party/blink/renderer/modules/permissions/permission_utils.cc index ba15806..1412dbf 100644 --- a/third_party/blink/renderer/modules/permissions/permission_utils.cc +++ b/third_party/blink/renderer/modules/permissions/permission_utils.cc
@@ -6,10 +6,12 @@ #include <utility> +#include "build/build_config.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" #include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h" #include "third_party/blink/renderer/bindings/core/v8/script_value.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_camera_device_permission_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_clipboard_permission_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_midi_permission_descriptor.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_permission_descriptor.h" @@ -79,6 +81,17 @@ return descriptor; } +PermissionDescriptorPtr CreateVideoCapturePermissionDescriptor( + bool pan_tilt_zoom) { + auto descriptor = + CreatePermissionDescriptor(mojom::blink::PermissionName::VIDEO_CAPTURE); + auto camera_device_extension = + mojom::blink::CameraDevicePermissionDescriptor::New(pan_tilt_zoom); + descriptor->extension = mojom::blink::PermissionDescriptorExtension::New(); + descriptor->extension->set_camera_device(std::move(camera_device_extension)); + return descriptor; +} + PermissionDescriptorPtr ParsePermissionDescriptor( ScriptState* script_state, const ScriptValue& raw_descriptor, @@ -94,8 +107,22 @@ const String& name = permission->name(); if (name == "geolocation") return CreatePermissionDescriptor(PermissionName::GEOLOCATION); - if (name == "camera") - return CreatePermissionDescriptor(PermissionName::VIDEO_CAPTURE); + if (name == "camera") { +#if !defined(OS_ANDROID) + CameraDevicePermissionDescriptor* camera_device_permission = + NativeValueTraits<CameraDevicePermissionDescriptor>::NativeValue( + script_state->GetIsolate(), raw_descriptor.V8Value(), + exception_state); + if (exception_state.HadException()) + return nullptr; + + if (RuntimeEnabledFeatures::MediaCapturePanTiltEnabled()) { + return CreateVideoCapturePermissionDescriptor( + camera_device_permission->panTiltZoom()); + } +#endif + return CreateVideoCapturePermissionDescriptor(false /* pan_tilt_zoom */); + } if (name == "microphone") return CreatePermissionDescriptor(PermissionName::AUDIO_CAPTURE); if (name == "notifications")
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc index 765532a..bc71fc3 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.cc +++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -306,6 +306,7 @@ client_receiver, device::mojom::blink::XRSessionMode mode, EnvironmentBlendMode environment_blend_mode, + InteractionMode interaction_mode, bool uses_input_eventing, bool sensorless_session, XRSessionFeatureSet enabled_features) @@ -341,6 +342,15 @@ NOTREACHED() << "Unknown environment blend mode: " << environment_blend_mode; } + + switch (interaction_mode) { + case kInteractionModeScreen: + interaction_mode_string_ = "screen-space"; + break; + case kInteractionModeWorld: + interaction_mode_string_ = "world-space"; + break; + } } void XRSession::SetDOMOverlayElement(Element* element) {
diff --git a/third_party/blink/renderer/modules/xr/xr_session.h b/third_party/blink/renderer/modules/xr/xr_session.h index 384aa39..e468b5cd 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.h +++ b/third_party/blink/renderer/modules/xr/xr_session.h
@@ -80,6 +80,8 @@ kBlendModeAlphaBlend }; + enum InteractionMode { kInteractionModeScreen = 0, kInteractionModeWorld }; + struct MetricsReporter { explicit MetricsReporter( mojo::Remote<device::mojom::blink::XRSessionMetricsRecorder> recorder); @@ -101,6 +103,7 @@ client_receiver, device::mojom::blink::XRSessionMode mode, EnvironmentBlendMode environment_blend_mode, + InteractionMode interaction_mode, bool uses_input_eventing, bool sensorless_session, XRSessionFeatureSet enabled_features); @@ -108,6 +111,7 @@ XRSystem* xr() const { return xr_; } const String& environmentBlendMode() const { return blend_mode_string_; } + const String& interactionMode() const { return interaction_mode_string_; } XRDOMOverlayState* domOverlayState() const { return dom_overlay_state_; } const String visibilityState() const; XRRenderState* renderState() const { return render_state_; } @@ -371,6 +375,7 @@ const device::mojom::blink::XRSessionMode mode_; const bool environment_integration_; String blend_mode_string_; + String interaction_mode_string_; XRVisibilityState device_visibility_state_ = XRVisibilityState::VISIBLE; XRVisibilityState visibility_state_ = XRVisibilityState::VISIBLE; String visibility_state_string_;
diff --git a/third_party/blink/renderer/modules/xr/xr_session.idl b/third_party/blink/renderer/modules/xr/xr_session.idl index 18192fb..64f64f4 100644 --- a/third_party/blink/renderer/modules/xr/xr_session.idl +++ b/third_party/blink/renderer/modules/xr/xr_session.idl
@@ -22,6 +22,11 @@ "hidden", }; +enum XRInteractionMode { + "screen-space", + "world-space" +}; + [ ActiveScriptWrappable, SecureContext, @@ -29,6 +34,7 @@ RuntimeEnabled=WebXR ] interface XRSession : EventTarget { [RuntimeEnabled=WebXRARModule] readonly attribute XREnvironmentBlendMode environmentBlendMode; + [RuntimeEnabled=WebXRARModule] readonly attribute XRInteractionMode interactionMode; readonly attribute XRVisibilityState visibilityState; [SameObject] readonly attribute XRRenderState renderState; [MeasureAs=XRSessionGetInputSources, SameObject] readonly attribute XRInputSourceArray inputSources;
diff --git a/third_party/blink/renderer/modules/xr/xr_system.cc b/third_party/blink/renderer/modules/xr/xr_system.cc index d7f3ea06..41d9550 100644 --- a/third_party/blink/renderer/modules/xr/xr_system.cc +++ b/third_party/blink/renderer/modules/xr/xr_system.cc
@@ -1250,15 +1250,25 @@ if (environment_integration) blend_mode = XRSession::kBlendModeAlphaBlend; + // TODO(https://crbug.com/1069350): The runtime should be the one to + // communicate the interaction mode, but for the moment we're going to use + // session mode and assume all AR is phone AR. + XRSession::InteractionMode interaction_mode = + XRSession::kInteractionModeWorld; + if (query->mode() == device::mojom::blink::XRSessionMode::kInline || + query->mode() == device::mojom::blink::XRSessionMode::kImmersiveAr) + interaction_mode = XRSession::kInteractionModeScreen; + XRSessionFeatureSet enabled_features; for (const auto& feature : session_ptr->enabled_features) { enabled_features.insert(feature); } - XRSession* session = CreateSession( - query->mode(), blend_mode, std::move(session_ptr->client_receiver), - std::move(session_ptr->display_info), session_ptr->uses_input_eventing, - enabled_features); + XRSession* session = + CreateSession(query->mode(), blend_mode, interaction_mode, + std::move(session_ptr->client_receiver), + std::move(session_ptr->display_info), + session_ptr->uses_input_eventing, enabled_features); frameProvider()->OnSessionStarted(session, std::move(session_ptr)); @@ -1354,6 +1364,7 @@ XRSession* XRSystem::CreateSession( device::mojom::blink::XRSessionMode mode, XRSession::EnvironmentBlendMode blend_mode, + XRSession::InteractionMode interaction_mode, mojo::PendingReceiver<device::mojom::blink::XRSessionClient> client_receiver, device::mojom::blink::VRDisplayInfoPtr display_info, @@ -1361,8 +1372,8 @@ XRSessionFeatureSet enabled_features, bool sensorless_session) { XRSession* session = MakeGarbageCollected<XRSession>( - this, std::move(client_receiver), mode, blend_mode, uses_input_eventing, - sensorless_session, std::move(enabled_features)); + this, std::move(client_receiver), mode, blend_mode, interaction_mode, + uses_input_eventing, sensorless_session, std::move(enabled_features)); if (display_info) session->SetXRDisplayInfo(std::move(display_info)); sessions_.insert(session); @@ -1372,12 +1383,14 @@ XRSession* XRSystem::CreateSensorlessInlineSession() { // TODO(https://crbug.com/944936): The blend mode could be "additive". XRSession::EnvironmentBlendMode blend_mode = XRSession::kBlendModeOpaque; - return CreateSession(device::mojom::blink::XRSessionMode::kInline, blend_mode, - mojo::NullReceiver() /* client receiver */, - nullptr /* display_info */, - false /* uses_input_eventing */, - {device::mojom::XRSessionFeature::REF_SPACE_VIEWER}, - true /* sensorless_session */); + XRSession::InteractionMode interaction_mode = + XRSession::kInteractionModeScreen; + return CreateSession( + device::mojom::blink::XRSessionMode::kInline, blend_mode, + interaction_mode, mojo::NullReceiver() /* client receiver */, + nullptr /* display_info */, false /* uses_input_eventing */, + {device::mojom::XRSessionFeature::REF_SPACE_VIEWER}, + true /* sensorless_session */); } void XRSystem::Dispose(DisposeType dispose_type) {
diff --git a/third_party/blink/renderer/modules/xr/xr_system.h b/third_party/blink/renderer/modules/xr/xr_system.h index 4a1258d..ec98911 100644 --- a/third_party/blink/renderer/modules/xr/xr_system.h +++ b/third_party/blink/renderer/modules/xr/xr_system.h
@@ -379,6 +379,7 @@ XRSession* CreateSession( device::mojom::blink::XRSessionMode mode, XRSession::EnvironmentBlendMode blend_mode, + XRSession::InteractionMode interaction_mode, mojo::PendingReceiver<device::mojom::blink::XRSessionClient> client_receiver, device::mojom::blink::VRDisplayInfoPtr display_info,
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 955103d..2ef890ec 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -2258,7 +2258,6 @@ "graphics/graphics_layer_test.cc", "graphics/image_decoding_store_test.cc", "graphics/image_frame_generator_test.cc", - "graphics/image_layer_chromium_test.cc", "graphics/paint_worklet_paint_dispatcher_test.cc", "graphics/test/fake_canvas_resource_host.h", "graphics/test/fake_gles2_interface.h",
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc index 389b099..c01f2e1 100644 --- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc +++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -307,10 +307,6 @@ RuntimeEnabledFeatures::SetPassiveDocumentEventListenersEnabled(enable); } -void WebRuntimeFeatures::EnablePassiveDocumentWheelEventListeners(bool enable) { - RuntimeEnabledFeatures::SetPassiveDocumentWheelEventListenersEnabled(enable); -} - void WebRuntimeFeatures::EnablePaymentApp(bool enable) { RuntimeEnabledFeatures::SetPaymentAppEnabled(enable); }
diff --git a/third_party/blink/renderer/platform/fonts/font.cc b/third_party/blink/renderer/platform/fonts/font.cc index 7a94148..70d0b70 100644 --- a/third_party/blink/renderer/platform/fonts/font.cc +++ b/third_party/blink/renderer/platform/fonts/font.cc
@@ -65,6 +65,20 @@ return *this; } +namespace { + +bool FontFallbackListVersionEqual(const FontFallbackList* first, + const FontFallbackList* second) { + if (RuntimeEnabledFeatures::CSSReducedFontLoadingInvalidationsEnabled()) + return true; + return (first ? first->FontSelectorVersion() : 0) == + (second ? second->FontSelectorVersion() : 0) && + (first ? first->Generation() : 0) == + (second ? second->Generation() : 0); +} + +} // namespace + bool Font::operator==(const Font& other) const { FontSelector* first = font_fallback_list_ ? font_fallback_list_->GetFontSelector() : nullptr; @@ -73,15 +87,8 @@ : nullptr; return first == second && font_description_ == other.font_description_ && - (font_fallback_list_ - ? font_fallback_list_->FontSelectorVersion() - : 0) == (other.font_fallback_list_ - ? other.font_fallback_list_->FontSelectorVersion() - : 0) && - (font_fallback_list_ ? font_fallback_list_->Generation() : 0) == - (other.font_fallback_list_ - ? other.font_fallback_list_->Generation() - : 0); + FontFallbackListVersionEqual(font_fallback_list_.get(), + other.font_fallback_list_.get()); } namespace {
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.cc b/third_party/blink/renderer/platform/graphics/graphics_layer.cc index 365eb7c..3be2155a 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.cc +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.cc
@@ -33,7 +33,6 @@ #include "base/memory/ptr_util.h" #include "base/trace_event/traced_value.h" #include "cc/layers/layer.h" -#include "cc/layers/picture_image_layer.h" #include "cc/layers/picture_layer.h" #include "cc/paint/display_item_list.h" #include "third_party/blink/public/platform/platform.h" @@ -43,7 +42,6 @@ #include "third_party/blink/renderer/platform/geometry/geometry_as_json.h" #include "third_party/blink/renderer/platform/geometry/layout_rect.h" #include "third_party/blink/renderer/platform/geometry/region.h" -#include "third_party/blink/renderer/platform/graphics/bitmap_image.h" #include "third_party/blink/renderer/platform/graphics/compositing/paint_chunks_to_cc_layer.h" #include "third_party/blink/renderer/platform/graphics/compositor_filter_operations.h" #include "third_party/blink/renderer/platform/graphics/graphics_context.h" @@ -74,7 +72,6 @@ contents_visible_(true), hit_testable_(false), needs_check_raster_invalidation_(false), - contents_layer_is_picture_image_layer_(false), painted_(false), painting_phase_(kGraphicsLayerPaintAllWithOverflowClip), parent_(nullptr), @@ -422,10 +419,6 @@ return; IntSize contents_size = contents_rect_.Size(); - if (contents_layer_is_picture_image_layer_) { - if (!contents_size.IsEmpty() && !image_size_.IsEmpty()) - contents_size = image_size_; - } contents_layer_->SetBounds(gfx::Size(contents_size)); } @@ -434,7 +427,6 @@ bool prevent_contents_opaque_changes) { DCHECK_NE(contents_layer, layer_); SetContentsTo(std::move(contents_layer), prevent_contents_opaque_changes); - contents_layer_is_picture_image_layer_ = false; } void GraphicsLayer::SetContentsTo(scoped_refptr<cc::Layer> layer, @@ -629,70 +621,10 @@ client_.GraphicsLayersDidChange(); } -void GraphicsLayer::SetContentsToImage( - Image* image, - Image::ImageDecodingMode decode_mode, - RespectImageOrientationEnum respect_image_orientation) { - PaintImage paint_image; - if (image) - paint_image = image->PaintImageForCurrentFrame(); - - ImageOrientation image_orientation = kOriginTopLeft; - SkMatrix matrix; - auto* bitmap_image = DynamicTo<BitmapImage>(image); - if (paint_image && bitmap_image && - respect_image_orientation == kRespectImageOrientation) { - image_orientation = bitmap_image->CurrentFrameOrientation(); - image_size_ = IntSize(paint_image.width(), paint_image.height()); - if (image_orientation.UsesWidthAsHeight()) - image_size_ = image_size_.TransposedSize(); - auto affine = - image_orientation.TransformFromDefault(FloatSize(image_size_)); - auto transform = affine.ToTransformationMatrix(); - matrix = SkMatrix(TransformationMatrix::ToSkMatrix44(transform)); - } else if (paint_image) { - matrix = SkMatrix::I(); - image_size_ = IntSize(paint_image.width(), paint_image.height()); - } else { - matrix = SkMatrix::I(); - image_size_ = IntSize(); - } - - scoped_refptr<cc::PictureImageLayer> image_layer; - if (paint_image) { - paint_image = - PaintImageBuilder::WithCopy(std::move(paint_image)) - .set_decoding_mode(Image::ToPaintImageDecodingMode(decode_mode)) - .TakePaintImage(); - if (!contents_layer_is_picture_image_layer_) { - image_layer = cc::PictureImageLayer::Create(); - contents_layer_is_picture_image_layer_ = true; - } else { - image_layer = static_cast<cc::PictureImageLayer*>(contents_layer_.get()); - } - image_layer->SetImage(std::move(paint_image), matrix, - image_orientation.UsesWidthAsHeight()); - // Image layers can not be marked as opaque due to crbug.com/870857. - image_layer->SetContentsOpaque(false); - } else { - contents_layer_is_picture_image_layer_ = false; - } - - SetContentsTo(std::move(image_layer), - /* prevent_contents_opaque_changes=*/true); -} - cc::PictureLayer* GraphicsLayer::CcLayer() const { return layer_.get(); } -void GraphicsLayer::SetFilterQuality(SkFilterQuality filter_quality) { - if (contents_layer_is_picture_image_layer_) { - static_cast<cc::PictureImageLayer*>(contents_layer_.get()) - ->SetNearestNeighbor(filter_quality == kNone_SkFilterQuality); - } -} - void GraphicsLayer::SetPaintingPhase(GraphicsLayerPaintingPhase phase) { if (painting_phase_ == phase) return;
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer.h b/third_party/blink/renderer/platform/graphics/graphics_layer.h index 973734d..47601313 100644 --- a/third_party/blink/renderer/platform/graphics/graphics_layer.h +++ b/third_party/blink/renderer/platform/graphics/graphics_layer.h
@@ -63,7 +63,6 @@ namespace blink { -class Image; class PaintController; class RasterInvalidationTracking; class RasterInvalidator; @@ -168,11 +167,6 @@ // Set that the position/size of the contents (image or video). void SetContentsRect(const IntRect&); - // Layer contents - void SetContentsToImage( - Image*, - Image::ImageDecodingMode decode_mode, - RespectImageOrientationEnum = kRespectImageOrientation); // If |prevent_contents_opaque_changes| is set to true, then calls to // SetContentsOpaque() will not be passed on to |contents_layer|. Use when // the client wants to have control of the opaqueness of |contents_layer| @@ -297,7 +291,6 @@ bool contents_visible_ : 1; bool hit_testable_ : 1; bool needs_check_raster_invalidation_ : 1; - bool contents_layer_is_picture_image_layer_ : 1; bool painted_ : 1;
diff --git a/third_party/blink/renderer/platform/graphics/image_layer_chromium_test.cc b/third_party/blink/renderer/platform/graphics/image_layer_chromium_test.cc deleted file mode 100644 index bd11e25..0000000 --- a/third_party/blink/renderer/platform/graphics/image_layer_chromium_test.cc +++ /dev/null
@@ -1,143 +0,0 @@ -/* - * Copyright (C) 2011 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - */ - -#include "third_party/blink/renderer/platform/graphics/image.h" - -#include <memory> - -#include "cc/layers/picture_layer.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/renderer/platform/graphics/graphics_layer.h" -#include "third_party/blink/renderer/platform/testing/fake_graphics_layer.h" -#include "third_party/blink/renderer/platform/testing/fake_graphics_layer_client.h" -#include "third_party/skia/include/core/SkImage.h" -#include "third_party/skia/include/core/SkSurface.h" - -namespace blink { - -namespace { - -class TestImage : public Image { - public: - static scoped_refptr<TestImage> Create(const IntSize& size, bool opaque) { - return base::AdoptRef(new TestImage(size, opaque)); - } - - bool CurrentFrameKnownToBeOpaque() override { return image_->isOpaque(); } - - IntSize Size() const override { return size_; } - - void DestroyDecodedData() override { - // Image pure virtual stub. - } - - void Draw(cc::PaintCanvas*, - const PaintFlags&, - const FloatRect&, - const FloatRect&, - RespectImageOrientationEnum, - ImageClampingMode, - ImageDecodingMode) override { - // Image pure virtual stub. - } - - PaintImage PaintImageForCurrentFrame() override { - return CreatePaintImageBuilder() - .set_image(image_, PaintImage::GetNextContentId()) - .TakePaintImage(); - } - - private: - TestImage(IntSize size, bool opaque) : Image(nullptr), size_(size) { - sk_sp<SkSurface> surface = CreateSkSurface(size, opaque); - if (!surface) - return; - - surface->getCanvas()->clear(SK_ColorTRANSPARENT); - image_ = surface->makeImageSnapshot(); - } - - static sk_sp<SkSurface> CreateSkSurface(IntSize size, bool opaque) { - return SkSurface::MakeRaster(SkImageInfo::MakeN32( - size.Width(), size.Height(), - opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType)); - } - - IntSize size_; - sk_sp<SkImage> image_; -}; - -} // anonymous namespace - -TEST(ImageLayerChromiumTest, imageLayerContentReset) { - FakeGraphicsLayerClient client; - std::unique_ptr<FakeGraphicsLayer> graphics_layer = - std::make_unique<FakeGraphicsLayer>(client); - ASSERT_TRUE(graphics_layer.get()); - - ASSERT_FALSE(graphics_layer->HasContentsLayer()); - ASSERT_FALSE(graphics_layer->ContentsLayer()); - - bool opaque = false; - scoped_refptr<Image> image = TestImage::Create(IntSize(100, 100), opaque); - ASSERT_TRUE(image.get()); - - graphics_layer->SetContentsToImage(image.get(), Image::kUnspecifiedDecode); - ASSERT_TRUE(graphics_layer->HasContentsLayer()); - ASSERT_TRUE(graphics_layer->ContentsLayer()); - - graphics_layer->SetContentsToImage(nullptr, Image::kUnspecifiedDecode); - ASSERT_FALSE(graphics_layer->HasContentsLayer()); - ASSERT_FALSE(graphics_layer->ContentsLayer()); -} - -TEST(ImageLayerChromiumTest, opaqueImages) { - FakeGraphicsLayerClient client; - std::unique_ptr<FakeGraphicsLayer> graphics_layer = - std::make_unique<FakeGraphicsLayer>(client); - ASSERT_TRUE(graphics_layer.get()); - - bool opaque = true; - scoped_refptr<Image> opaque_image = - TestImage::Create(IntSize(100, 100), opaque); - ASSERT_TRUE(opaque_image.get()); - scoped_refptr<Image> non_opaque_image = - TestImage::Create(IntSize(100, 100), !opaque); - ASSERT_TRUE(non_opaque_image.get()); - - ASSERT_FALSE(graphics_layer->ContentsLayer()); - - graphics_layer->SetContentsToImage(opaque_image.get(), - Image::kUnspecifiedDecode); - // This would normally have contents_opaque set but due to crbug.com/870857, - // we cannot set image layers as having contents_opaque. - ASSERT_FALSE(graphics_layer->ContentsLayer()->contents_opaque()); - - graphics_layer->SetContentsToImage(non_opaque_image.get(), - Image::kUnspecifiedDecode); - ASSERT_FALSE(graphics_layer->ContentsLayer()->contents_opaque()); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc index 771bfe7..68bbd9d 100644 --- a/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc +++ b/third_party/blink/renderer/platform/image-decoders/avif/avif_image_decoder.cc
@@ -387,11 +387,9 @@ } bool AVIFImageDecoder::DecodeImage(size_t index) { - if (!pending_decoded_image_ || decoder_->imageIndex != int{index}) { - auto ret = (decoder_->imageIndex + 1 == int{index}) - ? avifDecoderNextImage(decoder_.get()) - : avifDecoderNthImage(decoder_.get(), index); - if (ret != AVIF_RESULT_OK || !decoder_->image) { + if (!pending_decoded_image_) { + auto ret = avifDecoderNthImage(decoder_.get(), index); + if (ret != AVIF_RESULT_OK) { // We shouldn't be called more times than specified in // DecodeFrameCount(); possibly this should truncate if the initial // count is wrong?
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index fb33f4f..2f36bd7 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -951,6 +951,10 @@ name: "LayoutNGLineCache", }, { + name: "LayoutNGRuby", + depends_on: ["LayoutNG"], + }, + { name: "LayoutNGTable", }, { @@ -1289,10 +1293,6 @@ status: "stable", }, { - name: "PassiveDocumentWheelEventListeners", - status: "stable", - }, - { name: "PassPaintVisualRectToCompositor", }, // This is to add an option to enable the Reveal button on password inputs while waiting ::reveal gets standardized.
diff --git a/third_party/blink/renderer/platform/scheduler/common/scheduling_policy.cc b/third_party/blink/renderer/platform/scheduler/common/scheduling_policy.cc index edcd2bb6..386766e 100644 --- a/third_party/blink/renderer/platform/scheduler/common/scheduling_policy.cc +++ b/third_party/blink/renderer/platform/scheduler/common/scheduling_policy.cc
@@ -52,6 +52,7 @@ case Feature::kWebNfc: case Feature::kWebFileSystem: case Feature::kAppBanner: + case Feature::kPrinting: return true; } }
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index cf4a306..45b8351 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -1819,16 +1819,10 @@ external/wpt/orientation-event/free-fall-manual.https.html [ Skip ] external/wpt/orientation-event/screen-upmost-manual.https.html [ Skip ] external/wpt/orientation-event/screen-upright-manual.https.html [ Skip ] -external/wpt/orientation-event/t001-manual.https.html [ Skip ] -external/wpt/orientation-event/t002-manual.https.html [ Skip ] -external/wpt/orientation-event/t003-manual.https.html [ Skip ] external/wpt/orientation-event/t006-manual.https.html [ Skip ] external/wpt/orientation-event/t009-manual.https.html [ Skip ] external/wpt/orientation-event/t010-manual.https.html [ Skip ] external/wpt/orientation-event/t012-manual.https.html [ Skip ] -external/wpt/orientation-event/t021-manual.https.html [ Skip ] -external/wpt/orientation-event/t022-manual.https.html [ Skip ] -external/wpt/orientation-event/t023-manual.https.html [ Skip ] external/wpt/orientation-event/t025-manual.https.html [ Skip ] external/wpt/orientation-event/t028-manual.https.html [ Skip ] external/wpt/page-visibility/test_minimize-manual.html [ Skip ]
diff --git a/third_party/blink/web_tests/SmokeTests b/third_party/blink/web_tests/SmokeTests index 61af213..77e0e05 100644 --- a/third_party/blink/web_tests/SmokeTests +++ b/third_party/blink/web_tests/SmokeTests
@@ -271,7 +271,7 @@ external/wpt/navigation-timing/test_navigation_redirectCount_none.html external/wpt/orientation-event/motion/add-listener-from-callback.https.html external/wpt/orientation-event/orientation/create-event.https.html -external/wpt/orientation-event/devicemotionevent-init.https.html +external/wpt/orientation-event/motion/optional-event-properties.https.html external/wpt/pointerevents/pointerevent_touch-action-illegal.html external/wpt/preload/avoid-delaying-onload-link-preload.html external/wpt/referrer-policy/generic/subresource-test/attr-referrer-invalid-value.html
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index ad333f3..77ea88a 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -95,14 +95,6 @@ crbug.com/1050826 external/wpt/mixed-content/gen/top.http-rp/opt-in/object-tag.https.html [ Timeout ] -# Tests temporarily disabled until the video.requestAnimationFrame => -# video.requestVideoFrameCallback rename is completed. See crbug.com/1012063. - -external/wpt/video-raf/video-request-animation-frame.html [ Failure ] -external/wpt/video-raf/video-request-animation-frame-parallel.html [ Failure ] -external/wpt/video-raf/video-request-animation-frame-repeating.html [ Failure ] -external/wpt/video-raf/idlharness.window.html [ Failure ] - # Tests temporarily disabled with Site Isolation - uninvestigated bugs: # TODO(lukasza, alexmos): Burn down this list. crbug.com/608015 http/tests/inspector-protocol/access-inspected-object.js [ Failure Timeout ] @@ -2199,6 +2191,9 @@ crbug.com/745905 external/wpt/css/css-overflow/text-overflow-scroll-vertical-rl-001.html [ Failure ] crbug.com/745905 external/wpt/css/css-overflow/text-overflow-scroll-vertical-rl-rtl-001.html [ Failure ] +crbug.com/1067031 external/wpt/css/css-overflow/text-overflow-ellipsis-002.html [ Failure ] +crbug.com/1067031 external/wpt/css/css-overflow/webkit-line-clamp-035.html [ Failure ] + crbug.com/424365 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-024.html [ Failure ] crbug.com/441840 [ Win ] external/wpt/css/css-shapes/shape-outside/values/shape-margin-001.html [ Failure ] crbug.com/441840 external/wpt/css/css-shapes/shape-outside/values/shape-outside-circle-004.html [ Failure ] @@ -3151,16 +3146,6 @@ crbug.com/1069300 external/wpt/css/css-pseudo/active-selection-063.html [ Failure ] # ====== New tests from wpt-importer added here ====== -crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html [ Timeout ] -crbug.com/626703 [ Mac ] external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html [ Timeout ] -crbug.com/626703 [ Win ] external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html [ Timeout ] -crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html [ Timeout ] -crbug.com/626703 [ Mac ] external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html [ Timeout ] -crbug.com/626703 [ Win ] external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html [ Timeout ] -crbug.com/626703 [ Mac10.13 ] external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html [ Timeout ] -crbug.com/626703 [ Linux ] external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html [ Timeout ] -crbug.com/626703 [ Mac ] external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html [ Timeout ] -crbug.com/626703 [ Win ] external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html [ Timeout ] crbug.com/626703 [ Retina ] external/wpt/html/cross-origin-opener-policy/popup-coop-by-sw-from-coop.https.html [ Timeout ] crbug.com/626703 [ Mac10.14 ] external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html [ Timeout ] crbug.com/626703 [ Win7 ] external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html [ Timeout ] @@ -3181,12 +3166,6 @@ crbug.com/626703 [ Mac10.14 ] external/wpt/preload/onload-event.html [ Timeout ] crbug.com/626703 [ Mac10.10 ] external/wpt/storage/estimate-indexeddb.https.any.worker.html [ Failure Timeout ] crbug.com/626703 [ Mac10.10 ] external/wpt/fetch/origin/assorted.window.html [ Failure Timeout ] -crbug.com/626703 [ Linux ] external/wpt/css/css-overflow/text-overflow-ellipsis-002.html [ Failure ] -crbug.com/626703 [ Mac ] external/wpt/css/css-overflow/text-overflow-ellipsis-002.html [ Failure ] -crbug.com/626703 [ Win ] external/wpt/css/css-overflow/text-overflow-ellipsis-002.html [ Failure ] -crbug.com/626703 [ Linux ] external/wpt/css/css-overflow/webkit-line-clamp-035.html [ Failure ] -crbug.com/626703 [ Mac ] external/wpt/css/css-overflow/webkit-line-clamp-035.html [ Failure ] -crbug.com/626703 [ Win ] external/wpt/css/css-overflow/webkit-line-clamp-035.html [ Failure ] crbug.com/626703 [ Mac10.14 ] external/wpt/preload/download-resources.html [ Timeout ] crbug.com/626703 [ Mac10.10 ] virtual/threaded/external/wpt/requestidlecallback/callback-invoked.html [ Timeout ] crbug.com/626703 [ Mac10.10 ] virtual/web-components-v0-disabled/external/wpt/html/semantics/forms/the-input-element/input-type-checkbox.html [ Timeout ] @@ -5185,10 +5164,11 @@ crbug.com/824848 [ Win ] external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.html [ Pass Failure ] # Sheriff 2018-03-26 -crbug.com/825733 [ Win ] media/color-profile-video-seek-filter.html [ Pass Timeout Failure ] -crbug.com/825733 [ Win ] virtual/audio-service/media/color-profile-video-seek-filter.html [ Pass Timeout Failure ] crbug.com/754986 media/video-transformed.html [ Pass Failure ] crbug.com/754986 virtual/audio-service/media/video-transformed.html [ Pass Failure ] +# Superceded temporarily by wider suppresseion for skbug.com/10139 +#crbug.com/825733 [ Win ] media/color-profile-video-seek-filter.html [ Pass Timeout Failure ] +#crbug.com/825733 [ Win ] virtual/audio-service/media/color-profile-video-seek-filter.html [ Pass Timeout Failure ] # Sheriff 2018-03-29 crbug.com/827209 [ Win ] fast/events/middleClickAutoscroll-latching.html [ Pass Timeout Failure ] @@ -6124,7 +6104,9 @@ # Sheriff 2019-11-29 crbug.com/1019079 virtual/gpu/fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html [ Pass Failure ] crbug.com/1019079 fast/canvas/OffscreenCanvas-placeholder-createImageBitmap.html [ Pass Failure ] -crbug.com/1027434 external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Pass Timeout ] +#crbug.com/1027434 external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Pass Timeout ] +# Temporarily disabled until V8 roll +crbug.com/793406 external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Skip ] crbug.com/1027434 virtual/not-site-per-process/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Pass Timeout ] # Sheriff 2019-12-02 @@ -6659,6 +6641,14 @@ crbug.com/1066732 fast/events/platform-wheelevent-paging-x-in-scrolling-div.html [ Pass Failure ] crbug.com/1066732 fast/events/platform-wheelevent-paging-y-in-scrolling-div.html [ Pass Failure ] +#Imperceptible changes to Gaussian blur code in Skia. +skbug.com/10139 css3/filters/effect-combined-hw.html [ Pass Failure ] +skbug.com/10139 images/yuv-decode-eligible/color-profile-layer-filter.html [ Pass Failure ] +skbug.com/10139 media/color-profile-video-seek-filter.html [ Pass Timeout Failure ] +skbug.com/10139 virtual/audio-service/media/color-profile-video-seek-filter.html [ Pass Timeout Failure ] +skbug.com/10139 virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter.html [ Pass Failure ] +skbug.com/10139 virtual/gpu-rasterization-disable-yuv/images/yuv-decode-eligible/color-profile-filter.html [ Pass Failure ] + # Test flakes crbug.com/1066716 http/tests/cache/zero-length-xhr.html [ Pass Timeout ] @@ -6668,5 +6658,12 @@ crbug.com/1064422 external/wpt/html/user-activation/propagation-crossorigin.sub.tentative.html [ Pass Timeout ] crbug.com/1066178 external/wpt/html/user-activation/consumption-crossorigin.sub.tentative.html [ Pass Timeout ] +# Flaky test, happens only on Mac 10.13. +# The "timeout" was detected by the wpt-importer bot. +crbug.com/1069714 [ Mac10.13 ] external/wpt/webrtc/RTCRtpSender-replaceTrack.https.html [ Pass Failure Timeout ] + # Sheriff 2020-04-10 crbug.com/1068681 fast/peerconnection/RTCPeerConnection-insertable-streams.html [ Pass Failure Timeout ] + +# QUIC reordered versions to prefer IETF QUIC +crbug.com/1070747 [ Release ] external/wpt/webrtc-quic/* [ Skip ]
diff --git a/third_party/blink/web_tests/animations/multiple-same-name-css-animations.html b/third_party/blink/web_tests/animations/multiple-same-name-css-animations.html index 5b1935fdc..bfb87ea 100644 --- a/third_party/blink/web_tests/animations/multiple-same-name-css-animations.html +++ b/third_party/blink/web_tests/animations/multiple-same-name-css-animations.html
@@ -80,11 +80,11 @@ assert_equals(animations[0].currentTime, 1000); assert_equals(animations[0].effect.getTiming()['duration'], 1500); - assert_equals(animations[1].currentTime, 2000); - assert_equals(animations[1].effect.getTiming()['duration'], 2500); + assert_equals(animations[1].currentTime, 3000); + assert_equals(animations[1].effect.getTiming()['duration'], 3500); - assert_equals(animations[2].currentTime, 3000); - assert_equals(animations[2].effect.getTiming()['duration'], 3500); + assert_equals(animations[2].currentTime, 2000); + assert_equals(animations[2].effect.getTiming()['duration'], 2500); assert_equals(animations[3].currentTime, 4000); assert_equals(animations[3].effect.getTiming()['duration'], 4500); @@ -107,11 +107,11 @@ assert_equals(animations[0].currentTime, 1000); assert_equals(animations[0].effect.getTiming()['duration'], 1500); - assert_equals(animations[1].currentTime, 2000); - assert_equals(animations[1].effect.getTiming()['duration'], 3500); + assert_equals(animations[1].currentTime, 0); + assert_equals(animations[1].effect.getTiming()['duration'], 2500); - assert_equals(animations[2].currentTime, 0); - assert_equals(animations[2].effect.getTiming()['duration'], 2500); + assert_equals(animations[2].currentTime, 2000); + assert_equals(animations[2].effect.getTiming()['duration'], 3500); }, 'Removing same animation names should cancel animations from the end of the name list.'); test(() => {
diff --git a/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt b/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt index cea8b71..8000ed6 100644 --- a/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt +++ b/third_party/blink/web_tests/compositing/images/direct-image-dynamic-border-draws-content-expected.txt
@@ -11,12 +11,6 @@ { "name": "LayoutImage IMG class='composited'", "bounds": [256, 256], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='composited'", - "bounds": [256, 256], "transform": 1 } ],
diff --git a/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png b/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png index 548882a9..7c4963b 100644 --- a/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png +++ b/third_party/blink/web_tests/compositing/masks/mask-of-clipped-layer-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/compositing/overflow/resources/update-widget-positions-on-nested-frames-and-scrollers-inner-frame.html b/third_party/blink/web_tests/compositing/overflow/resources/update-widget-positions-on-nested-frames-and-scrollers-inner-frame.html index c8dfa67..eda8043 100644 --- a/third_party/blink/web_tests/compositing/overflow/resources/update-widget-positions-on-nested-frames-and-scrollers-inner-frame.html +++ b/third_party/blink/web_tests/compositing/overflow/resources/update-widget-positions-on-nested-frames-and-scrollers-inner-frame.html
@@ -17,10 +17,8 @@ return; var select = document.getElementById('select'); - // FIXME: it would be really nice to use getBoundingClientRect() and not - // hard-code pixel coordinates here, but since it's in an iframe, the - // coordinates are translated anyway. - clickToOpenPicker(50, 120, callback, function () { + var selectRect = select.getBoundingClientRect(); + clickToOpenPicker(selectRect.left, selectRect.top, callback, function () { setTimeout(callback, 0); }); } @@ -47,7 +45,7 @@ select.appendChild(option); } - if (x == 24) { + if (x == 23) { select.id = 'select'; }
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt index 7256bf5a..33da06e 100644 --- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt +++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
@@ -27,12 +27,6 @@ { "name": "LayoutImage IMG class='accelerated'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated'", - "bounds": [160, 90], "transform": 1 }, {
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt index bc6eb64..7f5274f 100644 --- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt +++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
@@ -21,12 +21,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 1 }, { @@ -51,12 +45,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 2 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 2 }, {
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt index 8aac105a..b0cf695 100644 --- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt +++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-layer-expected.txt
@@ -14,12 +14,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 1 }, {
diff --git a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt index e558265..a56abd9 100644 --- a/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt +++ b/third_party/blink/web_tests/css3/blending/mix-blend-mode-isolation-remove-expected.txt
@@ -24,12 +24,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 1 } ],
diff --git a/third_party/blink/web_tests/css3/filters/filter-region-transformed-composited-child.html b/third_party/blink/web_tests/css3/filters/filter-region-transformed-composited-child.html deleted file mode 100644 index f0ab1ce..0000000 --- a/third_party/blink/web_tests/css3/filters/filter-region-transformed-composited-child.html +++ /dev/null
@@ -1,43 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="0" height="0"> - <defs> - <filter id="filter" x="25%" y="0%" width="50%" height="100%"> - <feComponentTransfer> - <feFuncR type="linear" intercept="0" slope="1"/> - <feFuncG type="linear" intercept="0" slope="0"/> - <feFuncB type="linear" intercept="0" slope="0"/> - <feFuncA type="linear" intercept="0" slope="1"/> - </feComponentTransfer> - </filter> - </defs> -</svg> -<style> -div { - position: absolute; -} -.filtered { - filter: url(#filter); -} -.child { - background-color: gray; - width: 50px; - height: 50px; - position: absolute; - will-change: transform; -} -.p1 { - left: 50px; - top: 50px; -} -.c1 { - transform: translate(0px, 25px); -} -.p2 { - left: 150px; - top: 50px; -} -.c2 { - transform: translate(0px, -25px); -} -</style> -<div class="filtered p1"><div class="child c1"></div></div> -<div class="filtered p2"><div class="child c2"></div></div>
diff --git a/third_party/blink/web_tests/editing/pasteboard/drag-drop-to-data-url.html b/third_party/blink/web_tests/editing/pasteboard/drag-drop-to-data-url.html index 33a2527..9d8c6ca 100644 --- a/third_party/blink/web_tests/editing/pasteboard/drag-drop-to-data-url.html +++ b/third_party/blink/web_tests/editing/pasteboard/drag-drop-to-data-url.html
@@ -26,7 +26,7 @@ eventSender.leapForward(500); var framex = target.offsetLeft + 10; - var framey = target.offsetTop + t.offsetHeight / 2; + var framey = target.offsetTop + target.offsetHeight / 2; eventSender.mouseMoveTo(framex, framey); setTimeout(dropIt, 0); }
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 fc943145..67d04eb 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
@@ -53951,6 +53951,18 @@ {} ] ], + "css/css-grid/anonymous-grid-items-001.html": [ + [ + "css/css-grid/anonymous-grid-items-001.html", + [ + [ + "/css/css-grid/reference/anonymous-grid-items-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-grid/chrome-bug-001.html": [ [ "css/css-grid/chrome-bug-001.html", @@ -54611,6 +54623,18 @@ {} ] ], + "css/css-grid/grid-items/grid-item-script-001.html": [ + [ + "css/css-grid/grid-items/grid-item-script-001.html", + [ + [ + "/css/css-grid/reference/grid-item-script-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-grid/grid-items/grid-items-001.html": [ [ "css/css-grid/grid-items/grid-items-001.html", @@ -55535,6 +55559,18 @@ {} ] ], + "css/css-grid/grid-model/column-property-should-not-apply-on-grid-container-001.html": [ + [ + "css/css-grid/grid-model/column-property-should-not-apply-on-grid-container-001.html", + [ + [ + "/css/css-grid/grid-model/reference/column-property-should-not-apply-on-grid-container-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-grid/grid-model/display-grid.html": [ [ "css/css-grid/grid-model/display-grid.html", @@ -56075,6 +56111,18 @@ {} ] ], + "css/css-grid/layout-algorithm/auto-margins-ignored-during-track-sizing-001.html": [ + [ + "css/css-grid/layout-algorithm/auto-margins-ignored-during-track-sizing-001.html", + [ + [ + "/css/css-grid/layout-algorithm/references/auto-margins-ignored-during-track-sizing-001-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-grid/layout-algorithm/grid-layout-free-space-unit.html": [ [ "css/css-grid/layout-algorithm/grid-layout-free-space-unit.html", @@ -61823,6 +61871,18 @@ {} ] ], + "css/css-masking/clip-path/reference-mutated.html": [ + [ + "css/css-masking/clip-path/reference-mutated.html", + [ + [ + "/css/css-masking/clip-path/reference/reference-mutated-ref.html", + "==" + ] + ], + {} + ] + ], "css/css-masking/clip-path/reference-nonexisting-existing-local.html": [ [ "css/css-masking/clip-path/reference-nonexisting-existing-local.html", @@ -149792,6 +149852,9 @@ "css/css-grid/grid-model/reference/100x100-grey-box.html": [ [] ], + "css/css-grid/grid-model/reference/column-property-should-not-apply-on-grid-container-001-ref.html": [ + [] + ], "css/css-grid/grid-model/reference/grid-layout-stale-001-ref.html": [ [] ], @@ -149801,6 +149864,9 @@ "css/css-grid/layout-algorithm/grid-flex-track-intrinsic-sizes-001-expected.txt": [ [] ], + "css/css-grid/layout-algorithm/references/auto-margins-ignored-during-track-sizing-001-ref.html": [ + [] + ], "css/css-grid/layout-algorithm/references/grid-percent-cols-filled-shrinkwrap-001-ref.html": [ [] ], @@ -149846,6 +149912,9 @@ "css/css-grid/parsing/grid-template-shorthand-valid-expected.txt": [ [] ], + "css/css-grid/reference/anonymous-grid-items-001-ref.html": [ + [] + ], "css/css-grid/reference/display-grid-ref.html": [ [] ], @@ -149882,6 +149951,9 @@ "css/css-grid/reference/grid-inline-axis-alignment-auto-margins-008-ref.html": [ [] ], + "css/css-grid/reference/grid-item-script-001-ref.html": [ + [] + ], "css/css-grid/reference/grid-layout-auto-tracks-ref.html": [ [] ], @@ -150902,6 +150974,9 @@ "css/css-masking/clip-path/reference/reference-local-url-with-base-001-ref.html": [ [] ], + "css/css-masking/clip-path/reference/reference-mutated-ref.html": [ + [] + ], "css/css-masking/clip-path/reference/reference-nonexisting-existing-local-ref.html": [ [] ], @@ -175928,7 +176003,7 @@ "interfaces/vibration.idl": [ [] ], - "interfaces/video-raf.idl": [ + "interfaces/video-rvfc.idl": [ [] ], "interfaces/visual-viewport.idl": [ @@ -187985,15 +188060,15 @@ "vibration/OWNERS": [ [] ], - "video-raf/META.yml": [ - [] - ], - "video-raf/README.md": [ - [] - ], "video-raf/idlharness.window-expected.txt": [ [] ], + "video-rvfc/META.yml": [ + [] + ], + "video-rvfc/README.md": [ + [] + ], "visual-viewport/META.yml": [ [] ], @@ -319463,9 +319538,9 @@ } ] ], - "video-raf/idlharness.window.js": [ + "video-rvfc/idlharness.window.js": [ [ - "video-raf/idlharness.window.html", + "video-rvfc/idlharness.window.html", { "script_metadata": [ [ @@ -319480,21 +319555,21 @@ } ] ], - "video-raf/video-request-animation-frame-parallel.html": [ + "video-rvfc/video-request-animation-frame-parallel.html": [ [ - "video-raf/video-request-animation-frame-parallel.html", + "video-rvfc/video-request-animation-frame-parallel.html", {} ] ], - "video-raf/video-request-animation-frame-repeating.html": [ + "video-rvfc/video-request-animation-frame-repeating.html": [ [ - "video-raf/video-request-animation-frame-repeating.html", + "video-rvfc/video-request-animation-frame-repeating.html", {} ] ], - "video-raf/video-request-animation-frame.html": [ + "video-rvfc/video-request-animation-frame.html": [ [ - "video-raf/video-request-animation-frame.html", + "video-rvfc/video-request-animation-frame.html", {} ] ], @@ -355131,11 +355206,11 @@ "reftest" ], "content-index/content-index.https.window.js": [ - "082ebc3b9ec599da21351d4be1f21a79810ec65d", + "56870707a986afa8dc695a54ae4eaed1b572e3a2", "testharness" ], "content-index/resources.js": [ - "1a758abe27e0b31dd22d2b8c04a7943271dea95c", + "51e98005b037013f17d91add984edfd7846a17b2", "support" ], "content-index/resources/sw.js": [ @@ -399066,6 +399141,10 @@ "c1ff70c49ec1e77ba0e794c7537ae90cd503498e", "testharness" ], + "css/css-grid/anonymous-grid-items-001.html": [ + "f5ddd5c340176596b0da1ff731c07f219e7c435e", + "reftest" + ], "css/css-grid/chrome-bug-001.html": [ "7b24f41a47eeb090ec53e9a6e37a4f8a977ca802", "reftest" @@ -399514,6 +399593,10 @@ "4a4d6c843ac4f82cb1403a15739174ec781634ef", "reftest" ], + "css/css-grid/grid-items/grid-item-script-001.html": [ + "323e9ba3c4fb7a2f02a6f859c0915f456327ce87", + "reftest" + ], "css/css-grid/grid-items/grid-items-001.html": [ "fc9b27be4d1eb62d13afc9da04790da748b1a6ba", "reftest" @@ -399978,6 +400061,10 @@ "a5376827eb91a2e4a92fe4738b1a319fcdc38ee8", "testharness" ], + "css/css-grid/grid-model/column-property-should-not-apply-on-grid-container-001.html": [ + "a79536258644b44254c08f15d20cb0e656c46317", + "reftest" + ], "css/css-grid/grid-model/compute-intrinsic-widths-scrollbar-001.html": [ "d61f7ad14e6b911aca586a5a05713c9811db5a0c", "testharness" @@ -400218,6 +400305,10 @@ "0592f6d2ce582c3c89b9d7f5278eed9458531c3c", "support" ], + "css/css-grid/grid-model/reference/column-property-should-not-apply-on-grid-container-001-ref.html": [ + "154cf02290ce6f11ff1e2802e9a03841c8e27a43", + "support" + ], "css/css-grid/grid-model/reference/grid-layout-stale-001-ref.html": [ "3ade075c99cc2009aabc018aa4181b0ff930bea3", "support" @@ -400246,6 +400337,10 @@ "eee86f70300d4280531235c813589dc3c399c58c", "testharness" ], + "css/css-grid/layout-algorithm/auto-margins-ignored-during-track-sizing-001.html": [ + "2a23b1bd2031e2a3cfc104a90f70ab6c38d2fe64", + "reftest" + ], "css/css-grid/layout-algorithm/grid-content-distribution-must-account-for-track-sizing-001.html": [ "907ef68668f2cbe113674e808b4e78ae0e390100", "testharness" @@ -400326,6 +400421,10 @@ "29eca9dbc6f5738f7d6f929385453d64dcdf0aea", "reftest" ], + "css/css-grid/layout-algorithm/references/auto-margins-ignored-during-track-sizing-001-ref.html": [ + "b06d89115178107b12493023f211f156f3e4b17d", + "support" + ], "css/css-grid/layout-algorithm/references/grid-percent-cols-filled-shrinkwrap-001-ref.html": [ "97bc5da7256a1c5b5961c01c336e795918d413d3", "support" @@ -400570,6 +400669,10 @@ "4e6c4cceb59ac8d371ee96779cc1947d77bfc597", "reftest" ], + "css/css-grid/reference/anonymous-grid-items-001-ref.html": [ + "20302c2f1aa48e45b0698ed42bca866cf8f6a58e", + "support" + ], "css/css-grid/reference/display-grid-ref.html": [ "8008359a6b4c92e8e4f683d7448ccc1e1ccfeca5", "support" @@ -400618,6 +400721,10 @@ "d5f993d051001046baaabb4bbb0a1ce641b53a44", "support" ], + "css/css-grid/reference/grid-item-script-001-ref.html": [ + "2574678a8ba165fceaccff5224a615ea7d2cc864", + "support" + ], "css/css-grid/reference/grid-layout-auto-tracks-ref.html": [ "9f2f91cf7fa0fd3da5b24fe2f72cfdfc8929f4a1", "support" @@ -404310,6 +404417,10 @@ "c65761bddfc095e0e85b4feaea4359516a8df5b1", "reftest" ], + "css/css-masking/clip-path/reference-mutated.html": [ + "09642853c775f33ce3b8dbd6ee26e8eba05e1b3e", + "reftest" + ], "css/css-masking/clip-path/reference-nonexisting-existing-local.html": [ "d02e1439e64e79a65c185c703e4813e33225e679", "reftest" @@ -404418,6 +404529,10 @@ "f718ea6abfbab54333ba674ff0dcd320d8672bcd", "support" ], + "css/css-masking/clip-path/reference/reference-mutated-ref.html": [ + "f718ea6abfbab54333ba674ff0dcd320d8672bcd", + "support" + ], "css/css-masking/clip-path/reference/reference-nonexisting-existing-local-ref.html": [ "f718ea6abfbab54333ba674ff0dcd320d8672bcd", "support" @@ -487142,8 +487257,8 @@ "cc5cd194b558952dc5791b28ffe9a1d03bbc004b", "support" ], - "interfaces/video-raf.idl": [ - "25f9e3a3ba6d5ee0e6f1be59863455607604b47e", + "interfaces/video-rvfc.idl": [ + "a86e2b364df0da0326ff1154128a9198e7b23e89", "support" ], "interfaces/visual-viewport.idl": [ @@ -526326,31 +526441,31 @@ "16fc2a9f8534c11d9fa3536c70724335b8c9ef1a", "manual" ], - "video-raf/META.yml": [ - "44c3187495dcb08e7cf8306875503e91fc6c448d", - "support" - ], - "video-raf/README.md": [ - "a5272939964a80cd7020c4bbbbe14dc4229afe61", - "support" - ], "video-raf/idlharness.window-expected.txt": [ "b2638c0d2c1249614d80bc8edca4c87ec5f5e2c8", "support" ], - "video-raf/idlharness.window.js": [ - "cd1e85552dada5b176d0928c0c8dbe0b5d33e322", + "video-rvfc/META.yml": [ + "51048591d0a6fbb6fba70812d87685ba0e752038", + "support" + ], + "video-rvfc/README.md": [ + "fc2502a616613b7e48712d7c96dd15e550c1debd", + "support" + ], + "video-rvfc/idlharness.window.js": [ + "71fa6e0a3b9e8bd296ab6d5835ba8a166130b29c", "testharness" ], - "video-raf/video-request-animation-frame-parallel.html": [ + "video-rvfc/video-request-animation-frame-parallel.html": [ "35fe4575f3b543db990c956f9820e2eeee19745d", "testharness" ], - "video-raf/video-request-animation-frame-repeating.html": [ + "video-rvfc/video-request-animation-frame-repeating.html": [ "d98f39f96b1c3a5afacaa617f00f16f23d6b39fb", "testharness" ], - "video-raf/video-request-animation-frame.html": [ + "video-rvfc/video-request-animation-frame.html": [ "76b986ecb66d70047f29c8d65d1eabba5751a1af", "testharness" ], @@ -529827,7 +529942,7 @@ "wdspec" ], "webdriver/tests/support/__init__.py": [ - "fda74ce835cd108fb6deb6ffa2ff74430dc0577f", + "9bdf4dcd35e46b31c31e108ec4e87edbf3322eb4", "support" ], "webdriver/tests/support/asserts.py": [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/Document-getAnimations.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-animations/Document-getAnimations.tentative-expected.txt index 71d24842..5a926cfd 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-animations/Document-getAnimations.tentative-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-animations/Document-getAnimations.tentative-expected.txt
@@ -1,7 +1,7 @@ This is a testharness.js-based test. PASS getAnimations for non-animated content PASS getAnimations for CSS Animations -FAIL Order of CSS Animations - within an element unaffected by start time assert_equals: Order of first animation returned expected "animBottom" but got "animLeft" +PASS Order of CSS Animations - within an element unaffected by start time PASS Order of CSS Animations - within an element PASS Order of CSS Animations - across elements PASS Order of CSS Animations - across and within elements
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations.tentative-expected.txt deleted file mode 100644 index 71bd7a0..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-animations/Element-getAnimations.tentative-expected.txt +++ /dev/null
@@ -1,25 +0,0 @@ -This is a testharness.js-based test. -PASS getAnimations for non-animated content -PASS getAnimations for CSS Animations -PASS getAnimations returns CSSAnimation objects for CSS Animations -PASS getAnimations for multi-property animations -PASS getAnimations for both CSS Animations and CSS Transitions at once -PASS getAnimations for CSS Animations that have finished -PASS getAnimations for CSS Animations that have finished but are forwards filling -PASS getAnimations for CSS Animations with animation-name: none -PASS getAnimations for CSS Animations with animation-name: missing -PASS getAnimations for CSS Animations where the @keyframes rule is added later -PASS getAnimations for CSS Animations with duplicated animation-name -PASS getAnimations for CSS Animations with empty keyframes rule -PASS getAnimations for CSS animations in delay phase -PASS getAnimations for zero-duration CSS Animations -PASS getAnimations returns objects with the same identity -PASS getAnimations for CSS Animations that are canceled -FAIL getAnimations for CSS Animations follows animation-name order assert_equals: animation order after prepending to list expected "anim1" but got "anim2" -PASS { subtree: false } on a leaf element returns the element's animations and ignore pseudo-elements -PASS { subtree: true } on a leaf element returns the element's animations and its pseudo-elements' animations -PASS { subtree: false } on an element with a child returns only the element's animations -PASS { subtree: true } on an element with a child returns animations from the element, its pseudo-elements, its child and its child pseudo-elements -PASS { subtree: true } on an element with many descendants returns animations from all the descendants -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/animation-base-response-004.html b/third_party/blink/web_tests/external/wpt/css/css-animations/animation-base-response-004.html new file mode 100644 index 0000000..5638a57 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-animations/animation-base-response-004.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<title>Tests that base responds to font-affecting properties appearing via setKeyframes</title> +<link rel="help" href="https://drafts.csswg.org/css-animations/"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + #target1 { + font-size: 10px; + height: 1em; + } +</style> +<div id=target1></div> +<script> + test(function() { + getComputedStyle(target1).height; + + let animation = target1.animate([ + { height: '50px' }, + { height: '100px' }, + ], { + duration: 1000000, + delay: -500000, + easing: 'steps(2, end)' + }); + + assert_equals(getComputedStyle(target1).height, '75px'); + + animation.effect.setKeyframes([ + { fontSize: '10px' }, + { fontSize: '20px' }, + ]); + + assert_equals(getComputedStyle(target1).height, '15px'); + }, 'Base is responsive to font-affecting appearing via setKeyframes'); +</script>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/explicit-grid-size.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/explicit-grid-size-001.html similarity index 88% rename from third_party/blink/web_tests/fast/css-grid-layout/explicit-grid-size.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/explicit-grid-size-001.html index 4df0525..266c6a56 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/explicit-grid-size.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/explicit-grid-size-001.html
@@ -1,5 +1,11 @@ <!DOCTYPE html> -<link href="resources/grid.css" rel="stylesheet"> +<title>CSS Grid: grid size with explicit grid-template-areas.</title> +<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com"/> +<link rel="help" href="https://drafts.csswg.org/css-grid/#grid-definition"/> +<link rel="issue" href="https://crrev.com/603160"/> +<meta name="assert" content="Test ensures that the explicit grid size is set by the maximum of the grid-template-columns|rows properties and grid-template-areas."/> + +<link href="/css/support/grid.css" rel="stylesheet"/> <style> .grid { @@ -47,14 +53,12 @@ } </style> -<script src="../../resources/testharness.js"></script> -<script src="../../resources/testharnessreport.js"></script> -<script src="../../resources/check-layout-th.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> <body onload="checkLayout('.grid')"> <div id="log"></div> -<p>Checks that the explicit grid size is set by the maximum of the grid-template-columns|rows properties and grid-template-areas.</p> - <div class="grid"> <div class="autoRowAutoColumn" data-offset-x="0" data-offset-y="0" data-expected-width="10" data-expected-height="10">
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-distribution.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-distribution-001.html similarity index 71% rename from third_party/blink/web_tests/fast/css-grid-layout/flex-content-distribution.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-distribution-001.html index 4ee0513..62fb46d 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-distribution.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-distribution-001.html
@@ -1,7 +1,13 @@ <!DOCTYPE html> +<title>CSS Grid Layout Test: free space computation with flex lengths.</title> +<link rel="author" title="Sergio Villar Senin" href="mailto:svillar@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#algo-flex-tracks"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#fr-unit"> +<link rel="help" href="https://bugs.webkit.org/show_bug.cgi?id=150359"> +<link rel="stylesheet" href="/css/support/grid.css"> +<link rel="stylesheet" href="/css/support/alignment.css"> +<meta name="assert" content="Test that free space is properly computed after computing fr tracks so that we could use it for content distribution." /> -<link href="resources/grid.css" rel="stylesheet"> -<link href="resources/grid-alignment.css" rel="stylesheet"> <style> .freeSpaceForColumnsGrid { grid-template: 100% / minmax(20px, 0.7fr); @@ -31,12 +37,12 @@ </style> -<script src="../../resources/check-layout.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> <body onload="checkLayout('.grid');"> -<p>This test checks that freeSpace is properly computed after computing fr tracks so that we could use it for content distribution</p> - <p>Grid with justify-content: start.</p> <div class="container"> <div class="grid freeSpaceForColumnsGrid justifyContentStart">
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-columns.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-columns-001.html similarity index 87% rename from third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-columns.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-columns-001.html index 33f4f3a..ce70aa3 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-columns.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-columns-001.html
@@ -1,6 +1,14 @@ <!DOCTYPE html> <html> -<link href="resources/grid.css" rel="stylesheet"> +<title>CSS Grid Layout Test: Auto repeat tracks, grid-template-columns and flexible lengths.</title> +<link rel="author" title="Julien Chaffraix" href="mailto:jchaffraix@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#track-sizes"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#fr-unit"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=235258"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="/css/support/grid.css"> +<meta name="assert" content="Test that resolving auto tracks on grid items using <flex> values with grid-template-columns works properly." /> + <style> .gridFlexContent { grid-template-columns: 1fr 1fr; @@ -44,10 +52,15 @@ grid-row: 1; } </style> -<script src="../../resources/check-layout.js"></script> -<body onload="checkLayout('.grid');"> -<p>Test that resolving auto tracks on grid items works properly.</p> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script type="text/javascript"> + setup({ explicit_done: true }); +</script> + +<body onload="document.fonts.ready.then(() => { checkLayout('.grid'); })"> <div class="constrainedContainer" style="position: relative"> <div class="grid gridFlexContent">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-and-minmax-content-resolution-columns-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-columns-002.html similarity index 100% rename from third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-and-minmax-content-resolution-columns-001.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-columns-002.html
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-rows.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-rows-001.html similarity index 91% rename from third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-rows.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-rows-001.html index bf7f73b..d10b8401 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-rows.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-rows-001.html
@@ -1,6 +1,14 @@ <!DOCTYPE html> <html> -<link href="resources/grid.css" rel="stylesheet"> +<title>CSS Grid Layout Test: Auto repeat tracks, grid-template-rows and flexible lengths.</title> +<link rel="author" title="Julien Chaffraix" href="mailto:jchaffraix@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#track-sizes"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#fr-unit"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=235258"> +<link rel="stylesheet" href="/fonts/ahem.css"> +<link rel="stylesheet" href="/css/support/grid.css"> +<meta name="assert" content="Test that resolving auto tracks on grid items using <flex> values with grid-template-rows works properly." /> + <style> .gridFlexContent { grid-template-columns: 50px; @@ -40,11 +48,15 @@ grid-row: 3; } </style> -<script src="../../resources/check-layout.js"></script> -<body onload="checkLayout('.grid');"> -<p>Test that resolving auto tracks on grid items works properly.</p> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<script type="text/javascript"> + setup({ explicit_done: true }); +</script> +<body onload="document.fonts.ready.then(() => { checkLayout('.grid'); })"> <div class="grid gridFlexContent constrainedContainer" style="position: relative;"> <div class="sizedToGridArea firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="30">X<br>X<br>X</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-and-minmax-content-resolution-rows-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-rows-002.html similarity index 98% rename from third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-and-minmax-content-resolution-rows-001.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-rows-002.html index ebaa2c08..d668a93 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-and-minmax-content-resolution-rows-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-content-resolution-rows-002.html
@@ -54,8 +54,6 @@ <body onload="document.fonts.ready.then(() => { checkLayout('.grid'); })"> -<p>Test that resolving auto tracks on grid items works properly.</p> - <div class="constrainedContainer"> <div class="grid gridMaxMaxContent"> <div class="sizedToGridArea firstRowFirstColumn" data-expected-width="50" data-expected-height="10">XXXXX</div>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-factor-sum-less-than-1.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-factor-sum-less-than-1-001.html similarity index 74% rename from third_party/blink/web_tests/fast/css-grid-layout/flex-factor-sum-less-than-1.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-factor-sum-less-than-1-001.html index f9fd9b19..ad7af2d 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-factor-sum-less-than-1.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-definition/flex-factor-sum-less-than-1-001.html
@@ -1,21 +1,28 @@ <!DOCTYPE html> <html> -<link href="resources/grid.css" rel="stylesheet"> +<title>CSS Grid Layout Test: flex factor sum smaller than 1.</title> +<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid/#algo-find-fr-size"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#fr-unit"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=520477"> +<link rel="stylesheet" href="/css/support/grid.css"> +<meta name="assert" content="Test that resolving auto tracks on grid items works properly even when the flex factor sum is less than 1." /> + <style> .onlyColumnFractionFlexFactors { - grid-template-columns: minmax(0,0.1fr) minmax(0,0.2fr) minmax(0,0.3fr); + grid-template-columns: minmax(0, 0.1fr) minmax(0, 0.2fr) minmax(0, 0.3fr); grid-template-rows: 50px; width: 100px; } .onlyRowFractionFlexFactors { grid-template-columns: 50px; - grid-template-rows: minmax(0,0.1fr) minmax(0,0.2fr) minmax(0,0.3fr); + grid-template-rows: minmax(0, 0.1fr) minmax(0, 0.2fr) minmax(0, 0.3fr); width: 50px; height: 100px; } .fixedAndfractionFlexFactors { - grid-template-columns: 50px minmax(0,0.2fr) 30px; - grid-template-rows: minmax(0,0.1fr) 50px minmax(0,0.3fr); + grid-template-columns: 50px minmax(0, 0.2fr) 30px; + grid-template-rows: minmax(0, 0.1fr) 50px minmax(0, 0.3fr); width: 100px; height: 100px; } @@ -45,10 +52,12 @@ grid-row: 3; } </style> -<script src="../../resources/check-layout.js"></script> -<body onload="checkLayout('.grid');"> -<p>Test that resolving auto tracks on grid items works properly.</p> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + +<body onload="checkLayout('.grid');"> <div style="position: relative;"> <div class="grid onlyColumnFractionFlexFactors"> @@ -90,5 +99,3 @@ </body> </html> - -
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/float-not-protruding-into-next-grid-item-expected.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-002-ref.html similarity index 83% rename from third_party/blink/web_tests/fast/css-grid-layout/float-not-protruding-into-next-grid-item-expected.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-002-ref.html index 2860a92..070980e 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/float-not-protruding-into-next-grid-item-expected.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-002-ref.html
@@ -1,28 +1,28 @@ <!DOCTYPE html> <html> <head> -<link href="resources/grid.css" rel="stylesheet"> +<link rel="stylesheet" href="/css/support/grid.css"> <style> .cell { - width: 50px; - height: auto; - min-height: 50px + width: 50px; + height: auto; + min-height: 50px } .invisibleFont { - color: lime; + color: lime; } .floatLeft { - float: left; + float: left; } .clearLeft { - clear: left; + clear: left; } .relative { - position: relative; + position: relative; } </style> </head>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-002.html new file mode 100644 index 0000000..9c26e021 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-floats-no-intrude-002.html
@@ -0,0 +1,43 @@ +<!DOCTYPE html> +<html> +<head> +<title>CSS Grid Layout Test: floats do not protrude content onto grid items</title> +<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-containers"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=430100"> +<link rel="match" href="grid-floats-no-intrude-002-ref.html"> +<link rel="stylesheet" href="/css/support/grid.css"> +<link rel="stylesheet" href="/css/support/width-keyword-classes.css"> +<meta name="assert" content="Test that a grid item sets a new formatting context for its content, preventing any 'float' protruding content on the adjoining grid item." /> + +<style> +.grid { + grid-auto-columns: minmax(50px, max-content); + grid-auto-rows: minmax(50px, max-content); +} + +.floatChild { + float: left; + clear: both; +} +</style> +</head> + +<body> + +<div>This test checks that grid item sets a new formatting context for its content, preventing any 'float' protruding content on the adjoining grid item ('Float' text shouldn't overflow the first row).</div> + +<div class="grid fit-content"> + <div class="firstRowFirstColumn"> + <div class="floatChild">Float</div> + <div class="floatChild">Float</div> + <div class="floatChild">Float</div> + <div class="floatChild">Float</div> + </div> + <div class="firstRowSecondColumn"></div> + <div class="secondRowFirstColumn"></div> + <div class="secondRowSecondColumn"></div> +</div> + +</body> +</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margins-not-collapse-expected.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-002-ref.html similarity index 86% rename from third_party/blink/web_tests/fast/css-grid-layout/grid-item-margins-not-collapse-expected.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-002-ref.html index 86a17e6..ce56a566 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margins-not-collapse-expected.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-002-ref.html
@@ -1,5 +1,5 @@ <!DOCTYPE html> -<link href="resources/grid.css" rel="stylesheet"> +<link rel="stylesheet" href="/css/support/grid.css"> <div>This test checks that grid item's margins do not collapse with its content's margins (single margin in the first row and double between subsequent).</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-002.html b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-002.html new file mode 100644 index 0000000..f644a6f --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/grid-model/grid-margins-no-collapse-002.html
@@ -0,0 +1,16 @@ +<!DOCTYPE html> +<title>CSS Grid Layout Test: grid items not collapsing</title> +<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-containers"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=430100"> +<link rel="match" href="grid-margins-no-collapse-002-ref.html"> +<link rel="stylesheet" href="/css/support/grid.css"> +<meta name="assert" content="Test that grid item's margins do not collapse with its content's margins." /> + +<div>This test checks that grid item's margins do not collapse with its content's margins (single margin in the first row and double between subsequent).</div> + +<div style="display: grid;"> + <div><p>XXXXX</p></div> + <div style="margin:20px 0px;">XXXXX</div> + <div><p>XXXXX</p></div> +</div>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margin-auto-columns-rows.html b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-item-margin-auto-columns-rows-001.html similarity index 70% rename from third_party/blink/web_tests/fast/css-grid-layout/grid-item-margin-auto-columns-rows.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-item-margin-auto-columns-rows-001.html index 78aad77..6ae1c50c 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margin-auto-columns-rows.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/layout-algorithm/grid-item-margin-auto-columns-rows-001.html
@@ -1,8 +1,13 @@ <!DOCTYPE html> -<html> -<script src="../../resources/check-layout.js"></script> -<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet"> -<link href="resources/grid.css" rel="stylesheet"> +<title>CSS Grid: 'auto' sizes with item's margins</title> +<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid"> +<link rel="help" href="https://drafts.csswg.org/css-grid/#layout-algorithm"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=357419"> +<meta name="assert" content="Check that the grid's rows and columns 'auto' sizes are updated accordingly to its grid-item's before and start margins."/> +<link href="/css/support/grid.css" rel="stylesheet"> +<link href="/css/support/width-keyword-classes.css" rel="stylesheet"> + <style> .grid { grid-template-rows: auto auto; @@ -38,11 +43,12 @@ padding-bottom: 10px; } </style> -</head> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> + <body onload="checkLayout('.grid')"> - -<div>This test checks that the grid's rows and columns 'auto' sizes are updated accordingly to its grid-item's before and start margins.</div> - <div> <div class="grid fit-content" data-expected-width="40" data-expected-height="120"> <div class="gridItem marginTop firstRowFirstColumn"></div> @@ -78,6 +84,4 @@ <div class="gridItem secondRowSecondColumn"></div> </div> </div> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-template-areas-must-keep-named-columns-order-001.html b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-template-areas-must-keep-named-columns-order-001.html new file mode 100644 index 0000000..8b0736b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/placement/grid-template-areas-must-keep-named-columns-order-001.html
@@ -0,0 +1,32 @@ +<!DOCTYPE html> +<link rel="author" title="Javier Fernandez" href="mailto:jfernandez@igalia.com"> +<link rel="help" href="https://drafts.csswg.org/css-grid/#grid-placement-slot"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-template-columns"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-auto-rows"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-template-areas"> +<link rel="help" href="https://drafts.csswg.org/css-grid-1/#propdef-grid-column"> +<link rel="help" href="https://crbug.com/733577"> +<link rel="match" href="../reference/grid-template-areas-must-keep-named-columns-order-001-ref.html"> +<meta name="assert" content="A grid item located in a named line will be placed in the first one associated to that name"/> +<style> +.grid { + display: inline-grid; + background: grey; + grid-template-columns: [col] 50px [col] 50px [col] 50px [col] 50px; + grid-auto-rows: 50px; + grid-template-areas: "A . . ."; +} +.grid > :nth-child(1) { background: magenta; } +.grid > :nth-child(2) { background: blue; } +.grid > :nth-child(3) { background: yellow; } +.grid > :nth-child(4) { background: green; } +.grid > :nth-child(5) { background: black; } +</style> +<p>This test passes if the black item is positioned in the first column of the second row, since the spec states that we must select the first one among several equally named grid lines.</p> +<div class="grid"> + <div></div> + <div></div> + <div></div> + <div></div> + <div style="grid-column: col"></div> +</div>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-template-areas-must-keep-named-columns-order-expected.html b/third_party/blink/web_tests/external/wpt/css/css-grid/reference/grid-template-areas-must-keep-named-columns-order-001-ref.html similarity index 68% rename from third_party/blink/web_tests/fast/css-grid-layout/grid-template-areas-must-keep-named-columns-order-expected.html rename to third_party/blink/web_tests/external/wpt/css/css-grid/reference/grid-template-areas-must-keep-named-columns-order-001-ref.html index 30e6f9d..7ea26011 100644 --- a/third_party/blink/web_tests/fast/css-grid-layout/grid-template-areas-must-keep-named-columns-order-expected.html +++ b/third_party/blink/web_tests/external/wpt/css/css-grid/reference/grid-template-areas-must-keep-named-columns-order-001-ref.html
@@ -10,9 +10,9 @@ .grid > :nth-child(2) { background: blue; } .grid > :nth-child(3) { background: yellow; } .grid > :nth-child(4) { background: green; } -.grid > :nth-child(5) { background: red; } +.grid > :nth-child(5) { background: black; } </style> -<p>This is a regression test for the issue crbug.com/733577 and it passes if the red item is positioned in the first column of the second row, since the spec states that we must select the first one among several equally named grid lines.</p> +<p>This test passes if the black item is positioned in the first column of the second row, since the spec states that we must select the first one among several equally named grid lines.</p> <div class="grid"> <div style="grid-row: 1; grid-column: 1"></div> <div style="grid-row: 1; grid-column: 2"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/filter-region-transformed-composited-child-001.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/filter-region-transformed-composited-child-001.html new file mode 100644 index 0000000..c6bef8a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/filter-region-transformed-composited-child-001.html
@@ -0,0 +1,51 @@ +<title>CSS Filters: filtered parent with composited or transformed child</title> +<link rel="author" title="Stephen White" href="mailto:senorblanco@chromium.org"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects/#feComponentTransferElement"> +<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=618642"> +<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=620394"> +<link rel="match" href="reference/filter-region-transformed-composited-child-001-ref.html"> +<meta name="assert" content="This test ensures that filtered parent works correctly with composited or transformed children."> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="0" height="0"> + <defs> + <filter id="filter" x="25%" y="0%" width="50%" height="100%"> + <feComponentTransfer> + <feFuncR type="linear" intercept="0" slope="1"/> + <feFuncG type="linear" intercept="0" slope="0"/> + <feFuncB type="linear" intercept="0" slope="0"/> + <feFuncA type="linear" intercept="0" slope="1"/> + </feComponentTransfer> + </filter> + </defs> +</svg> +<style> +div { + position: absolute; +} +.filtered { + filter: url(#filter); +} +.child { + background-color: gray; + width: 50px; + height: 50px; + position: absolute; + will-change: transform; +} +.p1 { + left: 50px; + top: 50px; +} +.c1 { + transform: translate(0px, 25px); +} +.p2 { + left: 150px; + top: 50px; +} +.c2 { + transform: translate(0px, -25px); +} +</style> +<div class="filtered p1"><div class="child c1"></div></div> +<div class="filtered p2"><div class="child c2"></div></div>
diff --git a/third_party/blink/web_tests/css3/filters/filter-region-transformed-composited-child-expected.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/reference/filter-region-transformed-composited-child-001-ref.html similarity index 100% rename from third_party/blink/web_tests/css3/filters/filter-region-transformed-composited-child-expected.html rename to third_party/blink/web_tests/external/wpt/css/filter-effects/reference/filter-region-transformed-composited-child-001-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/dom/events/scrolling/OWNERS b/third_party/blink/web_tests/external/wpt/dom/events/scrolling/OWNERS new file mode 100644 index 0000000..e7e04516 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/dom/events/scrolling/OWNERS
@@ -0,0 +1,4 @@ +# TEAM: input-dev@chromium.org +# COMPONENT: Blink>Input +# WPT-NOTIFY: true +bokan@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/dom/nodes/aria-attribute-reflection.tentative.html b/third_party/blink/web_tests/external/wpt/dom/nodes/aria-attribute-reflection.tentative.html index d5f4adf..dfd5c37 100644 --- a/third_party/blink/web_tests/external/wpt/dom/nodes/aria-attribute-reflection.tentative.html +++ b/third_party/blink/web_tests/external/wpt/dom/nodes/aria-attribute-reflection.tentative.html
@@ -360,13 +360,24 @@ }, "aria-rowspan attribute reflects."); </script> +<div id="selected" aria-selected="true"></div> + +<script> +test(function(t) { + var element = document.getElementById("selected"); + assert_equals(element.ariaSelected, "true"); + element.ariaSelected = "false"; + assert_equals(element.getAttribute("aria-selected"), "false"); +}, "aria-selected attribute reflects."); +</script> + <div id="setsize" aria-setsize="10"></div> <script> test(function(t) { var element = document.getElementById("setsize"); - assert_equals(element.ariaSelected, "10"); - element.ariaSelected = "11"; + assert_equals(element.ariaSetSize, "10"); + element.ariaSetSize = "11"; assert_equals(element.getAttribute("aria-setsize"), "11"); }, "aria-setsize attribute reflects."); </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/interaction/focus/OWNERS b/third_party/blink/web_tests/external/wpt/html/interaction/focus/OWNERS new file mode 100644 index 0000000..f17b123 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/interaction/focus/OWNERS
@@ -0,0 +1,4 @@ +# TEAM: input-dev@chromium.org +# COMPONENT: Blink>Input +# WPT-NOTIFY: true +mustaq@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/html/user-activation/OWNERS b/third_party/blink/web_tests/external/wpt/html/user-activation/OWNERS new file mode 100644 index 0000000..f17b123 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/user-activation/OWNERS
@@ -0,0 +1,4 @@ +# TEAM: input-dev@chromium.org +# COMPONENT: Blink>Input +# WPT-NOTIFY: true +mustaq@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/actions/OWNERS b/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/actions/OWNERS new file mode 100644 index 0000000..6aa7ab7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/actions/OWNERS
@@ -0,0 +1,4 @@ +# TEAM: input-dev@chromium.org +# COMPONENT: Blink>Input +# WPT-NOTIFY: true +lanwei@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/input-events/OWNERS b/third_party/blink/web_tests/external/wpt/input-events/OWNERS index 51e8f5c..3b44901 100644 --- a/third_party/blink/web_tests/external/wpt/input-events/OWNERS +++ b/third_party/blink/web_tests/external/wpt/input-events/OWNERS
@@ -1,4 +1,5 @@ # TEAM: input-dev@chromium.org # COMPONENT: Blink>Input +# WPT-NOTIFY: true nzolghadr@chromium.org yosin@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/video-raf.idl b/third_party/blink/web_tests/external/wpt/interfaces/video-rvfc.idl similarity index 96% rename from third_party/blink/web_tests/external/wpt/interfaces/video-raf.idl rename to third_party/blink/web_tests/external/wpt/interfaces/video-rvfc.idl index 25f9e3a..a86e2b36 100644 --- a/third_party/blink/web_tests/external/wpt/interfaces/video-raf.idl +++ b/third_party/blink/web_tests/external/wpt/interfaces/video-rvfc.idl
@@ -1,7 +1,7 @@ // GENERATED CONTENT - DO NOT EDIT // Content was automatically extracted by Reffy into reffy-reports // (https://github.com/tidoust/reffy-reports) -// Source: HTMLVideoElement.requestVideoFrameCallback() (https://wicg.github.io/video-raf/) +// Source: HTMLVideoElement.requestVideoFrameCallback() (https://wicg.github.io/video-rvfc/) dictionary VideoFrameMetadata { required DOMHighResTimeStamp presentationTime;
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em-expected.txt b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em-expected.txt deleted file mode 100644 index 961aea8..0000000 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Parsing of non-negative integers Failed to set the 'width' property on 'OffscreenCanvas': Value is not of type 'unsigned long'. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html index 1f9b956f..f730235 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.html
@@ -20,10 +20,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '100em'; -offscreenCanvas.height = '100em'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '100em'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js index 3d69bcb..1755fcb 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.em.worker.js
@@ -16,10 +16,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '100em'; -offscreenCanvas.height = '100em'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '100em'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk-expected.txt b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk-expected.txt deleted file mode 100644 index 961aea8..0000000 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Parsing of non-negative integers Failed to set the 'width' property on 'OffscreenCanvas': Value is not of type 'unsigned long'. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html index 6411c30..0cd4d6c 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.html
@@ -20,10 +20,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '#!?'; -offscreenCanvas.height = '#!?'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '#!?'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js index 5ba9fdb..9251eed8 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.junk.worker.js
@@ -16,10 +16,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '#!?'; -offscreenCanvas.height = '#!?'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '#!?'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus-expected.txt b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus-expected.txt deleted file mode 100644 index 1806f20..0000000 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Parsing of non-negative integers Failed to set the 'width' property on 'OffscreenCanvas': Value is outside the 'unsigned long' value range. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html index 091d694..f05eef2 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.html
@@ -20,10 +20,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '-100'; -offscreenCanvas.height = '-100'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '-100'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js index 9d123275..0c8cc06 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.minus.worker.js
@@ -16,10 +16,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '-100'; -offscreenCanvas.height = '-100'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 50, "offscreenCanvas.height", "50"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '-100'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent-expected.txt b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent-expected.txt deleted file mode 100644 index 961aea8..0000000 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Parsing of non-negative integers Failed to set the 'width' property on 'OffscreenCanvas': Value is not of type 'unsigned long'. -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html index ba119ef..593781f3 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.html
@@ -20,10 +20,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '100%'; -offscreenCanvas.height = '100%'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '100%'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js index 76ce6da7a..e4da8ef 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/the-offscreen-canvas/size.attributes.parse.percent.worker.js
@@ -16,10 +16,7 @@ var offscreenCanvas = new OffscreenCanvas(100, 50); var ctx = offscreenCanvas.getContext('2d'); -offscreenCanvas.width = '100%'; -offscreenCanvas.height = '100%'; -_assertSame(offscreenCanvas.width, 100, "offscreenCanvas.width", "100"); -_assertSame(offscreenCanvas.height, 100, "offscreenCanvas.height", "100"); +assert_throws_js(TypeError, function() { offscreenCanvas.width = '100%'; }); t.done(); });
diff --git a/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml b/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml index 0dad4c43..f4a605c 100644 --- a/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml +++ b/third_party/blink/web_tests/external/wpt/offscreen-canvas/tools/tests2d.yaml
@@ -9783,14 +9783,14 @@ ("space", " 100", 100), ("whitespace", "\t\f100", 100), ("plus", "+100", 100), - ("minus", "-100", None), + ("minus", "-100", "exception"), ("octal", "0100", 100), ("hex", "0x100", 0x100), ("exp", "100e1", 100e1), ("decimal", "100.999", 100), - ("percent", "100%", 100), - ("em", "100em", 100), - ("junk", "#!?", None), + ("percent", "100%", "exception"), + ("em", "100em", "exception"), + ("junk", "#!?", "exception"), ("trailingjunk", "100#!?", "exception"), ] def gen(name, string, exp, code):
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/device-orientation-on-secure-origin.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/device-orientation-on-secure-origin.https.html deleted file mode 100644 index f72a5685..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/device-orientation-on-secure-origin.https.html +++ /dev/null
@@ -1,72 +0,0 @@ -<!DOCTYPE html> -<title>Device Sensor Events on Secure Origin</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/common/get-host-info.sub.js"></script> -<script src="/resources/testdriver.js"></script> -<script src="/resources/testdriver-vendor.js"></script> -<script src="resources/orientation-event-helpers.js"></script> -<script> - -test(() => { - assert_true('ondevicemotion' in window); - assert_true('ondeviceorientation' in window); - assert_true('DeviceMotionEvent' in window); - assert_true('DeviceOrientationEvent' in window); - assert_true('DeviceMotionEventAcceleration' in window); - assert_true('DeviceMotionEventRotationRate' in window); -}, 'Event handlers as well as interfaces are exposed on `window`.'); - -sensor_test(async (t, sensorProvider) => { - const FAKE_ACCELERATION_DATA = [1, 2, 3]; - const FAKE_LINEAR_ACCELERATION_DATA = [4, 5, 6]; - const FAKE_GYROSCOPE_DATA = [7, 8, 9]; - setMockSensorDataForType(sensorProvider, 'Accelerometer', FAKE_ACCELERATION_DATA); - setMockSensorDataForType(sensorProvider, 'LinearAccelerationSensor', FAKE_LINEAR_ACCELERATION_DATA); - setMockSensorDataForType(sensorProvider, 'Gyroscope', FAKE_GYROSCOPE_DATA); - - const radToDeg = 180 / Math.PI; - return waitForEvent(new DeviceMotionEvent('devicemotion', { - acceleration: { - x: FAKE_LINEAR_ACCELERATION_DATA[0], - y: FAKE_LINEAR_ACCELERATION_DATA[1], - z: FAKE_LINEAR_ACCELERATION_DATA[2], - }, - accelerationIncludingGravity: { - x: FAKE_ACCELERATION_DATA[0], - y: FAKE_ACCELERATION_DATA[1], - z: FAKE_ACCELERATION_DATA[2], - }, - rotationRate: { - alpha: FAKE_GYROSCOPE_DATA[0] * radToDeg, - beta: FAKE_GYROSCOPE_DATA[1] * radToDeg, - gamma: FAKE_GYROSCOPE_DATA[2] * radToDeg, - }, - interval: 16, - })); -}, 'DeviceMotionEvent fires.'); - -sensor_test(async (t, sensorProvider) => { - const FAKE_ORIENTATION_DATA = [1.1, 2.2, 3.3]; - setMockSensorDataForType(sensorProvider, 'RelativeOrientationEulerAngles', FAKE_ORIENTATION_DATA); - - return waitForEvent(new DeviceOrientationEvent('deviceorientation', { - alpha: FAKE_ORIENTATION_DATA[2], - beta: FAKE_ORIENTATION_DATA[0], - gamma: FAKE_ORIENTATION_DATA[1], - absolute: false, - })); -}, 'DeviceOrientationEvent fires.'); - -sensor_test(async (t, sensorProvider) => { - const FAKE_ORIENTATION_DATA = [1.1, 2.2, 3.3]; - setMockSensorDataForType(sensorProvider, 'AbsoluteOrientationEulerAngles', FAKE_ORIENTATION_DATA); - - return waitForEvent(new DeviceOrientationEvent('deviceorientationabsolute', { - alpha: FAKE_ORIENTATION_DATA[2], - beta: FAKE_ORIENTATION_DATA[0], - gamma: FAKE_ORIENTATION_DATA[1], - absolute: true, - })); -}, 'DeviceOrientationEvent fires (with absolute orientation).'); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/devicemotionevent-init.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/devicemotionevent-init.https.html deleted file mode 100644 index 90563d8..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/devicemotionevent-init.https.html +++ /dev/null
@@ -1,49 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>DeviceMotionEvent attributes must be initialized properly</title> - <meta charset='utf-8'> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - </head> - <body> - <p>DeviceOrientationEvent attributes must be initialized properly.</p> - <div id="log"></div> - <script> - test(function() { - var evt = new DeviceMotionEvent("foo"); - assert_equals(evt.type, "foo", "type is set to \"foo\""); - assert_equals(evt.acceleration, null, - "acceleration must be initialized to null"); - assert_equals(evt.accelerationIncludingGravity, null, - "accelerationIncludingGravity must be initialized to null"); - assert_equals(evt.rotationRate, null, - "rotationRate must be initialized to null"); - assert_equals(evt.interval, 0, "interval must be initialized to 0"); - }, "User created event is initialized properly with default values"); - - test(function() { - var evt = new DeviceMotionEvent("foo", { - acceleration: { x: 56, y: -56, z: 64 }, - accelerationIncludingGravity: { x: 56, y: -56, z: 64 }, - rotationRate: { alpha: 56, beta: -56, gamma: 64 }, - interval: 3 - }); - assert_equals(evt.type, "foo", "type is set to \"foo\""); - assert_equals(typeof evt.acceleration, "object", "acceleration is an object"); - assert_equals(evt.acceleration.x, 56, "acceleration.x is set to 56"); - assert_equals(evt.acceleration.y, -56, "acceleration.y is set to -56"); - assert_equals(evt.acceleration.z, 64, "acceleration.z is set to 64"); - assert_equals(typeof evt.accelerationIncludingGravity, "object", "accelerationIncludingGravity is an object"); - assert_equals(evt.accelerationIncludingGravity.x, 56, "accelerationIncludingGravity.x is set to 56"); - assert_equals(evt.accelerationIncludingGravity.y, -56, "accelerationIncludingGravity.y is set to -56"); - assert_equals(evt.accelerationIncludingGravity.z, 64, "accelerationIncludingGravity.z is set to 64"); - assert_equals(typeof evt.rotationRate, "object", "rotationRate is an object"); - assert_equals(evt.rotationRate.alpha, 56, "rotationRate.alpha is set to 56"); - assert_equals(evt.rotationRate.beta, -56, "rotationRate.beta is set to -56"); - assert_equals(evt.rotationRate.gamma, 64, "rotationRate.gamma is set to 64"); - assert_equals(evt.interval, 3, "interval is set to 3"); - }, "User created event is initialized properly using dictionary"); - </script> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/deviceorientationabsoluteevent.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/deviceorientationabsoluteevent.https.html index 8ccf671..8371098a 100644 --- a/third_party/blink/web_tests/external/wpt/orientation-event/deviceorientationabsoluteevent.https.html +++ b/third_party/blink/web_tests/external/wpt/orientation-event/deviceorientationabsoluteevent.https.html
@@ -16,6 +16,7 @@ if (!run) { run = true; t.step(function () { + assert_true(e instanceof DeviceOrientationEvent, "instanceof DeviceOrientationEvent"); assert_equals(e.type, "deviceorientationabsolute", "type is set to \"deviceorientationabsolute\""); assert_equals(e.alpha, null, "alpha is set to null"); assert_equals(e.beta, null, "beta is set to null");
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/deviceorientationevent-init.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/deviceorientationevent-init.https.html deleted file mode 100644 index b6485f69..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/deviceorientationevent-init.https.html +++ /dev/null
@@ -1,37 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>DeviceOrientationEvent attributes must be initialized properly</title> - <meta charset='utf-8'> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - </head> - <body> - <p>DeviceOrientationEvent attributes must be initialized properly.</p> - <div id="log"></div> - <script> - test(function() { - var evt = new DeviceOrientationEvent("foo"); - assert_equals(evt.type, "foo", "type is set to \"foo\""); - assert_equals(evt.alpha, null, "alpha is set to null"); - assert_equals(evt.beta, null, "beta is set to null"); - assert_equals(evt.gamma, null, "gamma is set to null"); - assert_false(evt.absolute, "absolute is set to false"); - }, "User created event is initialized properly with default values"); - - test(function() { - var evt = new DeviceOrientationEvent("foo", { - alpha: 56, - beta: -56, - gamma: 64, - absolute: true - }); - assert_equals(evt.type, "foo", "type is set to \"foo\""); - assert_equals(evt.alpha, 56, "alpha is set to 56"); - assert_equals(evt.beta, -56, "beta is set to -56"); - assert_equals(evt.gamma, 64, "gamma is set to 64"); - assert_true(evt.absolute, "absolute is set to true"); - }, "User created event is initialized properly using a dictionary"); - </script> - </body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/motion/add-child-listener.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/motion/add-child-listener.https.html deleted file mode 100644 index c2fb41b..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/motion/add-child-listener.https.html +++ /dev/null
@@ -1,18 +0,0 @@ -<!DOCTYPE html> -<html> -<body> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> -'use strict'; - -test(() => { - const childFrame = document.createElement('iframe'); - document.body.appendChild(childFrame); - const childWindow = childFrame.contentWindow; - document.body.removeChild(childFrame); - childWindow.addEventListener('devicemotion', () => {}); -}, 'Tests that an event listener can be safely added to a child frame that has been detached from the parent.'); -</script> -</body> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/motion/add-listener-from-callback.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/motion/add-listener-from-callback.https.html index 30a4735d..11f26957 100644 --- a/third_party/blink/web_tests/external/wpt/orientation-event/motion/add-listener-from-callback.https.html +++ b/third_party/blink/web_tests/external/wpt/orientation-event/motion/add-listener-from-callback.https.html
@@ -17,6 +17,9 @@ let firstEventCount = 0; let firstPromise = new Promise(resolve => { firstListener = (event) => { + assert_true(event instanceof DeviceMotionEvent, 'event is DeviceMotionEvent'); + assert_equals(event.type, 'devicemotion', 'event.type is devicemotion'); + assert_true(event.target instanceof Window, 'event is fired on the window object'); checkMotion(event, motionData); window.removeEventListener('devicemotion', firstListener); if (++firstEventCount == 1) {
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/motion/window-property.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/motion/window-property.https.html deleted file mode 100644 index 56e55dd..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/motion/window-property.https.html +++ /dev/null
@@ -1,36 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> -'use strict'; - -function hasDeviceMotionEventProperty() -{ - for (let property in window) { - if (property == "DeviceMotionEvent") - return true; - } - return false; -} - -function hasOnDeviceMotionProperty() -{ - for (let property in window) { - if (property == "ondevicemotion") - return true; - } - return false; -} - -test(test => { - assert_equals(typeof window.DeviceMotionEvent, 'function'); - assert_false(hasDeviceMotionEventProperty()); - assert_true('DeviceMotionEvent' in window); - assert_true(window.hasOwnProperty('DeviceMotionEvent')); - - assert_equals(typeof window.ondevicemotion, 'object'); - assert_true(hasOnDeviceMotionProperty()); - assert_true('ondevicemotion' in window); - assert_true(window.hasOwnProperty('ondevicemotion')); -}, 'Tests that the window.DeviceMotionEvent and window.ondevicemotion properties are present.'); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/ondeviceorientationabsolute.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/ondeviceorientationabsolute.https.html deleted file mode 100644 index 73ce97ab..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/ondeviceorientationabsolute.https.html +++ /dev/null
@@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>User agents must also provide an event handler IDL attribute named ondeviceorientationabsolute on the window object</title> - <meta name=viewport content="width=device-width, maximum-scale=1.0"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - </head> - <body> - <p>Rotate the device to run the tests.</p> - <div id="log"></div> - <script> - var t1 = async_test("Provide an event handler IDL attribute named ondeviceorientationabsolute"); - var t2 = async_test("The type of this event handler must be 'DeviceOrientationEvent'"); - var t3 = async_test("The absolute property must be set to true."); - var run = false; - if (window.ondeviceorientationabsolute === undefined) { - t1.step(t1.unreached_func("ondeviceorientationabsolute not supported")); - t2.step(t2.unreached_func("ondeviceorientationabsolute not supported")); - t3.step(t3.unreached_func("ondeviceorientationabsolute not supported")); - } else { - window.ondeviceorientationabsolute = function(e) { - if (!run) { - run = true; - t1.step(function() { - assert_equals(e.type, "deviceorientationabsolute"); - }); - t1.done(); - t2.step(function() { - assert_true(e instanceof DeviceOrientationEvent); - }); - t2.done(); - t3.step(function() { - assert_true(e.absolute); - }); - t3.done(); - } - }; - } - </script> - </body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/orientation/add-listener-from-callback.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/orientation/add-listener-from-callback.https.html index 827801b2..040e2a2 100644 --- a/third_party/blink/web_tests/external/wpt/orientation-event/orientation/add-listener-from-callback.https.html +++ b/third_party/blink/web_tests/external/wpt/orientation-event/orientation/add-listener-from-callback.https.html
@@ -15,6 +15,9 @@ let firstEventCount = 0; let firstPromise = new Promise(resolve => { firstListener = (event) => { + assert_true(event instanceof DeviceOrientationEvent, 'event is DeviceOrientationEvent'); + assert_equals(event.type, 'deviceorientation', 'event.type is devicemotion'); + assert_true(event.target instanceof Window, 'event is fired on the window object'); checkOrientation(event, orientationData); window.removeEventListener('deviceorientation', firstListener); if (++firstEventCount == 1) {
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/orientation/window-property.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/orientation/window-property.https.html deleted file mode 100644 index 200efc1..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/orientation/window-property.https.html +++ /dev/null
@@ -1,31 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> -'use strict'; - -function hasProperty(orientationProperty) -{ - for (let property in window) { - if (property == orientationProperty) - return true; - } - return false; -} - -test(test => { - assert_equals(typeof window.DeviceOrientationEvent, 'function'); - assert_false(window.propertyIsEnumerable('DeviceOrientationEvent')); - assert_true('DeviceOrientationEvent' in window); - assert_true(window.hasOwnProperty('DeviceOrientationEvent')); - - assert_equals(typeof window.ondeviceorientation, 'object'); - assert_equals(typeof window.ondeviceorientationabsolute, 'object'); - assert_true(hasProperty('ondeviceorientation')); - assert_true(hasProperty('ondeviceorientationabsolute')); - assert_true('ondeviceorientation' in window); - assert_true('ondeviceorientationabsolute' in window); - assert_true(window.hasOwnProperty('ondeviceorientation')); - assert_true(window.hasOwnProperty('ondeviceorientationabsolute')); -}, 'Tests that the window.DeviceOrientationEvent and window.ondeviceorientation and window.ondeviceorientationabsolute properties are present.'); -</script>
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/t001-manual.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/t001-manual.https.html deleted file mode 100644 index a38d3fd..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/t001-manual.https.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>User agents implementing this specification must provide a new DOM event, named deviceorientation</title> - <meta name=viewport content="width=device-width, maximum-scale=1.0"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <link rel="author" title="Mosquito FP7"> - <link rel="reviewer author" title="Zhiqiang Zhang" href="mailto:zhiqiang.zhang@intel.com"> <!-- 2013-10-12 --> - </head> - <body> - <p>Rotate the device to run the test.</p> - <div id="log"></div> - <script> - var t = async_test("deviceorientation event fires"); - var run = false; - window.addEventListener("deviceorientation", function(e) { - if (!run) { - run = true; - t.done(); - } - }, false); - </script> - </body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/t002-manual.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/t002-manual.https.html deleted file mode 100644 index 13acb468..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/t002-manual.https.html +++ /dev/null
@@ -1,35 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>The corresponding event must be of type DeviceOrientationEvent and must fire on the window object.</title> - <meta name=viewport content="width=device-width, maximum-scale=1.0"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <link rel="author" title="Mosquito FP7"> - <link rel="reviewer author" title="Zhiqiang Zhang" href="mailto:zhiqiang.zhang@intel.com"> <!-- 2013-10-12 --> - </head> - <body> - <p>Rotate the device to run the tests.</p> - <div id="log"></div> - <script> - var t1 = async_test("The corresponding event must be of type DeviceOrientationEvent"); - var t2 = async_test("The corresponding event must fire on the window object"); - var run = false; - window.addEventListener("deviceorientation", function(e) { - if (!run) { - run = true; - var _this = this; - t1.step(function() { - assert_equals(e.type, "deviceorientation"); - }); - t1.done(); - t2.step(function() { - assert_equals(_this, window); - }); - t2.done(); - } - }, false); - </script> - </body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/t003-manual.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/t003-manual.https.html deleted file mode 100644 index 328132d..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/t003-manual.https.html +++ /dev/null
@@ -1,34 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>User agents must also provide an event handler IDL attribute [HTML5] named ondeviceorientation on the window object</title> - <meta name=viewport content="width=device-width, maximum-scale=1.0"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <link rel="author" title="Mosquito FP7"> - <link rel="reviewer author" title="Zhiqiang Zhang" href="mailto:zhiqiang.zhang@intel.com"> <!-- 2013-10-12 --> - </head> - <body> - <p>Rotate the device to run the tests.</p> - <div id="log"></div> - <script> - var t1 = async_test("Provide an event handler IDL attribute [HTML5] named ondeviceorientation"); - var t2 = async_test("The type of this event handler must be 'DeviceOrientationEvent'"); - var run = false; - window.ondeviceorientation = function(e) { - if (!run) { - run = true; - t1.step(function() { - assert_equals(e.type, "deviceorientation"); - }); - t1.done(); - t2.step(function() { - assert_true(e instanceof "DeviceOrientationEvent"); - }); - t2.done(); - } - }; - </script> - </body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/t021-manual.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/t021-manual.https.html deleted file mode 100644 index 449d6100..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/t021-manual.https.html +++ /dev/null
@@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>User agents implementing this specification must provide a new DOM event, named devicemotion</title> - <meta name=viewport content="width=device-width, maximum-scale=1.0"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <link rel="author" title="Mosquito FP7"> - <link rel="reviewer author" title="Zhiqiang Zhang" href="mailto:zhiqiang.zhang@intel.com"> <!-- 2013-10-14 --> - </head> - <body> - <p>Move the device to run the test.</p> - <div id="log"></div> - <script> - var t = async_test("devicemotion event exists"); - var run = false; - window.addEventListener("devicemotion", function(e) { - if (!run) { - run = true; - t.done(); - } - }, false); - </script> - </body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/t022-manual.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/t022-manual.https.html deleted file mode 100644 index 45e9e7e..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/t022-manual.https.html +++ /dev/null
@@ -1,34 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>The corresponding event must be of type DeviceOrientationEvent and must fire on the window object</title> - <meta name=viewport content="width=device-width, maximum-scale=1.0"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <link rel="author" title="Mosquito FP7"> - <link rel="reviewer author" title="Zhiqiang Zhang" href="mailto:zhiqiang.zhang@intel.com"> <!-- 2013-10-14 --> - </head> - <body> - <p>Move the device to run the test.</p> - <div id="log"></div> - <script> - var t1 = async_test("The corresponding event must be of type DeviceMotionEvent"); - var t2 = async_test("The corresponding event must fire on the window object"); - var run = false; - window.addEventListener("devicemotion", function(e) { - if (!run) { - run = true; - t1.step(function() { - assert_equals(e.type, "devicemotion"); - }); - t1.done(); - t2.step(function() { - assert_true(e.target instanceof Window); - }); - t2.done(); - } - }, false); - </script> - </body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/orientation-event/t023-manual.https.html b/third_party/blink/web_tests/external/wpt/orientation-event/t023-manual.https.html deleted file mode 100644 index 7606e523..0000000 --- a/third_party/blink/web_tests/external/wpt/orientation-event/t023-manual.https.html +++ /dev/null
@@ -1,34 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>User agents must also provide an event handler IDL attribute HTML5 named ondevicemotion on the window object</title> - <meta name=viewport content="width=device-width, maximum-scale=1.0"> - <script src="/resources/testharness.js"></script> - <script src="/resources/testharnessreport.js"></script> - <link rel="author" title="Mosquito FP7"> - <link rel="reviewer author" title="Zhiqiang Zhang" href="mailto:zhiqiang.zhang@intel.com"> <!-- 2013-10-14 --> - </head> - <body> - <p>Move the device to run the test.</p> - <div id="log"></div> - <script> - var t1 = async_test("User agents provide an event handler IDL attribute HTML5 named ondevicemotion"); - var t2 = async_test("The type of this event handler must be 'DeviceMotionEvent'"); - var run = false; - window.ondevicemotion = function(e) { - if (!run) { - run = true; - t1.step(function() { - assert_equals(e.type, "devicemotion"); - }); - t1.done(); - t2.step(function() { - assert_true(e instanceof "DeviceMotionEvent"); - }); - t2.done(); - } - }; - </script> - </body> -</html> -
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/OWNERS b/third_party/blink/web_tests/external/wpt/pointerevents/OWNERS index 3466072..3a5adbad 100644 --- a/third_party/blink/web_tests/external/wpt/pointerevents/OWNERS +++ b/third_party/blink/web_tests/external/wpt/pointerevents/OWNERS
@@ -1,4 +1,5 @@ # TEAM: input-dev@chromium.org # COMPONENT: Blink>Input +# WPT-NOTIFY: true nzolghadr@chromium.org mustaq@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/pointerlock/OWNERS b/third_party/blink/web_tests/external/wpt/pointerlock/OWNERS index d9907e1..46d4a5d 100644 --- a/third_party/blink/web_tests/external/wpt/pointerlock/OWNERS +++ b/third_party/blink/web_tests/external/wpt/pointerlock/OWNERS
@@ -1,3 +1,4 @@ # TEAM: input-dev@chromium.org # COMPONENT: Blink>Input -eirage@chromium.org +# WPT-NOTIFY: true +nzolghadr@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js index 428ca0a5..a04aa372 100644 --- a/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js +++ b/third_party/blink/web_tests/external/wpt/resources/chromium/webxr-test.js
@@ -76,6 +76,10 @@ document.body.appendChild(button); test_driver.click(button); } + + Debug(name, msg) { + console.log(new Date().toISOString() + ' DEBUG[' + name + '] ' + msg); + } } // Mocking class definitions @@ -921,9 +925,9 @@ const neg = XRMathHelper.neg; //1. Calculate plane normal in world coordinates. - const point_A = face[0]; - const point_B = face[1]; - const point_C = face[2]; + const point_A = face.vertices[0]; + const point_B = face.vertices[1]; + const point_C = face.vertices[2]; const edge_AB = sub(point_B, point_A); const edge_AC = sub(point_C, point_A);
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-animation.html b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-animation.html index 521c64d..901549e 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-animation.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/scroll-animation.html
@@ -163,4 +163,62 @@ "Animation start time is resolved when the animation is ready."); }, 'Animation start and current times are correct if scroll timeline is ' + 'activated after animation.play call.'); + +promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + const maxScroll = scroller.scrollHeight - scroller.clientHeight; + const timeRange = animation.timeline.timeRange; + + animation.play(); + await animation.ready; + + // Advance the scroller to max position. + scroller.scrollTop = maxScroll; + await animation.finished; + + // Scroll back. + scroller.scrollTop = 0.2 * maxScroll; + + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + // Verify animation state and current time on reverse scrolling. + assert_equals(animation.playState, 'running', + 'Animation state is playing on reverse scrolling.'); + assert_equals(animation.currentTime, 0.2 * timeRange, + 'Animation current time is updated on reverse scrolling.'); +}, 'Finished animation plays on reverse scrolling.'); + +promise_test(async t => { + const animation = createScrollLinkedAnimation(t); + const scroller = animation.timeline.scrollSource; + const maxScroll = scroller.scrollHeight - scroller.clientHeight; + + animation.play(); + await animation.ready; + + // Advance the scroller to max position. + scroller.scrollTop = maxScroll; + await animation.finished; + + var sent_finish_event = false; + animation.onfinish = function() { + sent_finish_event = true; + }; + + // Scroll back. + scroller.scrollTop = 0.2 * maxScroll; + // Wait for new animation frame which allows the timeline to compute new + // current time. + await waitForNextFrame(); + assert_false(sent_finish_event, + "No animation finished event is sent on reverse scroll."); + + scroller.scrollTop = maxScroll; + await animation.finished; + assert_true(sent_finish_event, + "Animation finished event is sent on reaching max scroll."); +}, 'Sending animation finished events by finished animation on reverse ' + + 'scrolling.'); </script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/OWNERS b/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/OWNERS new file mode 100644 index 0000000..e7e04516 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/OWNERS
@@ -0,0 +1,4 @@ +# TEAM: input-dev@chromium.org +# COMPONENT: Blink>Input +# WPT-NOTIFY: true +bokan@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/svg/struct/reftests/support/sprites.svg b/third_party/blink/web_tests/external/wpt/svg/struct/reftests/support/sprites.svg new file mode 100644 index 0000000..f73b885 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/struct/reftests/support/sprites.svg
@@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <rect id="green-rect" width="100" height="100" fill="green"/> +</svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/struct/reftests/use-adopted-with-external-resource.tentative.svg b/third_party/blink/web_tests/external/wpt/svg/struct/reftests/use-adopted-with-external-resource.tentative.svg new file mode 100644 index 0000000..830d455 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/struct/reftests/use-adopted-with-external-resource.tentative.svg
@@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:h="http://www.w3.org/1999/xhtml"> + <title>Adopting a <use> (from an inactive document) requests an external resource</title> + <h:link rel="match" href="reference/green-100x100.svg"/> + <script type="text/plain" template=""><![CDATA[ + <svg xmlns="http://www.w3.org/2000/svg"> + <use href="support/sprites.svg#green-rect"/> + </svg>]]> + </script> + <script> + let text = document.querySelector('script[template]').textContent; + let doc = new DOMParser().parseFromString(text, 'image/svg+xml'); + document.documentElement.appendChild(doc.documentElement); + </script> +</svg>
diff --git a/third_party/blink/web_tests/external/wpt/touch-events/OWNERS b/third_party/blink/web_tests/external/wpt/touch-events/OWNERS index e830748f..46d4a5d 100644 --- a/third_party/blink/web_tests/external/wpt/touch-events/OWNERS +++ b/third_party/blink/web_tests/external/wpt/touch-events/OWNERS
@@ -1,3 +1,4 @@ # TEAM: input-dev@chromium.org # COMPONENT: Blink>Input +# WPT-NOTIFY: true nzolghadr@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/uievents/OWNERS b/third_party/blink/web_tests/external/wpt/uievents/OWNERS index e83df7e2..8ad136a 100644 --- a/third_party/blink/web_tests/external/wpt/uievents/OWNERS +++ b/third_party/blink/web_tests/external/wpt/uievents/OWNERS
@@ -1,3 +1,4 @@ # TEAM: input-dev@chromium.org # COMPONENT: Blink>Input +# WPT-NOTIFY: true dtapuska@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/video-raf/META.yml b/third_party/blink/web_tests/external/wpt/video-raf/META.yml deleted file mode 100644 index 44c31874..0000000 --- a/third_party/blink/web_tests/external/wpt/video-raf/META.yml +++ /dev/null
@@ -1,3 +0,0 @@ -spec: https://wicg.github.io/video-rag/ -suggested_reviewers: - - tguilbert \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/video-raf/README.md b/third_party/blink/web_tests/external/wpt/video-raf/README.md deleted file mode 100644 index a527293..0000000 --- a/third_party/blink/web_tests/external/wpt/video-raf/README.md +++ /dev/null
@@ -1,11 +0,0 @@ -# HTMLVideoElement.requestAnimationFrame specification Tests - -The HTMLVideoElement.requestAnimationFrame specification is available here: https://wicg.github.io/video-raf - -GitHub repository: https://github.com/WICG/video-raf - -File an issue: https://github.com/wicg/video-raf/issues/new - -## Status of these tests - -Theses tests are still basic. The specification is still WIP, and rendering tests will be added to ensure consistenty of behavior/timing relative to other [AnimationFrameProviders](https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#animation-frames) (e.g. window.rAF). \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/video-raf/idlharness.window-expected.txt b/third_party/blink/web_tests/external/wpt/video-raf/idlharness.window-expected.txt deleted file mode 100644 index b2638c0..0000000 --- a/third_party/blink/web_tests/external/wpt/video-raf/idlharness.window-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS idl_test setup -PASS idl_test validation -PASS Partial interface HTMLVideoElement: original interface defined -PASS Partial interface HTMLVideoElement: member names are unique -PASS HTMLElement includes GlobalEventHandlers: member names are unique -PASS HTMLElement includes DocumentAndElementEventHandlers: member names are unique -PASS HTMLElement includes ElementContentEditable: member names are unique -PASS HTMLElement includes HTMLOrSVGElement: member names are unique -PASS Element includes ParentNode: member names are unique -PASS Element includes NonDocumentTypeChildNode: member names are unique -PASS Element includes ChildNode: member names are unique -PASS Element includes Slotable: member names are unique -FAIL HTMLVideoElement interface: operation requestVideoFrameCallback(VideoFrameRequestCallback) assert_own_property: interface prototype object missing non-static operation expected property "requestVideoFrameCallback" missing -FAIL HTMLVideoElement interface: operation cancelVideoFrameCallback(unsigned long) assert_own_property: interface prototype object missing non-static operation expected property "cancelVideoFrameCallback" missing -FAIL HTMLVideoElement interface: video must inherit property "requestVideoFrameCallback(VideoFrameRequestCallback)" with the proper type assert_inherits: property "requestVideoFrameCallback" not found in prototype chain -FAIL HTMLVideoElement interface: calling requestVideoFrameCallback(VideoFrameRequestCallback) on video with too few arguments must throw TypeError assert_inherits: property "requestVideoFrameCallback" not found in prototype chain -FAIL HTMLVideoElement interface: video must inherit property "cancelVideoFrameCallback(unsigned long)" with the proper type assert_inherits: property "cancelVideoFrameCallback" not found in prototype chain -FAIL HTMLVideoElement interface: calling cancelVideoFrameCallback(unsigned long) on video with too few arguments must throw TypeError assert_inherits: property "cancelVideoFrameCallback" not found in prototype chain -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame.html b/third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame.html deleted file mode 100644 index 76b986e..0000000 --- a/third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame.html +++ /dev/null
@@ -1,77 +0,0 @@ -<!DOCTYPE html> -<html> -<title>Test the basics of the video.requestAnimationFrame() API.</title> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script src="/common/media.js"></script> -<script> -var testVideo = { - url: getVideoURI('/media/movie_5'), - height: 240, - width: 320, -} - -async_test(function(t) { - let video = document.createElement('video'); - - let id = video.requestAnimationFrame( - t.step_func_done((time, metadata) => { - assert_true(time > 0); - assert_equals(metadata.height, testVideo.height); - assert_equals(metadata.width, testVideo.width); - }) - ); - - assert_true(id > 0); - - video.src = testVideo.url; - video.play(); - -}, 'Test we can register a video.rAF callback.'); - - -async_test(function(t) { - let video = document.createElement('video'); - - let id = video.requestAnimationFrame( - t.step_func(_ => { - assert_unreached("Cancelled callbacks shouldn't be executed") - }) - ); - - video.cancelAnimationFrame(id); - - video.requestAnimationFrame( - t.step_func(_ => { - // At this point, the other callback shouldn't have fired, but - // give it some more time and really make sure it doesn't, by going - // throught the event loop once more. - t.step_timeout(() => { t.done(); }); - }) - ); - - video.src = testVideo.url; - video.play(); -}, 'Test we can cancel a video.rAF request.'); - -test(function(t) { - let video = document.createElement('video'); - - // requestAnimationFrame() expects 1 function as a parameter. - assert_throws_js(TypeError, _ => { video.requestAnimationFrame() } ); - assert_throws_js(TypeError, _ => { video.requestAnimationFrame(0) }); - assert_throws_js(TypeError, _ => { video.requestAnimationFrame("foo") }); - - // cancelAnimationFrame() expects 1 number as a parameter - assert_throws_js(TypeError, _ => { video.cancelAnimationFrame() } ); - - // Invalid calls are just noops - video.cancelAnimationFrame(_ => {}); - video.cancelAnimationFrame(NaN); - video.cancelAnimationFrame("foo"); - video.cancelAnimationFrame(12345); - video.cancelAnimationFrame(-1); - -}, 'Test invalid calls to the video.rAF API.'); -</script> -</html>
diff --git a/third_party/blink/web_tests/external/wpt/video-rvfc/META.yml b/third_party/blink/web_tests/external/wpt/video-rvfc/META.yml new file mode 100644 index 0000000..51048591 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/video-rvfc/META.yml
@@ -0,0 +1,3 @@ +spec: https://wicg.github.io/video-rvfc +suggested_reviewers: + - tguilbert
diff --git a/third_party/blink/web_tests/external/wpt/video-rvfc/README.md b/third_party/blink/web_tests/external/wpt/video-rvfc/README.md new file mode 100644 index 0000000..ab7a353 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/video-rvfc/README.md
@@ -0,0 +1,7 @@ +# HTMLVideoElement.requestVideoFrameCallback specification Tests + +The HTMLVideoElement.requestVideoFrameCallback specification is available here: https://wicg.github.io/video-rvfc + +GitHub repository: https://github.com/WICG/video-rvfc + +File an issue: https://github.com/wicg/video-rvfc/issues/new
diff --git a/third_party/blink/web_tests/external/wpt/video-raf/idlharness.window.js b/third_party/blink/web_tests/external/wpt/video-rvfc/idlharness.window.js similarity index 93% rename from third_party/blink/web_tests/external/wpt/video-raf/idlharness.window.js rename to third_party/blink/web_tests/external/wpt/video-rvfc/idlharness.window.js index cd1e855..71fa6e0a 100644 --- a/third_party/blink/web_tests/external/wpt/video-raf/idlharness.window.js +++ b/third_party/blink/web_tests/external/wpt/video-rvfc/idlharness.window.js
@@ -4,7 +4,7 @@ 'use strict'; idl_test( - ['video-raf'], + ['video-rvfc'], ['html', 'dom'], idl_array => { idl_array.add_objects({
diff --git a/third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame-parallel.html b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-parallel.html similarity index 69% rename from third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame-parallel.html rename to third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-parallel.html index 35fe457..3407786 100644 --- a/third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame-parallel.html +++ b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-parallel.html
@@ -1,6 +1,6 @@ <!DOCTYPE html> <html> -<title>Test having multiple video.rAF callbacks in flight for a single element.</title> +<title>Test having multiple video.rVFC callbacks in flight for a single element.</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/media.js"></script> @@ -12,12 +12,12 @@ let firstTime; let firstMetadata; - video.requestAnimationFrame(t.step_func((time, metadata) => { + video.requestVideoFrameCallback(t.step_func((time, metadata) => { firstTime = time; firstMetadata = metadata; })); - video.requestAnimationFrame(t.step_func_done((time, metadata) => { + video.requestVideoFrameCallback(t.step_func_done((time, metadata) => { assert_equals(firstTime, time); assert_object_equals(firstMetadata, metadata); })); @@ -32,18 +32,18 @@ let secondCallbackId; - video.requestAnimationFrame( - t.step_func(_ => { video.cancelAnimationFrame(secondCallbackId); }) + video.requestVideoFrameCallback( + t.step_func(_ => { video.cancelVideoFrameCallback(secondCallbackId); }) ); - secondCallbackId = video.requestAnimationFrame( + secondCallbackId = video.requestVideoFrameCallback( t.step_func(_ => { assert_unreached("Cancelled callbacks shouldn't be executed") }) ); // NOTE: This callback should be executed last. - video.requestAnimationFrame( + video.requestVideoFrameCallback( t.step_func_done() );
diff --git a/third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame-repeating.html b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-repeating.html similarity index 76% rename from third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame-repeating.html rename to third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-repeating.html index d98f39f9..0f9aa55 100644 --- a/third_party/blink/web_tests/external/wpt/video-raf/video-request-animation-frame-repeating.html +++ b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-repeating.html
@@ -1,6 +1,6 @@ <!DOCTYPE html> <html> -<title>Test repeatedly chaining video.rAF() callbacks.</title> +<title>Test repeatedly chaining video.rVFC() callbacks.</title> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/media.js"></script> @@ -10,19 +10,19 @@ let video = document.createElement('video'); let firstTime; - video.requestAnimationFrame(t.step_func((time) => { + video.requestVideoFrameCallback(t.step_func((time) => { firstTime = time; // Queue up a callback and make sure it's not immediately executed. let secondTime; - video.requestAnimationFrame(t.step_func((time) => { + video.requestVideoFrameCallback(t.step_func((time) => { secondTime = time; assert_greater_than(secondTime, firstTime, "Callbacks should be executed on the next frame"); })) // Queue up a second callback, and make sure it's called at the same time // as the one we just queued up. - video.requestAnimationFrame(t.step_func_done((time) => { + video.requestVideoFrameCallback(t.step_func_done((time) => { assert_equals(time, secondTime, "Callbacks queued together should be called at the same time"); })) @@ -47,15 +47,15 @@ if (--numberOfCallsLeft) { t.done() } else { - video.requestAnimationFrame(t.step_func(frameNumberVerifier)); + video.requestVideoFrameCallback(t.step_func(frameNumberVerifier)); } } - video.requestAnimationFrame(t.step_func(frameNumberVerifier)); + video.requestVideoFrameCallback(t.step_func(frameNumberVerifier)); video.src = getVideoURI('/media/movie_5'); video.play(); -}, 'Test chaining calls to video.rAF.'); +}, 'Test chaining calls to video.rVFC.'); </script> </html>
diff --git a/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback.html b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback.html new file mode 100644 index 0000000..743cbc6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback.html
@@ -0,0 +1,77 @@ +<!DOCTYPE html> +<html> +<title>Test the basics of the video.requestVideoFrameCallback() API.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/media.js"></script> +<script> +var testVideo = { + url: getVideoURI('/media/movie_5'), + height: 240, + width: 320, +} + +async_test(function(t) { + let video = document.createElement('video'); + + let id = video.requestVideoFrameCallback( + t.step_func_done((time, metadata) => { + assert_true(time > 0); + assert_equals(metadata.height, testVideo.height); + assert_equals(metadata.width, testVideo.width); + }) + ); + + assert_true(id > 0); + + video.src = testVideo.url; + video.play(); + +}, 'Test we can register a video.rVFC callback.'); + + +async_test(function(t) { + let video = document.createElement('video'); + + let id = video.requestVideoFrameCallback( + t.step_func(_ => { + assert_unreached("Cancelled callbacks shouldn't be executed") + }) + ); + + video.cancelVideoFrameCallback(id); + + video.requestVideoFrameCallback( + t.step_func(_ => { + // At this point, the other callback shouldn't have fired, but + // give it some more time and really make sure it doesn't, by going + // throught the event loop once more. + t.step_timeout(() => { t.done(); }, 0); + }) + ); + + video.src = testVideo.url; + video.play(); +}, 'Test we can cancel a video.rVFC request.'); + +test(function(t) { + let video = document.createElement('video'); + + // requestVideoFrameCallback() expects 1 function as a parameter. + assert_throws_js(TypeError, _ => { video.requestVideoFrameCallback() } ); + assert_throws_js(TypeError, _ => { video.requestVideoFrameCallback(0) }); + assert_throws_js(TypeError, _ => { video.requestVideoFrameCallback("foo") }); + + // cancelVideoFrameCallback() expects 1 number as a parameter + assert_throws_js(TypeError, _ => { video.cancelVideoFrameCallback() } ); + + // Invalid calls are just no-ops + video.cancelVideoFrameCallback(_ => {}); + video.cancelVideoFrameCallback(NaN); + video.cancelVideoFrameCallback("foo"); + video.cancelVideoFrameCallback(12345); + video.cancelVideoFrameCallback(-1); + +}, 'Test invalid calls to the video.rVFC API.'); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/visual-viewport/OWNERS b/third_party/blink/web_tests/external/wpt/visual-viewport/OWNERS index 36f0255..e7e04516 100644 --- a/third_party/blink/web_tests/external/wpt/visual-viewport/OWNERS +++ b/third_party/blink/web_tests/external/wpt/visual-viewport/OWNERS
@@ -1,3 +1,4 @@ # TEAM: input-dev@chromium.org # COMPONENT: Blink>Input +# WPT-NOTIFY: true bokan@chromium.org
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/update-and-send-events-replacement-expected.txt b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/update-and-send-events-replacement-expected.txt index 3650954..d583a4f 100644 --- a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/update-and-send-events-replacement-expected.txt +++ b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/timelines/update-and-send-events-replacement-expected.txt
@@ -37,7 +37,7 @@ PASS Does NOT remove an animation after making a redundant change to another animation's effect's properties PASS Does NOT remove an animation after making a redundant change to its effect's properties FAIL Updates ALL timelines before checking for replacement promise_test: Unhandled rejection with value: object "TypeError: Cannot assign to read only property 'timeline' of object '#<Animation>'" -FAIL Dispatches remove events after finish events assert_array_equals: lengths differ, expected array ["animA:finish", "animB:finish", "animA:remove"] length 3, got ["animA:finish", "animB:finish", "animA:remove", "animA:finish"] length 4 +PASS Dispatches remove events after finish events FAIL Fires remove event before requestAnimationFrame assert_true: Not expecting event, but got remove event expected true got false PASS Queues all remove events before running them PASS Performs removal in deeply nested iframes
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFReader_scan_filter.https-expected.txt b/third_party/blink/web_tests/external/wpt/web-nfc/NDEFReader_scan_filter.https-expected.txt deleted file mode 100644 index 4a5d00b..0000000 --- a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFReader_scan_filter.https-expected.txt +++ /dev/null
@@ -1,22 +0,0 @@ -This is a testharness.js-based test. -PASS Test that reading data succeed when NDEFScanOptions' recordType is set to 'empty'. -PASS Test that reading data succeed when NDEFScanOptions' recordType is set to 'mime'. -PASS Test that reading data succeed when NDEFScanOptions' recordType is set to 'unknown'. -PASS Test that reading data succeed when NDEFScanOptions' recordType is set to 'text'. -PASS Test that reading data succeed when NDEFScanOptions' recordType is set to 'url'. -PASS Test that reading data succeed when NDEFScanOptions' recordType is set to 'absolute-url'. -PASS Test that reading data succeed when NDEFScanOptions' recordType is set to a custom type for external type records. -PASS Test that the id of NDEFScanOptions filters relevant data sources correctly. -PASS Test that the mediaType of NDEFScanOptions filters relevant data sources correctly. -PASS Test that filtering 'empty' record from different messages correctly with NDEFScanOptions' recordType is set to 'empty'. -PASS Test that filtering 'mime' record from different messages correctly with NDEFScanOptions' recordType is set to 'mime'. -PASS Test that filtering 'unknown' record from different messages correctly with NDEFScanOptions' recordType is set to 'unknown'. -PASS Test that filtering 'text' record from different messages correctly with NDEFScanOptions' recordType is set to 'text'. -PASS Test that filtering 'url' record from different messages correctly with NDEFScanOptions' recordType is set to 'url'. -PASS Test that filtering 'absolute-url' record from different messages correctly with NDEFScanOptions' recordType is set to 'absolute-url'. -PASS Test that filtering external record from different messages correctly with NDEFScanOptions' recordType is set to the custom type. -PASS Test that filtering 'text' record from different messages correctly with NDEFScanOptions' id set. -PASS Test that filtering 'mime' record from different messages correctly with NDEFScanOptions' mediaType set. -FAIL Multiple scan() from the same NDEFReader object with new options should replace existing filters. promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'scan' on 'NDEFReader': There is already a scan() operation ongoing." -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFReader_scan_filter.https.html b/third_party/blink/web_tests/external/wpt/web-nfc/NDEFReader_scan_filter.https.html index 850d9b9..ddb25b87 100644 --- a/third_party/blink/web_tests/external/wpt/web-nfc/NDEFReader_scan_filter.https.html +++ b/third_party/blink/web_tests/external/wpt/web-nfc/NDEFReader_scan_filter.https.html
@@ -176,9 +176,9 @@ assertWebNDEFMessagesEqual(event.message, new NDEFMessage(mimeMsg)); }); - const scanOptions1 = { recordType: "text", signal: signal }; - const scanOptions2 = {recordType: "url", signal: signal }; - const scanOptions3 = {recordType: "mime", signal: signal }; + const scanOptions1 = {recordType: "text", signal: signal}; + const scanOptions2 = {recordType: "url", signal: signal}; + const scanOptions3 = {recordType: "mime", signal: signal}; await reader.scan(scanOptions1); await reader.scan(scanOptions2); @@ -193,4 +193,48 @@ }, "Multiple scan() from the same NDEFReader object with new options should \ replace existing filters."); +nfc_test(async (t, mockNFC) => { + const reader = new NDEFReader(); + const controller1 = new AbortController(); + const controller2 = new AbortController(); + const urlMsg = createMessage([createUrlRecord(test_url_data)]); + const mimeMsg = createMessage([createMimeRecord(test_buffer_data)]); + + const readerWatcher = new EventWatcher(t, reader, ["reading", "error"]); + const promise = readerWatcher.wait_for("reading").then(event => { + assertWebNDEFMessagesEqual(event.message, new NDEFMessage(mimeMsg)); + controller2.abort(); + }); + + const scanOptions1 = {recordType: "url", signal: controller1.signal}; + const scanOptions2 = {recordType: "mime", signal: controller2.signal}; + + // There is maximum one filter for an NDEFReader object, + // last filter will replace all previous ones. + await reader.scan(scanOptions1); + await reader.scan(scanOptions2); + + mockNFC.setReadingMessage(urlMsg); + + controller1.abort(); + + mockNFC.setReadingMessage(mimeMsg); + await promise; +}, "Aborting on previous signal should not stop current reading for multiple \ +scan() with different signals."); + +nfc_test(async (t, mockNFC) => { + const reader = new NDEFReader(); + const controller = new AbortController(); + const scanOptions1 = {recordType: "url", signal: controller.signal }; + const scanOptions2 = {recordType: "mime"}; + + await reader.scan(scanOptions1); + const promise = reader.scan(scanOptions2); + controller.abort(); + + await promise_rejects_dom(t, 'AbortError', promise); +}, "Aborting on previous signal can stop current reading if no new signals \ +passed to successive scan()."); + </script>
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/k-rate-audiobuffersource-connections.html b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/k-rate-audiobuffersource-connections.html new file mode 100644 index 0000000..0b94bd7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/k-rate-audiobuffersource-connections.html
@@ -0,0 +1,164 @@ +<!doctype html> +<html> + <head> + <title>k-rate AudioParams with inputs for AudioBufferSourceNode</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/webaudio/resources/audit.js"></script> + <script src="/webaudio/resources/audit-util.js"></script> + </head> + + <body> + <script> + let audit = Audit.createTaskRunner(); + + // Fairly abitrary sampleRate and somewhat duration + const sampleRate = 8000; + const testDuration = 0.25; + + [['playbackRate', [1, 0], [2, testDuration]], + ['detune', [-1200, 0], [1200, testDuration]]] + .forEach(param => { + audit.define( + {label: param[0], description: `AudioBufferSource ${param[0]}`}, + async (task, should) => { + await doTest(should, { + prefix: task.label, + paramName: param[0], + startValue: param[1], + endValue: param[2] + }); + task.done(); + }); + }); + + audit.run(); + + async function doTest(should, options) { + // Test k-rate automation of AudioBufferSourceNode with connected + // input. + // + // A reference source node is created with an automation on the + // selected AudioParam. For simplicity, we just use a linear ramp from + // the minValue to the maxValue of the AudioParam. + // + // The test node has an input signal connected to the AudioParam. This + // input signal is created to match the automation on the reference + // node. + // + // Finally, the output from the two nodes must be identical if k-rate + // inputs are working correctly. + // + // Options parameter is a dictionary with the following required + // members: + // prefix - prefix to use for the messages. + // paramName - Name of the AudioParam to be tested + + let {prefix, paramName, startValue, endValue} = options; + + let context = new OfflineAudioContext({ + numberOfChannels: 2, + sampleRate: sampleRate, + length: testDuration * sampleRate + }); + + let merger = new ChannelMergerNode( + context, {numberOfInputs: context.destination.channelCount}); + merger.connect(context.destination); + + // Linear ramp to use for the buffer sources + let ramp = createLinearRampBuffer(context, context.length); + + // Create the reference and test nodes. + let refNode; + let tstNode; + + const nodeOptions = {buffer: ramp}; + + should( + () => refNode = new AudioBufferSourceNode(context, nodeOptions), + `${prefix}: refNode = new AudioBufferSourceNode(context, ${ + JSON.stringify(nodeOptions)})`) + .notThrow(); + + should( + () => tstNode = new AudioBufferSourceNode(context, nodeOptions), + `${prefix}: tstNode = new AudioBufferSourceNode(context, ${ + JSON.stringify(nodeOptions)})`) + .notThrow(); + + + // Automate the AudioParam of the reference node with a linear ramp + should( + () => refNode[paramName].setValueAtTime(...startValue), + `${prefix}: refNode[${paramName}].setValueAtTime(${ + startValue[0]}, ${startValue[1]})`) + .notThrow(); + + should( + () => refNode[paramName].linearRampToValueAtTime(...endValue), + `${prefix}: refNode[${paramName}].linearRampToValueAtTime(${ + endValue[0]}, ${endValue[1]})`) + .notThrow(); + + + // Create the input node and automate it so that it's output when added + // to the intrinsic value of the AudioParam we get the same values as + // the automations on the reference node. + + // Compute the start and end values based on the defaultValue of the + // param and the desired startValue and endValue. The input is added to + // the intrinsic value of the AudioParam, so we need to account for + // that. + + let mod; + should( + () => mod = new ConstantSourceNode(context, {offset: 0}), + `${prefix}: mod = new ConstantSourceNode(context, {offset: 0})`) + .notThrow(); + + let modStart = startValue[0] - refNode[paramName].defaultValue; + let modEnd = endValue[0] - refNode[paramName].defaultValue; + should( + () => mod.offset.setValueAtTime(modStart, startValue[1]), + `${prefix}: mod.offset.setValueAtTime(${modStart}, ${ + startValue[1]})`) + .notThrow(); + should( + () => mod.offset.linearRampToValueAtTime(modEnd, endValue[1]), + `${prefix}: mod.offset.linearRampToValueAtTime(${modEnd}, ${ + endValue[1]})`) + .notThrow(); + + // Connect up everything. + should( + () => mod.connect(tstNode[paramName]), + `${prefix}: mod.connect(tstNode[${paramName}])`) + .notThrow(); + + refNode.connect(merger, 0, 0); + tstNode.connect(merger, 0, 1); + + // Go! + refNode.start(); + tstNode.start(); + mod.start(); + + const buffer = await context.startRendering(); + let expected = buffer.getChannelData(0); + let actual = buffer.getChannelData(1); + + // Quick sanity check that output isn't zero. This means we messed up + // the connections or automations or the buffer source. + should(expected, `Expected k-rate ${paramName} AudioParam with input`) + .notBeConstantValueOf(0); + should(actual, `Actual k-rate ${paramName} AudioParam with input`) + .notBeConstantValueOf(0); + + // The expected and actual results must be EXACTLY the same. + should(actual, `k-rate ${paramName} AudioParam with input`) + .beCloseToArray(expected, {absoluteThreshold: 0}); + } + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/k-rate-delay-connections.html b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/k-rate-delay-connections.html new file mode 100644 index 0000000..fcf66f2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audioparam-interface/k-rate-delay-connections.html
@@ -0,0 +1,156 @@ +<!doctype html> +<html> + <head> + <title>k-rate AudioParams with inputs for DelayNode</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/webaudio/resources/audit.js"></script> + <script src="/webaudio/resources/audit-util.js"></script> + </head> + + <body> + <script> + let audit = Audit.createTaskRunner(); + + // Power-of-two to eliminate round-off in computing time and frames, but + // is otherwise arbitrary. + const sampleRate = 8192; + + // Arbitrary duration except it must be greater than or equal to 1. + const testDuration = 1.5; + + audit.define( + {label: 'delayTime', description: `DelayNode delayTime k-rate input`}, + async (task, should) => { + // Two channels: 0 = test result, 1 = expected result. + let context = new OfflineAudioContext({ + numberOfChannels: 2, + sampleRate: sampleRate, + length: testDuration * sampleRate + }); + + let merger = new ChannelMergerNode( + context, {numberOfInputs: context.destination.channelCount}); + merger.connect(context.destination); + + // Test the DelayNode by having a reference node (refNode) that uses + // k-rate automations of delayTime. The test node (testNode) sets + // delayTime to k-rate with a connected input that has the same + // automation vlaues as the reference node. The test passes if the + // output from each node is identical to each other. + + // Just some non-constant source. + let src = new OscillatorNode(context); + + // The end value and time for the linear ramp. These values are + // chosen so that the delay advances faster than real time. + let endValue = 1.125; + let endTime = 1; + + let refNode; + + should( + () => refNode = new DelayNode(context), + `refNode = new DelayNode(context)`) + .notThrow(); + + should( + () => refNode.delayTime.automationRate = 'k-rate', + `refNode.delayTime.automationRate = 'k-rate'`) + .notThrow(); + + should( + () => refNode.delayTime.setValueAtTime(0, 0), + `refNode.delayTime.setValueAtTime(0, 0)`) + .notThrow(); + + should( + () => refNode.delayTime.linearRampToValueAtTime( + endValue, endTime), + `refNode.delayTime.linearRampToValueAtTime(${endValue}, ${ + endTime})`) + .notThrow(); + + let testNode; + + should( + () => testNode = new DelayNode(context), + `testNode = new DelayNode(context)`) + .notThrow(); + + should( + () => testNode.delayTime.automationRate = 'k-rate', + `testNode.delayTime.automationRate = 'k-rate'`) + .notThrow(); + + let testMod; + + should( + () => testMod = new ConstantSourceNode(context), + `testMod = new ConstantSourceNode(context)`) + .notThrow(); + + should( + () => testMod.offset.setValueAtTime(0, 0), + `testMod.offset.setValueAtTime(0, 0)`) + .notThrow(); + + should( + () => testMod.offset.linearRampToValueAtTime(endValue, endTime), + `testMod.offset.linearRampToValueAtTime(${endValue}, ${ + endTime})`) + .notThrow(); + + should( + () => testMod.connect(testNode.delayTime), + `testMod.connect(testNode.delayTime)`) + .notThrow(); + + // Connect up everything and go! + src.connect(testNode).connect(merger, 0, 0); + src.connect(refNode).connect(merger, 0, 1); + + src.start(); + testMod.start(); + + const buffer = await context.startRendering(); + let expected = buffer.getChannelData(0); + let actual = buffer.getChannelData(1); + + // Quick sanity check that output isn't zero. This means we messed + // up the connections or automations or the buffer source. + should(expected, `Expected k-rate delayTime AudioParam with input`) + .notBeConstantValueOf(0); + should(actual, `Actual k-rate delayTime AudioParam with input`) + .notBeConstantValueOf(0); + + // Quick sanity check. The amount of delay after one render is + // endValue * 128 / sampleRate. But after 1 render, time has + // advanced 128/sampleRate. Hence, the delay exceeds the time by + // (endValue - 1)*128/sampleRate sec or (endValue - 1)*128 frames. + // This means the output must be EXACTLY zero for this many frames + // in the second render. + let zeroFrames = (endValue - 1) * RENDER_QUANTUM_FRAMES; + should( + actual.slice( + RENDER_QUANTUM_FRAMES, RENDER_QUANTUM_FRAMES + zeroFrames), + `output[${RENDER_QUANTUM_FRAMES}, ${ + RENDER_QUANTUM_FRAMES + zeroFrames - 1}]`) + .beConstantValueOf(0); + should( + actual.slice( + RENDER_QUANTUM_FRAMES + zeroFrames, + 2 * RENDER_QUANTUM_FRAMES), + `output[${RENDER_QUANTUM_FRAMES + zeroFrames}, ${ + 2 * RENDER_QUANTUM_FRAMES - 1}]`) + .notBeConstantValueOf(0); + + // The expected and actual results must be EXACTLY the same. + should(actual, `k-rate delayTime AudioParam with input`) + .beCloseToArray(expected, {absoluteThreshold: 0}); + }); + + audit.run(); + </script> + </body> + </html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/__init__.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/__init__.py index fda74ce..a7b33cc 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/support/__init__.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/support/__init__.py
@@ -3,6 +3,10 @@ from .merge_dictionaries import merge_dictionaries platform_name = { + # From Python version 3.3: On Linux, sys.platform doesn't contain the major version anymore. + # It is always 'linux'. See + # https://docs.python.org/3/library/sys.html#sys.platform + "linux": "linux", "linux2": "linux", "win32": "windows", "cygwin": "windows",
diff --git a/third_party/blink/web_tests/external/wpt/webxr/ar-module/idlharness.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/webxr/ar-module/idlharness.https.window-expected.txt deleted file mode 100644 index 5998a2b3..0000000 --- a/third_party/blink/web_tests/external/wpt/webxr/ar-module/idlharness.https.window-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -This is a testharness.js-based test. -PASS idl_test setup -PASS idl_test validation -PASS Partial interface XRSession: original interface defined -PASS Partial interface XRSession: member names are unique -PASS Partial interface XRSession[2]: original interface defined -PASS Partial interface XRSession[2]: member names are unique -PASS XRSession interface: attribute environmentBlendMode -FAIL XRSession interface: attribute interactionMode assert_true: The prototype object must have a property "interactionMode" expected true got false -PASS XRSession interface: xrSession must inherit property "environmentBlendMode" with the proper type -FAIL XRSession interface: xrSession must inherit property "interactionMode" with the proper type assert_inherits: property "interactionMode" not found in prototype chain -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html index 15eac78..e6f7a9d4 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html
@@ -106,6 +106,7 @@ let watcherDone = new Event("watcherdone"); let testInput = function(overlayElement, session, fakeDeviceController, t) { + let debug = xr_debug.bind(this, 'testInput'); // Use two DIVs for this test. "inner_a" uses a "beforexrselect" handler // that uses preventDefault(). Controller interactions with it should trigger @@ -135,30 +136,38 @@ fakeDeviceController.simulateInputSourceConnection(SCREEN_CONTROLLER); session.requestReferenceSpace('viewer').then(function(viewerSpace) { // Press the primary input button and then release it a short time later. + debug('got viewerSpace'); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 1'); input_source.setOverlayPointerPosition(inner_a.offsetLeft + 1, inner_a.offsetTop + 1); input_source.startSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 2'); input_source.endSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 3'); // Need to process one more frame to allow select to propagate. session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 4'); session.dispatchEvent(watcherStep); assert_true(got_beforexrselect); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 5'); input_source.setOverlayPointerPosition(inner_b.offsetLeft + 1, inner_b.offsetTop + 1); input_source.startSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 6'); input_source.endSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 7'); // Need to process one more frame to allow select to propagate. session.dispatchEvent(watcherDone); }); @@ -173,6 +182,8 @@ }; let testCrossOriginContent = function(overlayElement, session, fakeDeviceController, t) { + let debug = xr_debug.bind(this, 'testCrossOriginContent'); + let iframe = document.getElementById('iframe'); assert_true(iframe != null); let inner_b = document.getElementById('inner_b'); @@ -192,27 +203,34 @@ session.requestReferenceSpace('viewer').then(function(viewerSpace) { // Press the primary input button and then release it a short time later. session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 1'); input_source.setOverlayPointerPosition(iframe.offsetLeft + 1, iframe.offsetTop + 1); input_source.startSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 2'); input_source.endSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 3'); // Need to process one more frame to allow select to propagate. session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 4'); session.dispatchEvent(watcherStep); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 5'); input_source.setOverlayPointerPosition(inner_b.offsetLeft + 1, inner_b.offsetTop + 1); input_source.startSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 6'); input_source.endSelection(); session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 7'); // Need to process one more frame to allow select to propagate. session.dispatchEvent(watcherDone); });
diff --git a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html index 406efe8..820dd71 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html
@@ -35,6 +35,7 @@ views: VALID_VIEWS, viewerOrigin: IDENTITY_TRANSFORM, supportedFeatures: ALL_FEATURES, + world: createFakeWorld(5.0, 2.0, 5.0), // see webxr_test_constants_fake_world.js for details }; const hitTestOptionsInit = { @@ -58,40 +59,54 @@ const iframe = document.getElementById('iframe'); const inner_b = document.getElementById('inner_b'); + let debug = xr_debug.bind(this, 'testCrossOriginContent'); + const input_source = fakeDeviceController.simulateInputSourceConnection(screen_controller_init); + debug('start'); return session.requestReferenceSpace('viewer').then(function(viewerSpace) { + debug('got viewerSpace'); return session.requestHitTestSourceForTransientInput(hitTestOptionsInit) .then((hitTestSource) => { - // Press the primary input button and then release it a short time later. - session.requestAnimationFrame((time, xrFrame) => { - input_source.setOverlayPointerPosition(iframe.offsetLeft + 1, - iframe.offsetTop + 1); - input_source.startSelection(); - + debug('got hitTestSource'); + return new Promise((resolve) => { + // Press the primary input button and then release it a short time later. session.requestAnimationFrame((time, xrFrame) => { - input_source.endSelection(); - - // There should be no results for transient input for cross origin content: - const results = xrFrame.getHitTestResultsForTransientInput(hitTestSource); - t.step(() => { - assert_true(results.length === 0, "Hit test results should be suppressed for cross-origin content"); - }); + debug('got rAF 1'); + input_source.setOverlayPointerPosition(iframe.offsetLeft + 1, + iframe.offsetTop + 1); + input_source.startSelection(); session.requestAnimationFrame((time, xrFrame) => { - // Need to process one more frame to allow select to propagate + input_source.endSelection(); + + // There should be no results for transient input for cross origin content: + const results = xrFrame.getHitTestResultsForTransientInput(hitTestSource); + t.step(() => { + assert_equals(results.length, 0, "Hit test results should be suppressed for cross-origin content"); + }); session.requestAnimationFrame((time, xrFrame) => { - input_source.setOverlayPointerPosition(inner_b.offsetLeft + 1, - inner_b.offsetTop + 1); - input_source.startSelection(); + debug('got rAF 2'); + // Need to process one more frame to allow select to propagate session.requestAnimationFrame((time, xrFrame) => { - input_source.endSelection(); + debug('got rAF 3'); + input_source.setOverlayPointerPosition(inner_b.offsetLeft + 1, + inner_b.offsetTop + 1); + input_source.startSelection(); - const results = xrFrame.getHitTestResultsForTransientInput(hitTestSource); - t.step(() => { - assert_true(results.length === 1, "Hit test results should not be for cross-origin content"); + session.requestAnimationFrame((time, xrFrame) => { + debug('got rAF 4'); + input_source.endSelection(); + + const results = xrFrame.getHitTestResultsForTransientInput(hitTestSource); + t.step(() => { + // TODO(bialpio): this assertion is currently failing, FIXME + assert_equals(results.length, 1, "Hit test results should be available for same-origin content"); + }); + debug('resolving'); + resolve(); }); }); });
diff --git a/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html b/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html index 201a9b72..d3f83da 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html
@@ -16,9 +16,12 @@ }; let testFunction = function(session, fakeDeviceController, t) { + let debug = xr_debug.bind(this, 'testFunction'); return session.requestReferenceSpace('local') .then((referenceSpace) => new Promise((resolve, reject) => { + debug('refSpace promise'); function CheckPositionNotEmulated(time, vrFrame){ + debug('rAF 1: checkPositionNotEmulated'); t.step(() => { let pose = vrFrame.getViewerPose(referenceSpace); assert_not_equals(pose, null); @@ -30,6 +33,7 @@ } function CheckPositionEmulated(time, vrFrame) { + debug('rAF 2: checkPositionEmulated'); t.step(() => { let pose = vrFrame.getViewerPose(referenceSpace); assert_not_equals(pose, null); @@ -37,6 +41,7 @@ }); // Finished. + debug('resolve'); resolve(); }
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html index 5d8b0322..fdfadc5b 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html +++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html
@@ -52,11 +52,13 @@ // Null entries in the array mean that the given entry will not be validated. let testFunctionGenerator = function(ray, expectedPoses, inputFromPointer, nextFrameExpectedPoses) { const testFunction = function(session, fakeDeviceController, t) { + let debug = xr_debug.bind(this, 'testFunction'); return session.requestReferenceSpace('local').then((localRefSpace) => new Promise((resolve, reject) => { const input_source_controller = fakeDeviceController.simulateInputSourceConnection(screen_controller_init); session.requestAnimationFrame((time, frame) => { + debug('rAF 1'); t.step(() => { assert_equals(session.inputSources.length, 1); }); @@ -74,6 +76,7 @@ // We got a hit test source, now get the results in subsequent rAFcb: session.requestAnimationFrame((time, frame) => { + debug('rAF 2'); const results = frame.getHitTestResultsForTransientInput(hitTestSource); t.step(() => { @@ -92,6 +95,7 @@ input_source_controller.setPointerOrigin(inputFromPointer, false); session.requestAnimationFrame((time, frame) => { + debug('rAF 3'); const results = frame.getHitTestResultsForTransientInput(hitTestSource); t.step(() => { @@ -105,6 +109,7 @@ } }); + debug('resolving'); resolve(); }); });
diff --git a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js index 72a21c0f..c9f7e81b 100644 --- a/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js +++ b/third_party/blink/web_tests/external/wpt/webxr/resources/webxr_util.js
@@ -7,13 +7,19 @@ // // --enable-blink-features=MojoJS,MojoJSTest +// Debugging message helper, by default does nothing. Implementations can +// override this. +var xr_debug = function(name, msg) {} + function xr_promise_test(name, func, properties) { promise_test(async (t) => { // Perform any required test setup: + xr_debug(name, 'setup'); if (window.XRTest === undefined) { // Chrome setup await loadChromiumResources; + xr_debug = navigator.xr.test.Debug; } // Ensure that any devices are disconnected when done. If this were done in @@ -22,9 +28,11 @@ // interfere with the next test. t.add_cleanup(async () => { // Ensure system state is cleaned up. + xr_debug(name, 'cleanup'); await navigator.xr.test.disconnectAllDevices(); }); + xr_debug(name, 'main'); return func(t); }, name, properties); } @@ -74,9 +82,12 @@ }) .then(() => new Promise((resolve, reject) => { // Perform the session request in a user gesture. + xr_debug(name, 'simulateUserActivation'); navigator.xr.test.simulateUserActivation(() => { + xr_debug(name, 'document.hasFocus()=' + document.hasFocus()); navigator.xr.requestSession(sessionMode, sessionInit || {}) .then((session) => { + xr_debug(name, 'session start'); testSession = session; session.mode = sessionMode; let glLayer = new XRWebGLLayer(session, gl, gllayerProperties); @@ -87,9 +98,11 @@ baseLayer: glLayer }); sessionObjects.glLayer = glLayer; + xr_debug(name, 'session.visibilityState=' + session.visibilityState); resolve(func(session, testDeviceController, t, sessionObjects)); }) .catch((err) => { + xr_debug(name, 'error: ' + err); reject( 'Session with params ' + JSON.stringify(sessionMode) +
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-distribution-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/flex-content-distribution-expected.txt deleted file mode 100644 index 649e45e9..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-distribution-expected.txt +++ /dev/null
@@ -1,25 +0,0 @@ -This test checks that freeSpace is properly computed after computing fr tracks so that we could use it for content distribution - -Grid with justify-content: start. - -PASS - -Grid with justify-content: center. - -PASS - -Grid with justify-content: end. - -PASS - -Grid with align-content: start. - -PASS - -Grid with align-content: center. - -PASS - -Grid with align-content: end. - -PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-columns-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-columns-expected.txt deleted file mode 100644 index d60e5633..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-columns-expected.txt +++ /dev/null
@@ -1,19 +0,0 @@ -Test that resolving auto tracks on grid items works properly. - -XXX -XXXXX -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-rows-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-rows-expected.txt deleted file mode 100644 index 35c5cea..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-content-resolution-rows-expected.txt +++ /dev/null
@@ -1,36 +0,0 @@ -Test that resolving auto tracks on grid items works properly. - -X -X -X -X -X -X -X -X -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS -PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/flex-factor-sum-less-than-1-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/flex-factor-sum-less-than-1-expected.txt deleted file mode 100644 index 01cbaf1c..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/flex-factor-sum-less-than-1-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -Test that resolving auto tracks on grid items works properly. - -PASS -PASS -PASS -PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/float-not-protruding-into-next-grid-item.html b/third_party/blink/web_tests/fast/css-grid-layout/float-not-protruding-into-next-grid-item.html deleted file mode 100644 index 8e4f1327..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/float-not-protruding-into-next-grid-item.html +++ /dev/null
@@ -1,38 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<link href="../css-intrinsic-dimensions/resources/width-keyword-classes.css" rel="stylesheet"> -<link href="resources/grid.css" rel="stylesheet"> -<style> -.grid { - grid-auto-columns: minmax(50px, max-content); - grid-auto-rows: minmax(50px, max-content); -} - -.floatChild { - float: left; - clear: both; -} - -</style> -</style> -</head> - -<body> - -<div>This test checks that grid item sets a new formatting context for its content, preventing any 'float' protruding content on the adjoining grid item ('Float' text shouldn't overflow the first row).</div> - -<div class="grid fit-content"> - <div class="firstRowFirstColumn"> - <div class="floatChild">Float</div> - <div class="floatChild">Float</div> - <div class="floatChild">Float</div> - <div class="floatChild">Float</div> - </div> - <div class="firstRowSecondColumn"></div> - <div class="secondRowFirstColumn"></div> - <div class="secondRowSecondColumn"></div> -</div> - -</body> -</html>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-expected.txt b/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-expected.txt deleted file mode 100644 index 341ecbd..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margin-auto-columns-rows-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This test checks that the grid's rows and columns 'auto' sizes are updated accordingly to its grid-item's before and start margins. -PASS -PASS -PASS -PASS
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margins-not-collapse.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margins-not-collapse.html deleted file mode 100644 index afccbd3..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/grid-item-margins-not-collapse.html +++ /dev/null
@@ -1,10 +0,0 @@ -<!DOCTYPE html> -<link href="resources/grid.css" rel="stylesheet"> - -<div>This test checks that grid item's margins do not collapse with its content's margins (single margin in the first row and double between subsequent).</div> - -<div style="display: grid;"> - <div><p>XXXXX</p></div> - <div style="margin:20px 0px;">XXXXX</div> - <div><p>XXXXX</p></div> -</div>
diff --git a/third_party/blink/web_tests/fast/css-grid-layout/grid-template-areas-must-keep-named-columns-order.html b/third_party/blink/web_tests/fast/css-grid-layout/grid-template-areas-must-keep-named-columns-order.html deleted file mode 100644 index 90e280fc..0000000 --- a/third_party/blink/web_tests/fast/css-grid-layout/grid-template-areas-must-keep-named-columns-order.html +++ /dev/null
@@ -1,23 +0,0 @@ -<!DOCTYPE html> -<style> -.grid { - display: inline-grid; - background: grey; - grid-template-columns: [col] 50px [col] 50px [col] 50px [col] 50px; - grid-auto-rows: 50px; - grid-template-areas: "A . . ."; -} -.grid > :nth-child(1) { background: magenta; } -.grid > :nth-child(2) { background: blue; } -.grid > :nth-child(3) { background: yellow; } -.grid > :nth-child(4) { background: green; } -.grid > :nth-child(5) { background: red; } -</style> -<p>This is a regression test for the issue crbug.com/733577 and it passes if the red item is positioned in the first column of the second row, since the spec states that we must select the first one among several equally named grid lines.</p> -<div class="grid"> - <div></div> - <div></div> - <div></div> - <div></div> - <div style="grid-column: col"></div> -</div>
diff --git a/third_party/blink/web_tests/fast/dom/HTMLAnchorElement/resources/iframe-with-anchor.html b/third_party/blink/web_tests/fast/dom/HTMLAnchorElement/resources/iframe-with-anchor.html index 4e68fb0..ca653228 100644 --- a/third_party/blink/web_tests/fast/dom/HTMLAnchorElement/resources/iframe-with-anchor.html +++ b/third_party/blink/web_tests/fast/dom/HTMLAnchorElement/resources/iframe-with-anchor.html
@@ -10,8 +10,8 @@ function run() { if (window.eventSender) { var anchor = document.getElementById("start"); - var x = window.frameElement.offsetLeft + anchor.offsetLeft + 2; - var y = window.frameElement.offsetTop + anchor.offsetTop + 2; + var x = anchor.offsetLeft + 2; + var y = anchor.offsetTop + 2; eventSender.mouseMoveTo(x, y); eventSender.mouseDown(); eventSender.mouseUp();
diff --git a/third_party/blink/web_tests/fast/events/resources/drag-and-drop-autoscroll-frame.js b/third_party/blink/web_tests/fast/events/resources/drag-and-drop-autoscroll-frame.js index 83eb3a39b..4a1cbb5 100644 --- a/third_party/blink/web_tests/fast/events/resources/drag-and-drop-autoscroll-frame.js +++ b/third_party/blink/web_tests/fast/events/resources/drag-and-drop-autoscroll-frame.js
@@ -1,26 +1,5 @@ function $(id) { return document.getElementById(id); } -// Convert client coordinates in this frame into client coordinates of the root -// frame, usable with event sender. -function toRootWindow(rect) { - var w = window; - var curRect = { - left: rect.left, - top: rect.top, - right: rect.right, - bottom: rect.bottom - }; - while(w.parent != w) { - var frameRect = w.frameElement.getBoundingClientRect(); - curRect.left += frameRect.left; - curRect.right += frameRect.left; - curRect.top += frameRect.top; - curRect.bottom += frameRect.top; - w = window.parent; - } - return curRect -} - var lastScrollLeft; var lastScrollTop; @@ -48,8 +27,6 @@ }; } - scrollerRect = toRootWindow(scrollerRect); - var eastX = scrollerRect.right - scrollBarWidth - 10; var northY = scrollerRect.top + 10; var southY= scrollerRect.bottom - scrollBarHeight - 10; @@ -146,7 +123,7 @@ eventSender.dragMode = false; // Grab draggable - const draggable_rect = toRootWindow(draggable.getBoundingClientRect()); + const draggable_rect = draggable.getBoundingClientRect(); eventSender.mouseMoveTo(draggable_rect.left + 5, draggable_rect.top + 5); eventSender.mouseDown(); };
diff --git a/third_party/blink/web_tests/fast/events/resources/drag-outside-window-frame.html b/third_party/blink/web_tests/fast/events/resources/drag-outside-window-frame.html index 4b6b9775..ba9b6c0f 100644 --- a/third_party/blink/web_tests/fast/events/resources/drag-outside-window-frame.html +++ b/third_party/blink/web_tests/fast/events/resources/drag-outside-window-frame.html
@@ -15,9 +15,9 @@ if (!window.testRunner) return; testRunner.dumpAsText(); - eventSender.mouseMoveTo(150, 100); - eventSender.mouseDown(); eventSender.mouseMoveTo(50, 100); + eventSender.mouseDown(); + eventSender.mouseMoveTo(-50, 100); eventSender.mouseUp(); alert("Test result: " + result); }
diff --git a/third_party/blink/web_tests/fast/events/resources/mouse-events-within-no-element-iframe.html b/third_party/blink/web_tests/fast/events/resources/mouse-events-within-no-element-iframe.html index ab91863..1a8659114 100644 --- a/third_party/blink/web_tests/fast/events/resources/mouse-events-within-no-element-iframe.html +++ b/third_party/blink/web_tests/fast/events/resources/mouse-events-within-no-element-iframe.html
@@ -28,13 +28,16 @@ <p id="description"></p> <div id="console"></div> <script> - var div = document.getElementById("test"); - var x = div.offsetLeft + 100; - var y = div.offsetTop - window.pageYOffset + 1; var events = []; var targets = []; window.scrollTo(0, 200); + + // A position over to the right of <button> and #test. + var button = document.getElementById("test").children[0]; + var x = button.getBoundingClientRect().right + 1; + var y = button.getBoundingClientRect().top; + if (window.eventSender) { function appendEventLog(e) { events.push(e.type);
diff --git a/third_party/blink/web_tests/fast/events/simulated-click-coords.html b/third_party/blink/web_tests/fast/events/simulated-click-coords.html index 92a81b87..b9a64a0 100644 --- a/third_party/blink/web_tests/fast/events/simulated-click-coords.html +++ b/third_party/blink/web_tests/fast/events/simulated-click-coords.html
@@ -36,8 +36,8 @@ if (!window.eventSender) return; var rect = element.getBoundingClientRect(); - var x = rect.left + rect.width / 2; - var y = rect.top + rect.height / 2; + var x = Math.floor(rect.left + rect.width / 2); + var y = Math.floor(rect.top + rect.height / 2); eventSender.mouseMoveTo(x, y); eventSender.mouseDown(); eventSender.mouseUp();
diff --git a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-insertable-streams-audio.html b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-insertable-streams-audio.html index 72d110bd..225366f 100644 --- a/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-insertable-streams-audio.html +++ b/third_party/blink/web_tests/fast/peerconnection/RTCPeerConnection-insertable-streams-audio.html
@@ -22,7 +22,10 @@ } function areFrameInfosEqual(frame1, frame2) { - return areArrayBuffersEqual(frame1.data, frame2.data); + return frame1.type === frame2.type && + frame1.synchronizationSource === frame2.synchronizationSource && + frame1.timestamp === frame2.timestamp && + areArrayBuffersEqual(frame1.data, frame2.data); } async function doInverseSignalingHandshake(pc1, pc2) { @@ -98,7 +101,12 @@ // Pass frames as they come from the encoder. for (let i = 0; i < numFramesPassthrough; i++) { const result = await senderReader.read() - frameInfos.push({data: result.value.data}); + frameInfos.push({ + data: result.value.data, + synchronizationSource: result.value.synchronizationSource, + timestamp: result.value.timestamp, + type: result.value.type, + }); senderWriter.write(result.value); } @@ -111,7 +119,12 @@ int8View.fill(i); result.value.data = buffer; - frameInfos.push({data: result.value.data}); + frameInfos.push({ + data: result.value.data, + synchronizationSource: result.value.synchronizationSource, + timestamp: result.value.timestamp, + type: result.value.type, + }); senderWriter.write(result.value); } @@ -121,7 +134,12 @@ const int8View = new Int8Array(result.value.data); int8View.fill(i); - frameInfos.push({data: result.value.data}); + frameInfos.push({ + data: result.value.data, + synchronizationSource: result.value.synchronizationSource, + timestamp: result.value.timestamp, + type: result.value.type, + }); senderWriter.write(result.value); }
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/color-matching/image-color-matching-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/color-matching/image-color-matching-expected.png deleted file mode 100644 index e6fa227..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/color-matching/image-color-matching-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/visibility/visibility-image-layers-expected.png deleted file mode 100644 index d515bc0..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/compositing/visibility/visibility-image-layers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/color-profile-image-canvas-pattern-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/color-profile-image-canvas-pattern-expected.png new file mode 100644 index 0000000..7f17d0f --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/color-profile-image-canvas-pattern-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-canvas-expected.png new file mode 100644 index 0000000..4b949f6 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-image-expected.png new file mode 100644 index 0000000..4b949f6 --- /dev/null +++ b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/optimize-contrast-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/yuv-decode-eligible/color-profile-layer-expected.png b/third_party/blink/web_tests/flag-specific/composite-after-paint/images/yuv-decode-eligible/color-profile-layer-expected.png deleted file mode 100644 index 2a70653..0000000 --- a/third_party/blink/web_tests/flag-specific/composite-after-paint/images/yuv-decode-eligible/color-profile-layer-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt index a482b37..4492d200a 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/compositing/visibility/visibility-image-layers-dynamic-expected.txt
@@ -23,15 +23,9 @@ { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 3 }, { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 4 - }, - { "name": "ContentsLayer for Vertical Scrollbar Layer", "position": [785, 0], "bounds": [15, 600], @@ -66,17 +60,6 @@ [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 4, - "parent": 3, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] } @@ -86,7 +69,7 @@ "layers": [ { "name": "Scrolling Contents Layer", - "bounds": [785, 1942], + "bounds": [785, 1670], "contentsOpaque": true, "backgroundColor": "#FFFFFF" }, @@ -99,31 +82,19 @@ { "name": "LayoutImage IMG class='hidden composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 2 }, { - "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'", - "bounds": [184, 124], - "transform": 3 - }, - { "name": "LayoutBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 153], "drawsContent": false, - "transform": 4 + "transform": 3 }, { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 5 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 6 + "transform": 4 }, { "name": "ContentsLayer for Vertical Scrollbar Layer", @@ -154,17 +125,6 @@ }, { "id": 3, - "parent": 2, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 4, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -173,25 +133,14 @@ ] }, { - "id": 5, - "parent": 4, + "id": 4, + "parent": 3, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 6, - "parent": 5, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] } @@ -201,7 +150,7 @@ "layers": [ { "name": "Scrolling Contents Layer", - "bounds": [785, 3769], + "bounds": [785, 2953], "contentsOpaque": true, "backgroundColor": "#FFFFFF" }, @@ -214,48 +163,30 @@ { "name": "LayoutImage IMG class='hidden composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 2 }, { - "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'", - "bounds": [184, 124], - "transform": 3 - }, - { "name": "LayoutBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 153], - "transform": 4 + "transform": 3 }, { "name": "LayoutImage IMG class='composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 5 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='composited box'", - "bounds": [184, 124], - "transform": 6 + "transform": 4 }, { "name": "LayoutBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 153], "drawsContent": false, - "transform": 7 + "transform": 5 }, { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 8 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 9 + "transform": 6 }, { "name": "ContentsLayer for Vertical Scrollbar Layer", @@ -286,17 +217,6 @@ }, { "id": 3, - "parent": 2, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 4, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -305,8 +225,8 @@ ] }, { - "id": 5, - "parent": 4, + "id": 4, + "parent": 3, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -315,18 +235,7 @@ ] }, { - "id": 6, - "parent": 5, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 7, + "id": 5, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -335,25 +244,14 @@ ] }, { - "id": 8, - "parent": 7, + "id": 6, + "parent": 5, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 9, - "parent": 8, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] }
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt index 8fffeac..d5508ac 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-composited-reason-children-expected.txt
@@ -27,12 +27,6 @@ { "name": "LayoutImage IMG class='accelerated'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated'", - "bounds": [160, 90], "transform": 1 }, {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt index f406914d..43a44070 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-2-stacking-contexts-expected.txt
@@ -21,12 +21,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 1 }, { @@ -51,12 +45,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 2 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 2 }, {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt index 4fc57e2..d913169 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-layer-expected.txt
@@ -14,12 +14,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 1 }, {
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt index 43f1206..d255674 100644 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt +++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/css3/blending/mix-blend-mode-isolation-remove-expected.txt
@@ -24,12 +24,6 @@ { "name": "LayoutImage IMG class='accelerated blended'", "bounds": [160, 90], - "drawsContent": false, - "transform": 1 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='accelerated blended'", - "bounds": [160, 90], "transform": 1 } ],
diff --git a/third_party/blink/web_tests/http/tests/misc/resources/cross-origin-subframe-for-scrolling.html b/third_party/blink/web_tests/http/tests/misc/resources/cross-origin-subframe-for-scrolling.html index 6d6bf0cb..bf59be3 100644 --- a/third_party/blink/web_tests/http/tests/misc/resources/cross-origin-subframe-for-scrolling.html +++ b/third_party/blink/web_tests/http/tests/misc/resources/cross-origin-subframe-for-scrolling.html
@@ -17,13 +17,13 @@ if (event.data.hasOwnProperty('scrollBy')) { port = event.source; frame_id = event.data.frame_id; - eventSender.mouseMoveTo(event.data.left + 5, event.data.top + 5); + eventSender.mouseMoveTo(5, 5); eventSender.mouseScrollBy(0, event.data.scrollBy); } else if (event.data.hasOwnProperty('clickScrollbar')) { port = event.source; frame_id = event.data.frame_id; console.log('clicking'); - eventSender.mouseMoveTo(event.data.left + window.innerWidth - 5, event.data.top + window.innerWidth - 5); + eventSender.mouseMoveTo(window.innerWidth - 5, window.innerWidth - 5); eventSender.mouseDown(); eventSender.mouseUp(); }
diff --git a/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes-scrollbar.html b/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes-scrollbar.html index 838c75d..562d0b7 100644 --- a/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes-scrollbar.html +++ b/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes-scrollbar.html
@@ -24,9 +24,7 @@ assert_greater_than(event.data.scrollTop, 0, "iframe1 scroll offset greater than 0.")} ); last_frame_scrolled = 2; - iframe2.contentWindow.postMessage( - {clickScrollbar: true, frame_id: 2, left: iframe2.offsetLeft, - top: iframe2.offsetTop}, "*"); + iframe2.contentWindow.postMessage({clickScrollbar: true, frame_id: 2}, "*"); } else if (event.data.scrolled == 2) { scroll_test.step(() => { assert_greater_than(event.data.scrollTop, 0, @@ -42,8 +40,7 @@ iframe1.onload = (() => { last_frame_scrolled = 1; console.log('posting'); - iframe1.contentWindow.postMessage({clickScrollbar: true, frame_id: 1, - left: iframe1.offsetLeft, top: iframe1.offsetTop}, "*"); + iframe1.contentWindow.postMessage({clickScrollbar: true, frame_id: 1}, "*"); }); </script>
diff --git a/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes.html b/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes.html index 54db4aff..d556abfa 100644 --- a/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes.html +++ b/third_party/blink/web_tests/http/tests/misc/scroll-cross-origin-iframes.html
@@ -15,7 +15,7 @@ if (event.data.scrolled == 1 && last_frame_scrolled == 1) { scroll_test.step(() => { assert_greater_than(event.data.scrollTop, 0, "iframe1 scroll offset greater than 0.")} ); last_frame_scrolled = 2; - iframe2.contentWindow.postMessage({scrollBy: -1, frame_id: 2, left: iframe2.offsetLeft, top: iframe2.offsetTop}, "*"); + iframe2.contentWindow.postMessage({scrollBy: -1, frame_id: 2}, "*"); } else if (event.data.scrolled == 2) { scroll_test.step(() => { assert_greater_than(event.data.scrollTop, 0, "iframe2 scroll offset greater than 0.")} ); scroll_test.done(); @@ -28,7 +28,7 @@ iframe1.onload = (() => { last_frame_scrolled = 1; - iframe1.contentWindow.postMessage({scrollBy: -1, frame_id: 1, left: iframe1.offsetLeft, top: iframe1.offsetTop}, "*"); + iframe1.contentWindow.postMessage({scrollBy: -1, frame_id: 1}, "*"); }); </script>
diff --git a/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation-async.html b/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation-async.html index 36d79f342..870f465 100644 --- a/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation-async.html +++ b/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation-async.html
@@ -4,14 +4,11 @@ function loaded() { document.getElementsByTagName('h4')[0].innerHTML = document.domain; - } - function startTest(event) - { // A manual click should navigate. if (window.eventSender) { var button = document.getElementById("b"); - eventSender.mouseMoveTo(button.offsetLeft + event.data.x + 4, button.offsetTop + event.data.y + 4); + eventSender.mouseMoveTo(button.offsetLeft + 4, button.offsetTop + 4); eventSender.mouseDown(); eventSender.mouseUp(); } @@ -29,8 +26,6 @@ }, 0); }, 0); } - - window.addEventListener("message", startTest, false); </script> </head> <body onload="loaded();">
diff --git a/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation.html b/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation.html index 0009def0..01ce857d 100644 --- a/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation.html +++ b/third_party/blink/web_tests/http/tests/security/frameNavigation/resources/iframe-that-performs-parent-navigation.html
@@ -4,14 +4,11 @@ function loaded() { document.getElementsByTagName('h4')[0].innerHTML = document.domain; - } - - function startTest(event) - { + // A manual click should navigate. if (window.eventSender) { var button = document.getElementById("b"); - eventSender.mouseMoveTo(button.offsetLeft + event.data.x + 4, button.offsetTop + event.data.y + 4); + eventSender.mouseMoveTo(button.offsetLeft + 4, button.offsetTop + 4); eventSender.mouseDown(); eventSender.mouseUp(); } @@ -21,8 +18,6 @@ { parent.location = "http://localhost:8000/security/frameNavigation/resources/navigation-changed-iframe.html"; } - - window.addEventListener("message", startTest, false); </script> </head> <body onload="loaded();">
diff --git a/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html b/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html index ad10e946..3e95aa6 100644 --- a/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html +++ b/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change-async.html
@@ -12,16 +12,12 @@ function loaded() { document.getElementsByTagName('h4')[0].innerHTML = document.domain; - var iframe = document.getElementById("i"); - // The iframe uses eventSender to emulate a user navigatation, which requires absolute coordinates. - // Because the iframe is cross-origin, it can't get the offsets itself, so leak them. - frames[0].postMessage({x: iframe.offsetLeft, y: iframe.offsetTop}, "*"); } </script> </head> <body onload="loaded();"> - <p>This tests that documents can navigate the location of any of it's parent-frames regardless of domain, if a - user gesture is present.</p> + <p>This tests that documents can navigate the location of any of it's + parent-frames regardless of domain, if a user gesture is present.</p> <h4>DOMAIN</h4> <iframe id="i" src="http://localhost:8000/security/frameNavigation/resources/iframe-that-performs-parent-navigation-async.html"></iframe> </body>
diff --git a/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html b/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html index 7d9de1f..3e8ea6a 100644 --- a/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html +++ b/third_party/blink/web_tests/http/tests/security/frameNavigation/xss-ALLOWED-parent-navigation-change.html
@@ -12,16 +12,12 @@ function loaded() { document.getElementsByTagName('h4')[0].innerHTML = document.domain; - var iframe = document.getElementById("i"); - // The iframe uses eventSender to emulate a user navigatation, which requires absolute coordinates. - // Because the iframe is cross-origin, it can't get the offsets itself, so leak them. - frames[0].postMessage({x: iframe.offsetLeft, y: iframe.offsetTop}, "*"); } </script> </head> <body onload="loaded();"> - <p>This tests that documents can navigate the location of any of it's parent-frames regardless of domain, if a - user gesture is present.</p> + <p>This tests that documents can navigate the location of any of it's + parent-frames regardless of domain, if a user gesture is present.</p> <h4>DOMAIN</h4> <iframe id="i" src="http://localhost:8000/security/frameNavigation/resources/iframe-that-performs-parent-navigation.html"></iframe> </body>
diff --git a/third_party/blink/web_tests/http/tests/security/referrer-policy-redirect-link.html b/third_party/blink/web_tests/http/tests/security/referrer-policy-redirect-link.html index b50cdcd..2950759 100644 --- a/third_party/blink/web_tests/http/tests/security/referrer-policy-redirect-link.html +++ b/third_party/blink/web_tests/http/tests/security/referrer-policy-redirect-link.html
@@ -11,7 +11,7 @@ function runTest() { var iframe = document.getElementById("iframe"); - iframe.contentWindow.postMessage({"action": "click", "offsetLeft": iframe.offsetLeft, "offsetTop": iframe.offsetTop}, "*"); + iframe.contentWindow.postMessage({"action": "click"}, "*"); } </script> </head>
diff --git a/third_party/blink/web_tests/http/tests/security/resources/referrer-policy-redirect-link.html b/third_party/blink/web_tests/http/tests/security/resources/referrer-policy-redirect-link.html index 5892915..1526dbb 100644 --- a/third_party/blink/web_tests/http/tests/security/resources/referrer-policy-redirect-link.html +++ b/third_party/blink/web_tests/http/tests/security/resources/referrer-policy-redirect-link.html
@@ -10,8 +10,7 @@ testRunner.notifyDone(); } else if (typeof(evt.data) == "object" && evt.data.action == "click") { var link = document.getElementById("link"); - eventSender.mouseMoveTo(link.offsetLeft + evt.data.offsetLeft + 2, - link.offsetTop + evt.data.offsetTop + 2); + eventSender.mouseMoveTo(link.offsetLeft + 2, link.offsetTop + 2); eventSender.mouseDown(); eventSender.mouseUp(); } else {
diff --git a/third_party/blink/web_tests/http/tests/security/resources/rel-noreferrer.html b/third_party/blink/web_tests/http/tests/security/resources/rel-noreferrer.html index e8ee317..4c839a97 100644 --- a/third_party/blink/web_tests/http/tests/security/resources/rel-noreferrer.html +++ b/third_party/blink/web_tests/http/tests/security/resources/rel-noreferrer.html
@@ -4,9 +4,7 @@ <script> function runTest() { var link = document.getElementById("link"); - var iframe = window.parent.document.getElementsByTagName("iframe")[0]; - eventSender.mouseMoveTo(link.offsetLeft + iframe.offsetLeft + 2, - link.offsetTop + iframe.offsetTop + 2); + eventSender.mouseMoveTo(link.offsetLeft, link.offsetTop); eventSender.mouseDown(); eventSender.mouseUp(); }
diff --git a/third_party/blink/web_tests/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/images/directly-composited-image-orientation-expected.png new file mode 100644 index 0000000..30dbc6ed --- /dev/null +++ b/third_party/blink/web_tests/images/directly-composited-image-orientation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/images/directly-composited-image-orientation.html b/third_party/blink/web_tests/images/directly-composited-image-orientation.html new file mode 100644 index 0000000..f90e49b --- /dev/null +++ b/third_party/blink/web_tests/images/directly-composited-image-orientation.html
@@ -0,0 +1,78 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<title>CSS Images Module Level 3: image-orientation: from-image with will-change: transform and no border. Blink treats this as 'directly composited' and rasterizes the image at its intrinsic size</title> +<style> + body { + overflow: hidden; + image-orientation: from-image; + } + img { + will-change: transform; + } + .orientation-normal { + width:50px; + height:25px; + } + .orientation-swapped { + width:25px; + height:50px; + } + div { + display: inline-block; + width: 100px; + vertical-align: top; + } +</style> +</head> +<body> + <!-- The images should rotate respecting their EXIF orientation because + image-orientation: from-image is specified. --> + <div> + <img class="orientation-normal" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-1-ul.jpg"/> + + </div> + <div> + <img class="orientation-normal" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-2-ur.jpg"/> + + </div> + <div> + <img class="orientation-normal" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-3-lr.jpg"/> + + </div> + <div> + <img class="orientation-normal" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-4-lol.jpg"/> + + </div> + <div> + <img class="orientation-swapped" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-5-lu.jpg"/> + + </div> + <div> + <img class="orientation-swapped" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-6-ru.jpg"/> + + </div> + <div> + <img class="orientation-swapped" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-7-rl.jpg"/> + + </div> + <div> + <img class="orientation-swapped" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-8-llo.jpg"/> + + </div> + <div> + <img class="orientation-normal" + src="../external/wpt/css/css-images/image-orientation/support/exif-orientation-9-u.jpg"/> + + </div> +</body> +</html>
diff --git a/third_party/blink/web_tests/platform/linux/compositing/masks/mask-of-clipped-layer-expected.png b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-of-clipped-layer-expected.png new file mode 100644 index 0000000..2b0a7fa --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/compositing/masks/mask-of-clipped-layer-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png new file mode 100644 index 0000000..6d12442 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png b/third_party/blink/web_tests/platform/mac/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png index 2d8c2e65..7fe7218 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt index 275e9ede..07fd6568 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt +++ b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-dynamic-expected.txt
@@ -23,15 +23,9 @@ { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 3 }, { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 4 - }, - { "name": "ContentsLayer for Vertical Scrollbar Layer", "position": [785, 0], "bounds": [15, 600], @@ -66,17 +60,6 @@ [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 4, - "parent": 3, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] } @@ -86,7 +69,7 @@ "layers": [ { "name": "Scrolling Contents Layer", - "bounds": [785, 1861], + "bounds": [785, 1606], "contentsOpaque": true, "backgroundColor": "#FFFFFF" }, @@ -99,31 +82,19 @@ { "name": "LayoutImage IMG class='hidden composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 2 }, { - "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'", - "bounds": [184, 124], - "transform": 3 - }, - { "name": "LayoutNGBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 152], "drawsContent": false, - "transform": 4 + "transform": 3 }, { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 5 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 6 + "transform": 4 }, { "name": "ContentsLayer for Vertical Scrollbar Layer", @@ -154,17 +125,6 @@ }, { "id": 3, - "parent": 2, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 4, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -173,25 +133,14 @@ ] }, { - "id": 5, - "parent": 4, + "id": 4, + "parent": 3, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 6, - "parent": 5, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] } @@ -201,7 +150,7 @@ "layers": [ { "name": "Scrolling Contents Layer", - "bounds": [785, 3575], + "bounds": [785, 2810], "contentsOpaque": true, "backgroundColor": "#FFFFFF" }, @@ -214,48 +163,30 @@ { "name": "LayoutImage IMG class='hidden composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 2 }, { - "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'", - "bounds": [184, 124], - "transform": 3 - }, - { "name": "LayoutNGBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 152], - "transform": 4 + "transform": 3 }, { "name": "LayoutImage IMG class='composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 5 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='composited box'", - "bounds": [184, 124], - "transform": 6 + "transform": 4 }, { "name": "LayoutNGBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 152], "drawsContent": false, - "transform": 7 + "transform": 5 }, { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 8 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 9 + "transform": 6 }, { "name": "ContentsLayer for Vertical Scrollbar Layer", @@ -286,17 +217,6 @@ }, { "id": 3, - "parent": 2, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 4, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -305,8 +225,8 @@ ] }, { - "id": 5, - "parent": 4, + "id": 4, + "parent": 3, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -315,18 +235,7 @@ ] }, { - "id": 6, - "parent": 5, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 7, + "id": 5, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -335,25 +244,14 @@ ] }, { - "id": 8, - "parent": 7, + "id": 6, + "parent": 5, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 9, - "parent": 8, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] }
diff --git a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png index fdb7f4e..dacc12e 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/visibility/visibility-image-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/mac/images/directly-composited-image-orientation-expected.png new file mode 100644 index 0000000..42e14476 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/images/directly-composited-image-orientation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png new file mode 100644 index 0000000..b349b6a --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png b/third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png index 2d8c2e65..7fe7218 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/prefer_compositing_to_lcd_text/compositing/overflow/update-widget-positions-on-nested-frames-and-scrollers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt index 5965410..53da943 100644 --- a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt +++ b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-dynamic-expected.txt
@@ -23,15 +23,9 @@ { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 3 }, { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 4 - }, - { "name": "ContentsLayer for Vertical Scrollbar Layer", "position": [785, 0], "bounds": [15, 600], @@ -66,17 +60,6 @@ [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 4, - "parent": 3, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] } @@ -86,7 +69,7 @@ "layers": [ { "name": "Scrolling Contents Layer", - "bounds": [785, 1942], + "bounds": [785, 1670], "contentsOpaque": true, "backgroundColor": "#FFFFFF" }, @@ -99,31 +82,19 @@ { "name": "LayoutImage IMG class='hidden composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 2 }, { - "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'", - "bounds": [184, 124], - "transform": 3 - }, - { "name": "LayoutNGBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 153], "drawsContent": false, - "transform": 4 + "transform": 3 }, { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 5 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 6 + "transform": 4 }, { "name": "ContentsLayer for Vertical Scrollbar Layer", @@ -154,17 +125,6 @@ }, { "id": 3, - "parent": 2, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 4, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -173,25 +133,14 @@ ] }, { - "id": 5, - "parent": 4, + "id": 4, + "parent": 3, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 6, - "parent": 5, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] } @@ -201,7 +150,7 @@ "layers": [ { "name": "Scrolling Contents Layer", - "bounds": [785, 3769], + "bounds": [785, 2953], "contentsOpaque": true, "backgroundColor": "#FFFFFF" }, @@ -214,48 +163,30 @@ { "name": "LayoutImage IMG class='hidden composited box'", "bounds": [100, 100], - "drawsContent": false, "transform": 2 }, { - "name": "ContentsLayer for LayoutImage IMG class='hidden composited box'", - "bounds": [184, 124], - "transform": 3 - }, - { "name": "LayoutNGBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 153], - "transform": 4 + "transform": 3 }, { "name": "LayoutImage IMG class='composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 5 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='composited box'", - "bounds": [184, 124], - "transform": 6 + "transform": 4 }, { "name": "LayoutNGBlockFlow DIV class='composited hidden container'", "position": [-4, -4], "bounds": [757, 153], "drawsContent": false, - "transform": 7 + "transform": 5 }, { "name": "LayoutImage IMG class='visible composited box'", "bounds": [100, 100], - "drawsContent": false, - "transform": 8 - }, - { - "name": "ContentsLayer for LayoutImage IMG class='visible composited box'", - "bounds": [184, 124], - "transform": 9 + "transform": 6 }, { "name": "ContentsLayer for Vertical Scrollbar Layer", @@ -286,17 +217,6 @@ }, { "id": 3, - "parent": 2, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 4, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -305,8 +225,8 @@ ] }, { - "id": 5, - "parent": 4, + "id": 4, + "parent": 3, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -315,18 +235,7 @@ ] }, { - "id": 6, - "parent": 5, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] - }, - { - "id": 7, + "id": 5, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], @@ -335,25 +244,14 @@ ] }, { - "id": 8, - "parent": 7, + "id": 6, + "parent": 5, "transform": [ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [20, 20, 0, 1] ] - }, - { - "id": 9, - "parent": 8, - "transform": [ - [0.54347825050354, 0, 0, 0], - [0, 0.806451618671417, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ], - "origin": [0, 0] } ] }
diff --git a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png index faf8d51..37d4daf 100644 --- a/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/visibility/visibility-image-layers-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png new file mode 100644 index 0000000..a0bf16f --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/vibration/resources/vibrate-from-iframe.html b/third_party/blink/web_tests/vibration/resources/vibrate-from-iframe.html index de3e52262..9f59744 100644 --- a/third_party/blink/web_tests/vibration/resources/vibrate-from-iframe.html +++ b/third_party/blink/web_tests/vibration/resources/vibrate-from-iframe.html
@@ -9,12 +9,9 @@ function startTest() { if (window.eventSender) { - var iframes = window.parent.document.getElementsByTagName('iframe'); - // The last iframe. - var iframe = iframes[iframes.length-1]; // Simulates a user click for vibrate to be allowed. var element = document.getElementById("test"); - simulateUserClick(element.offsetLeft + iframe.offsetLeft + 4, element.offsetTop + iframe.offsetTop + 4); + simulateUserClick(element.offsetLeft, element.offsetTop); } }
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html index 645a2d2..5bfd595 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-accelerated-keyboard-navigation-from-bottom-right-corner.html
@@ -23,7 +23,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.right - 1, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.right) - 1, + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 5; i++) { @@ -39,4 +40,4 @@ }); </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html index 5936a2a..68f5a4f8 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-left-keyboard-navigation-from-bottom-right-corner.html
@@ -20,7 +20,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.right - 1, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.right) - 1, + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 25; i++) { @@ -30,4 +31,4 @@ } </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html index 4372d1fb..a52802e 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-accelerated-keyboard-navigation-from-bottom-left-corner.html
@@ -23,7 +23,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.left, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.left), + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 5; i++) { @@ -39,4 +40,4 @@ }); </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html index 5c2e4ea..514d586 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-right-keyboard-navigation-from-bottom-left-corner.html
@@ -20,7 +20,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.left, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.left), + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 25; i++) { @@ -30,4 +31,4 @@ } </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html index 7a46a3e..d5600083 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-left-corner.html
@@ -23,7 +23,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.left, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.left), + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 5; i++) { @@ -39,4 +40,4 @@ }); </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html index 47998279..74be7cf 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-accelerated-keyboard-navigation-from-bottom-right-corner.html
@@ -23,7 +23,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.right - 1, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.right) - 1, + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 5; i++) { @@ -39,4 +40,4 @@ }); </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html index 5222217..07b14a2 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-left-corner.html
@@ -20,7 +20,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.left, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.left), + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 25; i++) { @@ -30,4 +31,4 @@ } </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html index 56f5108..96deac5f7 100644 --- a/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html +++ b/third_party/blink/web_tests/virtual/controls-refresh/color/color-picker-appearance-color-well-up-keyboard-navigation-from-bottom-right-corner.html
@@ -20,7 +20,8 @@ const popupDocument = popupWindow.document; const colorWell = popupDocument.querySelector('color-well'); const colorWellRect = colorWell.getBoundingClientRect(); - eventSender.mouseMoveTo(colorWellRect.right - 1, colorWellRect.bottom); + eventSender.mouseMoveTo(Math.floor(colorWellRect.right) - 1, + Math.floor(colorWellRect.bottom)); eventSender.mouseDown(); eventSender.mouseUp(); for (let i = 0; i < 25; i++) { @@ -30,4 +31,4 @@ } </script> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png b/third_party/blink/web_tests/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png new file mode 100644 index 0000000..6d12442 --- /dev/null +++ b/third_party/blink/web_tests/virtual/exotic-color-space/images/directly-composited-image-orientation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt index cef9ca00..dded1ac 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
@@ -61,6 +61,7 @@ property ariaRowIndex property ariaRowSpan property ariaSelected + property ariaSetSize property ariaSort property ariaValueMax property ariaValueMin @@ -1218,6 +1219,7 @@ property ariaRowIndex property ariaRowSpan property ariaSelected + property ariaSetSize property ariaSort property ariaValueMax property ariaValueMin
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt index 4bb2d50..86d9b0c2 100644 --- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -1664,6 +1664,7 @@ getter ariaRowIndex getter ariaRowSpan getter ariaSelected + getter ariaSetSize getter ariaSort getter ariaValueMax getter ariaValueMin @@ -1791,6 +1792,7 @@ setter ariaRowIndex setter ariaRowSpan setter ariaSelected + setter ariaSetSize setter ariaSort setter ariaValueMax setter ariaValueMin @@ -1849,6 +1851,7 @@ getter ariaRowIndex getter ariaRowSpan getter ariaSelected + getter ariaSetSize getter ariaSort getter ariaValueMax getter ariaValueMin @@ -1896,6 +1899,7 @@ setter ariaRowIndex setter ariaRowSpan setter ariaSelected + setter ariaSetSize setter ariaSort setter ariaValueMax setter ariaValueMin @@ -9117,6 +9121,7 @@ getter domOverlayState getter environmentBlendMode getter inputSources + getter interactionMode getter onend getter oninputsourceschange getter onselect
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt index 985bd915..c35cccf 100644 --- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -70,6 +70,7 @@ property ariaRowIndex property ariaRowSpan property ariaSelected + property ariaSetSize property ariaSort property ariaValueMax property ariaValueMin @@ -1279,6 +1280,7 @@ property ariaRowIndex property ariaRowSpan property ariaSelected + property ariaSetSize property ariaSort property ariaValueMax property ariaValueMin
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index ba924cf..b31b1b21 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -2024,6 +2024,7 @@ getter ariaRowIndex getter ariaRowSpan getter ariaSelected + getter ariaSetSize getter ariaSort getter ariaValueMax getter ariaValueMin @@ -2167,6 +2168,7 @@ setter ariaRowIndex setter ariaRowSpan setter ariaSelected + setter ariaSetSize setter ariaSort setter ariaValueMax setter ariaValueMin @@ -2235,6 +2237,7 @@ getter ariaRowIndex getter ariaRowSpan getter ariaSelected + getter ariaSetSize getter ariaSort getter ariaValueMax getter ariaValueMin @@ -2292,6 +2295,7 @@ setter ariaRowIndex setter ariaRowSpan setter ariaSelected + setter ariaSetSize setter ariaSort setter ariaValueMax setter ariaValueMin @@ -11410,6 +11414,7 @@ getter domOverlayState getter environmentBlendMode getter inputSources + getter interactionMode getter onend getter oninputsourceschange getter onselect
diff --git a/third_party/crashpad/README.chromium b/third_party/crashpad/README.chromium index 68fb0adf..00384c8 100644 --- a/third_party/crashpad/README.chromium +++ b/third_party/crashpad/README.chromium
@@ -2,7 +2,7 @@ Short Name: crashpad URL: https://crashpad.chromium.org/ Version: unknown -Revision: 311a5a2fdd5b6be8cee01b66991933397094204f +Revision: b49dcdc48fd95aacb0f202842fe54753cc5cdcb7 License: Apache 2.0 License File: crashpad/LICENSE Security Critical: yes @@ -36,4 +36,3 @@ Local Modifications: - codereview.settings has been excluded. - - elf_image_reader_fuzzer is enabled only when use_fuzzing_engine is true.
diff --git a/third_party/crashpad/crashpad/DEPS b/third_party/crashpad/crashpad/DEPS index 8b958f1..b38c9b6 100644 --- a/third_party/crashpad/crashpad/DEPS +++ b/third_party/crashpad/crashpad/DEPS
@@ -33,7 +33,7 @@ }, 'crashpad/third_party/gtest/gtest': Var('chromium_git') + '/external/github.com/google/googletest@' + - 'eb78ee170ac9eb21487f4d127720c060351fa8a2', + 'e3f0319d89f4cbf32993de595d984183b1a9fc57', 'crashpad/third_party/gyp/gyp': Var('chromium_git') + '/external/gyp@' + '8bee09f4a57807136593ddc906b0b213c21f9014', @@ -42,7 +42,7 @@ '7bde79cc274d06451bf65ae82c012a5d3e476b5a', 'crashpad/third_party/mini_chromium/mini_chromium': Var('chromium_git') + '/chromium/mini_chromium@' + - 'c426ff98e1d9e9d59777fe8b883a5c0ceeca9ca3', + '641fcf9bbc1277e8153ac7e86d5b8f9340b1bfdd', 'crashpad/third_party/libfuzzer/src': Var('chromium_git') + '/chromium/llvm-project/compiler-rt/lib/fuzzer.git@' + 'fda403cf93ecb8792cb1d061564d89a6553ca020',
diff --git a/third_party/crashpad/crashpad/build/crashpad_fuzzer_test.gni b/third_party/crashpad/crashpad/build/crashpad_fuzzer_test.gni index ef4b0d82..cc709b0 100644 --- a/third_party/crashpad/crashpad/build/crashpad_fuzzer_test.gni +++ b/third_party/crashpad/crashpad/build/crashpad_fuzzer_test.gni
@@ -44,7 +44,7 @@ if (defined(invoker.seed_corpus)) { not_needed(invoker, [ "seed_corpus" ]) } - } else if (crashpad_is_in_chromium) { + } else if (crashpad_is_in_chromium && use_fuzzing_engine) { # Append "crashpad_" to the beginning of the fuzzer's name to make it easier # in Chromium to recognize where fuzzer came from. forward_variables_from(invoker, "*")
diff --git a/third_party/crashpad/crashpad/client/BUILD.gn b/third_party/crashpad/crashpad/client/BUILD.gn index 476ceb2c..11ba757 100644 --- a/third_party/crashpad/crashpad/client/BUILD.gn +++ b/third_party/crashpad/crashpad/client/BUILD.gn
@@ -44,7 +44,10 @@ } if (crashpad_is_ios) { - sources += [ "crashpad_client_ios.cc" ] + sources += [ + "crash_report_database_mac.mm", + "crashpad_client_ios.cc", + ] } if (crashpad_is_linux || crashpad_is_android) { @@ -95,7 +98,10 @@ # TODO(justincohen): Temporary dependency to bring up the iOS client. if (crashpad_is_ios) { - deps += [ "../snapshot" ] + deps += [ + "../minidump", + "../snapshot", + ] } if (crashpad_is_linux || crashpad_is_android) { @@ -132,7 +138,7 @@ } if (crashpad_is_ios) { - sources += [ "crashpad_client_ios_test.cc" ] + sources += [ "crashpad_client_ios_test.mm" ] sources -= [ "annotation_list_test.cc", "annotation_test.cc",
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_ios.cc b/third_party/crashpad/crashpad/client/crashpad_client_ios.cc index 8e3fafa..465867af 100644 --- a/third_party/crashpad/crashpad/client/crashpad_client_ios.cc +++ b/third_party/crashpad/crashpad/client/crashpad_client_ios.cc
@@ -20,6 +20,8 @@ #include "base/strings/stringprintf.h" #include "client/client_argv_handling.h" #include "snapshot/ios/process_snapshot_ios.h" +#include "util/ios/exception_processor.h" +#include "util/ios/ios_system_data_collector.h" #include "util/posix/signals.h" namespace crashpad { @@ -43,7 +45,9 @@ void HandleCrash(int signo, siginfo_t* siginfo, void* context) { // TODO(justincohen): This is incomplete. ProcessSnapshotIOS process_snapshot; - process_snapshot.Initialize(); + process_snapshot.Initialize(system_data); + process_snapshot.SetException(siginfo, + reinterpret_cast<ucontext_t*>(context)); } private: @@ -55,7 +59,6 @@ siginfo_t* siginfo, void* context) { HandleCrash(signo, siginfo, context); - // Always call system handler. Signals::RestoreHandlerAndReraiseSignalOnReturn( siginfo, old_actions_.ActionForSignal(signo)); @@ -68,6 +71,9 @@ Signals::OldActions old_actions_ = {}; + // Collect some system data before the signal handler is triggered. + IOSSystemDataCollector system_data; + DISALLOW_COPY_AND_ASSIGN(SignalHandler); }; @@ -78,14 +84,15 @@ CrashpadClient::~CrashpadClient() {} bool CrashpadClient::StartCrashpadInProcessHandler() { + InstallObjcExceptionPreprocessor(); return SignalHandler::Get()->Install(nullptr); } // static void CrashpadClient::DumpWithoutCrash() { DCHECK(SignalHandler::Get()); - siginfo_t siginfo = {}; SignalHandler::Get()->HandleCrash(siginfo.si_signo, &siginfo, nullptr); } + } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_ios_test.cc b/third_party/crashpad/crashpad/client/crashpad_client_ios_test.cc deleted file mode 100644 index 6ed4579..0000000 --- a/third_party/crashpad/crashpad/client/crashpad_client_ios_test.cc +++ /dev/null
@@ -1,32 +0,0 @@ -// Copyright 2020 The Crashpad Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include "client/crashpad_client.h" - -#include "gtest/gtest.h" - -namespace crashpad { -namespace test { -namespace { - -// TODO(justincohen): This is a placeholder. -TEST(CrashpadIOSClient, DumpWithoutCrash) { - crashpad::CrashpadClient client; - client.StartCrashpadInProcessHandler(); - client.DumpWithoutCrash(); -} - -} // namespace -} // namespace test -} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/client/crashpad_client_ios_test.mm b/third_party/crashpad/crashpad/client/crashpad_client_ios_test.mm new file mode 100644 index 0000000..e07a107 --- /dev/null +++ b/third_party/crashpad/crashpad/client/crashpad_client_ios_test.mm
@@ -0,0 +1,60 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "client/crashpad_client.h" + +#import <Foundation/Foundation.h> + +#include <vector> + +#include "gtest/gtest.h" +#include "testing/platform_test.h" + +namespace crashpad { +namespace test { +namespace { + +using CrashpadIOSClient = PlatformTest; + +// TODO(justincohen): This is a placeholder. +TEST_F(CrashpadIOSClient, DumpWithoutCrash) { + CrashpadClient client; + client.StartCrashpadInProcessHandler(); + client.DumpWithoutCrash(); +} + +// This test is covered by a similar XCUITest, but for development purposes +// it's sometimes easier and faster to run as a gtest. However, there's no +// way to correctly run this as a gtest. Leave the test here, disabled, for use +// during development only. +TEST_F(CrashpadIOSClient, DISABLED_ThrowNSException) { + CrashpadClient client; + client.StartCrashpadInProcessHandler(); + [NSException raise:@"GtestNSException" format:@"ThrowException"]; +} + +// This test is covered by a similar XCUITest, but for development purposes +// it's sometimes easier and faster to run as a gtest. However, there's no +// way to correctly run this as a gtest. Leave the test here, disabled, for use +// during development only. +TEST_F(CrashpadIOSClient, DISABLED_ThrowException) { + CrashpadClient client; + client.StartCrashpadInProcessHandler(); + std::vector<int> empty_vector; + empty_vector.at(42); +} + +} // namespace +} // namespace test +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/client/settings.cc b/third_party/crashpad/crashpad/client/settings.cc index db9dfac..0aa525f1 100644 --- a/third_party/crashpad/crashpad/client/settings.cc +++ b/third_party/crashpad/crashpad/client/settings.cc
@@ -85,8 +85,8 @@ #endif // OS_FUCHSIA struct Settings::Data { - static const uint32_t kSettingsMagic = 'CPds'; - static const uint32_t kSettingsVersion = 1; + static constexpr uint32_t kSettingsMagic = 'CPds'; + static constexpr uint32_t kSettingsVersion = 1; enum Options : uint32_t { kUploadsEnabled = 1 << 0,
diff --git a/third_party/crashpad/crashpad/doc/developing.md b/third_party/crashpad/crashpad/doc/developing.md index 406a234..431ca1d5c 100644 --- a/third_party/crashpad/crashpad/doc/developing.md +++ b/third_party/crashpad/crashpad/doc/developing.md
@@ -328,7 +328,7 @@ ## Buildbot -The [Crashpad Buildbot](https://build.chromium.org/p/client.crashpad/) performs -automated builds and tests of Crashpad. Before checking out or updating the -Crashpad source code, and after checking in a new change, it is prudent to check -the Buildbot to ensure that “the tree is green.” +The [Crashpad Buildbot](https://ci.chromium.org/p/crashpad/g/main/console) +performs automated builds and tests of Crashpad. Before checking out or updating +the Crashpad source code, and after checking in a new change, it is prudent to +check the Buildbot to ensure that “the tree is green.”
diff --git a/third_party/crashpad/crashpad/handler/BUILD.gn b/third_party/crashpad/crashpad/handler/BUILD.gn index ff9f5d1f..1d8b945 100644 --- a/third_party/crashpad/crashpad/handler/BUILD.gn +++ b/third_party/crashpad/crashpad/handler/BUILD.gn
@@ -133,6 +133,8 @@ ] if (crashpad_is_win) { + deps += [ "../minidump:test_support" ] + data_deps = [ ":crashpad_handler_test_extended_handler", ":fake_handler_that_crashes_at_startup", @@ -149,6 +151,7 @@ "../build:default_exe_manifest_win", "../compat", "../third_party/mini_chromium:base", + "../tools:tool_support", ] if (crashpad_is_win) { @@ -225,6 +228,7 @@ "../build:default_exe_manifest_win", "../compat", "../third_party/mini_chromium:base", + "../tools:tool_support", ] }
diff --git a/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc b/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc index 7bb14f92..c9fbb0a 100644 --- a/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc +++ b/third_party/crashpad/crashpad/handler/linux/exception_handler_server.cc
@@ -93,23 +93,20 @@ } bool HaveCapSysPtrace() { - struct __user_cap_header_struct cap_header = {}; - struct __user_cap_data_struct cap_data = {}; - + __user_cap_header_struct cap_header; cap_header.pid = getpid(); + cap_header.version = _LINUX_CAPABILITY_VERSION_3; + __user_cap_data_struct cap_data[_LINUX_CAPABILITY_U32S_3]; if (syscall(SYS_capget, &cap_header, &cap_data) != 0) { PLOG(ERROR) << "capget"; + LOG_IF(ERROR, errno == EINVAL) << "cap_header.version " << std::hex + << cap_header.version; return false; } - if (cap_header.version != _LINUX_CAPABILITY_VERSION_3) { - LOG(ERROR) << "Unexpected capability version " << std::hex - << cap_header.version; - return false; - } - - return (cap_data.effective & (1 << CAP_SYS_PTRACE)) != 0; + return (cap_data[CAP_TO_INDEX(CAP_SYS_PTRACE)].effective & + CAP_TO_MASK(CAP_SYS_PTRACE)) != 0; } bool SendMessageToClient(
diff --git a/third_party/crashpad/crashpad/handler/minidump_to_upload_parameters.cc b/third_party/crashpad/crashpad/handler/minidump_to_upload_parameters.cc index 9e26d877..6b64081 100644 --- a/third_party/crashpad/crashpad/handler/minidump_to_upload_parameters.cc +++ b/third_party/crashpad/crashpad/handler/minidump_to_upload_parameters.cc
@@ -50,7 +50,7 @@ } } - for (std::string annotation : module->AnnotationsVector()) { + for (const std::string& annotation : module->AnnotationsVector()) { list_annotations.append(annotation); list_annotations.append("\n"); }
diff --git a/third_party/crashpad/crashpad/minidump/BUILD.gn b/third_party/crashpad/crashpad/minidump/BUILD.gn index 35b1917..4442585 100644 --- a/third_party/crashpad/crashpad/minidump/BUILD.gn +++ b/third_party/crashpad/crashpad/minidump/BUILD.gn
@@ -20,15 +20,12 @@ "minidump_annotation_writer.h", "minidump_byte_array_writer.cc", "minidump_byte_array_writer.h", - "minidump_context.h", "minidump_context_writer.cc", "minidump_context_writer.h", "minidump_crashpad_info_writer.cc", "minidump_crashpad_info_writer.h", "minidump_exception_writer.cc", "minidump_exception_writer.h", - "minidump_extensions.cc", - "minidump_extensions.h", "minidump_file_writer.cc", "minidump_file_writer.h", "minidump_handle_writer.cc", @@ -71,7 +68,10 @@ public_configs = [ "..:crashpad_config" ] - public_deps = [ "../compat" ] + public_deps = [ + ":format", + "../compat", + ] deps = [ "../snapshot", @@ -87,6 +87,25 @@ } } +# :format is the only part of minidump that snapshot may depend on. +static_library("format") { + sources = [ + "minidump_context.h", + "minidump_extensions.cc", + "minidump_extensions.h", + ] + + public_configs = [ "..:crashpad_config" ] + + public_deps = [ "../compat" ] + + deps = [ + "../snapshot:context", + "../third_party/mini_chromium:base", + "../util", + ] +} + static_library("test_support") { testonly = true @@ -114,8 +133,11 @@ public_deps = [ ":minidump" ] deps = [ + "../snapshot:test_support", + "../test", "../third_party/gtest:gtest", "../third_party/mini_chromium:base", + "../util", ] if (crashpad_is_win) {
diff --git a/third_party/crashpad/crashpad/minidump/minidump_extensions.h b/third_party/crashpad/crashpad/minidump/minidump_extensions.h index 9332f96..97276d5 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_extensions.h +++ b/third_party/crashpad/crashpad/minidump/minidump_extensions.h
@@ -242,7 +242,7 @@ kMinidumpOSMacOSX = 0x8101, //! \brief iOS, Darwin for mobile devices. - kMinidumpOSiOS = 0x8102, + kMinidumpOSIOS = 0x8102, //! \brief Linux, not including Android. kMinidumpOSLinux = 0x8201, @@ -264,7 +264,6 @@ kMinidumpOSUnknown = 0xffffffff, }; - //! \brief A list of ::RVA pointers. struct ALIGNAS(4) PACKED MinidumpRVAList { //! \brief The number of children present in the #children array.
diff --git a/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc index 06aeecda..7b4b49d 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_system_info_writer.cc
@@ -176,6 +176,9 @@ case SystemSnapshot::kOperatingSystemFuchsia: operating_system = kMinidumpOSFuchsia; break; + case SystemSnapshot::kOperatingSystemIOS: + operating_system = kMinidumpOSIOS; + break; default: NOTREACHED(); operating_system = kMinidumpOSUnknown;
diff --git a/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer.cc b/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer.cc index 855e196..c8a5f0f 100644 --- a/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer.cc +++ b/third_party/crashpad/crashpad/minidump/minidump_unloaded_module_writer.cc
@@ -123,7 +123,8 @@ DCHECK_EQ(state(), kStateMutable); DCHECK(unloaded_modules_.empty()); - for (auto unloaded_module_snapshot : unloaded_module_snapshots) { + for (const UnloadedModuleSnapshot& unloaded_module_snapshot : + unloaded_module_snapshots) { auto unloaded_module = std::make_unique<MinidumpUnloadedModuleWriter>(); unloaded_module->InitializeFromSnapshot(unloaded_module_snapshot); AddUnloadedModule(std::move(unloaded_module));
diff --git a/third_party/crashpad/crashpad/snapshot/BUILD.gn b/third_party/crashpad/crashpad/snapshot/BUILD.gn index 7a53b3a..fea22c2 100644 --- a/third_party/crashpad/crashpad/snapshot/BUILD.gn +++ b/third_party/crashpad/crashpad/snapshot/BUILD.gn
@@ -28,9 +28,6 @@ "annotation_snapshot.h", "capture_memory.cc", "capture_memory.h", - "cpu_architecture.h", - "cpu_context.cc", - "cpu_context.h", "crashpad_info_client_options.cc", "crashpad_info_client_options.h", "exception_snapshot.h", @@ -113,12 +110,16 @@ if (crashpad_is_ios) { sources += [ + "ios/exception_snapshot_ios.cc", + "ios/exception_snapshot_ios.h", "ios/memory_snapshot_ios.cc", "ios/memory_snapshot_ios.h", "ios/module_snapshot_ios.cc", "ios/module_snapshot_ios.h", "ios/process_snapshot_ios.cc", "ios/process_snapshot_ios.h", + "ios/system_snapshot_ios.cc", + "ios/system_snapshot_ios.h", "ios/thread_snapshot_ios.cc", "ios/thread_snapshot_ios.h", "mac/cpu_context_mac.cc", @@ -240,9 +241,12 @@ public_configs = [ "..:crashpad_config" ] + public_deps = [ ":context" ] + deps = [ "../client", "../compat", + "../minidump:format", "../third_party/mini_chromium:base", "../util", ] @@ -259,10 +263,27 @@ configs += [ "..:disable_ubsan" ] } -if (crashpad_is_linux && use_fuzzing_engine) { - # Since crashpad uses its own crashpad_fuzzer_test GN template to wrap - # Chromium's fuzzer_test template, it's better to rely on |use_fuzzing_engine| - # and disable fuzz targets as they will not build successfully without it. +# :context is the only part of snapshot that minidump may depend on. +static_library("context") { + sources = [ + "cpu_architecture.h", + "cpu_context.cc", + "cpu_context.h", + ] + + public_configs = [ "..:crashpad_config" ] + + deps = [ + "../third_party/mini_chromium:base", + "../util", + ] + + if (crashpad_is_win) { + cflags = [ "/wd4201" ] # nonstandard extension used : nameless struct/union + } +} + +if (crashpad_is_linux) { crashpad_fuzzer_test("elf_image_reader_fuzzer") { sources = [ "elf/elf_image_reader_fuzzer.cc" ] @@ -405,6 +426,7 @@ ":test_support", "../client", "../compat", + "../minidump:format", "../test", "../third_party/gtest:gtest", "../third_party/mini_chromium:base",
diff --git a/third_party/crashpad/crashpad/snapshot/crashpad_info_client_options.cc b/third_party/crashpad/crashpad/snapshot/crashpad_info_client_options.cc index fe3b0b3..3a88a4c0 100644 --- a/third_party/crashpad/crashpad/snapshot/crashpad_info_client_options.cc +++ b/third_party/crashpad/crashpad/snapshot/crashpad_info_client_options.cc
@@ -15,7 +15,6 @@ #include "snapshot/crashpad_info_client_options.h" #include "base/logging.h" -#include "client/crashpad_info.h" namespace crashpad {
diff --git a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.cc new file mode 100644 index 0000000..559b105e --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.cc
@@ -0,0 +1,122 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "snapshot/ios/exception_snapshot_ios.h" + +#include "base/logging.h" +#include "base/mac/mach_logging.h" +#include "base/strings/stringprintf.h" +#include "snapshot/cpu_context.h" +#include "snapshot/mac/cpu_context_mac.h" +#include "util/misc/from_pointer_cast.h" + +namespace crashpad { +namespace internal { + +ExceptionSnapshotIOS::ExceptionSnapshotIOS() + : ExceptionSnapshot(), + context_(), + codes_(), + thread_id_(0), + exception_address_(0), + signal_number_(0), + signal_code_(0), + initialized_() {} + +ExceptionSnapshotIOS::~ExceptionSnapshotIOS() {} + +bool ExceptionSnapshotIOS::Initialize(const siginfo_t* siginfo, + const ucontext_t* context) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + if (!context) + return false; + + mcontext_t mcontext = context->uc_mcontext; +#if defined(ARCH_CPU_X86_64) + context_.architecture = kCPUArchitectureX86_64; + context_.x86_64 = &context_x86_64_; + x86_debug_state64_t empty_debug_state; + InitializeCPUContextX86_64(&context_x86_64_, + THREAD_STATE_NONE, + nullptr, + 0, + &mcontext->__ss, + &mcontext->__fs, + &empty_debug_state); +#elif defined(ARCH_CPU_ARM64) + context_.architecture = kCPUArchitectureARM64; + context_.arm64 = &context_arm64_; + InitializeCPUContextARM64(&context_arm64_, &mcontext->__ss, &mcontext->__ns); +#endif + + // Thread ID. + thread_identifier_info identifier_info; + mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT; + kern_return_t kr = + thread_info(mach_thread_self(), + THREAD_IDENTIFIER_INFO, + reinterpret_cast<thread_info_t>(&identifier_info), + &count); + if (kr != KERN_SUCCESS) { + MACH_LOG(ERROR, kr) << "thread_identifier_info"; + } else { + thread_id_ = identifier_info.thread_id; + } + + signal_number_ = siginfo->si_signo; + signal_code_ = siginfo->si_code; + exception_address_ = FromPointerCast<uintptr_t>(siginfo->si_addr); + + INITIALIZATION_STATE_SET_VALID(initialized_); + return true; +} + +const CPUContext* ExceptionSnapshotIOS::Context() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return &context_; +} + +uint64_t ExceptionSnapshotIOS::ThreadID() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return thread_id_; +} + +uint32_t ExceptionSnapshotIOS::Exception() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return signal_number_; +} + +uint32_t ExceptionSnapshotIOS::ExceptionInfo() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return signal_code_; +} + +uint64_t ExceptionSnapshotIOS::ExceptionAddress() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return exception_address_; +} + +const std::vector<uint64_t>& ExceptionSnapshotIOS::Codes() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return codes_; +} + +std::vector<const MemorySnapshot*> ExceptionSnapshotIOS::ExtraMemory() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return std::vector<const MemorySnapshot*>(); +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.h new file mode 100644 index 0000000..3c19a07 --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/exception_snapshot_ios.h
@@ -0,0 +1,79 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_SNAPSHOT_IOS_EXCEPTION_SNAPSHOT_IOS_H_ +#define CRASHPAD_SNAPSHOT_IOS_EXCEPTION_SNAPSHOT_IOS_H_ + +#include <mach/mach.h> +#include <stdint.h> + +#include <vector> + +#include "base/macros.h" +#include "build/build_config.h" +#include "snapshot/cpu_context.h" +#include "snapshot/exception_snapshot.h" +#include "util/mach/mach_extensions.h" +#include "util/misc/initialization_state_dcheck.h" + +namespace crashpad { + +namespace internal { + +//! \brief An ExceptionSnapshot of an exception sustained by a running (or +//! crashed) process on an iOS system. +class ExceptionSnapshotIOS final : public ExceptionSnapshot { + public: + ExceptionSnapshotIOS(); + ~ExceptionSnapshotIOS() override; + + //! \brief Initializes the object. + //! + //! \return `true` if the snapshot could be created, `false` otherwise with + //! an appropriate message logged. + bool Initialize(const siginfo_t* siginfo, const ucontext_t* context); + + // ExceptionSnapshot: + + const CPUContext* Context() const override; + uint64_t ThreadID() const override; + uint32_t Exception() const override; + uint32_t ExceptionInfo() const override; + uint64_t ExceptionAddress() const override; + const std::vector<uint64_t>& Codes() const override; + virtual std::vector<const MemorySnapshot*> ExtraMemory() const override; + + private: +#if defined(ARCH_CPU_X86_64) + CPUContextX86_64 context_x86_64_; +#elif defined(ARCH_CPU_ARM64) + CPUContextARM64 context_arm64_; +#else +#error Port. +#endif // ARCH_CPU_X86_64 + CPUContext context_; + std::vector<uint64_t> codes_; + uint64_t thread_id_; + uintptr_t exception_address_; + int signal_number_; + int signal_code_; + InitializationStateDcheck initialized_; + + DISALLOW_COPY_AND_ASSIGN(ExceptionSnapshotIOS); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_SNAPSHOT_IOS_EXCEPTION_SNAPSHOT_IOS_H_
diff --git a/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.h index 7d0bbdc..505c08f8 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.h +++ b/third_party/crashpad/crashpad/snapshot/ios/module_snapshot_ios.h
@@ -24,7 +24,6 @@ #include <vector> #include "base/macros.h" -#include "client/crashpad_info.h" #include "snapshot/crashpad_info_client_options.h" #include "snapshot/module_snapshot.h" #include "util/misc/initialization_state_dcheck.h"
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.cc index 27f9de4..2970199 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.cc +++ b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.cc
@@ -17,17 +17,32 @@ #include <mach-o/loader.h> #include <mach/mach.h> -#include <utility> - #include "base/logging.h" #include "base/mac/mach_logging.h" +#include "base/stl_util.h" + +namespace { + +void MachTimeValueToTimeval(const time_value& mach, timeval* tv) { + tv->tv_sec = mach.seconds; + tv->tv_usec = mach.microseconds; +} + +} // namespace namespace crashpad { ProcessSnapshotIOS::ProcessSnapshotIOS() : ProcessSnapshot(), + kern_proc_info_(), + basic_info_user_time_(), + basic_info_system_time_(), + thread_times_user_time_(), + thread_times_system_time_(), + system_(), threads_(), modules_(), + exception_(), report_id_(), client_id_(), annotations_simple_map_(), @@ -36,14 +51,50 @@ ProcessSnapshotIOS::~ProcessSnapshotIOS() {} -bool ProcessSnapshotIOS::Initialize() { +bool ProcessSnapshotIOS::Initialize(const IOSSystemDataCollector& system_data) { INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + // Used by pid, parent pid and snapshot time. + int mib[] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; + size_t len = sizeof(kern_proc_info_); + if (sysctl(mib, base::size(mib), &kern_proc_info_, &len, nullptr, 0)) { + PLOG(ERROR) << "sysctl"; + return false; + } + + // Used by user time and system time. + task_basic_info_64 task_basic_info; + mach_msg_type_number_t task_basic_info_count = TASK_BASIC_INFO_64_COUNT; + kern_return_t kr = task_info(mach_task_self(), + TASK_BASIC_INFO_64, + reinterpret_cast<task_info_t>(&task_basic_info), + &task_basic_info_count); + if (kr != KERN_SUCCESS) { + MACH_LOG(WARNING, kr) << "task_info TASK_BASIC_INFO_64"; + return false; + } + + task_thread_times_info_data_t task_thread_times; + mach_msg_type_number_t task_thread_times_count = TASK_THREAD_TIMES_INFO_COUNT; + kr = task_info(mach_task_self(), + TASK_THREAD_TIMES_INFO, + reinterpret_cast<task_info_t>(&task_thread_times), + &task_thread_times_count); + if (kr != KERN_SUCCESS) { + MACH_LOG(WARNING, kr) << "task_info TASK_THREAD_TIMES"; + } + + basic_info_user_time_ = task_basic_info.user_time; + basic_info_system_time_ = task_basic_info.system_time; + thread_times_user_time_ = task_thread_times.user_time; + thread_times_system_time_ = task_thread_times.system_time; + if (gettimeofday(&snapshot_time_, nullptr) != 0) { PLOG(ERROR) << "gettimeofday"; return false; } + system_.Initialize(system_data); InitializeThreads(); InitializeModules(); @@ -51,14 +102,23 @@ return true; } +void ProcessSnapshotIOS::SetException(const siginfo_t* siginfo, + const ucontext_t* context) { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + exception_.reset(new internal::ExceptionSnapshotIOS()); + if (!exception_->Initialize(siginfo, context)) { + exception_.reset(); + } +} + pid_t ProcessSnapshotIOS::ProcessID() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return getpid(); + return kern_proc_info_.kp_proc.p_pid; } pid_t ProcessSnapshotIOS::ParentProcessID() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return 0; + return kern_proc_info_.kp_eproc.e_ppid; } void ProcessSnapshotIOS::SnapshotTime(timeval* snapshot_time) const { @@ -68,11 +128,28 @@ void ProcessSnapshotIOS::ProcessStartTime(timeval* start_time) const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *start_time = kern_proc_info_.kp_proc.p_starttime; } void ProcessSnapshotIOS::ProcessCPUTimes(timeval* user_time, timeval* system_time) const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); + + // Calculate user and system time the same way the kernel does for + // getrusage(). See 10.15.0 xnu-6153.11.26/bsd/kern/kern_resource.c calcru(). + timerclear(user_time); + timerclear(system_time); + + MachTimeValueToTimeval(basic_info_user_time_, user_time); + MachTimeValueToTimeval(basic_info_system_time_, system_time); + + timeval thread_user_time; + MachTimeValueToTimeval(thread_times_user_time_, &thread_user_time); + timeval thread_system_time; + MachTimeValueToTimeval(thread_times_system_time_, &thread_system_time); + + timeradd(user_time, &thread_user_time, user_time); + timeradd(system_time, &thread_system_time, system_time); } void ProcessSnapshotIOS::ReportID(UUID* report_id) const { @@ -93,7 +170,7 @@ const SystemSnapshot* ProcessSnapshotIOS::System() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return nullptr; + return &system_; } std::vector<const ThreadSnapshot*> ProcessSnapshotIOS::Threads() const { @@ -122,7 +199,7 @@ const ExceptionSnapshot* ProcessSnapshotIOS::Exception() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return nullptr; + return exception_.get(); } std::vector<const MemoryMapRegionSnapshot*> ProcessSnapshotIOS::MemoryMap()
diff --git a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.h index 19d43b2..2332ff45 100644 --- a/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.h +++ b/third_party/crashpad/crashpad/snapshot/ios/process_snapshot_ios.h
@@ -15,9 +15,13 @@ #ifndef CRASHPAD_SNAPSHOT_IOS_PROCESS_SNAPSHOT_IOS_H_ #define CRASHPAD_SNAPSHOT_IOS_PROCESS_SNAPSHOT_IOS_H_ +#include <sys/sysctl.h> + #include <vector> +#include "snapshot/ios/exception_snapshot_ios.h" #include "snapshot/ios/module_snapshot_ios.h" +#include "snapshot/ios/system_snapshot_ios.h" #include "snapshot/ios/thread_snapshot_ios.h" #include "snapshot/process_snapshot.h" #include "snapshot/thread_snapshot.h" @@ -34,9 +38,26 @@ //! \brief Initializes the object. //! + //! \param[in] system_data A class containing various system data points. + //! //! \return `true` if the snapshot could be created, `false` otherwise with //! an appropriate message logged. - bool Initialize(); + bool Initialize(const IOSSystemDataCollector& system_data); + + void SetException(const siginfo_t* siginfo, const ucontext_t* context); + //! \brief Sets the value to be returned by ClientID(). + //! + //! On iOS, the client ID is under the control of the snapshot producer, + //! which may call this method to set the client ID. If this is not done, + //! ClientID() will return an identifier consisting entirely of zeroes. + void SetClientID(const UUID& client_id) { client_id_ = client_id; } + + //! \brief Sets the value to be returned by ReportID(). + //! + //! On iOS, the crash report ID is under the control of the snapshot + //! producer, which may call this method to set the report ID. If this is not + //! done, ReportID() will return an identifier consisting entirely of zeroes. + void SetReportID(const UUID& report_id) { report_id_ = report_id; } // ProcessSnapshot: pid_t ProcessID() const override; @@ -65,8 +86,15 @@ // Initializes threads_ on behalf of Initialize(). void InitializeThreads(); + kinfo_proc kern_proc_info_; + time_value_t basic_info_user_time_; + time_value_t basic_info_system_time_; + time_value_t thread_times_user_time_; + time_value_t thread_times_system_time_; + internal::SystemSnapshotIOS system_; std::vector<std::unique_ptr<internal::ThreadSnapshotIOS>> threads_; std::vector<std::unique_ptr<internal::ModuleSnapshotIOS>> modules_; + std::unique_ptr<internal::ExceptionSnapshotIOS> exception_; UUID report_id_; UUID client_id_; std::map<std::string, std::string> annotations_simple_map_;
diff --git a/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.cc b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.cc new file mode 100644 index 0000000..57c686e --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.cc
@@ -0,0 +1,224 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "snapshot/ios/system_snapshot_ios.h" + +#include <mach/mach.h> +#include <stddef.h> +#include <sys/sysctl.h> +#include <sys/types.h> +#include <sys/utsname.h> + +#include <algorithm> + +#include "base/logging.h" +#include "base/mac/mach_logging.h" +#include "base/strings/stringprintf.h" +#include "build/build_config.h" +#include "snapshot/cpu_context.h" +#include "snapshot/posix/timezone.h" +#include "util/mac/mac_util.h" +#include "util/numeric/in_range_cast.h" + +namespace crashpad { + +namespace internal { + +SystemSnapshotIOS::SystemSnapshotIOS() + : SystemSnapshot(), + os_version_build_(), + machine_description_(), + os_version_major_(0), + os_version_minor_(0), + os_version_bugfix_(0), + active_(0), + inactive_(0), + wired_(0), + free_(0), + cpu_count_(0), + cpu_vendor_(), + dst_status_(), + standard_offset_seconds_(0), + daylight_offset_seconds_(0), + standard_name_(), + daylight_name_(), + initialized_() {} + +SystemSnapshotIOS::~SystemSnapshotIOS() {} + +void SystemSnapshotIOS::Initialize(const IOSSystemDataCollector& system_data) { + INITIALIZATION_STATE_SET_INITIALIZING(initialized_); + + system_data.OSVersion(&os_version_major_, + &os_version_minor_, + &os_version_bugfix_, + &os_version_build_); + machine_description_ = system_data.MachineDescription(); + cpu_count_ = system_data.ProcessorCount(); + cpu_vendor_ = system_data.CPUVendor(); + if (system_data.HasDaylightSavingTime()) { + dst_status_ = system_data.IsDaylightSavingTime() + ? SystemSnapshot::kObservingDaylightSavingTime + : SystemSnapshot::kObservingStandardTime; + } else { + dst_status_ = SystemSnapshot::kDoesNotObserveDaylightSavingTime; + } + standard_offset_seconds_ = system_data.StandardOffsetSeconds(); + daylight_offset_seconds_ = system_data.DaylightOffsetSeconds(); + standard_name_ = system_data.StandardName(); + daylight_name_ = system_data.DaylightName(); + + // Currently unused by minidump. + vm_size_t page_size; + host_page_size(mach_host_self(), &page_size); + mach_msg_type_number_t host_size = + sizeof(vm_statistics_data_t) / sizeof(integer_t); + vm_statistics_data_t vm_stat; + kern_return_t kr = host_statistics(mach_host_self(), + HOST_VM_INFO, + reinterpret_cast<host_info_t>(&vm_stat), + &host_size); + if (kr != KERN_SUCCESS) { + MACH_LOG(WARNING, kr) << "host_statistics"; + } + active_ = vm_stat.active_count * page_size; + inactive_ = vm_stat.inactive_count * page_size; + wired_ = vm_stat.wire_count * page_size; + free_ = vm_stat.free_count * page_size; + + INITIALIZATION_STATE_SET_VALID(initialized_); +} + +CPUArchitecture SystemSnapshotIOS::GetCPUArchitecture() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); +#if defined(ARCH_CPU_X86_64) + return kCPUArchitectureX86_64; +#elif defined(ARCH_CPU_ARM64) + return kCPUArchitectureARM64; +#endif +} + +uint32_t SystemSnapshotIOS::CPURevision() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): sysctlbyname machdep.cpu.* returns -1 on iOS/ARM64, but + // consider recording this for X86_64 only. + return 0; +} + +uint8_t SystemSnapshotIOS::CPUCount() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return cpu_count_; +} + +std::string SystemSnapshotIOS::CPUVendor() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return cpu_vendor_; +} + +void SystemSnapshotIOS::CPUFrequency(uint64_t* current_hz, + uint64_t* max_hz) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): sysctlbyname hw.cpufrequency returns -1 on iOS/ARM64, + // but consider recording this for X86_64 only. + *current_hz = 0; + *max_hz = 0; +} + +uint32_t SystemSnapshotIOS::CPUX86Signature() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +uint64_t SystemSnapshotIOS::CPUX86Features() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +uint64_t SystemSnapshotIOS::CPUX86ExtendedFeatures() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +uint32_t SystemSnapshotIOS::CPUX86Leaf7Features() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return 0; +} + +bool SystemSnapshotIOS::CPUX86SupportsDAZ() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider recording this for X86_64 only. + return false; +} + +SystemSnapshot::OperatingSystem SystemSnapshotIOS::GetOperatingSystem() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return kOperatingSystemIOS; +} + +bool SystemSnapshotIOS::OSServer() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return false; +} + +void SystemSnapshotIOS::OSVersion(int* major, + int* minor, + int* bugfix, + std::string* build) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *major = os_version_major_; + *minor = os_version_minor_; + *bugfix = os_version_bugfix_; + build->assign(os_version_build_); +} + +std::string SystemSnapshotIOS::OSVersionFull() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return base::StringPrintf("%d.%d.%d %s", + os_version_major_, + os_version_minor_, + os_version_bugfix_, + os_version_build_.c_str()); +} + +std::string SystemSnapshotIOS::MachineDescription() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + return machine_description_; +} + +bool SystemSnapshotIOS::NXEnabled() const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + // TODO(justincohen): Consider using kern.nx when available (pre-iOS 13, + // pre-OS X 10.15). Otherwise the bit is always enabled. + return true; +} + +void SystemSnapshotIOS::TimeZone(DaylightSavingTimeStatus* dst_status, + int* standard_offset_seconds, + int* daylight_offset_seconds, + std::string* standard_name, + std::string* daylight_name) const { + INITIALIZATION_STATE_DCHECK_VALID(initialized_); + *dst_status = dst_status_; + *standard_offset_seconds = standard_offset_seconds_; + *daylight_offset_seconds = daylight_offset_seconds_; + standard_name->assign(standard_name_); + daylight_name->assign(daylight_name_); +} + +} // namespace internal +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.h b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.h new file mode 100644 index 0000000..a38de4ef --- /dev/null +++ b/third_party/crashpad/crashpad/snapshot/ios/system_snapshot_ios.h
@@ -0,0 +1,94 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_SNAPSHOT_IOS_SYSTEM_SNAPSHOT_IOS_H_ +#define CRASHPAD_SNAPSHOT_IOS_SYSTEM_SNAPSHOT_IOS_H_ + +#include <stdint.h> + +#include <string> + +#include "base/macros.h" +#include "snapshot/system_snapshot.h" +#include "util/ios/ios_system_data_collector.h" +#include "util/misc/initialization_state_dcheck.h" + +namespace crashpad { + +namespace internal { + +//! \brief A SystemSnapshot of the running system, when the system runs iOS. +class SystemSnapshotIOS final : public SystemSnapshot { + public: + SystemSnapshotIOS(); + ~SystemSnapshotIOS() override; + + //! \brief Initializes the object. + //! + //! \param[in] system_data A class containing various system data points. + void Initialize(const IOSSystemDataCollector& system_data); + + // SystemSnapshot: + + CPUArchitecture GetCPUArchitecture() const override; + uint32_t CPURevision() const override; + uint8_t CPUCount() const override; + std::string CPUVendor() const override; + void CPUFrequency(uint64_t* current_hz, uint64_t* max_hz) const override; + uint32_t CPUX86Signature() const override; + uint64_t CPUX86Features() const override; + uint64_t CPUX86ExtendedFeatures() const override; + uint32_t CPUX86Leaf7Features() const override; + bool CPUX86SupportsDAZ() const override; + OperatingSystem GetOperatingSystem() const override; + bool OSServer() const override; + void OSVersion(int* major, + int* minor, + int* bugfix, + std::string* build) const override; + std::string OSVersionFull() const override; + bool NXEnabled() const override; + std::string MachineDescription() const override; + void TimeZone(DaylightSavingTimeStatus* dst_status, + int* standard_offset_seconds, + int* daylight_offset_seconds, + std::string* standard_name, + std::string* daylight_name) const override; + + private: + std::string os_version_build_; + std::string machine_description_; + int os_version_major_; + int os_version_minor_; + int os_version_bugfix_; + uint64_t active_; + uint64_t inactive_; + uint64_t wired_; + uint64_t free_; + int cpu_count_; + std::string cpu_vendor_; + DaylightSavingTimeStatus dst_status_; + int standard_offset_seconds_; + int daylight_offset_seconds_; + std::string standard_name_; + std::string daylight_name_; + InitializationStateDcheck initialized_; + + DISALLOW_COPY_AND_ASSIGN(SystemSnapshotIOS); +}; + +} // namespace internal +} // namespace crashpad + +#endif // CRASHPAD_SNAPSHOT_IOS_SYSTEM_SNAPSHOT_IOS_H_
diff --git a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc index 21f254e..5410be0 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac.cc
@@ -14,6 +14,7 @@ #include "snapshot/mac/system_snapshot_mac.h" +#include <AvailabilityMacros.h> #include <stddef.h> #include <sys/sysctl.h> #include <sys/types.h> @@ -22,6 +23,7 @@ #include <algorithm> #include "base/logging.h" +#include "base/scoped_clear_last_error.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "snapshot/cpu_context.h" @@ -35,10 +37,15 @@ namespace { template <typename T> +int ReadIntSysctlByName_NoLog(const char* name, T* value) { + size_t value_len = sizeof(*value); + return sysctlbyname(name, value, &value_len, nullptr, 0); +} + +template <typename T> T ReadIntSysctlByName(const char* name, T default_value) { T value; - size_t value_len = sizeof(value); - if (sysctlbyname(name, &value, &value_len, nullptr, 0) != 0) { + if (ReadIntSysctlByName_NoLog(name, &value) != 0) { PLOG(WARNING) << "sysctlbyname " << name; return default_value; } @@ -338,7 +345,35 @@ bool SystemSnapshotMac::NXEnabled() const { INITIALIZATION_STATE_DCHECK_VALID(initialized_); - return ReadIntSysctlByName<int>("kern.nx", 0); + + int value; + if (ReadIntSysctlByName_NoLog("kern.nx", &value) != 0) { + { + // Support for the kern.nx sysctlbyname is compiled out of production + // kernels on macOS 10.14.5 and later, although it’s available in + // development and debug kernels. Compare 10.14.3 + // xnu-4903.241.1/bsd/kern/kern_sysctl.c to 10.15.0 + // xnu-6153.11.26/bsd/kern/kern_sysctl.c (10.14.4 and 10.14.5 xnu source + // are not yet available). In newer production kernels, NX is always + // enabled. See 10.15.0 xnu-6153.11.26/osfmk/x86_64/pmap.c nx_enabled. +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_14 + const bool nx_always_enabled = true; +#else // DT >= 10.14 + base::ScopedClearLastError reset_errno; + const bool nx_always_enabled = MacOSXMinorVersion() >= 14; +#endif // DT >= 10.14 + if (nx_always_enabled) { + return true; + } + } + + // Even if sysctlbyname should have worked, NX is enabled by default in all + // supported configurations, so return true even while warning. + PLOG(WARNING) << "sysctlbyname kern.nx"; + return true; + } + + return value; } void SystemSnapshotMac::TimeZone(DaylightSavingTimeStatus* dst_status,
diff --git a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac_test.cc b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac_test.cc index 69048eb..2b66592 100644 --- a/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac_test.cc +++ b/third_party/crashpad/crashpad/snapshot/mac/system_snapshot_mac_test.cc
@@ -126,6 +126,12 @@ EXPECT_FALSE(system_snapshot().MachineDescription().empty()); } +TEST_F(SystemSnapshotMacTest, NXEnabled) { + // Assume NX will always be enabled, as it was always enabled by default on + // all supported versions of macOS. + EXPECT_TRUE(system_snapshot().NXEnabled()); +} + } // namespace } // namespace test } // namespace crashpad
diff --git a/third_party/crashpad/crashpad/snapshot/system_snapshot.h b/third_party/crashpad/crashpad/snapshot/system_snapshot.h index a363c0c..d78cc23 100644 --- a/third_party/crashpad/crashpad/snapshot/system_snapshot.h +++ b/third_party/crashpad/crashpad/snapshot/system_snapshot.h
@@ -50,6 +50,9 @@ //! \brief Fuchsia. kOperatingSystemFuchsia, + + //! \brief iOS. + kOperatingSystemIOS, }; //! \brief A system’s daylight saving time status.
diff --git a/third_party/crashpad/crashpad/test/BUILD.gn b/third_party/crashpad/crashpad/test/BUILD.gn index a00f682..bfbdd513 100644 --- a/third_party/crashpad/crashpad/test/BUILD.gn +++ b/third_party/crashpad/crashpad/test/BUILD.gn
@@ -245,6 +245,9 @@ "../third_party/mini_chromium:base", "../third_party/mini_chromium:base_test_support", ] + if (crashpad_is_android) { + deps += [ "../util" ] + } if (crashpad_is_ios) { deps += [ "ios:google_test_setup" ] } @@ -261,6 +264,9 @@ "../third_party/mini_chromium:base", "../third_party/mini_chromium:base_test_support", ] + if (crashpad_is_android) { + deps += [ "../util" ] + } if (crashpad_is_ios) { deps += [ "ios:google_test_setup" ] }
diff --git a/third_party/crashpad/crashpad/test/gtest_main.cc b/third_party/crashpad/crashpad/test/gtest_main.cc index ad3a095..73cdddf 100644 --- a/third_party/crashpad/crashpad/test/gtest_main.cc +++ b/third_party/crashpad/crashpad/test/gtest_main.cc
@@ -21,6 +21,10 @@ #include "gmock/gmock.h" #endif // CRASHPAD_TEST_LAUNCHER_GMOCK +#if defined(OS_ANDROID) +#include "util/linux/initial_signal_dispositions.h" +#endif // OS_ANDROID + #if defined(OS_IOS) #include "test/ios/google_test_setup.h" #endif @@ -55,6 +59,10 @@ } // namespace int main(int argc, char* argv[]) { +#if defined(OS_ANDROID) + crashpad::InitializeSignalDispositions(); +#endif // OS_ANDROID + crashpad::test::InitializeMainArguments(argc, argv); #if !defined(OS_IOS)
diff --git a/third_party/crashpad/crashpad/test/ios/crash_type_xctest.mm b/third_party/crashpad/crashpad/test/ios/crash_type_xctest.mm index 8ebdafa..5369e3cf 100644 --- a/third_party/crashpad/crashpad/test/ios/crash_type_xctest.mm +++ b/third_party/crashpad/crashpad/test/ios/crash_type_xctest.mm
@@ -145,4 +145,82 @@ XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); } +- (void)testException { + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); + + // Crash the app. + CPTestSharedObject* rootObject = [EDOClientService rootObjectWithPort:12345]; + [rootObject crashException]; + + // Confirm the app is not running. + XCTAssertTrue([_app waitForState:XCUIApplicationStateNotRunning timeout:15]); + XCTAssertTrue(_app.state == XCUIApplicationStateNotRunning); + + // TODO: Query the app for crash data + [_app launch]; + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); +} + +- (void)testNSException { + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); + + // Crash the app. + CPTestSharedObject* rootObject = [EDOClientService rootObjectWithPort:12345]; + [rootObject crashNSException]; + + // Confirm the app is not running. + XCTAssertTrue([_app waitForState:XCUIApplicationStateNotRunning timeout:15]); + XCTAssertTrue(_app.state == XCUIApplicationStateNotRunning); + + // TODO: Query the app for crash data + [_app launch]; + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); +} + +- (void)testCrashUnreocgnizedSelectorAfterDelay { + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); + + // Crash the app. + CPTestSharedObject* rootObject = [EDOClientService rootObjectWithPort:12345]; + [rootObject crashUnreocgnizedSelectorAfterDelay]; + + // Confirm the app is not running. + XCTAssertTrue([_app waitForState:XCUIApplicationStateNotRunning timeout:15]); + XCTAssertTrue(_app.state == XCUIApplicationStateNotRunning); + + // TODO: Query the app for crash data + [_app launch]; + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); +} + +- (void)testCatchNSException { + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); + + // The app should not crash + CPTestSharedObject* rootObject = [EDOClientService rootObjectWithPort:12345]; + [rootObject catchNSException]; + + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); +} + +- (void)testRecursion { + // TODO(justincohen): Crashpad iOS does not currently support stack type + // crashes. + return; + + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); + + // Crash the app. + CPTestSharedObject* rootObject = [EDOClientService rootObjectWithPort:12345]; + [rootObject crashRecursion]; + + // Confirm the app is not running. + XCTAssertTrue([_app waitForState:XCUIApplicationStateNotRunning timeout:15]); + XCTAssertTrue(_app.state == XCUIApplicationStateNotRunning); + + // TODO: Query the app for crash data + [_app launch]; + XCTAssertTrue(_app.state == XCUIApplicationStateRunningForeground); +} + @end
diff --git a/third_party/crashpad/crashpad/test/ios/host/application_delegate.mm b/third_party/crashpad/crashpad/test/ios/host/application_delegate.mm index a31d4d6..c74229a8 100644 --- a/third_party/crashpad/crashpad/test/ios/host/application_delegate.mm +++ b/third_party/crashpad/crashpad/test/ios/host/application_delegate.mm
@@ -14,6 +14,10 @@ #import "test/ios/host/application_delegate.h" +#include <dispatch/dispatch.h> + +#include <vector> + #import "Service/Sources/EDOHostNamingService.h" #import "Service/Sources/EDOHostService.h" #include "client/crashpad_client.h" @@ -75,4 +79,41 @@ abort(); } +- (void)crashException { + std::vector<int> empty_vector = {}; + empty_vector.at(42); +} + +- (void)crashNSException { + // EDO has its own sinkhole. + dispatch_async(dispatch_get_main_queue(), ^{ + NSArray* empty_array = @[]; + [empty_array objectAtIndex:42]; + }); +} + +- (void)catchNSException { + @try { + NSArray* empty_array = @[]; + [empty_array objectAtIndex:42]; + } @catch (NSException* exception) { + } @finally { + } +} + +- (void)crashUnreocgnizedSelectorAfterDelay { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wundeclared-selector" + [self performSelector:@selector(does_not_exist) withObject:nil afterDelay:1]; +#pragma clang diagnostic pop +} + +- (void)recurse { + [self recurse]; +} + +- (void)crashRecursion { + [self recurse]; +} + @end
diff --git a/third_party/crashpad/crashpad/test/ios/host/cptest_shared_object.h b/third_party/crashpad/crashpad/test/ios/host/cptest_shared_object.h index 483fce4..70c814b 100644 --- a/third_party/crashpad/crashpad/test/ios/host/cptest_shared_object.h +++ b/third_party/crashpad/crashpad/test/ios/host/cptest_shared_object.h
@@ -35,6 +35,21 @@ // Trigger a crash with an abort(). - (void)crashAbort; + +// Trigger a crash with an uncaught exception. +- (void)crashException; + +// Trigger a crash with an uncaught NSException. +- (void)crashNSException; + +// Trigger an unrecognized selector after delay. +- (void)crashUnreocgnizedSelectorAfterDelay; + +// Trigger a caught NSxception. +- (void)catchNSException; + +// Trigger a crash with an infinite recursion. +- (void)crashRecursion; @end #endif // CRASHPAD_TEST_IOS_HOST_SHARED_OBJECT_H_
diff --git a/third_party/crashpad/crashpad/third_party/fuchsia/BUILD.gn b/third_party/crashpad/crashpad/third_party/fuchsia/BUILD.gn index 4111c58..56d426a 100644 --- a/third_party/crashpad/crashpad/third_party/fuchsia/BUILD.gn +++ b/third_party/crashpad/crashpad/third_party/fuchsia/BUILD.gn
@@ -82,7 +82,6 @@ "$sdk_pkg_path/fidl_base/builder.cc", "$sdk_pkg_path/fidl_base/decoding.cc", "$sdk_pkg_path/fidl_base/encoding.cc", - "$sdk_pkg_path/fidl_base/envelope_frames.h", "$sdk_pkg_path/fidl_base/formatting.cc", "$sdk_pkg_path/fidl_base/linearizing.cc", "$sdk_pkg_path/fidl_base/message.cc", @@ -91,9 +90,7 @@ "$sdk_pkg_path/fidl_base/transformer.cc", "$sdk_pkg_path/fidl_base/txn_header.c", "$sdk_pkg_path/fidl_base/validating.cc", - "$sdk_pkg_path/fidl_base/visitor.h", "$sdk_pkg_path/fidl_base/walker.cc", - "$sdk_pkg_path/fidl_base/walker.h", ] public_configs = [ ":fidl_config" ]
diff --git a/third_party/crashpad/crashpad/third_party/gtest/BUILD.gn b/third_party/crashpad/crashpad/third_party/gtest/BUILD.gn index 28137681..4764604 100644 --- a/third_party/crashpad/crashpad/third_party/gtest/BUILD.gn +++ b/third_party/crashpad/crashpad/third_party/gtest/BUILD.gn
@@ -291,8 +291,6 @@ "gtest/googlemock/include/gmock/gmock-cardinalities.h", "gtest/googlemock/include/gmock/gmock-function-mocker.h", "gtest/googlemock/include/gmock/gmock-generated-actions.h", - "gtest/googlemock/include/gmock/gmock-generated-function-mockers.h", - "gtest/googlemock/include/gmock/gmock-generated-matchers.h", "gtest/googlemock/include/gmock/gmock-matchers.h", "gtest/googlemock/include/gmock/gmock-more-actions.h", "gtest/googlemock/include/gmock/gmock-more-matchers.h", @@ -342,7 +340,6 @@ "gtest/googlemock/test/gmock-cardinalities_test.cc", "gtest/googlemock/test/gmock-function-mocker_test.cc", "gtest/googlemock/test/gmock-generated-actions_test.cc", - "gtest/googlemock/test/gmock-generated-function-mockers_test.cc", "gtest/googlemock/test/gmock-generated-matchers_test.cc", "gtest/googlemock/test/gmock-internal-utils_test.cc", "gtest/googlemock/test/gmock-matchers_test.cc",
diff --git a/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp b/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp index 499792f9..10c0879 100644 --- a/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp +++ b/third_party/crashpad/crashpad/third_party/gtest/gmock.gyp
@@ -58,8 +58,6 @@ '<(gmock_dir)/include/gmock/gmock-cardinalities.h', '<(gmock_dir)/include/gmock/gmock-function-mocker.h', '<(gmock_dir)/include/gmock/gmock-generated-actions.h', - '<(gmock_dir)/include/gmock/gmock-generated-function-mockers.h', - '<(gmock_dir)/include/gmock/gmock-generated-matchers.h', '<(gmock_dir)/include/gmock/gmock-matchers.h', '<(gmock_dir)/include/gmock/gmock-more-actions.h', '<(gmock_dir)/include/gmock/gmock-more-matchers.h', @@ -160,7 +158,6 @@ '<(gmock_dir)/test/gmock-cardinalities_test.cc', '<(gmock_dir)/test/gmock-function-mocker_test.cc', '<(gmock_dir)/test/gmock-generated-actions_test.cc', - '<(gmock_dir)/test/gmock-generated-function-mockers_test.cc', '<(gmock_dir)/test/gmock-generated-matchers_test.cc', '<(gmock_dir)/test/gmock-internal-utils_test.cc', '<(gmock_dir)/test/gmock-matchers_test.cc',
diff --git a/third_party/crashpad/crashpad/third_party/zlib/BUILD.gn b/third_party/crashpad/crashpad/third_party/zlib/BUILD.gn index 1723c11d..e5a2ad3 100644 --- a/third_party/crashpad/crashpad/third_party/zlib/BUILD.gn +++ b/third_party/crashpad/crashpad/third_party/zlib/BUILD.gn
@@ -71,9 +71,9 @@ "zlib/uncompr.c", "zlib/zconf.h", "zlib/zlib.h", - "zlib/zlib_crashpad.h", "zlib/zutil.c", "zlib/zutil.h", + "zlib_crashpad.h", ] cflags = []
diff --git a/third_party/crashpad/crashpad/util/BUILD.gn b/third_party/crashpad/crashpad/util/BUILD.gn index bd0d2427..18cc112 100644 --- a/third_party/crashpad/crashpad/util/BUILD.gn +++ b/third_party/crashpad/crashpad/util/BUILD.gn
@@ -17,6 +17,9 @@ if (crashpad_is_in_chromium) { import("//build/config/sanitizers/sanitizers.gni") + + # Prevent Chromium source assignment filters from being inherited. + set_sources_assignment_filter([]) } if (crashpad_is_mac) { @@ -241,6 +244,17 @@ } } + if (crashpad_is_ios) { + sources += [ + "ios/exception_processor.h", + "ios/exception_processor.mm", + "ios/ios_system_data_collector.h", + "ios/ios_system_data_collector.mm", + "mac/xattr.cc", + "mac/xattr.h", + ] + } + if (crashpad_is_mac) { sources += [ "mac/checked_mach_address_range.h", @@ -312,8 +326,14 @@ } } + if (crashpad_is_android) { + sources += [ + "linux/initial_signal_dispositions.cc", + "linux/initial_signal_dispositions.h", + ] + } + if (crashpad_is_linux || crashpad_is_android) { - set_sources_assignment_filter([]) sources += [ "linux/address_types.h", "linux/auxiliary_vector.cc", @@ -661,7 +681,6 @@ } if (crashpad_is_linux || crashpad_is_android) { - set_sources_assignment_filter([]) sources += [ "linux/auxiliary_vector_test.cc", "linux/memory_map_test.cc",
diff --git a/third_party/crashpad/crashpad/util/ios/exception_processor.h b/third_party/crashpad/crashpad/util/ios/exception_processor.h new file mode 100644 index 0000000..76a8c8b3 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/exception_processor.h
@@ -0,0 +1,37 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_IOS_EXCEPTION_PROCESSOR_H_ +#define CRASHPAD_UTIL_IOS_EXCEPTION_PROCESSOR_H_ + +namespace crashpad { + +//! \brief Installs the Objective-C exception preprocessor. +//! +//! When code raises an Objective-C exception, unwind the stack looking for +//! any exception handlers. If an exception handler is encountered, test to +//! see if it is a function known to be a catch-and-rethrow 'sinkhole' exception +//! handler. Various routines in UIKit do this, and they obscure the +//! crashing stack, since the original throw location is no longer present +//! on the stack (just the re-throw) when Crashpad captures the crash +//! report. In the case of sinkholes, trigger an immediate exception to +//! capture the original stack. +//! +//! This should be installed at the same time the CrashpadClient installs the +//! signal handler. It should only be installed once. +void InstallObjcExceptionPreprocessor(); + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_EXCEPTION_PROCESSOR_H_
diff --git a/third_party/crashpad/crashpad/util/ios/exception_processor.mm b/third_party/crashpad/crashpad/util/ios/exception_processor.mm new file mode 100644 index 0000000..818d498 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/exception_processor.mm
@@ -0,0 +1,289 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/ios/exception_processor.h" + +#import <Foundation/Foundation.h> +#include <TargetConditionals.h> +#include <cxxabi.h> +#include <dlfcn.h> +#include <libunwind.h> +#include <mach-o/loader.h> +#include <objc/objc-exception.h> +#include <objc/objc.h> +#include <objc/runtime.h> +#include <stdint.h> +#include <string.h> +#include <sys/types.h> +#include <unwind.h> + +#include <exception> +#include <type_traits> +#include <typeinfo> + +#include "base/logging.h" +#include "base/strings/sys_string_conversions.h" +#include "build/build_config.h" + +namespace { + +// From 10.15.0 objc4-779.1/runtime/objc-exception.mm. +struct objc_typeinfo { + const void* const* vtable; + const char* name; + Class cls_unremapped; +}; +struct objc_exception { + id obj; + objc_typeinfo tinfo; +}; + +// From 10.15.0 objc4-779.1/runtime/objc-abi.h. +extern "C" const void* const objc_ehtype_vtable[]; + +// https://github.com/llvm/llvm-project/blob/09dc884eb2e4/libcxxabi/src/cxa_exception.h +static const uint64_t kOurExceptionClass = 0x434c4e47432b2b00; +struct __cxa_exception { +#if defined(ARCH_CPU_64_BITS) + void* reserve; + size_t referenceCount; +#endif + std::type_info* exceptionType; + void (*exceptionDestructor)(void*); + std::unexpected_handler unexpectedHandler; + std::terminate_handler terminateHandler; + __cxa_exception* nextException; + int handlerCount; + int handlerSwitchValue; + const unsigned char* actionRecord; + const unsigned char* languageSpecificData; + void* catchTemp; + void* adjustedPtr; +#if !defined(ARCH_CPU_64_BITS) + size_t referenceCount; +#endif + _Unwind_Exception unwindHeader; +}; + +objc_exception_preprocessor g_next_preprocessor; +bool g_exception_preprocessor_installed; + +void TerminatingFromUncaughtNSException(id exception, const char* sinkhole) { + // TODO(justincohen): This is incomplete, as the signal handler will not have + // access to the exception name and reason. Pass that along somehow here. + NSString* exception_message_ns = [NSString + stringWithFormat:@"%@: %@", [exception name], [exception reason]]; + std::string exception_message = base::SysNSStringToUTF8(exception_message_ns); + LOG(INFO) << "Terminating from Objective-C exception: " << exception_message + << " with sinkhole: " << sinkhole; + // TODO(justincohen): This is temporary, as crashpad can capture this + // exception directly instead. + std::terminate(); +} + +// Returns true if |path| equals |sinkhole| on device. Simulator paths prepend +// much of Xcode's internal structure, so check that |path| ends with |sinkhole| +// for simulator. +bool ModulePathMatchesSinkhole(const char* path, const char* sinkhole) { +#if TARGET_OS_SIMULATOR + size_t path_length = strlen(path); + size_t sinkhole_length = strlen(sinkhole); + if (sinkhole_length > path_length) + return false; + return strncmp(path + path_length - sinkhole_length, + sinkhole, + sinkhole_length) == 0; +#else + return strcmp(path, sinkhole) == 0; +#endif +} + +id ObjcExceptionPreprocessor(id exception) { + // Unwind the stack looking for any exception handlers. If an exception + // handler is encountered, test to see if it is a function known to catch- + // and-rethrow as a "top-level" exception handler. Various routines in + // Cocoa/UIKit do this, and it obscures the crashing stack, since the original + // throw location is no longer present on the stack (just the re-throw) when + // Crashpad captures the crash report. + unw_context_t context; + unw_getcontext(&context); + + unw_cursor_t cursor; + unw_init_local(&cursor, &context); + + static const void* this_base_address = []() -> const void* { + Dl_info dl_info; + if (!dladdr(reinterpret_cast<const void*>(&ObjcExceptionPreprocessor), + &dl_info)) { + LOG(ERROR) << "dladdr: " << dlerror(); + return nullptr; + } + return dl_info.dli_fbase; + }(); + + // Generate an exception_header for the __personality_routine. + // From 10.15.0 objc4-779.1/runtime/objc-exception.mm objc_exception_throw. + objc_exception* exception_objc = reinterpret_cast<objc_exception*>( + __cxxabiv1::__cxa_allocate_exception(sizeof(objc_exception))); + exception_objc->obj = exception; + exception_objc->tinfo.vtable = objc_ehtype_vtable + 2; + exception_objc->tinfo.name = object_getClassName(exception); + exception_objc->tinfo.cls_unremapped = object_getClass(exception); + + // https://github.com/llvm/llvm-project/blob/c5d2746fbea7/libcxxabi/src/cxa_exception.cpp + // __cxa_throw + __cxa_exception* exception_header = + reinterpret_cast<__cxa_exception*>(exception_objc) - 1; + exception_header->unexpectedHandler = std::get_unexpected(); + exception_header->terminateHandler = std::get_terminate(); + exception_header->exceptionType = + reinterpret_cast<std::type_info*>(&exception_objc->tinfo); + exception_header->unwindHeader.exception_class = kOurExceptionClass; + + bool handler_found = false; + while (unw_step(&cursor) > 0) { + unw_proc_info_t frame_info; + if (unw_get_proc_info(&cursor, &frame_info) != UNW_ESUCCESS) { + continue; + } + + if (frame_info.handler == 0) { + continue; + } + + // Check to see if the handler is really an exception handler. + __personality_routine p = + reinterpret_cast<__personality_routine>(frame_info.handler); + + // From 10.15.0 libunwind-35.4/src/UnwindLevel1.c. + _Unwind_Reason_Code personalityResult = (*p)( + 1, + _UA_SEARCH_PHASE, + exception_header->unwindHeader.exception_class, + reinterpret_cast<_Unwind_Exception*>(&exception_header->unwindHeader), + reinterpret_cast<_Unwind_Context*>(&cursor)); + switch (personalityResult) { + case _URC_HANDLER_FOUND: + break; + case _URC_CONTINUE_UNWIND: + continue; + default: + break; + } + + char proc_name[512]; + unw_word_t offset; + if (unw_get_proc_name(&cursor, proc_name, sizeof(proc_name), &offset) != + UNW_ESUCCESS) { + // The symbol has no name, so see if it belongs to the same image as + // this function. + Dl_info dl_info; + if (dladdr(reinterpret_cast<const void*>(frame_info.start_ip), + &dl_info)) { + if (dl_info.dli_fbase == this_base_address) { + // This is a handler in our image, so allow it to run. + handler_found = true; + break; + } + } + + // This handler does not belong to us, so continue the search. + continue; + } + + // Check if the function is one that is known to obscure (by way of + // catch-and-rethrow) exception stack traces. If it is, sinkhole it + // by crashing here at the point of throw. + constexpr const char* kExceptionSymbolNameSinkholes[] = { + // The two CF symbol names will also be captured by the CoreFoundation + // library path check below, but for completeness they are listed here, + // since they appear unredacted. + "CFRunLoopRunSpecific", + "_CFXNotificationPost", + "__NSFireDelayedPerform", + }; + for (const char* sinkhole : kExceptionSymbolNameSinkholes) { + if (strcmp(sinkhole, proc_name) == 0) { + TerminatingFromUncaughtNSException(exception, sinkhole); + } + } + + // On iOS, function names are often reported as "<redacted>", although they + // do appear when attached to the debugger. When this happens, use the path + // of the image to determine if the handler is an exception sinkhole. + constexpr const char* kExceptionLibraryPathSinkholes[] = { + // Everything in this library is a sinkhole, specifically + // _dispatch_client_callout. Both are needed here depending on whether + // the debugger is attached (introspection only appears when a simulator + // is attached to a debugger. + // only). + "/usr/lib/system/introspection/libdispatch.dylib", + "/usr/lib/system/libdispatch.dylib", + + // __CFRunLoopDoTimers and __CFRunLoopRun are sinkholes. Consider also + // checking that a few frames up is CFRunLoopRunSpecific(). + "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation"}; + + Dl_info dl_info; + if (dladdr(reinterpret_cast<const void*>(frame_info.start_ip), &dl_info) != + 0) { + for (const char* sinkhole : kExceptionLibraryPathSinkholes) { + if (ModulePathMatchesSinkhole(dl_info.dli_fname, sinkhole)) { + TerminatingFromUncaughtNSException(exception, sinkhole); + } + } + } + + handler_found = true; + + break; + } + + // If no handler is found, __cxa_throw would call failed_throw and terminate. + // See: + // https://github.com/llvm/llvm-project/blob/c5d2746fbea7/libcxxabi/src/cxa_exception.cpp + // __cxa_throw. Instead, terminate via TerminatingFromUncaughtNSException so + // the exception name and reason are properly recorded. + if (!handler_found) { + TerminatingFromUncaughtNSException(exception, "__cxa_throw"); + } + + // Forward to the next preprocessor. + if (g_next_preprocessor) + return g_next_preprocessor(exception); + + return exception; +} + +} // namespace + +namespace crashpad { + +void InstallObjcExceptionPreprocessor() { + DCHECK(!g_exception_preprocessor_installed); + + g_next_preprocessor = + objc_setExceptionPreprocessor(&ObjcExceptionPreprocessor); + g_exception_preprocessor_installed = true; +} + +void UninstallObjcExceptionPreprocessor() { + DCHECK(g_exception_preprocessor_installed); + + objc_setExceptionPreprocessor(g_next_preprocessor); + g_next_preprocessor = nullptr; + g_exception_preprocessor_installed = false; +} + +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.h b/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.h new file mode 100644 index 0000000..45837c6 --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.h
@@ -0,0 +1,81 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_IOS_IOS_SYSTEM_DATA_COLLECTOR_H_ +#define CRASHPAD_UTIL_IOS_IOS_SYSTEM_DATA_COLLECTOR_H_ + +#import <CoreFoundation/CoreFoundation.h> + +#include <string> + +namespace crashpad { + +//! \brief Used to collect system level data before a crash occurs. +class IOSSystemDataCollector { + public: + IOSSystemDataCollector(); + ~IOSSystemDataCollector(); + + void OSVersion(int* major, int* minor, int* bugfix, std::string* build) const; + std::string MachineDescription() const { return machine_description_; } + int ProcessorCount() const { return processor_count_; } + std::string CPUVendor() const { return cpu_vendor_; } + bool HasDaylightSavingTime() const { return has_next_daylight_saving_time_; } + bool IsDaylightSavingTime() const { return is_daylight_saving_time_; } + int StandardOffsetSeconds() const { return standard_offset_seconds_; } + int DaylightOffsetSeconds() const { return daylight_offset_seconds_; } + std::string StandardName() const { return standard_name_; } + std::string DaylightName() const { return daylight_name_; } + + // Currently unused by minidump. + int Orientation() const { return orientation_; } + + private: + // Notification handlers. + void InstallHandlers(); + static void SystemTimeZoneDidChangeNotificationHandler( + CFNotificationCenterRef center, + void* observer, + CFStringRef name, + const void* object, + CFDictionaryRef userInfo); + void SystemTimeZoneDidChangeNotification(); + + static void OrientationDidChangeNotificationHandler( + CFNotificationCenterRef center, + void* observer, + CFStringRef name, + const void* object, + CFDictionaryRef userInfo); + void OrientationDidChangeNotification(); + + int major_version_; + int minor_version_; + int patch_version_; + std::string build_; + std::string machine_description_; + int orientation_; + int processor_count_; + std::string cpu_vendor_; + bool has_next_daylight_saving_time_; + bool is_daylight_saving_time_; + int standard_offset_seconds_; + int daylight_offset_seconds_; + std::string standard_name_; + std::string daylight_name_; +}; + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_IOS_IOS_SYSTEM_DATA_COLLECTOR_H_
diff --git a/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.mm b/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.mm new file mode 100644 index 0000000..c81fe3f --- /dev/null +++ b/third_party/crashpad/crashpad/util/ios/ios_system_data_collector.mm
@@ -0,0 +1,209 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/ios/ios_system_data_collector.h" + +#include <sys/sysctl.h> +#include <sys/utsname.h> + +#import <Foundation/Foundation.h> +#include <TargetConditionals.h> +#import <UIKit/UIKit.h> + +#include "base/mac/mach_logging.h" +#include "base/numerics/safe_conversions.h" +#include "base/strings/sys_string_conversions.h" +#include "build/build_config.h" + +namespace { + +std::string ReadStringSysctlByName(const char* name) { + size_t buf_len; + if (sysctlbyname(name, nullptr, &buf_len, nullptr, 0) != 0) { + PLOG(WARNING) << "sysctlbyname (size) " << name; + return std::string(); + } + + if (buf_len == 0) { + return std::string(); + } + + std::string value(buf_len - 1, '\0'); + if (sysctlbyname(name, &value[0], &buf_len, nullptr, 0) != 0) { + PLOG(WARNING) << "sysctlbyname " << name; + return std::string(); + } + + return value; +} + +} // namespace + +namespace crashpad { + +IOSSystemDataCollector::IOSSystemDataCollector() + : major_version_(0), + minor_version_(0), + patch_version_(0), + build_(), + machine_description_(), + orientation_(0), + processor_count_(0), + cpu_vendor_(), + has_next_daylight_saving_time_(false), + is_daylight_saving_time_(false), + standard_offset_seconds_(0), + daylight_offset_seconds_(0), + standard_name_(), + daylight_name_() { + NSOperatingSystemVersion version = + [[NSProcessInfo processInfo] operatingSystemVersion]; + major_version_ = base::saturated_cast<int>(version.majorVersion); + minor_version_ = base::saturated_cast<int>(version.minorVersion); + patch_version_ = base::saturated_cast<int>(version.patchVersion); + processor_count_ = + base::saturated_cast<int>([[NSProcessInfo processInfo] processorCount]); + build_ = ReadStringSysctlByName("kern.osversion"); + +#if defined(ARCH_CPU_X86_64) + cpu_vendor_ = ReadStringSysctlByName("machdep.cpu.vendor"); +#endif + +#if TARGET_OS_SIMULATOR + // TODO(justincohen): Consider adding board and model information to + // |machine_description| as well (similar to MacModelAndBoard in + // util/mac/mac_util.cc). + switch (UI_USER_INTERFACE_IDIOM()) { + case UIUserInterfaceIdiomPhone: + machine_description_ = "iOS Simulator (iPhone)"; + break; + case UIUserInterfaceIdiomPad: + machine_description_ = "iOS Simulator (iPad)"; + break; + default: + machine_description_ = "iOS Simulator (Unknown)"; + break; + } +#elif TARGET_OS_IPHONE + utsname uts; + if (uname(&uts) == 0) { + machine_description_ = uts.machine; + } +#else +#error "Unexpected target type OS." +#endif + + InstallHandlers(); +} + +IOSSystemDataCollector::~IOSSystemDataCollector() { + CFNotificationCenterRemoveEveryObserver(CFNotificationCenterGetLocalCenter(), + this); +} + +void IOSSystemDataCollector::OSVersion(int* major, + int* minor, + int* bugfix, + std::string* build) const { + *major = major_version_; + *minor = minor_version_; + *bugfix = patch_version_; + build->assign(build_); +} + +void IOSSystemDataCollector::InstallHandlers() { + // Timezone. + CFNotificationCenterAddObserver( + CFNotificationCenterGetLocalCenter(), + this, + IOSSystemDataCollector::SystemTimeZoneDidChangeNotificationHandler, + reinterpret_cast<CFStringRef>(NSSystemTimeZoneDidChangeNotification), + nullptr, + CFNotificationSuspensionBehaviorDeliverImmediately); + SystemTimeZoneDidChangeNotification(); + + // Orientation. + CFNotificationCenterAddObserver( + CFNotificationCenterGetLocalCenter(), + this, + IOSSystemDataCollector::OrientationDidChangeNotificationHandler, + reinterpret_cast<CFStringRef>(UIDeviceOrientationDidChangeNotification), + nullptr, + CFNotificationSuspensionBehaviorDeliverImmediately); + OrientationDidChangeNotification(); +} + +// static +void IOSSystemDataCollector::SystemTimeZoneDidChangeNotificationHandler( + CFNotificationCenterRef center, + void* observer, + CFStringRef name, + const void* object, + CFDictionaryRef userInfo) { + static_cast<IOSSystemDataCollector*>(observer) + ->SystemTimeZoneDidChangeNotification(); +} + +void IOSSystemDataCollector::SystemTimeZoneDidChangeNotification() { + NSTimeZone* time_zone = NSTimeZone.localTimeZone; + NSDate* transition = + [time_zone nextDaylightSavingTimeTransitionAfterDate:[NSDate date]]; + if (transition == nil) { + has_next_daylight_saving_time_ = false; + is_daylight_saving_time_ = false; + standard_offset_seconds_ = + base::saturated_cast<int>([time_zone secondsFromGMTForDate:transition]); + standard_name_ = base::SysNSStringToUTF8([time_zone abbreviation]); + daylight_offset_seconds_ = standard_offset_seconds_; + daylight_name_ = standard_name_; + } else { + has_next_daylight_saving_time_ = true; + is_daylight_saving_time_ = time_zone.isDaylightSavingTime; + if (time_zone.isDaylightSavingTime) { + standard_offset_seconds_ = base::saturated_cast<int>( + [time_zone secondsFromGMTForDate:transition]); + standard_name_ = + base::SysNSStringToUTF8([time_zone abbreviationForDate:transition]); + daylight_offset_seconds_ = + base::saturated_cast<int>([time_zone secondsFromGMT]); + daylight_name_ = base::SysNSStringToUTF8([time_zone abbreviation]); + } else { + standard_offset_seconds_ = + base::saturated_cast<int>([time_zone secondsFromGMT]); + standard_name_ = base::SysNSStringToUTF8([time_zone abbreviation]); + daylight_offset_seconds_ = base::saturated_cast<int>( + [time_zone secondsFromGMTForDate:transition]); + daylight_name_ = + base::SysNSStringToUTF8([time_zone abbreviationForDate:transition]); + } + } +} + +// static +void IOSSystemDataCollector::OrientationDidChangeNotificationHandler( + CFNotificationCenterRef center, + void* observer, + CFStringRef name, + const void* object, + CFDictionaryRef userInfo) { + static_cast<IOSSystemDataCollector*>(observer) + ->OrientationDidChangeNotification(); +} + +void IOSSystemDataCollector::OrientationDidChangeNotification() { + orientation_ = + base::saturated_cast<int>([[UIDevice currentDevice] orientation]); +} + +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/linux/initial_signal_dispositions.cc b/third_party/crashpad/crashpad/util/linux/initial_signal_dispositions.cc new file mode 100644 index 0000000..b72b247 --- /dev/null +++ b/third_party/crashpad/crashpad/util/linux/initial_signal_dispositions.cc
@@ -0,0 +1,78 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "util/linux/initial_signal_dispositions.h" + +#include <android/api-level.h> +#include <signal.h> + +#include "base/logging.h" +#include "build/build_config.h" + +#if __ANDROID_API__ <= 23 + +namespace crashpad { +namespace { +bool LoggingSignal(int signum, sighandler_t handler) { + sighandler_t previous = signal(signum, handler); + PLOG_IF(ERROR, previous == SIG_ERR) << "signal " << signum; + return previous != SIG_ERR; +} +} // namespace + +#endif // __ANDROID_API__ <= 23 + +bool InitializeSignalDispositions() { +#if __ANDROID_API__ <= 23 + const int api_level = android_get_device_api_level(); + if (api_level < 0) { + LOG(WARNING) << "bad api level"; + return false; + } + + // Bionic installs signal handlers which request crash dumps from Android's + // debuggerd, but there are errors in how signals which aren't automatically + // re-raised are handled on Marshmallow (API 23). + // + // Before requesting a dump, Bionic acquires a lock to communicate with + // debuggerd and expecting imminent death, never releases it. + // + // While handling the dump request, debuggerd allows the dying process to + // continue before ptrace-detaching it. So, when Bionic manually re-raises a + // signal, it is intercepted by debuggerd and the dying process is allowed to + // live. + // + // Bionic restores SIG_DFL for the signal it's just handled, but if a + // different crash signal is later recieved, Bionic attempts to reacquire the + // lock to communicate with debuggerd and blocks forever. + // + // Disable Bionic's signal handlers for these signals on Marshmallow. + bool success = true; + if (api_level == 23) { + success = LoggingSignal(SIGABRT, SIG_DFL); + success = LoggingSignal(SIGFPE, SIG_DFL) && success; + success = LoggingSignal(SIGPIPE, SIG_DFL) && success; +#if defined(SIGSTKFLT) + success = LoggingSignal(SIGSTKFLT, SIG_DFL) && success; +#endif + success = LoggingSignal(SIGTRAP, SIG_DFL) && success; + } + + return success; +#else + return true; +#endif // __ANDROID_API__ <= 23 +} + +} // namespace crashpad
diff --git a/third_party/crashpad/crashpad/util/linux/initial_signal_dispositions.h b/third_party/crashpad/crashpad/util/linux/initial_signal_dispositions.h new file mode 100644 index 0000000..b67083c --- /dev/null +++ b/third_party/crashpad/crashpad/util/linux/initial_signal_dispositions.h
@@ -0,0 +1,41 @@ +// Copyright 2020 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_UTIL_LINUX_INITIAL_SIGNAL_DISPOSITIONS_H +#define CRASHPAD_UTIL_LINUX_INITIAL_SIGNAL_DISPOSITIONS_H + +namespace crashpad { + +//! \brief Establishes signal dispositions for a process based on the platform. +//! +//! Default signal dispositions are normally configured by the kernel, but +//! additional signal handlers might be installed by dependent or preloaded +//! libraries, e.g. Bionic normally installs signal handlers which log stack +//! traces to Android's logcat. +//! +//! This function initializes signal dispositions when the default dispositions +//! provided by the platform are broken. This function must be called before any +//! application level signal handlers have been installed and should be called +//! early in the process lifetime to reduce the chance of any broken signal +//! handlers being triggered. +//! +//! When running on Android M (API 23), this function installs `SIG_DFL` for +//! signals: `SIGABRT`, `SIGFPE`, `SIGPIPE`, `SIGSTKFLT`, and `SIGTRAP`. +//! +//! \return `true` on success. Otherwise `false` with a message logged. +bool InitializeSignalDispositions(); + +} // namespace crashpad + +#endif // CRASHPAD_UTIL_LINUX_INITIAL_SIGNAL_DISPOSITIONS_H
diff --git a/third_party/crashpad/crashpad/util/util.gyp b/third_party/crashpad/crashpad/util/util.gyp index 3c980e4..78a432a 100644 --- a/third_party/crashpad/crashpad/util/util.gyp +++ b/third_party/crashpad/crashpad/util/util.gyp
@@ -67,6 +67,8 @@ 'linux/exception_handler_protocol.cc', 'linux/exception_handler_protocol.h', 'linux/exception_information.h', + 'linux/initial_signal_dispositions.cc', + 'linux/initial_signal_dispositions.h', 'linux/memory_map.cc', 'linux/memory_map.h', 'linux/proc_stat_reader.cc',
diff --git a/third_party/crashpad/crashpad/util/win/exception_handler_server.cc b/third_party/crashpad/crashpad/util/win/exception_handler_server.cc index 2593ff2d..c841f7b 100644 --- a/third_party/crashpad/crashpad/util/win/exception_handler_server.cc +++ b/third_party/crashpad/crashpad/util/win/exception_handler_server.cc
@@ -26,9 +26,6 @@ #include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" -#include "minidump/minidump_file_writer.h" -#include "snapshot/crashpad_info_client_options.h" -#include "snapshot/win/process_snapshot_win.h" #include "util/file/file_writer.h" #include "util/misc/tri_state.h" #include "util/misc/uuid.h"
diff --git a/third_party/zlib/contrib/bench/zlib_bench.cc b/third_party/zlib/contrib/bench/zlib_bench.cc index 5dcdef0..3a488f2 100644 --- a/third_party/zlib/contrib/bench/zlib_bench.cc +++ b/third_party/zlib/contrib/bench/zlib_bench.cc
@@ -38,7 +38,7 @@ } inline char* string_data(std::string* s) { - return s->empty() ? 0 : &*s->begin(); + return s->empty() ? nullptr : &*s->begin(); } struct Data { @@ -99,10 +99,25 @@ if (type == kWrapperZRAW) return "RAW"; error_exit("bad wrapper type", int(type)); - return 0; + return nullptr; } -static int zlib_compression_level; +static int zlib_strategy = Z_DEFAULT_STRATEGY; + +const char* zlib_level_strategy_name(int compression_level) { + if (compression_level == 0) + return ""; // strategy is meaningless at level 0 + if (zlib_strategy == Z_HUFFMAN_ONLY) + return "huffman "; + if (zlib_strategy == Z_RLE) + return "rle "; + if (zlib_strategy == Z_DEFAULT_STRATEGY) + return ""; + error_exit("bad strategy", zlib_strategy); + return nullptr; +} + +static int zlib_compression_level = Z_DEFAULT_COMPRESSION; void zlib_compress( const zlib_wrapper type, @@ -119,7 +134,7 @@ memset(&stream, 0, sizeof(stream)); int result = deflateInit2(&stream, zlib_compression_level, Z_DEFLATED, - zlib_stream_wrapper_type(type), MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); + zlib_stream_wrapper_type(type), MAX_MEM_LEVEL, zlib_strategy); if (result != Z_OK) error_exit("deflateInit2 failed", result); @@ -185,7 +200,12 @@ const auto file = read_file_data_or_exit(name); const int length = static_cast<int>(file.size); const char* data = file.data.get(); - printf("%-40s :\n", name); + + /* + * Report compression strategy and file name. + */ + const char* strategy = zlib_level_strategy_name(zlib_compression_level); + printf("%s%-40s :\n", strategy, name); /* * Chop the data into blocks. @@ -276,18 +296,18 @@ char* get_option(int argc, char* argv[], const char* option) { if (argn < argc) - return !strcmp(argv[argn], option) ? argv[argn++] : 0; - return 0; + return !strcmp(argv[argn], option) ? argv[argn++] : nullptr; + return nullptr; } bool get_compression(int argc, char* argv[], int* value) { if (argn < argc) - *value = atoi(argv[argn++]); - return *value >= 1 && *value <= 9; + *value = isdigit(argv[argn][0]) ? atoi(argv[argn++]) : -1; + return *value >= 0 && *value <= 9; } void usage_exit(const char* program) { - printf("usage: %s gzip|zlib|raw [--compression 1:9] files...\n", program); + printf("usage: %s gzip|zlib|raw [--compression 0:9] files...\n", program); exit(1); } @@ -302,10 +322,18 @@ else usage_exit(argv[0]); - if (!get_option(argc, argv, "--compression")) - zlib_compression_level = Z_DEFAULT_COMPRESSION; - else if (!get_compression(argc, argv, &zlib_compression_level)) - usage_exit(argv[0]); + while (argn < argc && !strncmp(argv[argn], "--", 2)) { + if (get_option(argc, argv, "--compression")) { + if (!get_compression(argc, argv, &zlib_compression_level)) + usage_exit(argv[0]); + } else if (get_option(argc, argv, "--huffman")) { + zlib_strategy = Z_HUFFMAN_ONLY; + } else if (get_option(argc, argv, "--rle")) { + zlib_strategy = Z_RLE; + } else { + usage_exit(argv[0]); + } + } if (argn >= argc) usage_exit(argv[0]);
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 4642c32..07325a0 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -84,6 +84,7 @@ 'Android WebView P FYI (rel)': 'android_release_bot_minimal_symbols_arm64_webview_google', 'android-marshmallow-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_whitelisting', 'android-bfcache-rel': 'android_release_bot_minimal_symbols_arm64', + 'android-weblayer-pie-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', }, 'chromium.chromedriver': { @@ -511,6 +512,18 @@ 'chromeos-kevin-builder-perf-fyi': 'chromeos_kevin', }, + 'chromium.pgo': { + 'mac-pgo-beta': 'official_goma_mac_pgo', + 'mac-pgo-stable': 'official_goma_mac_pgo', + 'mac-pgo-trunk': 'official_goma_mac_pgo', + 'win32-pgo-beta': 'official_goma_x86_pgo', + 'win32-pgo-stable': 'official_goma_x86_pgo', + 'win32-pgo-trunk': 'official_goma_x86_pgo', + 'win64-pgo-beta': 'official_goma_x64_pgo', + 'win64-pgo-stable': 'official_goma_x64_pgo', + 'win64-pgo-trunk': 'official_goma_x64_pgo', + }, + 'chromium.swangle': { 'linux-swangle-chromium-x64': 'gpu_tests_release_trybot', 'linux-swangle-tot-angle-x64': 'angle_deqp_release_trybot', @@ -685,6 +698,7 @@ 'android-pie-arm64-rel': 'android_release_trybot_arm64_webview_google', 'android-pie-x86-rel': 'android_release_trybot_x86_fastbuild_webview_google', 'android-weblayer-pie-arm64-fyi-rel': 'android_release_trybot_arm64', + 'android-weblayer-pie-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_google', 'android-webview-pie-arm64-fyi-rel': 'android_release_trybot_arm64_webview_google', 'android-10-arm64-rel': 'android_release_trybot_arm64_fastbuild_webview_google', 'android-webview-marshmallow-arm64-dbg': 'android_release_trybot_arm64_webview_google', @@ -1971,6 +1985,10 @@ 'official', 'goma', 'no_keystone_registration_framework', ], + 'official_goma_mac_pgo': [ + 'official', 'goma', 'no_keystone_registration_framework', 'static', 'no_symbols', 'disable_nacl', 'pgo_phase_1' + ], + 'official_goma_perf': [ 'official', 'goma', 'no_gnome_keyring', ], @@ -1999,10 +2017,18 @@ 'official', 'goma', 'minimal_symbols', 'android', 'thin_lto_opt', 'arm64', ], + 'official_goma_x64_pgo': [ + 'official', 'goma', 'x64', 'static', 'no_symbols', 'disable_nacl', 'pgo_phase_1' + ], + 'official_goma_x86': [ 'official', 'goma', 'x86', ], + 'official_goma_x86_pgo': [ + 'official', 'goma', 'x86', 'static', 'no_symbols', 'disable_nacl', 'pgo_phase_1' + ], + 'ozone_linux_release_bot': [ 'ozone_linux', 'release_bot', ], @@ -2615,6 +2641,11 @@ 'gn_args': 'pdf_enable_xfa=true', }, + 'pgo_phase_1': { + 'mixins': ['use_clang_profiling', 'strip_absolute_paths_from_debug_symbols'], + 'gn_args': 'chrome_pgo_phase=1' + }, + # Note: This is probably not what you want to use. Instead use one of the # chrome_with_codecs or chromeos_with_codecs mixins. 'proprietary_codecs': { @@ -2673,6 +2704,10 @@ 'gn_args': 'strip_debug_info=true', }, + 'strip_absolute_paths_from_debug_symbols': { + 'gn_args': 'strip_absolute_paths_from_debug_symbols=true' + }, + 'system_gbm_libdrm': { 'gn_args': 'use_system_libdrm=true use_system_minigbm=true', }, @@ -2710,6 +2745,10 @@ 'gn_args': 'use_clang_coverage=true', }, + 'use_clang_profiling': { + 'gn_args': 'use_clang_profiling=true' + }, + 'use_cxx11': { 'gn_args': 'use_cxx11=true', },
diff --git a/tools/mb/mb_config_buckets.pyl b/tools/mb/mb_config_buckets.pyl index 3fa4ba5..c61f38df 100644 --- a/tools/mb/mb_config_buckets.pyl +++ b/tools/mb/mb_config_buckets.pyl
@@ -210,6 +210,7 @@ 'android-mojo-webview-rel': 'android_release_bot_minimal_symbols_arm64', 'android-pie-arm64-rel': 'android_release_bot_minimal_symbols_arm64_webview_google', 'android-pie-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', + 'android-weblayer-pie-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google', 'chromeos-amd64-generic-cfi-thin-lto-rel': 'chromeos_amd64-generic_cfi_thin_lto', 'chromeos-amd64-generic-dbg': 'chromeos_amd64-generic_dbg', 'chromeos-amd64-generic-rel': 'chromeos_amd64-generic', @@ -385,6 +386,7 @@ 'android-pie-arm64-rel': 'android_release_trybot_arm64_webview_google', 'android-pie-x86-rel': 'android_release_trybot_x86_fastbuild_webview_google', 'android-weblayer-pie-arm64-fyi-rel': 'android_release_trybot_arm64', + 'android-weblayer-pie-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_google', 'android-webview-marshmallow-arm64-dbg': 'android_release_trybot_arm64_webview_google', 'android-webview-nougat-arm64-dbg': 'android_release_trybot_arm64_webview_google', 'android-webview-oreo-arm64-dbg': 'android_release_trybot_arm64_webview_google',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 5b570dae..76a08512 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -2667,6 +2667,7 @@ <int value="28" label="Omnibox, Personalzied Suggestion"/> <int value="29" label="Zero State Local File"/> <int value="30" label="Drive Quick Access"/> + <int value="31" label="Assistant"/> </enum> <enum name="AppListSearchResultDisplayType"> @@ -7689,6 +7690,7 @@ <int value="4" label="Navigation"/> <int value="5" label="Composited UI"/> <int value="6" label="VR"/> + <int value="7" label="PROMOTE_TAB"/> </enum> <enum name="BrokenAlternateProtocolLocation"> @@ -15689,6 +15691,20 @@ <int value="3" label="Keyboard"/> </enum> +<enum name="DocumentPolicyFeature"> +<!-- Generated from third_party/blink/public/mojom/feature_policy/document_policy_feature.mojom. +Called by update_document_policy_enum.py.--> + + <int value="0" label="NotFound"/> + <int value="1" label="FontDisplay"/> + <int value="2" label="UnoptimizedLosslessImages"/> + <int value="3" label="ForceLoadAtTop"/> + <int value="4" label="UnoptimizedLosslessImagesStrict"/> + <int value="5" label="UnoptimizedLossyImages"/> + <int value="6" label="OversizedImages"/> + <int value="7" label="UnsizedMedia"/> +</enum> + <enum name="DocumentStateForDeferredLoading"> <int value="0" label="Created"/> <int value="1" label="WouldLoadBecauseVisible"/> @@ -26955,6 +26971,12 @@ <int value="3223" label="LegacyLayoutByWebkitBoxWithoutVerticalLineClamp"/> <int value="3224" label="LegacyLayoutByTableFlexGridBlockInNGFragmentationContext"/> + <int value="3225" label="DocumentPolicyHeader"/> + <int value="3226" label="DocumentPolicyReportOnlyHeader"/> + <int value="3227" label="RequireDocumentPolicyHeader"/> + <int value="3228" label="DocumentPolicyIframePolicyAttribute"/> + <int value="3229" label="DocumentPolicyCausedPageUnload"/> + <int value="3230" label="RequiredDocumentPolicy"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -34930,6 +34952,8 @@ <enum name="IntelGpuGeneration"> <int value="0" label="Not Intel"/> <int value="1" label="Unknown Intel"/> + <int value="4" label="4th Gen"/> + <int value="5" label="5th Gen"/> <int value="6" label="6th Gen"/> <int value="7" label="7th Gen"/> <int value="8" label="8th Gen"/> @@ -34959,6 +34983,12 @@ <int value="13" label="Intel CometLake"/> <int value="14" label="Intel CannonLake"/> <int value="15" label="Intel IceLake"/> + <int value="16" label="Intel Broadwater"/> + <int value="17" label="Intel EagleLake"/> + <int value="18" label="Intel IronLake"/> + <int value="19" label="Intel ElkhartLake"/> + <int value="20" label="Intel JaspterLake"/> + <int value="21" label="Intel TigerLake"/> </enum> <enum name="IntelMaxMicroArchitecture"> @@ -39000,6 +39030,7 @@ <int value="-505679399" label="FontCacheScaling:enabled"/> <int value="-503601144" label="UserDataSnapshot:disabled"/> <int value="-503430431" label="XRSandbox:enabled"/> + <int value="-502156595" label="AutofillCacheServerCardInfo:disabled"/> <int value="-499186481" label="OmniboxGroupSuggestionsBySearchVsUrl:disabled"/> <int value="-498740735" label="ArcUsbHost:disabled"/> @@ -39748,6 +39779,7 @@ <int value="388328387" label="WindowsMixedReality:enabled"/> <int value="388786873" label="EnableUnifiedMultiDeviceSettings:enabled"/> <int value="388996324" label="CustomContextMenu:disabled"/> + <int value="389340238" label="AutofillCacheServerCardInfo:enabled"/> <int value="392782890" label="SafeBrowsingTelemetryForApkDownloads:enabled"/> <int value="393704200" label="account-consistency"/> <int value="398903399" label="GenericSensorExtraClasses:disabled"/> @@ -39785,6 +39817,8 @@ <int value="430959979" label="SyncStandaloneTransport:disabled"/> <int value="431691805" label="MediaDocumentDownloadButton:enabled"/> <int value="434033638" label="PwaPersistentNotification:disabled"/> + <int value="434530296" + label="HappinessTrackingSurveysForDesktopMigration:disabled"/> <int value="436682243" label="TabGroupsAndroid:disabled"/> <int value="439525862" label="GlobalMediaControlsForCast:disabled"/> <int value="444754854" label="LegacyTLSWarnings:disabled"/> @@ -40512,6 +40546,8 @@ <int value="1308537004" label="force-pnacl-subzero"/> <int value="1311860720" label="ChromeHomeNtpRedesign:disabled"/> <int value="1312025202" label="NTPOfflinePageSuggestions:disabled"/> + <int value="1313570156" + label="HappinessTrackingSurveysForDesktopMigration:enabled"/> <int value="1313850691" label="Metal:disabled"/> <int value="1314681756" label="NoStatePrefetch:disabled"/> <int value="1317562265" label="SeccompSandboxAndroid:disabled"/> @@ -59285,6 +59321,13 @@ <int value="7" label="Secure, by enterprise policy"/> </enum> +<enum name="SecurityFilteredTouchResult"> + <int value="0" label="Touch event was handled by security sensitive dialog"/> + <int value="1" + label="Touch event was blocked because another window was obscuring + security sensitive dialog."/> +</enum> + <enum name="SecurityInterstitialDecision"> <int value="0" label="SHOW"/> <int value="1" label="PROCEED"/> @@ -69408,6 +69451,7 @@ <int value="40" label="OutstandingNetworkRequestFetch"/> <int value="41" label="OutstandingNetworkRequestXHR"/> <int value="42" label="AppBanner"/> + <int value="43" label="Printing"/> </enum> <enum name="WebShareMethod">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 562b0b1..dfdcac8 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -3418,6 +3418,16 @@ </summary> </histogram> +<histogram name="Android.ModalDialog.SecurityFilteredTouchResult" + enum="SecurityFilteredTouchResult" expires_after="2021-04-01"> + <owner>pavely@chromium.org</owner> + <owner>chrome-android-app@chromium.org</owner> + <summary> + Records the action taken on a security sensitive touch event in modal + dialog. As of M84 it is used for site premission dialogs. + </summary> +</histogram> + <histogram name="Android.ModerateBindingCount" units="bindings" expires_after="M77"> <owner>clank-team@google.com</owner> @@ -4300,7 +4310,7 @@ </histogram> <histogram name="Android.StrictMode.OverrideUrlLoadingTime" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>yfriedman@chromium.org</owner> <owner>wnwen@chromium.org</owner> <summary> @@ -5143,7 +5153,7 @@ </histogram> <histogram name="AnimatedImage.NumOfFramesSkipped" units="count" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>khushalsagar@chromium.org</owner> <summary> If the frame rate for the image animation can not be reached, frames in the @@ -5739,7 +5749,7 @@ </summary> </histogram> -<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2020-08-09"> +<histogram name="Apps.AppLaunch" enum="AppLaunch" expires_after="2020-10-11"> <owner>tapted@chromium.org</owner> <owner>benwells@chromium.org</owner> <summary> @@ -6432,7 +6442,7 @@ </histogram> <histogram name="Apps.AppListPageSwitcherSource" - enum="AppListPageSwitcherSource" expires_after="2020-08-10"> + enum="AppListPageSwitcherSource" expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" --> <owner>newcomer@chromium.org</owner> @@ -6616,7 +6626,7 @@ </histogram> <histogram name="Apps.AppListSearchResultInternalApp.Open" - enum="AppListInternalAppName" expires_after="2020-08-09"> + enum="AppListInternalAppName" expires_after="2020-10-11"> <owner>wutao@chromium.org</owner> <summary> The app list search result of an internal app that was opened by the user. @@ -6625,7 +6635,7 @@ </histogram> <histogram name="Apps.AppListSearchResultInternalApp.Show" - enum="AppListInternalAppName" expires_after="2020-08-09"> + enum="AppListInternalAppName" expires_after="2020-10-11"> <owner>wutao@chromium.org</owner> <summary> The app list search result of an internal app that was shown to the user. @@ -6680,7 +6690,7 @@ </histogram> <histogram name="Apps.AppListShow.InputLatency" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>newcomer@chromium.org</owner> <owner>mmourgos@chromium.org</owner> <summary> @@ -8065,7 +8075,7 @@ </histogram> <histogram base="true" name="Arc.Provisioning.Result" - enum="ArcProvisioningResult" expires_after="2020-08-09"> + enum="ArcProvisioningResult" expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="ArcUserTypes" --> <owner>alexchau@google.com</owner> @@ -8936,7 +8946,7 @@ </histogram> <histogram base="true" name="Ash.HotseatTransition.AnimationSmoothness" - units="%" expires_after="2020-08-09"> + units="%" expires_after="2020-10-11"> <!-- Name completed by histogram suffixes name="HotseatTransitionType" --> @@ -9933,7 +9943,7 @@ </histogram> <histogram name="Ash.TouchView.TouchViewInactiveTotal" units="minutes" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>girard@chromium.org</owner> <summary> The total time that TouchView is not active during a session. @@ -10887,7 +10897,7 @@ </histogram> <histogram name="Assistant.QueryCountPerEntryPoint" enum="AssistantEntryPoint" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>xiaohuic@chromium.org</owner> <owner>meilinw@chromium.org</owner> <summary>Number of queries fired for each entry point.</summary> @@ -11844,7 +11854,7 @@ </histogram> <histogram name="AsyncDNS.WatchStatus" enum="AsyncDNSWatchStatus" - expires_after="2020-06-28"> + expires_after="2020-10-11"> <owner>pauljensen@chromium.org</owner> <owner>mef@chromium.org</owner> <summary> @@ -11872,7 +11882,7 @@ </histogram> <histogram name="AuthPolicy.ErrorTypeOfAuthenticateUser" - enum="AuthPolicyErrorType" expires_after="2020-08-09"> + enum="AuthPolicyErrorType" expires_after="2020-10-11"> <owner>fsandrade@chromium.org</owner> <owner>tomdobro@chromium.org</owner> <summary> @@ -11897,7 +11907,7 @@ </histogram> <histogram name="AuthPolicy.ErrorTypeOfGetUserKerberosFiles" - enum="AuthPolicyErrorType" expires_after="2020-08-09"> + enum="AuthPolicyErrorType" expires_after="2020-10-11"> <owner>fsandrade@chromium.org</owner> <owner>tomdobro@chromium.org</owner> <summary> @@ -12001,7 +12011,7 @@ </histogram> <histogram name="AuthPolicy.TimeToAuthenticateUser" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>fsandrade@chromium.org</owner> <owner>tomdobro@chromium.org</owner> <summary> @@ -12043,7 +12053,7 @@ </histogram> <histogram name="AuthPolicy.TimeToRefreshDevicePolicy" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>fsandrade@chromium.org</owner> <owner>tomdobro@chromium.org</owner> <summary> @@ -12054,7 +12064,7 @@ </histogram> <histogram name="AuthPolicy.TimeToRefreshUserPolicy" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>fsandrade@chromium.org</owner> <owner>tomdobro@chromium.org</owner> <summary> @@ -14801,6 +14811,18 @@ </summary> </histogram> +<histogram name="Autofill.UsedCachedServerCard" units="uses" + expires_after="2021-04-03"> + <owner>jsaul@google.com</owner> + <owner>annelim@google.com</owner> + <summary> + Records the number of times that the cache for unmasked server cards has + been accessed for a given card. For example, if the cache is being accessed + and it has already been accessed for the card twice before, then + "3" is recorded. + </summary> +</histogram> + <histogram name="Autofill.UserHappiness" enum="AutofillUserHappiness" expires_after="M85"> <owner>battre@chromium.org</owner> @@ -15639,7 +15661,7 @@ </histogram> <histogram base="true" name="Availability.Prober.CacheEntryAge" units="hours" - expires_after="2020-08-01"> + expires_after="2020-10-11"> <owner>robertogden@chromium.org</owner> <owner>tbansal@chromium.org</owner> <summary> @@ -15658,7 +15680,7 @@ <histogram base="true" name="Availability.Prober.DidSucceed.AfterReportedFailure" - enum="BooleanSuccess" expires_after="2020-08-01"> + enum="BooleanSuccess" expires_after="2020-10-11"> <owner>robertogden@chromium.org</owner> <owner>tbansal@chromium.org</owner> <summary> @@ -16715,7 +16737,7 @@ </histogram> <histogram name="Blink.Animation.CompositedAnimationFailureReason" - enum="CompositorAnimationsFailureReason" expires_after="2020-08-02"> + enum="CompositorAnimationsFailureReason" expires_after="2020-10-11"> <owner>animations-dev@chromium.org</owner> <summary> Reasons an Animation is not suitable for running on the compositor thread. @@ -17747,7 +17769,7 @@ </histogram> <histogram name="Blink.DecodedImage.JpegDensity.KiBWeighted" - units="0.01 bits per pixel" expires_after="2020-08-08"> + units="0.01 bits per pixel" expires_after="2020-10-11"> <owner>deymo@google.com</owner> <owner>compression-dev@google.com</owner> <summary> @@ -17767,7 +17789,7 @@ </histogram> <histogram name="Blink.DecodedImage.WebPFileFormat" enum="WebPFileFormat" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>mcasas@chromium.org</owner> <owner>andrescj@chromium.org</owner> <summary> @@ -18582,7 +18604,7 @@ </histogram> <histogram name="Blink.MainFrame.UpdateTime" units="microseconds" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" --> @@ -18802,7 +18824,7 @@ </histogram> <histogram name="Blink.Paint.UpdateTime" units="microseconds" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePreFCPSuffixes" --> <!-- Name completed by histogram_suffixes name="BlinkUpdateTimePostFCPSuffixes" --> @@ -19494,6 +19516,44 @@ </summary> </histogram> +<histogram name="Blink.UseCounter.DocumentPolicy.Enforced" + enum="DocumentPolicyFeature" expires_after="2021-03-31"> + <owner>iclelland@chromium.org</owner> + <owner>feature-control@chromium.org</owner> + <summary> + Counts enforced DocumentPolicyViolationReport generated in a document. + </summary> +</histogram> + +<histogram name="Blink.UseCounter.DocumentPolicy.Header" + enum="DocumentPolicyFeature" expires_after="2021-03-31"> + <owner>iclelland@chromium.org</owner> + <owner>feature-control@chromium.org</owner> + <summary> + Counts the use of a specific document policy via the + "Document-Policy" HTTP response header. + </summary> +</histogram> + +<histogram name="Blink.UseCounter.DocumentPolicy.PolicyAttribute" + enum="DocumentPolicyFeature" expires_after="2021-03-31"> + <owner>iclelland@chromium.org</owner> + <owner>feature-control@chromium.org</owner> + <summary> + Counts the use of a specific document policy via the "policy" + attribute. Each policy is counted only once per page load. + </summary> +</histogram> + +<histogram name="Blink.UseCounter.DocumentPolicy.ReportOnly" + enum="DocumentPolicyFeature" expires_after="2021-03-31"> + <owner>iclelland@chromium.org</owner> + <owner>feature-control@chromium.org</owner> + <summary> + Counts report only DocumentPolicyViolationReport generated in a document. + </summary> +</histogram> + <histogram name="Blink.UseCounter.Extensions.Features" enum="FeatureObserver" expires_after="2020-09-27"> <owner>chasej@chromium.org</owner> @@ -21534,7 +21594,7 @@ </histogram> <histogram name="Bookmarks.LaunchLocation" enum="BookmarkLaunchLocation" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>ianwen@chromium.org</owner> <summary>Logs a UI location from which a bookmark is launched.</summary> </histogram> @@ -23507,7 +23567,7 @@ </histogram> <histogram name="ChildProcess.HungRendererInForeground" - enum="BooleanForeground" expires_after="2020-05-31"> + enum="BooleanForeground" expires_after="2020-10-11"> <owner>cduvall@chromium.org</owner> <owner>cmumford@chromium.org</owner> <summary> @@ -28659,8 +28719,9 @@ </histogram> <histogram name="ContextMenu.CancelSystemTouches" enum="BooleanHit" - expires_after="M83"> + expires_after="2020-12-11"> <owner>michaeldo@chromium.org</owner> + <owner>src/ios/web/web_state/ui/OWNERS</owner> <summary> Logs true when the system touches are cancelled in order to show the Context Menu instead of performing a default system action. Only logged on iOS. @@ -28668,8 +28729,9 @@ </histogram> <histogram name="ContextMenu.DelayedElementDetails" - enum="ContextMenuDelayedElementDetails" expires_after="M83"> + enum="ContextMenuDelayedElementDetails" expires_after="2020-12-11"> <owner>michaeldo@chromium.org</owner> + <owner>src/ios/web/web_state/ui/OWNERS</owner> <summary> Logged when DOM element details are not yet available when the user completes a long press. Also logs if the context menu was shown once the @@ -28695,8 +28757,9 @@ </histogram> <histogram name="ContextMenu.DOMElementFrame" enum="ContextMenuDOMElementFrame" - expires_after="M83"> + expires_after="2020-12-11"> <owner>michaeldo@chromium.org</owner> + <owner>src/ios/web/web_state/ui/OWNERS</owner> <summary> Logged when the Context Menu will be displayed. Also logs if the element for the last touch was found in the main frame or a iframe. Only logged on iOS. @@ -28893,8 +28956,9 @@ </histogram> <histogram name="ContextMenu.WaitingForElementDetails" enum="BooleanHit" - expires_after="M83"> + expires_after="2020-12-11"> <owner>michaeldo@chromium.org</owner> + <owner>src/ios/web/web_state/ui/OWNERS</owner> <summary> Logs true when the context menu gesture recognizer fully recognizes a long press, but is still waiting on the DOM element details before the context @@ -29173,7 +29237,7 @@ </histogram> <histogram name="Cookie.CookiePrefix" enum="CookiePrefix" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>estark@chromium.org</owner> <summary> Number of times a cookie was set with a name prefixed by @@ -29208,7 +29272,7 @@ </histogram> <histogram name="Cookie.CookieSourceScheme" enum="CookieSourceScheme" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>estark@chromium.org</owner> <summary> For each cookie added to the store, record whether its source URL has a @@ -30826,7 +30890,7 @@ </histogram> <histogram name="CrosDisksClient.FormatTime" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>austinct@chromium.org</owner> <summary> Time taken for the Chrome OS cros-disks daemon to perform a format @@ -30844,7 +30908,7 @@ </histogram> <histogram name="CrosDisksClient.MountErrorMountType" - enum="CrosDisksMountTypeError" expires_after="2020-08-09"> + enum="CrosDisksMountTypeError" expires_after="2020-10-11"> <owner>amistry@chromium.org</owner> <summary> The {mount type}x{mount error code} received from the Chrome OS cros-disks @@ -32789,7 +32853,7 @@ </histogram> <histogram name="Cryptohome.TimeToInitPkcs11" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>apronin@chromium.org</owner> <owner>cros-hwsec+uma@chromium.org</owner> <summary> @@ -40808,6 +40872,10 @@ <histogram name="DomDistiller.DistillationQuality" enum="BooleanSuccess" expires_after="M85"> + <obsolete> + Removed 04/2020 because the code to collect this metric has not been called + in months. + </obsolete> <owner>nyquist@chromium.org</owner> <summary> Whether the perceived quality of the distillation of a web page was good. @@ -42538,7 +42606,7 @@ </histogram> <histogram base="true" name="Download.ParallelizableDownloadBandwidth" - units="bytes/second" expires_after="2020-08-10"> + units="bytes/second" expires_after="2020-10-11"> <owner>qinmin@chromium.org</owner> <summary> For parallelizable download, average disk bandwidth seen for different @@ -43872,7 +43940,7 @@ </histogram> <histogram name="DrmUtil.CreateDisplaySnapshot.HasEdidBlob" enum="Boolean" - expires_after="2020-07-24"> + expires_after="2020-10-11"> <owner>andrescj@chromium.org</owner> <owner>mcasas@chromium.org</owner> <owner>chromeos-gfx@google.com</owner> @@ -47728,7 +47796,7 @@ </histogram> <histogram name="Event.Latency.EndToEnd.TouchpadPinch" units="microseconds" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>input-dev@chromium.org</owner> <summary> Time between the OS receiving a touchpad pinch event and the resulting GPU @@ -47737,7 +47805,7 @@ </histogram> <histogram name="Event.Latency.EndToEnd.TouchpadPinch2" units="microseconds" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>input-dev@chromium.org</owner> <summary> Time between the OS receiving a touchpad pinch event and the resulting GPU @@ -55409,6 +55477,9 @@ <histogram name="Extensions.SandboxUnpackFailureTime" units="units" expires_after="2018-08-30"> + <obsolete> + Code removed 2020-04. No longer being monitored. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary>Time taken to unpack an extension, when the unpack fails.</summary> @@ -55424,6 +55495,9 @@ <histogram name="Extensions.SandboxUnpackInitialCrxPathLength" units="units" expires_after="2018-08-30"> + <obsolete> + Code removed 2020-04. No longer being monitored. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary>Length of the initial path to the CRX to be unpacked.</summary> @@ -55431,6 +55505,9 @@ <histogram name="Extensions.SandboxUnpackLinkFreeCrxPathLength" units="units" expires_after="2018-08-30"> + <obsolete> + Code removed 2020-04. No longer being monitored. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -55505,6 +55582,9 @@ <histogram name="Extensions.SandboxUnpackSuccessCantGetCrxSize" units="units" expires_after="2018-08-30"> + <obsolete> + Code removed 2020-04. No longer being monitored. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -55521,6 +55601,9 @@ <histogram name="Extensions.SandboxUnpackSuccessTime" units="units" expires_after="2018-08-30"> + <obsolete> + Code removed 2020-04. No longer being monitored. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -55530,6 +55613,9 @@ <histogram name="Extensions.SandboxUnpackTempCrxPathLength" units="units" expires_after="2018-08-30"> + <obsolete> + Code removed 2020-04. No longer being monitored. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary> @@ -55539,6 +55625,9 @@ <histogram name="Extensions.SandboxUnpackUnpackedCrxPathLength" units="units" expires_after="2018-08-30"> + <obsolete> + Code removed 2020-04. No longer being monitored. + </obsolete> <owner>rdevlin.cronin@chromium.org</owner> <owner>extensions-core@chromium.org</owner> <summary>Length of the path under which a CRX is unpacked.</summary> @@ -59100,7 +59189,7 @@ </histogram> <histogram name="GCM.SendWebPushMessagePayloadSize" units="units" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>alexchau@chromium.org</owner> <owner>peter@chromium.org</owner> <summary> @@ -59110,7 +59199,7 @@ </histogram> <histogram name="GCM.SendWebPushMessageResult" enum="SendWebPushMessageResult" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>alexchau@chromium.org</owner> <owner>peter@chromium.org</owner> <summary> @@ -59120,7 +59209,7 @@ </histogram> <histogram name="GCM.SendWebPushMessageStatusCode" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2020-08-09"> + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2020-10-11"> <owner>alexchau@chromium.org</owner> <owner>peter@chromium.org</owner> <summary> @@ -60274,7 +60363,7 @@ </histogram> <histogram name="GPU.AppContainer.Status" enum="LaunchErrorCodes" - expires_after="2020-07-31"> + expires_after="2020-10-11"> <owner>forshaw@chromium.org</owner> <owner>wfh@chromium.org</owner> <summary> @@ -60730,7 +60819,7 @@ </histogram> <histogram name="GPU.DirectComposition.NumPendingFrames" units="frames" - expires_after="2020-08-02"> + expires_after="2020-10-11"> <owner>sunnyps@chromium.org</owner> <owner>zmo@chromium.org</owner> <summary> @@ -61513,7 +61602,7 @@ </histogram> <histogram name="GPU.Output.ColorSpace" enum="DXGI_COLOR_SPACE_TYPE" - expires_after="2020-08-02"> + expires_after="2020-10-11"> <owner>hubbe@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -61523,7 +61612,7 @@ </summary> </histogram> -<histogram name="GPU.Output.HDR" enum="Boolean" expires_after="2020-08-02"> +<histogram name="GPU.Output.HDR" enum="Boolean" expires_after="2020-10-11"> <owner>hubbe@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -69574,7 +69663,7 @@ </histogram> <histogram base="true" name="LoadingPredictor.PreconnectLearningRecall" - units="%" expires_after="2020-08-09"> + units="%" expires_after="2020-10-11"> <owner>alexilin@chromium.org</owner> <owner>tbansal@chromium.org</owner> <summary> @@ -70081,7 +70170,7 @@ </summary> </histogram> -<histogram name="Login.PromptToLoginTime" units="ms" expires_after="2020-08-09"> +<histogram name="Login.PromptToLoginTime" units="ms" expires_after="2020-10-11"> <owner>elijahtaylor@google.com</owner> <owner>yusukes@chromium.org</owner> <summary> @@ -70099,7 +70188,7 @@ </histogram> <histogram name="Login.SessionExitType" enum="LoginSessionExitType" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>iby@chromium.org</owner> <summary> Tracks whether a ChromeOS user was logged out because Chrome repeatedly @@ -70223,7 +70312,7 @@ </histogram> <histogram name="MachineLearningService.CpuUsageMilliPercent" - units="1/1000ths of %" expires_after="2020-08-09"> + units="1/1000ths of %" expires_after="2020-10-11"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <summary> @@ -70289,7 +70378,7 @@ </histogram> <histogram name="MachineLearningService.MojoConnectionEvent" - enum="MachineLearningServiceMojoConnectionEvent" expires_after="2020-08-09"> + enum="MachineLearningServiceMojoConnectionEvent" expires_after="2020-10-11"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <summary> @@ -70314,7 +70403,7 @@ </histogram> <histogram name="MachineLearningService.PeakTotalMemoryKb" units="KB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <owner>honglinyu@chromium.org</owner> @@ -70367,7 +70456,7 @@ </histogram> <histogram name="MachineLearningService.TotalMemoryKb" units="KB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>alanlxl@chromium.org</owner> <owner>amoylan@chromium.org</owner> <owner>honglinyu@chromium.org</owner> @@ -70531,7 +70620,7 @@ </histogram> <histogram name="Manifest.FetchResult" enum="ManifestFetchResultType" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>mgiuca@chromium.org</owner> <owner>mlamouri@chromium.org</owner> <summary> @@ -70540,7 +70629,7 @@ </histogram> <histogram name="Manifest.HasProperty" enum="Boolean" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>mgiuca@chromium.org</owner> <owner>mlamouri@chromium.org</owner> <summary> @@ -70572,7 +70661,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.AllPasswords" - units="Credentials" expires_after="2020-06-07"> + units="Credentials" expires_after="2020-10-11"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of credentials presented to the user in the "Use @@ -70582,7 +70671,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.CreditCards" units="Cards" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of cards presented to the user in Manual Fallback. This is @@ -70591,7 +70680,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.Passwords" units="Credentials" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of credentials presented to the user in the Passwords @@ -70600,7 +70689,7 @@ </histogram> <histogram name="ManualFallback.PresentedOptions.Profiles" units="Profiles" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>javierrobles@chromium.org</owner> <summary> Tracks the number of profiles presented to the user in Manual Fallback. This @@ -72948,7 +73037,7 @@ </histogram> <histogram name="Media.Controls.Show.Audio" enum="MediaControlsShowReason" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>mlamouri@chromium.org</owner> <summary> Record whether the default media controls of an audio element were shown and @@ -72959,7 +73048,7 @@ </histogram> <histogram name="Media.Controls.Show.Video" enum="MediaControlsShowReason" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>mlamouri@chromium.org</owner> <summary> Record whether the default media controls of a video element were shown and @@ -73207,7 +73296,7 @@ </histogram> <histogram name="Media.DXVAVDA.PictureBufferMechanism" - enum="PictureBufferMechanism" expires_after="2020-06-07"> + enum="PictureBufferMechanism" expires_after="2020-10-11"> <owner>liberato@chromium.org</owner> <owner>sandersd@chromium.org</owner> <summary> @@ -73218,7 +73307,7 @@ </histogram> <histogram name="Media.DXVAVDA.UseD3D11" enum="DXVADXVersion" - expires_after="2020-06-30"> + expires_after="2020-10-11"> <owner>liberato@chromium.org</owner> <owner>tmathmeyer@chromium.org</owner> <owner>sandersd@chromium.org</owner> @@ -73326,12 +73415,12 @@ </histogram> <histogram name="Media.EME.CdmLoadResult" enum="CdmLoadResult" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>media-dev@chromium.org</owner> <summary>The result from an attempt to load a library CDM.</summary> </histogram> -<histogram name="Media.EME.CdmLoadTime" units="ms" expires_after="2020-08-09"> +<histogram name="Media.EME.CdmLoadTime" units="ms" expires_after="2020-10-11"> <owner>media-dev@chromium.org</owner> <summary>The time spent to load a library CDM.</summary> </histogram> @@ -73544,7 +73633,7 @@ </histogram> <histogram name="Media.EME.RequestMediaKeySystemAccess" - enum="RequestMediaKeySystemAccessStatus" expires_after="2020-08-09"> + enum="RequestMediaKeySystemAccessStatus" expires_after="2020-10-11"> <owner>sandersd@chromium.org</owner> <summary> Key system support query status and result, as reported by @@ -73575,7 +73664,7 @@ </histogram> <histogram name="Media.EME.Widevine.VideoCapability.HasEmptyRobustness" - enum="BooleanEmpty" expires_after="2020-08-09"> + enum="BooleanEmpty" expires_after="2020-10-11"> <owner>xhwang@chromium.org</owner> <summary> Whether the robustness level of any video capability in the supported @@ -74193,7 +74282,7 @@ </histogram> <histogram name="Media.InputStreamDurationWithoutCallback" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>maxmorin@chromium.org</owner> <summary> Duration in milliseconds of low-latency audio input streams which never got @@ -74322,7 +74411,7 @@ </histogram> <histogram name="Media.LinuxAudioIO" enum="LinuxAudioIO" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>dalecurtis@chromium.org</owner> <summary> Audio IO layer used by the Linux OS, sampled once at startup of the browser. @@ -74389,7 +74478,7 @@ </histogram> <histogram name="Media.MCVD.ForwardVideoFrameTiming" units="ms" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>liberato@chromium.org</owner> <owner>sandersd@chromium.org</owner> <owner>tguilbert@chromium.org</owner> @@ -74400,7 +74489,7 @@ </histogram> <histogram name="Media.MeanTimeBetweenRebuffers" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>dalecurtis@chromium.org</owner> <summary> The total watch time (see Media.WatchTime) of a given playback divided by @@ -74644,7 +74733,7 @@ </histogram> <histogram name="Media.MSE.DetectedShakaPackagerInMp4" enum="BooleanDetected" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>dalecurtis@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -74736,7 +74825,7 @@ </histogram> <histogram name="Media.MSE.Mp4ConsecutiveEmptySamples" units="samples" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>wolenetz@chromium.org</owner> <owner>sandersd@chromium.org</owner> <summary> @@ -74749,7 +74838,7 @@ </histogram> <histogram name="Media.MSE.Mp4EmptySamplesInTRun" units="samples" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>wolenetz@chromium.org</owner> <owner>sandersd@chromium.org</owner> <summary> @@ -74760,7 +74849,7 @@ </histogram> <histogram name="Media.MSE.Mp4SampleSize" units="bytes" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>wolenetz@chromium.org</owner> <owner>sandersd@chromium.org</owner> <summary> @@ -74955,7 +75044,7 @@ </histogram> <histogram name="Media.Notification.ArtworkPresent" enum="Boolean" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -75022,7 +75111,7 @@ </histogram> <histogram name="Media.Notification.Count" units="count" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -75033,7 +75122,7 @@ </histogram> <histogram name="Media.Notification.MetadataPresent" - enum="MediaNotificationMetadata" expires_after="2020-08-09"> + enum="MediaNotificationMetadata" expires_after="2020-10-11"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -75044,7 +75133,7 @@ </histogram> <histogram name="Media.Notification.Source" enum="MediaNotificationSource" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -75055,7 +75144,7 @@ </histogram> <histogram name="Media.Notification.UserAction" enum="MediaSessionAction" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>beccahughes@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -75125,7 +75214,7 @@ </histogram> <histogram name="Media.PipelineStatus" enum="PipelineStatus" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>prabhur@chromium.org</owner> <owner>dalecurtis@chromium.org</owner> <summary> @@ -76983,7 +77072,7 @@ </summary> </histogram> -<histogram name="Media.WatchTime" units="ms" expires_after="2020-08-09"> +<histogram name="Media.WatchTime" units="ms" expires_after="2020-10-11"> <owner>dalecurtis@chromium.org</owner> <summary> Watch time is defined as the amount of elapsed media time for audio+video @@ -77217,7 +77306,7 @@ </histogram> <histogram name="MediaLauncherActivity.MediaType" - enum="MediaLauncherActivityMediaType" expires_after="2020-06-07"> + enum="MediaLauncherActivityMediaType" expires_after="2020-10-11"> <owner>steimel@chromium.org</owner> <owner>media-dev@chromium.org</owner> <summary> @@ -78122,7 +78211,7 @@ </histogram> <histogram name="Memory.Browser.SharedMemoryFootprint" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>erikchen@chromium.org</owner> <summary> A rough estimate of the shared memory footprint of the browser process. @@ -78313,7 +78402,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Browser2" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" --> <owner>erikchen@chromium.org</owner> @@ -78325,7 +78414,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Browser2.Small" units="KB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" --> <owner>erikchen@chromium.org</owner> @@ -78482,7 +78571,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Gpu2" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" --> <owner>erikchen@chromium.org</owner> @@ -79068,7 +79157,7 @@ </histogram> <histogram name="Memory.Experimental.Renderer.Uptime" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>keishi@chromium.org</owner> <summary> The uptime of a render process in time ticks (excludes extensions). Emitted @@ -79088,7 +79177,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Renderer2" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" --> <owner>erikchen@chromium.org</owner> @@ -79100,7 +79189,7 @@ </histogram> <histogram base="true" name="Memory.Experimental.Renderer2.Small" units="KB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" --> <owner>erikchen@chromium.org</owner> @@ -79165,7 +79254,7 @@ </histogram> <histogram name="Memory.Experimental.Total2.PrivateMemoryFootprint" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -79186,7 +79275,7 @@ <histogram name="Memory.Experimental.UserLevelMemoryPressureSignal.RendererPrivateMemoryFootprintBefore" - units="MB" expires_after="2020-06-07"> + units="MB" expires_after="2020-10-11"> <owner>keishi@chromium.org</owner> <owner>tasak@chromium.org</owner> <summary> @@ -79434,7 +79523,7 @@ </histogram> <histogram base="true" name="Memory.GPU.PeakMemoryAllocationSource" units="KB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <!-- Name completed by a combination of the following two histogram_suffixes: --> <!-- histogram_suffixes name="GPU.PeakMemoryAllocationSourceBase" --> @@ -79452,7 +79541,7 @@ </histogram> <histogram base="true" name="Memory.GPU.PeakMemoryUsage" units="KB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <!-- Name completed by histogram_suffixes name="GPU.PeakMemoryUsage" --> <owner>graphics-dev@chromium.org</owner> @@ -79504,7 +79593,7 @@ </histogram> <histogram name="Memory.Gpu.SharedMemoryFootprint" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -79625,7 +79714,7 @@ </histogram> <histogram name="Memory.NativeLibrary.MappedAndResidentMemoryFootprint2" - units="KB" expires_after="2020-06-07"> + units="KB" expires_after="2020-10-11"> <owner>msalama@google.com</owner> <owner>lizeb@chromium.org</owner> <summary> @@ -79637,7 +79726,7 @@ </histogram> <histogram name="Memory.NativeLibrary.NotResidentOrderedCodeMemoryFootprint" - units="KB" expires_after="2020-06-07"> + units="KB" expires_after="2020-10-11"> <owner>lizeb@chromium.org</owner> <summary> The size of the native library code which was ordered, yet is not resident @@ -79661,7 +79750,7 @@ </histogram> <histogram name="Memory.NetworkService.PrivateMemoryFootprint" units="MiB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>mmenke@chromium.org</owner> <owner>morlovich@chromium.org</owner> <summary> @@ -80079,7 +80168,7 @@ </histogram> <histogram name="Memory.PressureLevel" enum="MemoryPressureLevel" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>chrisha@chromium.org</owner> <summary> The memory pressure level, which is recorded periodically. This shows the @@ -80111,7 +80200,7 @@ </histogram> <histogram name="Memory.ProcessCount" units="processes" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>creis@chromium.org</owner> <owner>nasko@chromium.org</owner> <summary> @@ -80220,7 +80309,7 @@ </histogram> <histogram name="Memory.Renderer.SharedMemoryFootprint" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -80284,7 +80373,7 @@ </histogram> <histogram name="Memory.RendererProcessCount" units="processes" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>creis@chromium.org</owner> <owner>nasko@chromium.org</owner> <summary> @@ -80321,7 +80410,7 @@ </histogram> <histogram name="Memory.RenderProcessHost.Count.All" units="processes" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> @@ -80339,7 +80428,7 @@ </histogram> <histogram name="Memory.RenderProcessHost.Count.InitializedAndNotDead" - units="processes" expires_after="2020-08-09"> + units="processes" expires_after="2020-10-11"> <owner>alexmos@chromium.org</owner> <owner>creis@chromium.org</owner> <owner>lukasza@chromium.org</owner> @@ -80890,7 +80979,7 @@ </histogram> <histogram name="Memory.Total.RendererPrivateMemoryFootprint" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>tommckee@chromium.org</owner> <summary> A rough estimate of the private memory footprint of all renderer processes. @@ -80917,7 +81006,7 @@ </histogram> <histogram name="Memory.Total.SharedMemoryFootprint" units="MB" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>erikchen@chromium.org</owner> <owner>ssid@chromium.org</owner> <summary> @@ -81371,7 +81460,7 @@ </histogram> <histogram name="Mobile.Legacy.Translate.Toggle.Delay" units="ms" - expires_after="2020-06-01"> + expires_after="2020-10-11"> <owner>sczs@chromium.org</owner> <owner>thegreenfrog@chromium.org</owner> <summary> @@ -81381,7 +81470,7 @@ </histogram> <histogram name="Mobile.Legacy.Translate.Unused.Duration" units="ms" - expires_after="2020-06-09"> + expires_after="2020-10-11"> <owner>sczs@chromium.org</owner> <owner>thegreenfrog@chromium.org</owner> <summary> @@ -81718,7 +81807,7 @@ </histogram> <histogram name="MobileDownload.Background" - enum="MobileDownloadBackgroundDownloadEvent" expires_after="2020-06-07"> + enum="MobileDownloadBackgroundDownloadEvent" expires_after="2020-10-11"> <owner>hnakashima@chromium.org</owner> <owner>hanxi@chromium.org</owner> <owner>yfriedman@chromium.org</owner> @@ -81731,7 +81820,7 @@ <histogram name="MobileDownload.Background.TargetDeterminationResult" enum="MobileDownloadBackgroundTargetDeterminationResult" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>qinmin@chromium.org</owner> <owner>xingliu@chromium.org</owner> <summary> @@ -82023,7 +82112,7 @@ </histogram> <histogram name="MobileFre.Progress" enum="MobileFreProgress" - expires_after="2020-06-07"> + expires_after="2020-10-11"> <owner>gogerald@chromium.org</owner> <summary> Android: Records which states of the "first run experience" have @@ -82151,7 +82240,7 @@ </histogram> <histogram name="MobileOmnibox.PressedClipboardSuggestionAge" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>jdonnelly@chromium.org</owner> <owner>mpearson@chromium.org</owner> <summary> @@ -82871,7 +82960,7 @@ </histogram> <histogram name="MPArch.ChildProcessLaunchFirst" units="units" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>ppi@chromium.org</owner> <summary> The time it takes to spawn the first child subprocess (including sandbox @@ -83421,7 +83510,7 @@ </histogram> <histogram name="MultiProfile.UsersPerSessionIncremental" units="units" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>skuhne@chromium.org</owner> <summary> The number of users simultaneously signed into a multiprofile session on @@ -113808,8 +113897,10 @@ </histogram> <histogram name="PageLoad.InteractiveTiming.InputTimestamp3" units="ms" - expires_after="2020-05-24"> - <owner>tdresser@chromium.org</owner> + expires_after="never"> +<!-- expires-never: diagnostic to InputDelay3 guiding metric (internal: go/chrome-browser-guiding-metrics) --> + + <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> <summary> The duration between navigation start and the hardware timestamp of a @@ -119036,7 +119127,7 @@ <summary>The size of PDF documents opened in the PDF viewer.</summary> </histogram> -<histogram name="PDF.FormType" enum="PDFFormTypes" expires_after="2020-08-09"> +<histogram name="PDF.FormType" enum="PDFFormTypes" expires_after="2020-10-11"> <owner>rharrison@chromium.org</owner> <summary> Tracks what types of forms are present in PDF document, logged when the @@ -124307,14 +124398,14 @@ </histogram> <histogram name="PluginVm.DlcUseResult" units="PluginVmDlcUseResult" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>kimjae@google.com</owner> <owner>timloh@google.com</owner> <summary>Recorded at each time PluginVM DLC is installed.</summary> </histogram> <histogram name="PluginVm.EngagementTime.Background" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>timloh@google.com</owner> <owner>joelhockey@google.com</owner> <summary> @@ -124325,7 +124416,7 @@ </histogram> <histogram name="PluginVm.EngagementTime.Foreground" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>timloh@google.com</owner> <owner>joelhockey@google.com</owner> <summary> @@ -124335,7 +124426,7 @@ </histogram> <histogram name="PluginVm.EngagementTime.PluginVmTotal" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>timloh@google.com</owner> <owner>joelhockey@google.com</owner> <summary> @@ -124346,7 +124437,7 @@ </histogram> <histogram name="PluginVm.EngagementTime.Total" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>timloh@google.com</owner> <owner>joelhockey@google.com</owner> <summary> @@ -124962,7 +125053,7 @@ </histogram> <histogram name="Power.KernelSuspendTimeOnBattery" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>tbroch@chromium.org</owner> <summary> The time that the kernel took to suspend-to-RAM the Chrome OS device when @@ -125344,7 +125435,7 @@ </histogram> <histogram name="Power.UserBrightnessAdjustmentsPerSessionOnBattery" - units="units" expires_after="2020-07-06"> + units="units" expires_after="2020-10-11"> <owner>tbroch@chromium.org</owner> <owner>jiameng@chromium.org</owner> <summary> @@ -125355,7 +125446,7 @@ </histogram> <histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>jiameng@chromium.org</owner> <summary> What happens when UserActivityManager receives a screen dim imminent @@ -125364,7 +125455,7 @@ </histogram> <histogram name="PowerML.ModelDim.Result" enum="PowerMLFinalResult" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>jiameng@chromium.org</owner> <summary> What happens after screen is dimmed following model instruction. Only @@ -125373,7 +125464,7 @@ </histogram> <histogram name="PowerML.ModelNoDim.Result" enum="PowerMLFinalResult" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>jiameng@chromium.org</owner> <summary> What happens after screen dim is deferred following model instruction. Only @@ -125391,7 +125482,7 @@ </histogram> <histogram name="PowerML.PreviousEventLogging.Result" - enum="PowerMLPreviousEventLoggingResult" expires_after="2020-08-09"> + enum="PowerMLPreviousEventLoggingResult" expires_after="2020-10-11"> <owner>jiameng@chromium.org</owner> <summary> Status of logging previous idle event after a screen dim imminent signal is @@ -125434,7 +125525,7 @@ </histogram> <histogram name="PowerML.SmartDimModel.RequestCanceledDuration" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>amoylan@chromium.org</owner> <owner>jiameng@chromium.org</owner> <owner>napper@chromium.org</owner> @@ -125446,7 +125537,7 @@ </histogram> <histogram name="PowerML.SmartDimModel.RequestCompleteDuration" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>amoylan@chromium.org</owner> <owner>jiameng@chromium.org</owner> <owner>napper@chromium.org</owner> @@ -125470,7 +125561,7 @@ </histogram> <histogram name="PowerML.SmartDimParameter.Result" - enum="PowerMLSmartDimParameterResult" expires_after="2020-08-09"> + enum="PowerMLSmartDimParameterResult" expires_after="2020-10-11"> <owner>jiameng@chromium.org</owner> <summary> The result of parsing the dim threshold parameter value. Only applicable to @@ -129325,7 +129416,7 @@ </histogram> <histogram name="Profile.NumberOfAccountsPerProfile" units="units" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>msarda@chromium.org</owner> <owner>droger@chromium.org</owner> <summary> @@ -130004,7 +130095,7 @@ </histogram> <histogram name="ProtoDB.SharedDbInitStatus" enum="ProtoDatabaseInitState" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>ssid@chromium.org</owner> <owner>salg@chromium.org</owner> <summary> @@ -130798,7 +130889,7 @@ </summary> </histogram> -<histogram name="Quota.DiskspaceShortage" units="MB" expires_after="2020-08-09"> +<histogram name="Quota.DiskspaceShortage" units="MB" expires_after="2020-10-11"> <owner>jarrydg@chromium.org</owner> <summary> Difference between acceptable lower limit of diskspace and actual free @@ -156977,7 +157068,7 @@ </histogram> <histogram name="Stability.BadMessageTerminated.Chrome" - enum="BadMessageReasonChrome" expires_after="2020-08-09"> + enum="BadMessageReasonChrome" expires_after="2020-10-11"> <owner>creis@chromium.org</owner> <owner>jamescook@chromium.org</owner> <summary> @@ -157160,7 +157251,7 @@ </histogram> <histogram name="Stability.Internals.SystemCrashCount" units="crashes" - expires_after="2020-08-02"> + expires_after="2020-10-11"> <owner>siggi@chromium.org</owner> <summary> Number of times a browser crash was detected, where the browser was last @@ -157760,7 +157851,7 @@ </histogram> <histogram name="Startup.Android.TimeToGTSFirstMeaningfulPaint" units="ms" - expires_after="2020-08-02"> + expires_after="2020-10-11"> <owner>yusufo@chromium.org</owner> <owner>yfriedman@chromium.org</owner> <summary> @@ -157859,7 +157950,7 @@ </histogram> <histogram name="Startup.BrowserMainRunnerImplInitializeLongTime" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>robliao@chromium.org</owner> <summary> The amount of time that elapsed during BrowserMainRunnerImpl::Initialize. @@ -158124,7 +158215,7 @@ </histogram> <histogram name="Startup.ColdStartFromProcessCreationTime" units="ms" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>djean@chromium.org</owner> <owner>eugenebut@chromium.org</owner> <summary> @@ -159647,7 +159738,7 @@ </histogram> <histogram name="SubresourceFilter.Actions2" enum="SubresourceFilterActions2" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>csharrison@chromium.org</owner> <owner>jkarlin@chromium.org</owner> <summary> @@ -161420,7 +161511,7 @@ </histogram> <histogram name="Sync.CryptographerPendingKeys" - enum="SyncCryptographerPendingKeysState" expires_after="2020-08-09"> + enum="SyncCryptographerPendingKeysState" expires_after="2020-10-11"> <owner>zea@chromium.org</owner> <summary> Breakdown of sync users whose cryptographer has pending keys. @@ -162894,7 +162985,7 @@ </histogram> <histogram name="Sync.PassphraseType" enum="SyncPassphraseType" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>treib@chromium.org</owner> <owner>mastiz@chromium.org</owner> <summary>The active sync passphrase type at sync startup.</summary> @@ -168810,7 +168901,7 @@ </histogram> <histogram name="Translate.ModifyTargetLang" units="units" - expires_after="2020-08-02"> + expires_after="2020-10-11"> <owner>kenjibaheux@google.com</owner> <summary> The number of times the target language in the translate infobar has been @@ -169276,7 +169367,7 @@ </summary> </histogram> -<histogram name="UI.DeviceScale" units="%" expires_after="2020-08-02"> +<histogram name="UI.DeviceScale" units="%" expires_after="2020-10-11"> <owner>bsep@chromium.org</owner> <summary> The device scales available on the system at startup. A system may report @@ -169416,7 +169507,7 @@ </histogram> <histogram name="UKM.LogUpload.ResponseOrErrorCode" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2020-08-10"> + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2020-10-11"> <owner>rkaplow@chromium.org</owner> <owner>ukm-team@google.com</owner> <summary> @@ -169497,7 +169588,7 @@ </histogram> <histogram name="UKM.Sources.SerializedCount2" units="sources" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>rkaplow@chromium.org</owner> <owner>ukm-team@google.com</owner> <summary>Number of serialized UKM sources when storing a UKM log.</summary> @@ -170842,7 +170933,7 @@ </histogram> <histogram name="UMA.TruncatedEvents.UserAction" units="events" - expires_after="2020-10-04"> + expires_after="2020-10-11"> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -178039,7 +178130,7 @@ </histogram> <histogram name="WebCore.IndexedDB.SchemaV2HasBlobs.Docs" enum="Boolean" - expires_after="2020-07-26"> + expires_after="2020-10-11"> <owner>dmurph@chromium.org</owner> <owner>pwnall@chromium.org</owner> <summary> @@ -178434,13 +178525,13 @@ </histogram> <histogram name="WebCore.ScriptedIdleTaskController.IdleTaskCallbackType" - enum="IdleDeadlineCallbackType" expires_after="2020-08-09"> + enum="IdleDeadlineCallbackType" expires_after="2020-10-11"> <owner>shaseley@chromium.org</owner> <summary>The callback type for every idle task that was run.</summary> </histogram> <histogram name="WebCore.ScriptedIdleTaskController.IdleTaskQueueingTime" - units="ms" expires_after="2020-08-09"> + units="ms" expires_after="2020-10-11"> <owner>shaseley@chromium.org</owner> <summary> The amount of time an idle task was queued before running. This metric is @@ -179212,7 +179303,7 @@ </histogram> <histogram name="WebP.DecodedImageFormat" enum="WebpDecodedFormat" - expires_after="2020-07-06"> + expires_after="2020-10-11"> <owner>droger@chromium.org</owner> <summary> Histogram for the format of decoded WebP images on iOS, as Chrome re-encodes @@ -179481,7 +179572,7 @@ </histogram> <histogram name="WebRTC.Audio.ApmCaptureOutputLevelPeakRms" - units="dBFS (negated)" expires_after="2020-08-09"> + units="dBFS (negated)" expires_after="2020-10-11"> <owner>peah@chromium.org</owner> <summary> This histogram reports the peak RMS of the signal in the output of WebRTC's @@ -180329,7 +180420,7 @@ </histogram> <histogram name="WebRTC.BWE.Types" enum="WebRtcBweType" - expires_after="2020-08-09"> + expires_after="2020-10-11"> <owner>holmer@chromium.org</owner> <summary> The bandwidth estimation used in WebRTC calls. Records whether the BWE is @@ -181345,7 +181436,7 @@ </histogram> <histogram name="WebRTC.Video.DelayedFramesToRenderer_AvgDelayInMs" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The average delay of delayed frames to renderer for a received video stream. @@ -181450,7 +181541,7 @@ </histogram> <histogram name="WebRTC.Video.EndToEndDelayInMs" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The average end-to-end delay per frame for a received video stream. Recorded @@ -181546,7 +181637,7 @@ </histogram> <histogram name="WebRTC.Video.InputFramesPerSecond" units="fps" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The number of incoming frames per second for a sent video stream. Recorded @@ -181661,7 +181752,7 @@ </histogram> <histogram name="WebRTC.Video.MediaBitrateSentInKbps" units="kbps" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The number of sent media payload bits per second for a sent video stream. @@ -181681,7 +181772,7 @@ </histogram> <histogram name="WebRTC.Video.NackPacketsSentPerMinute" units="packets/minute" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The number of sent RTCP NACK packets per minute for a received video stream. @@ -181719,7 +181810,7 @@ </histogram> <histogram name="WebRTC.Video.OnewayDelayInMs" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> Average delay (network delay (rtt/2) + jitter delay + decode time + render @@ -181767,7 +181858,7 @@ </histogram> <histogram name="WebRTC.Video.PliPacketsSentPerMinute" units="packets/minute" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The number of sent RTCP PLI packets per minute for a received video stream. @@ -181860,7 +181951,7 @@ </histogram> <histogram name="WebRTC.Video.RenderSqrtPixelsPerSecond" units="pps" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The number of pixels (sqrt(width*height)) of sent frames to the renderer per @@ -181870,7 +181961,7 @@ </histogram> <histogram name="WebRTC.Video.RetransmittedBitrateReceivedInKbps" units="kbps" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The number of retransmitted bits per second for a received video stream. @@ -182430,7 +182521,7 @@ </histogram> <histogram name="WebRTC.Video.SendDelayInMs" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The average send delay of sent packets for a sent video stream. Recorded @@ -182440,7 +182531,7 @@ </histogram> <histogram name="WebRTC.Video.SendSideDelayInMs" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The average delay (of average delays) of sent packets for a sent video @@ -182452,7 +182543,7 @@ </histogram> <histogram name="WebRTC.Video.SendSideDelayMaxInMs" units="ms" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The average delay (of max delays) of sent packets for a sent video stream. @@ -182473,7 +182564,7 @@ </histogram> <histogram name="WebRTC.Video.SentFramesPerSecond" units="fps" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>asapersson@chromium.org</owner> <summary> The number of sent frames per second for a sent video stream. Recorded when @@ -184017,7 +184108,7 @@ </histogram> <histogram name="WrenchMenu.TimeToAction" units="units" - expires_after="2020-08-10"> + expires_after="2020-10-11"> <owner>ainslie@chromium.org</owner> <owner>edwardjung@chromium.org</owner> <summary> @@ -184147,7 +184238,7 @@ </histogram> <histogram name="XR.WebXR.ConsentFlowDuration.ConsentGranted" units="ms" - expires_after="2020-07-01"> + expires_after="2020-10-11"> <owner>alcooper@chromium.org</owner> <owner>mlamouri@chromium.org</owner> <owner>xr-dev@chromium.org</owner> @@ -184158,7 +184249,7 @@ </histogram> <histogram name="XR.WebXR.ConsentFlowDuration.ConsentNotGranted" units="ms" - expires_after="2020-07-01"> + expires_after="2020-10-11"> <owner>alcooper@chromium.org</owner> <owner>mlamouri@chromium.org</owner> <owner>xr-dev@chromium.org</owner> @@ -184183,7 +184274,7 @@ </histogram> <histogram name="XR.WebXR.ReferenceSpace.Requested" enum="XRReferenceSpaceType" - expires_after="2020-07-01"> + expires_after="2020-10-11"> <owner>alcooper@chromium.org</owner> <owner>cassew@chromium.org</owner> <owner>xr-dev@chromium.org</owner>
diff --git a/tools/metrics/histograms/update_document_policy_enum.py b/tools/metrics/histograms/update_document_policy_enum.py new file mode 100755 index 0000000..18fe3c3 --- /dev/null +++ b/tools/metrics/histograms/update_document_policy_enum.py
@@ -0,0 +1,32 @@ +#!/usr/bin/env python +# 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. +"""Updates the DocumentPolicyFeature enum in enums.xml file with +values read from document_policy_feature.mojom. + +If the file was pretty-printed, the updated version is pretty-printed too. +""" + +from __future__ import print_function + +import os +import sys + +from update_histogram_enum import UpdateHistogramEnum + +if __name__ == '__main__': + if len(sys.argv) > 1: + print('No arguments expected!', file=sys.stderr) + sys.stderr.write(__doc__) + sys.exit(1) + + source_file = 'third_party/blink/public/mojom/feature_policy/' \ + 'document_policy_feature.mojom' + UpdateHistogramEnum( + histogram_enum_name='DocumentPolicyFeature', + source_enum_path=source_file, + start_marker='^enum DocumentPolicyFeature {', + end_marker='^};', + strip_k_prefix=True, + calling_script=os.path.basename(__file__))
diff --git a/tools/metrics/histograms/update_feature_policy_enum.py b/tools/metrics/histograms/update_feature_policy_enum.py index daec0c71..23dedce 100755 --- a/tools/metrics/histograms/update_feature_policy_enum.py +++ b/tools/metrics/histograms/update_feature_policy_enum.py
@@ -4,7 +4,7 @@ # found in the LICENSE file. """Updates the FeaturePolicyFeature enum in enums.xml file with -values read from feature_policy.mojom. +values read from feature_policy_feature.mojom. If the file was pretty-printed, the updated version is pretty-printed too. """
diff --git a/ui/base/ime/BUILD.gn b/ui/base/ime/BUILD.gn index 0c266ac8..b625ff4 100644 --- a/ui/base/ime/BUILD.gn +++ b/ui/base/ime/BUILD.gn
@@ -57,12 +57,12 @@ sources = [ "constants.cc", "constants.h", + "ime_assistive_window_handler_interface.h", "ime_bridge.cc", "ime_bridge.h", "ime_candidate_window_handler_interface.h", "ime_engine_handler_interface.h", "ime_input_context_handler_interface.h", - "ime_suggestion_window_handler_interface.h", "input_method.h", "input_method_base.cc", "input_method_base.h",
diff --git a/ui/base/ime/chromeos/input_method_chromeos.cc b/ui/base/ime/chromeos/input_method_chromeos.cc index a11ec20..48fcc28 100644 --- a/ui/base/ime/chromeos/input_method_chromeos.cc +++ b/ui/base/ime/chromeos/input_method_chromeos.cc
@@ -209,9 +209,9 @@ chromeos::IMECandidateWindowHandlerInterface* candidate_window = ui::IMEBridge::Get()->GetCandidateWindowHandler(); - chromeos::IMESuggestionWindowHandlerInterface* suggestion_window = - ui::IMEBridge::Get()->GetSuggestionWindowHandler(); - if (!candidate_window && !suggestion_window) + chromeos::IMEAssistiveWindowHandlerInterface* assistive_window = + ui::IMEBridge::Get()->GetAssistiveWindowHandler(); + if (!candidate_window && !assistive_window) return; const gfx::Rect caret_rect = client->GetCaretBounds(); @@ -226,8 +226,8 @@ composition_head = caret_rect; if (candidate_window) candidate_window->SetCursorBounds(caret_rect, composition_head); - if (suggestion_window) - suggestion_window->SetBounds(caret_rect); + if (assistive_window) + assistive_window->SetBounds(caret_rect); gfx::Range text_range; gfx::Range selection_range; base::string16 surrounding_text; @@ -388,11 +388,11 @@ if (candidate_window) candidate_window->FocusStateChanged(IsNonPasswordInputFieldFocused()); - // Propagate focus event to suggestion window handler. - chromeos::IMESuggestionWindowHandlerInterface* suggestion_window = - ui::IMEBridge::Get()->GetSuggestionWindowHandler(); - if (suggestion_window) - suggestion_window->FocusStateChanged(); + // Propagate focus event to assistive window handler. + chromeos::IMEAssistiveWindowHandlerInterface* assistive_window = + ui::IMEBridge::Get()->GetAssistiveWindowHandler(); + if (assistive_window) + assistive_window->FocusStateChanged(); ui::IMEEngineHandlerInterface::InputContext context( GetTextInputType(), GetTextInputMode(), GetTextInputFlags(),
diff --git a/ui/base/ime/ime_assistive_window_handler_interface.h b/ui/base/ime/ime_assistive_window_handler_interface.h new file mode 100644 index 0000000..96d4e3b --- /dev/null +++ b/ui/base/ime/ime_assistive_window_handler_interface.h
@@ -0,0 +1,45 @@ +// 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 UI_BASE_IME_IME_ASSISTIVE_WINDOW_HANDLER_INTERFACE_H_ +#define UI_BASE_IME_IME_ASSISTIVE_WINDOW_HANDLER_INTERFACE_H_ + +#include <stdint.h> + +#include "base/component_export.h" +#include "base/strings/string16.h" + +namespace gfx { +class Rect; +} // namespace gfx + +namespace chromeos { + +// A interface to handle the assistive windows related method call. +class COMPONENT_EXPORT(UI_BASE_IME) IMEAssistiveWindowHandlerInterface { + public: + virtual ~IMEAssistiveWindowHandlerInterface() {} + + // Called when showing/hiding suggestion window. + virtual void ShowSuggestion(const base::string16& text, + const base::string16& confirmed_text, + const bool show_tab) {} + virtual void HideSuggestion() {} + + // Called to get the current suggestion text. + virtual base::string16 GetSuggestionText() const = 0; + + // Called when the application changes its caret bounds. + virtual void SetBounds(const gfx::Rect& cursor_bounds) = 0; + + // Called when the text field's focus state is changed. + virtual void FocusStateChanged() {} + + protected: + IMEAssistiveWindowHandlerInterface() {} +}; + +} // namespace chromeos + +#endif // UI_BASE_IME_IME_ASSISTIVE_WINDOW_HANDLER_INTERFACE_H_
diff --git a/ui/base/ime/ime_bridge.cc b/ui/base/ime/ime_bridge.cc index ff81081..b35426e 100644 --- a/ui/base/ime/ime_bridge.cc +++ b/ui/base/ime/ime_bridge.cc
@@ -93,15 +93,15 @@ } // IMEBridge override. - void SetSuggestionWindowHandler( - chromeos::IMESuggestionWindowHandlerInterface* handler) override { - suggestion_window_handler_ = handler; + void SetAssistiveWindowHandler( + chromeos::IMEAssistiveWindowHandlerInterface* handler) override { + assistive_window_handler_ = handler; } // IMEBridge override. - chromeos::IMESuggestionWindowHandlerInterface* GetSuggestionWindowHandler() + chromeos::IMEAssistiveWindowHandlerInterface* GetAssistiveWindowHandler() const override { - return suggestion_window_handler_; + return assistive_window_handler_; } #endif @@ -114,7 +114,7 @@ #if defined(OS_CHROMEOS) chromeos::IMECandidateWindowHandlerInterface* candidate_window_handler_ = nullptr; - chromeos::IMESuggestionWindowHandlerInterface* suggestion_window_handler_ = + chromeos::IMEAssistiveWindowHandlerInterface* assistive_window_handler_ = nullptr; #endif
diff --git a/ui/base/ime/ime_bridge.h b/ui/base/ime/ime_bridge.h index fe4b0d16..9fade0b1 100644 --- a/ui/base/ime/ime_bridge.h +++ b/ui/base/ime/ime_bridge.h
@@ -13,12 +13,12 @@ #include "ui/base/ime/ime_input_context_handler_interface.h" #if defined(OS_CHROMEOS) +#include "ui/base/ime/ime_assistive_window_handler_interface.h" #include "ui/base/ime/ime_candidate_window_handler_interface.h" -#include "ui/base/ime/ime_suggestion_window_handler_interface.h" namespace chromeos { class IMECandidateWindowHandlerInterface; -class IMESuggestionWindowHandlerInterface; +class IMEAssistiveWindowHandlerInterface; } #endif @@ -84,10 +84,10 @@ virtual void SetCandidateWindowHandler( chromeos::IMECandidateWindowHandlerInterface* handler) = 0; - virtual chromeos::IMESuggestionWindowHandlerInterface* - GetSuggestionWindowHandler() const = 0; - virtual void SetSuggestionWindowHandler( - chromeos::IMESuggestionWindowHandlerInterface* handler) = 0; + virtual chromeos::IMEAssistiveWindowHandlerInterface* + GetAssistiveWindowHandler() const = 0; + virtual void SetAssistiveWindowHandler( + chromeos::IMEAssistiveWindowHandlerInterface* handler) = 0; #endif protected:
diff --git a/ui/base/ime/ime_suggestion_window_handler_interface.h b/ui/base/ime/ime_suggestion_window_handler_interface.h deleted file mode 100644 index 494b79a..0000000 --- a/ui/base/ime/ime_suggestion_window_handler_interface.h +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_BASE_IME_IME_SUGGESTION_WINDOW_HANDLER_INTERFACE_H_ -#define UI_BASE_IME_IME_SUGGESTION_WINDOW_HANDLER_INTERFACE_H_ - -#include <stdint.h> - -#include "base/component_export.h" -#include "base/strings/string16.h" - -namespace gfx { -class Rect; -} // namespace gfx - -namespace chromeos { - -// A interface to handle the suggestion window related method call. -class COMPONENT_EXPORT(UI_BASE_IME) IMESuggestionWindowHandlerInterface { - public: - virtual ~IMESuggestionWindowHandlerInterface() {} - - // Called when showing/hiding suggestion window. - virtual void Show(const base::string16& text, - const base::string16& confirmed_text, - const bool show_tab) {} - virtual void Hide() {} - - // Called to get the current suggestion text. - virtual base::string16 GetText() const = 0; - - // Called when the application changes its caret bounds. - virtual void SetBounds(const gfx::Rect& cursor_bounds) = 0; - - // Called when the text field's focus state is changed. - virtual void FocusStateChanged() {} - - protected: - IMESuggestionWindowHandlerInterface() {} -}; - -} // namespace chromeos - -#endif // UI_BASE_IME_IME_SUGGESTION_WINDOW_HANDLER_INTERFACE_H_
diff --git a/ui/base/resource/resource_bundle.h b/ui/base/resource/resource_bundle.h index 3daa73bd..0b62c5db 100644 --- a/ui/base/resource/resource_bundle.h +++ b/ui/base/resource/resource_bundle.h
@@ -120,7 +120,8 @@ }; // Initialize the ResourceBundle for this process. Does not take ownership of - // the |delegate| value. Returns the language selected. + // the |delegate| value. Returns the language selected or an empty string if + // initialization failed (e.g. resource bundle not found or corrupted). // NOTE: Mac ignores this and always loads up resources for the language // defined by the Cocoa UI (i.e., NSBundle does the language work). // @@ -194,11 +195,12 @@ ScaleFactor scale_factor); // Changes the locale for an already-initialized ResourceBundle, returning the - // name of the newly-loaded locale. Future calls to get strings will return - // the strings for this new locale. This has no effect on existing or future - // image resources. |locale_resources_data_| is protected by a lock for the - // duration of the swap, as GetLocalizedString() may be concurrently invoked - // on another thread. + // name of the newly-loaded locale, or an empty string if initialization + // failed (e.g. resource bundle not found or corrupted). Future calls to get + // strings will return the strings for this new locale. This has no effect on + // existing or future image resources. |locale_resources_data_| is protected + // by a lock for the duration of the swap, as GetLocalizedString() may be + // concurrently invoked on another thread. std::string ReloadLocaleResources(const std::string& pref_locale); // Gets image with the specified resource_id from the current module data.
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb index d7105db..05a21f5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -86,7 +86,7 @@ <translation id="1933345018156373194">No se ha podido mover el archivo porque se ha producido un error inesperado: <ph name="ERROR_MESSAGE" /></translation> <translation id="1936717151811561466">Finlandés</translation> <translation id="1942765061641586207">Resolución de imagen</translation> -<translation id="1943097386230153518">Instala más servicios</translation> +<translation id="1943097386230153518">Instalar más servicios</translation> <translation id="1947424002851288782">Teclado alemán</translation> <translation id="1972984168337863910">Ampliar paneles de comentarios de archivos</translation> <translation id="1984603991036629094">Teclado fonético armenio</translation>
diff --git a/ui/compositor/debug_utils.cc b/ui/compositor/debug_utils.cc index a2b385dc..6d07688 100644 --- a/ui/compositor/debug_utils.cc +++ b/ui/compositor/debug_utils.cc
@@ -108,10 +108,16 @@ void PrintLayerHierarchy(const Layer* layer, const gfx::Point& mouse_location) { std::ostringstream out; - out << "Layer hierarchy:\n"; - PrintLayerHierarchyImp(layer, 0, mouse_location, &out); + PrintLayerHierarchy(layer, mouse_location, &out); // Error so logs can be collected from end-users. LOG(ERROR) << out.str(); } +void PrintLayerHierarchy(const Layer* layer, + const gfx::Point& mouse_location, + std::ostringstream* out) { + *out << "Layer hierarchy:\n"; + PrintLayerHierarchyImp(layer, 0, mouse_location, out); +} + } // namespace ui
diff --git a/ui/compositor/debug_utils.h b/ui/compositor/debug_utils.h index f66998c..f8ba964 100644 --- a/ui/compositor/debug_utils.h +++ b/ui/compositor/debug_utils.h
@@ -5,6 +5,8 @@ #ifndef UI_COMPOSITOR_DEBUG_UTILS_H_ #define UI_COMPOSITOR_DEBUG_UTILS_H_ +#include <sstream> + #include "ui/compositor/compositor_export.h" namespace gfx { @@ -19,6 +21,12 @@ COMPOSITOR_EXPORT void PrintLayerHierarchy(const Layer* layer, const gfx::Point& mouse_location); +// Print the layer hierarchy to |out|. Mark layers which contain +// |mouse_location| with '*'. +COMPOSITOR_EXPORT void PrintLayerHierarchy(const Layer* layer, + const gfx::Point& mouse_location, + std::ostringstream* out); + } // namespace ui #endif // UI_COMPOSITOR_DEBUG_UTILS_H_
diff --git a/ui/display/manager/json_converter_unittest.cc b/ui/display/manager/json_converter_unittest.cc index 4bc838a..559e836 100644 --- a/ui/display/manager/json_converter_unittest.cc +++ b/ui/display/manager/json_converter_unittest.cc
@@ -49,9 +49,8 @@ "}"; base::JSONReader::ValueWithError result = base::JSONReader::ReadAndReturnValueWithError(data, 0); - ASSERT_EQ(base::JSONReader::JSON_NO_ERROR, result.error_code) - << result.error_message << " at " << result.error_line << ":" - << result.error_column; + ASSERT_TRUE(result.value) << result.error_message << " at " + << result.error_line << ":" << result.error_column; EXPECT_EQ(value, result.value.value()); DisplayLayout read_layout; @@ -71,9 +70,8 @@ "}"; base::JSONReader::ValueWithError result = base::JSONReader::ReadAndReturnValueWithError(data, 0); - ASSERT_EQ(base::JSONReader::JSON_NO_ERROR, result.error_code) - << result.error_message << " at " << result.error_line << ":" - << result.error_column; + ASSERT_TRUE(result.value) << result.error_message << " at " + << result.error_line << ":" << result.error_column; DisplayLayout read_layout; EXPECT_TRUE(JsonToDisplayLayout(result.value.value(), &read_layout));
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css index 6c51b20ad..4759e79 100644 --- a/ui/file_manager/file_manager/foreground/css/file_manager.css +++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -610,8 +610,8 @@ display: none; } -.dialog-header:not(.files-ng) button, -.dialog-header:not(.files-ng) button:hover { +body:not(.check-select) .dialog-header:not(.files-ng) button, +body:not(.check-select) .dialog-header:not(.files-ng) button:hover { color: white; }
diff --git a/ui/gfx/canvas.cc b/ui/gfx/canvas.cc index 6c5bb46..303aeca 100644 --- a/ui/gfx/canvas.cc +++ b/ui/gfx/canvas.cc
@@ -98,34 +98,6 @@ return base::i18n::IsRTL() ? TEXT_ALIGN_RIGHT : TEXT_ALIGN_LEFT; } -void Canvas::DrawDashedRect(const RectF& inrect, SkColor color) { - if (inrect.IsEmpty()) - return; - RectF rect = inrect; - - cc::PaintFlags flags; - flags.setColor(color); - SkScalar intervals[] = {1.f, 1.f}; - flags.setStrokeWidth(1.f); - flags.setStyle(cc::PaintFlags::kStroke_Style); - rect.Inset(gfx::InsetsF(0.5f)); - - flags.setPathEffect(SkDashPathEffect::Make(intervals, 2, 0)); - - // Top-left to top-right. - canvas_->drawLine(rect.x() - 0.5f, rect.y(), rect.right() + 0.5f, rect.y(), - flags); - // Top-left to bottom-left. - canvas_->drawLine(rect.right() + 0.5f, rect.bottom(), rect.x() - 0.5f, - rect.bottom(), flags); - // Bottom-right to bottom-left. - canvas_->drawLine(rect.x(), rect.y() - 0.5f, rect.x(), rect.bottom() + 0.5f, - flags); - // Bottom-right to top-right. - canvas_->drawLine(rect.right(), rect.bottom() + 0.5f, rect.right(), - rect.y() - 0.5f, flags); -} - float Canvas::UndoDeviceScaleFactor() { SkScalar scale_factor = 1.0f / image_scale_; canvas_->scale(scale_factor, scale_factor); @@ -309,14 +281,6 @@ canvas_->drawPath(path, flags); } -void Canvas::DrawFocusRect(const Rect& rect) { - DrawFocusRect(RectF(rect)); -} - -void Canvas::DrawFocusRect(const RectF& rect) { - DrawDashedRect(rect, SK_ColorGRAY); -} - void Canvas::DrawSolidFocusRect(RectF rect, SkColor color, int thickness) { cc::PaintFlags flags; flags.setColor(color);
diff --git a/ui/gfx/canvas.h b/ui/gfx/canvas.h index 16ac9b3..abad2e6 100644 --- a/ui/gfx/canvas.h +++ b/ui/gfx/canvas.h
@@ -151,9 +151,6 @@ // Canvas::TEXT_ALIGN_RIGHT. static int DefaultCanvasTextAlignment(); - // Draws a dashed rectangle of the specified color. - void DrawDashedRect(const RectF& rect, SkColor color); - // Unscales by the image scale factor (aka device scale factor), and returns // that factor. This is useful when callers want to draw directly in the // native scale. @@ -381,14 +378,6 @@ const Rect& display_rect, int flags); - // Draws a dotted gray rectangle used for focus purposes. - // DEPRECATED in favor of the RectF version below. - // TODO(funkysidd): Remove this (http://crbug.com/553726) - void DrawFocusRect(const Rect& rect); - - // Draws a dotted gray rectangle used for focus purposes. - void DrawFocusRect(const RectF& rect); - // Draws a |rect| in the specified region with the specified |color|. The // width of the stroke is |thickness| dip, but the actual pixel width will be // floored to ensure an integral value.
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index 9a56945..e187b97 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn
@@ -482,10 +482,12 @@ jumbo_static_library("test_support") { testonly = true sources = [ + "test/gl_image_bind_test_template.h", "test/gl_image_test_support.cc", "test/gl_image_test_support.h", "test/gl_image_test_template.cc", "test/gl_image_test_template.h", + "test/gl_image_zero_initialize_test_template.h", "test/gl_surface_test_support.cc", "test/gl_surface_test_support.h", "test/gl_test_helper.cc",
diff --git a/ui/gl/gl_image_ahardwarebuffer_unittest.cc b/ui/gl/gl_image_ahardwarebuffer_unittest.cc index fa92ef5..27e47ed 100644 --- a/ui/gl/gl_image_ahardwarebuffer_unittest.cc +++ b/ui/gl/gl_image_ahardwarebuffer_unittest.cc
@@ -10,7 +10,9 @@ #include "base/memory/scoped_refptr.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_image_ahardwarebuffer.h" +#include "ui/gl/test/gl_image_bind_test_template.h" #include "ui/gl/test/gl_image_test_template.h" +#include "ui/gl/test/gl_image_zero_initialize_test_template.h" namespace gl { namespace {
diff --git a/ui/gl/gl_image_d3d_unittest.cc b/ui/gl/gl_image_d3d_unittest.cc index b9d03318..e76c559 100644 --- a/ui/gl/gl_image_d3d_unittest.cc +++ b/ui/gl/gl_image_d3d_unittest.cc
@@ -7,7 +7,9 @@ #include "build/build_config.h" #include "ui/gl/gl_angle_util_win.h" #include "ui/gl/gl_bindings.h" +#include "ui/gl/test/gl_image_bind_test_template.h" #include "ui/gl/test/gl_image_test_template.h" +#include "ui/gl/test/gl_image_zero_initialize_test_template.h" namespace gl { namespace {
diff --git a/ui/gl/gl_image_dxgi_unittest.cc b/ui/gl/gl_image_dxgi_unittest.cc index 78ab903..668e7860 100644 --- a/ui/gl/gl_image_dxgi_unittest.cc +++ b/ui/gl/gl_image_dxgi_unittest.cc
@@ -10,7 +10,9 @@ #include "ui/gfx/buffer_format_util.h" #include "ui/gl/gl_angle_util_win.h" #include "ui/gl/gl_image_dxgi.h" +#include "ui/gl/test/gl_image_bind_test_template.h" #include "ui/gl/test/gl_image_test_template.h" +#include "ui/gl/test/gl_image_zero_initialize_test_template.h" namespace gl { namespace {
diff --git a/ui/gl/gl_image_io_surface_unittest.cc b/ui/gl/gl_image_io_surface_unittest.cc index d321438..3488aeb 100644 --- a/ui/gl/gl_image_io_surface_unittest.cc +++ b/ui/gl/gl_image_io_surface_unittest.cc
@@ -11,7 +11,9 @@ #include "ui/gfx/buffer_format_util.h" #include "ui/gfx/mac/io_surface.h" #include "ui/gl/gl_image_io_surface.h" +#include "ui/gl/test/gl_image_bind_test_template.h" #include "ui/gl/test/gl_image_test_template.h" +#include "ui/gl/test/gl_image_zero_initialize_test_template.h" namespace gl { namespace {
diff --git a/ui/gl/init/create_gr_gl_interface.cc b/ui/gl/init/create_gr_gl_interface.cc index dbc61ccd..52fb950 100644 --- a/ui/gl/init/create_gr_gl_interface.cc +++ b/ui/gl/init/create_gr_gl_interface.cc
@@ -215,8 +215,7 @@ sk_sp<GrGLInterface> CreateGrGLInterface( const gl::GLVersionInfo& version_info, bool use_version_es2, - gl::ProgressReporter* progress_reporter, - std::vector<const char*> blacklisted_extensions) { + gl::ProgressReporter* progress_reporter) { // Can't fake ES with desktop GL. use_version_es2 &= version_info.is_es; @@ -268,8 +267,6 @@ } for (const char* extension : kBlacklistExtensions) extensions.remove(extension); - for (const char* extension : blacklisted_extensions) - extensions.remove(extension); GrGLInterface* interface = new GrGLInterface(); GrGLInterface::Functions* functions = &interface->fFunctions;
diff --git a/ui/gl/init/create_gr_gl_interface.h b/ui/gl/init/create_gr_gl_interface.h index bef9269..9243fbe 100644 --- a/ui/gl/init/create_gr_gl_interface.h +++ b/ui/gl/init/create_gr_gl_interface.h
@@ -5,8 +5,6 @@ #ifndef UI_GL_INIT_CREATE_GR_GL_INTERFACE_H_ #define UI_GL_INIT_CREATE_GR_GL_INTERFACE_H_ -#include <vector> - #include "third_party/skia/include/gpu/gl/GrGLInterface.h" #include "ui/gl/init/gl_init_export.h" @@ -24,8 +22,7 @@ GL_INIT_EXPORT sk_sp<GrGLInterface> CreateGrGLInterface( const gl::GLVersionInfo& version_info, bool use_version_es2, - gl::ProgressReporter* progress_reporter = nullptr, - std::vector<const char*> blacklisted_extensions = {}); + gl::ProgressReporter* progress_reporter = nullptr); } // namespace init } // namespace gl
diff --git a/ui/gl/test/gl_image_bind_test_template.h b/ui/gl/test/gl_image_bind_test_template.h new file mode 100644 index 0000000..43c5f37 --- /dev/null +++ b/ui/gl/test/gl_image_bind_test_template.h
@@ -0,0 +1,64 @@ +// 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 UI_GL_TEST_GL_IMAGE_BIND_TEST_TEMPLATE_H_ +#define UI_GL_TEST_GL_IMAGE_BIND_TEST_TEMPLATE_H_ + +#include "ui/gl/test/gl_image_test_template.h" + +namespace gl { + +template <typename GLImageTestDelegate> +class GLImageBindTest : public GLImageTest<GLImageTestDelegate> {}; + +TYPED_TEST_SUITE_P(GLImageBindTest); + +TYPED_TEST_P(GLImageBindTest, BindTexImage) { + if (this->delegate_.SkipTest()) + return; + + const gfx::Size image_size(256, 256); + const uint8_t* image_color = this->delegate_.GetImageColor(); + + GLuint framebuffer = + GLTestHelper::SetupFramebuffer(image_size.width(), image_size.height()); + ASSERT_TRUE(framebuffer); + glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer); + glViewport(0, 0, image_size.width(), image_size.height()); + + // Create a solid color green image of preferred format. This must succeed + // in order for a GLImage to be conformant. + scoped_refptr<GLImage> image = + this->delegate_.CreateSolidColorImage(image_size, image_color); + ASSERT_TRUE(image); + + // Initialize a blue texture of the same size as |image|. + unsigned target = this->delegate_.GetTextureTarget(); + GLuint texture = GLTestHelper::CreateTexture(target); + glBindTexture(target, texture); + + // Bind |image| to |texture|. + bool rv = image->BindTexImage(target); + EXPECT_TRUE(rv); + + glClearColor(0.0f, 0.0f, 1.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + // Draw |texture| to viewport. + internal::DrawTextureQuad(target, image_size); + + // Read back pixels to check expectations. + GLTestHelper::CheckPixelsWithError( + 0, 0, image_size.width(), image_size.height(), + this->delegate_.GetAdmissibleError(), image_color); + + // Clean up. + glDeleteTextures(1, &texture); + glDeleteFramebuffersEXT(1, &framebuffer); +} + +REGISTER_TYPED_TEST_SUITE_P(GLImageBindTest, BindTexImage); + +} // namespace gl + +#endif // UI_GL_TEST_GL_IMAGE_BIND_TEST_TEMPLATE_H_
diff --git a/ui/gl/test/gl_image_test_template.h b/ui/gl/test/gl_image_test_template.h index 55ae2790..b9f4ed8 100644 --- a/ui/gl/test/gl_image_test_template.h +++ b/ui/gl/test/gl_image_test_template.h
@@ -154,112 +154,6 @@ REGISTER_TYPED_TEST_SUITE_P_WITH_EXPANSION(GLImageOddSizeTest, MAYBE_Create); template <typename GLImageTestDelegate> -class GLImageZeroInitializeTest : public GLImageTest<GLImageTestDelegate> {}; - -// This test verifies that if an uninitialized image is bound to a texture, the -// result is zero-initialized. -TYPED_TEST_SUITE_P(GLImageZeroInitializeTest); - -TYPED_TEST_P(GLImageZeroInitializeTest, ZeroInitialize) { - if (this->delegate_.SkipTest()) - return; - -#if defined(OS_MACOSX) - // This functionality is disabled on Yosemite because it is suspected of - // causing performance regressions on old hardware. https://crbug.com/606850. - if (base::mac::IsOS10_10()) - return; -#endif - - const gfx::Size image_size(256, 256); - - GLuint framebuffer = - GLTestHelper::SetupFramebuffer(image_size.width(), image_size.height()); - ASSERT_TRUE(framebuffer); - glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer); - glViewport(0, 0, image_size.width(), image_size.height()); - - // Create an uninitialized image of preferred format. - scoped_refptr<GLImage> image = this->delegate_.CreateImage(image_size); - - // Create a texture that |image| will be bound to. - GLenum target = this->delegate_.GetTextureTarget(); - GLuint texture = GLTestHelper::CreateTexture(target); - glBindTexture(target, texture); - - // Bind |image| to |texture|. - bool rv = image->BindTexImage(target); - EXPECT_TRUE(rv); - - // Draw |texture| to viewport. - internal::DrawTextureQuad(target, image_size); - - // Release |image| from |texture|. - image->ReleaseTexImage(target); - - // Read back pixels to check expectations. - const uint8_t zero_color[] = {0, 0, 0, 0}; - GLTestHelper::CheckPixels(0, 0, image_size.width(), image_size.height(), - zero_color); - - // Clean up. - glDeleteTextures(1, &texture); - glDeleteFramebuffersEXT(1, &framebuffer); -} - -REGISTER_TYPED_TEST_SUITE_P(GLImageZeroInitializeTest, ZeroInitialize); - -template <typename GLImageTestDelegate> -class GLImageBindTest : public GLImageTest<GLImageTestDelegate> {}; - -TYPED_TEST_SUITE_P(GLImageBindTest); - -TYPED_TEST_P(GLImageBindTest, BindTexImage) { - if (this->delegate_.SkipTest()) - return; - - const gfx::Size image_size(256, 256); - const uint8_t* image_color = this->delegate_.GetImageColor(); - - GLuint framebuffer = - GLTestHelper::SetupFramebuffer(image_size.width(), image_size.height()); - ASSERT_TRUE(framebuffer); - glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer); - glViewport(0, 0, image_size.width(), image_size.height()); - - // Create a solid color green image of preferred format. This must succeed - // in order for a GLImage to be conformant. - scoped_refptr<GLImage> image = - this->delegate_.CreateSolidColorImage(image_size, image_color); - ASSERT_TRUE(image); - - // Initialize a blue texture of the same size as |image|. - unsigned target = this->delegate_.GetTextureTarget(); - GLuint texture = GLTestHelper::CreateTexture(target); - glBindTexture(target, texture); - - // Bind |image| to |texture|. - bool rv = image->BindTexImage(target); - EXPECT_TRUE(rv); - - glClearColor(0.0f, 0.0f, 1.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - // Draw |texture| to viewport. - internal::DrawTextureQuad(target, image_size); - - // Read back pixels to check expectations. - GLTestHelper::CheckPixelsWithError( - 0, 0, image_size.width(), image_size.height(), - this->delegate_.GetAdmissibleError(), image_color); - - // Clean up. - glDeleteTextures(1, &texture); - glDeleteFramebuffersEXT(1, &framebuffer); -} - -REGISTER_TYPED_TEST_SUITE_P(GLImageBindTest, BindTexImage); - -template <typename GLImageTestDelegate> class GLImageCopyTest : public GLImageTest<GLImageTestDelegate> {}; TYPED_TEST_SUITE_P(GLImageCopyTest);
diff --git a/ui/gl/test/gl_image_zero_initialize_test_template.h b/ui/gl/test/gl_image_zero_initialize_test_template.h new file mode 100644 index 0000000..84014f95 --- /dev/null +++ b/ui/gl/test/gl_image_zero_initialize_test_template.h
@@ -0,0 +1,71 @@ +// 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 UI_GL_TEST_GL_IMAGE_ZERO_INITIALIZE_TEST_TEMPLATE_H_ +#define UI_GL_TEST_GL_IMAGE_ZERO_INITIALIZE_TEST_TEMPLATE_H_ + +#include "build/build_config.h" +#include "ui/gl/test/gl_image_test_template.h" + +namespace gl { + +template <typename GLImageTestDelegate> +class GLImageZeroInitializeTest : public GLImageTest<GLImageTestDelegate> {}; + +// This test verifies that if an uninitialized image is bound to a texture, the +// result is zero-initialized. +TYPED_TEST_SUITE_P(GLImageZeroInitializeTest); + +TYPED_TEST_P(GLImageZeroInitializeTest, ZeroInitialize) { + if (this->delegate_.SkipTest()) + return; + +#if defined(OS_MACOSX) + // This functionality is disabled on Yosemite because it is suspected of + // causing performance regressions on old hardware. https://crbug.com/606850. + if (base::mac::IsOS10_10()) + return; +#endif + + const gfx::Size image_size(256, 256); + + GLuint framebuffer = + GLTestHelper::SetupFramebuffer(image_size.width(), image_size.height()); + ASSERT_TRUE(framebuffer); + glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer); + glViewport(0, 0, image_size.width(), image_size.height()); + + // Create an uninitialized image of preferred format. + scoped_refptr<GLImage> image = this->delegate_.CreateImage(image_size); + + // Create a texture that |image| will be bound to. + GLenum target = this->delegate_.GetTextureTarget(); + GLuint texture = GLTestHelper::CreateTexture(target); + glBindTexture(target, texture); + + // Bind |image| to |texture|. + bool rv = image->BindTexImage(target); + EXPECT_TRUE(rv); + + // Draw |texture| to viewport. + internal::DrawTextureQuad(target, image_size); + + // Release |image| from |texture|. + image->ReleaseTexImage(target); + + // Read back pixels to check expectations. + const uint8_t zero_color[] = {0, 0, 0, 0}; + GLTestHelper::CheckPixels(0, 0, image_size.width(), image_size.height(), + zero_color); + + // Clean up. + glDeleteTextures(1, &texture); + glDeleteFramebuffersEXT(1, &framebuffer); +} + +REGISTER_TYPED_TEST_SUITE_P(GLImageZeroInitializeTest, ZeroInitialize); + +} // namespace gl + +#endif // UI_GL_TEST_GL_IMAGE_ZERO_INITIALIZE_TEST_TEMPLATE_H_
diff --git a/ui/gtk/BUILD.gn b/ui/gtk/BUILD.gn index 2dd6739..be7a538 100644 --- a/ui/gtk/BUILD.gn +++ b/ui/gtk/BUILD.gn
@@ -103,23 +103,3 @@ deps += [ "//ui/ozone" ] } } - -component("x") { - output_name = "ui_gtk_x" - sources = [ - "gtk_event_loop_x11.cc", - "gtk_event_loop_x11.h", - "gtk_ui_delegate_x11.cc", - "gtk_ui_delegate_x11.h", - ] - deps = [ - "//base", - "//build/config/linux/gtk", - "//ui/base", - "//ui/events/platform/x11", - "//ui/gfx/x", - ] - public_deps = [ ":gtk_ui_delegate" ] - defines = [ "IS_UI_GTK_X_IMPL" ] - configs += [ "//build/config/linux:x11" ] -}
diff --git a/ui/gtk/x/BUILD.gn b/ui/gtk/x/BUILD.gn new file mode 100644 index 0000000..0d8505ed --- /dev/null +++ b/ui/gtk/x/BUILD.gn
@@ -0,0 +1,28 @@ +# 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("//build/config/ui.gni") +import("//ui/ozone/ozone.gni") + +assert(use_x11 || ozone_platform_x11) + +component("x") { + output_name = "ui_gtk_x" + sources = [ + "gtk_event_loop_x11.cc", + "gtk_event_loop_x11.h", + "gtk_ui_delegate_x11.cc", + "gtk_ui_delegate_x11.h", + ] + deps = [ + "//base", + "//build/config/linux/gtk", + "//ui/base", + "//ui/events/platform/x11", + "//ui/gfx/x", + ] + public_deps = [ "//ui/gtk:gtk_ui_delegate" ] + defines = [ "IS_UI_GTK_X_IMPL" ] + configs += [ "//build/config/linux:x11" ] +}
diff --git a/ui/gtk/gtk_event_loop_x11.cc b/ui/gtk/x/gtk_event_loop_x11.cc similarity index 98% rename from ui/gtk/gtk_event_loop_x11.cc rename to ui/gtk/x/gtk_event_loop_x11.cc index 5dd6474..aab1a9c 100644 --- a/ui/gtk/gtk_event_loop_x11.cc +++ b/ui/gtk/x/gtk_event_loop_x11.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 "ui/gtk/gtk_event_loop_x11.h" +#include "ui/gtk/x/gtk_event_loop_x11.h" #include <gdk/gdk.h> #include <gdk/gdkx.h>
diff --git a/ui/gtk/gtk_event_loop_x11.h b/ui/gtk/x/gtk_event_loop_x11.h similarity index 87% rename from ui/gtk/gtk_event_loop_x11.h rename to ui/gtk/x/gtk_event_loop_x11.h index 41b3ffa..7ea7205 100644 --- a/ui/gtk/gtk_event_loop_x11.h +++ b/ui/gtk/x/gtk_event_loop_x11.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GTK_GTK_EVENT_LOOP_X11_H_ -#define UI_GTK_GTK_EVENT_LOOP_X11_H_ +#ifndef UI_GTK_X_GTK_EVENT_LOOP_X11_H_ +#define UI_GTK_X_GTK_EVENT_LOOP_X11_H_ #include "base/macros.h" #include "ui/base/glib/glib_integers.h" @@ -36,4 +36,4 @@ } // namespace ui -#endif // UI_GTK_GTK_EVENT_LOOP_X11_H_ +#endif // UI_GTK_X_GTK_EVENT_LOOP_X11_H_
diff --git a/ui/gtk/gtk_ui_delegate_x11.cc b/ui/gtk/x/gtk_ui_delegate_x11.cc similarity index 95% rename from ui/gtk/gtk_ui_delegate_x11.cc rename to ui/gtk/x/gtk_ui_delegate_x11.cc index 7de953d..6dfe5fa 100644 --- a/ui/gtk/gtk_ui_delegate_x11.cc +++ b/ui/gtk/x/gtk_ui_delegate_x11.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 "ui/gtk/gtk_ui_delegate_x11.h" +#include "ui/gtk/x/gtk_ui_delegate_x11.h" #include <gdk/gdkx.h> #include <gtk/gtk.h> @@ -11,7 +11,7 @@ #include "ui/events/platform/x11/x11_event_source.h" #include "ui/gfx/native_widget_types.h" #include "ui/gfx/x/x11.h" -#include "ui/gtk/gtk_event_loop_x11.h" +#include "ui/gtk/x/gtk_event_loop_x11.h" namespace ui {
diff --git a/ui/gtk/gtk_ui_delegate_x11.h b/ui/gtk/x/gtk_ui_delegate_x11.h similarity index 91% rename from ui/gtk/gtk_ui_delegate_x11.h rename to ui/gtk/x/gtk_ui_delegate_x11.h index d2e4b32..e1f252d 100644 --- a/ui/gtk/gtk_ui_delegate_x11.h +++ b/ui/gtk/x/gtk_ui_delegate_x11.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef UI_GTK_GTK_UI_DELEGATE_X11_H_ -#define UI_GTK_GTK_UI_DELEGATE_X11_H_ +#ifndef UI_GTK_X_GTK_UI_DELEGATE_X11_H_ +#define UI_GTK_X_GTK_UI_DELEGATE_X11_H_ #include "base/component_export.h" #include "ui/gfx/native_widget_types.h" @@ -43,4 +43,4 @@ } // namespace ui -#endif // UI_GTK_GTK_UI_DELEGATE_X11_H_ +#endif // UI_GTK_X_GTK_UI_DELEGATE_X11_H_
diff --git a/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc b/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc index 229b151..4008730 100644 --- a/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc +++ b/ui/ozone/gl/gl_image_ozone_native_pixmap_unittest.cc
@@ -9,6 +9,7 @@ #include "ui/gfx/buffer_types.h" #include "ui/gfx/client_native_pixmap.h" #include "ui/gl/gl_image_native_pixmap.h" +#include "ui/gl/test/gl_image_bind_test_template.h" #include "ui/gl/test/gl_image_test_template.h" #include "ui/ozone/public/client_native_pixmap_factory_ozone.h" #include "ui/ozone/public/ozone_platform.h"
diff --git a/ui/ozone/platform/x11/BUILD.gn b/ui/ozone/platform/x11/BUILD.gn index de0a06e..3df13b9 100644 --- a/ui/ozone/platform/x11/BUILD.gn +++ b/ui/ozone/platform/x11/BUILD.gn
@@ -79,7 +79,7 @@ } if (use_gtk) { - deps += [ "//ui/gtk:x" ] + deps += [ "//ui/gtk/x" ] } if (use_xkbcommon) {
diff --git a/ui/ozone/platform/x11/DEPS b/ui/ozone/platform/x11/DEPS index c4251a75..3d70447 100644 --- a/ui/ozone/platform/x11/DEPS +++ b/ui/ozone/platform/x11/DEPS
@@ -2,5 +2,5 @@ "+ui/base/x", "+ui/base", "+ui/gtk/gtk_ui_delegate.h", - "+ui/gtk/gtk_ui_delegate_x11.h", + "+ui/gtk/x/gtk_ui_delegate_x11.h", ]
diff --git a/ui/ozone/platform/x11/ozone_platform_x11.cc b/ui/ozone/platform/x11/ozone_platform_x11.cc index a53c88d..49e3614 100644 --- a/ui/ozone/platform/x11/ozone_platform_x11.cc +++ b/ui/ozone/platform/x11/ozone_platform_x11.cc
@@ -41,8 +41,8 @@ #endif #if BUILDFLAG(USE_GTK) -#include "ui/gtk/gtk_ui_delegate.h" // nogncheck -#include "ui/gtk/gtk_ui_delegate_x11.h" // nogncheck +#include "ui/gtk/gtk_ui_delegate.h" // nogncheck +#include "ui/gtk/x/gtk_ui_delegate_x11.h" // nogncheck #endif #if BUILDFLAG(USE_XKBCOMMON)
diff --git a/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc b/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc index f4315d4..607295453 100644 --- a/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc +++ b/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc
@@ -196,7 +196,7 @@ } } // namespace -TEST_F(AXSystemCaretWinTest, DISABLED_TestOnCaretBoundsChangeInTextField) { +TEST_F(AXSystemCaretWinTest, TestOnCaretBoundsChangeInTextField) { TextfieldTestApi textfield_test_api(textfield_); Microsoft::WRL::ComPtr<IAccessible> caret_accessible; gfx::NativeWindow native_window = widget_->GetNativeWindow(); @@ -205,9 +205,12 @@ EXPECT_HRESULT_SUCCEEDED(AccessibleObjectFromWindow( hwnd, static_cast<DWORD>(OBJID_CARET), IID_PPV_ARGS(&caret_accessible))); + gfx::Rect window_bounds = native_window->GetBoundsInScreen(); + textfield_test_api.ExecuteTextEditCommand( ui::TextEditCommand::MOVE_TO_BEGINNING_OF_DOCUMENT); - gfx::Point caret_position = textfield_test_api.GetCursorViewRect().origin(); + gfx::Point caret_position = textfield_test_api.GetCursorViewRect().origin() + + window_bounds.OffsetFromOrigin(); LONG x, y, width, height; EXPECT_EQ(S_OK, caret_accessible->accLocation(&x, &y, &width, &height, self_)); @@ -217,7 +220,8 @@ textfield_test_api.ExecuteTextEditCommand( ui::TextEditCommand::MOVE_TO_END_OF_DOCUMENT); - gfx::Point caret_position2 = textfield_test_api.GetCursorViewRect().origin(); + gfx::Point caret_position2 = textfield_test_api.GetCursorViewRect().origin() + + window_bounds.OffsetFromOrigin(); EXPECT_NE(caret_position, caret_position2); EXPECT_EQ(S_OK, caret_accessible->accLocation(&x, &y, &width, &height, self_)); @@ -226,7 +230,7 @@ EXPECT_EQ(1, width); } -TEST_F(AXSystemCaretWinTest, DISABLED_TestOnInputTypeChangeInTextField) { +TEST_F(AXSystemCaretWinTest, TestOnInputTypeChangeInTextField) { Microsoft::WRL::ComPtr<IAccessible> caret_accessible; gfx::NativeWindow native_window = widget_->GetNativeWindow(); ASSERT_NE(nullptr, native_window); @@ -255,7 +259,7 @@ EXPECT_EQ(height, height2); } -TEST_F(AXSystemCaretWinTest, DISABLED_TestMovingWindow) { +TEST_F(AXSystemCaretWinTest, TestMovingWindow) { Microsoft::WRL::ComPtr<IAccessible> caret_accessible; gfx::NativeWindow native_window = widget_->GetNativeWindow(); ASSERT_NE(nullptr, native_window); @@ -268,9 +272,6 @@ widget_->SetBounds(gfx::Rect(100, 100, 500, 500)); LONG x2, y2, width2, height2; - caret_accessible.Reset(); - EXPECT_HRESULT_SUCCEEDED(AccessibleObjectFromWindow( - hwnd, static_cast<DWORD>(OBJID_CARET), IID_PPV_ARGS(&caret_accessible))); EXPECT_EQ(S_OK, caret_accessible->accLocation(&x2, &y2, &width2, &height2, self_)); EXPECT_NE(x, x2); @@ -281,13 +282,14 @@ // Try maximizing the window. SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0); - LONG x3, y3, width3, height3; - EXPECT_HRESULT_FAILED( - caret_accessible->accLocation(&x3, &y3, &width3, &height3, self_)); - caret_accessible.Reset(); + // On Win7, maximizing the window causes our caret object to get destroyed and + // re-created, so re-acquire it. + caret_accessible.Reset(); EXPECT_HRESULT_SUCCEEDED(AccessibleObjectFromWindow( hwnd, static_cast<DWORD>(OBJID_CARET), IID_PPV_ARGS(&caret_accessible))); + + LONG x3, y3, width3, height3; EXPECT_EQ(S_OK, caret_accessible->accLocation(&x3, &y3, &width3, &height3, self_)); EXPECT_NE(x2, x3); @@ -297,7 +299,7 @@ EXPECT_EQ(height, height3); } -TEST_F(AXSystemCaretWinTest, DISABLED_TestCaretMSAAEvents) { +TEST_F(AXSystemCaretWinTest, TestCaretMSAAEvents) { TextfieldTestApi textfield_test_api(textfield_); Microsoft::WRL::ComPtr<IAccessible> caret_accessible; gfx::NativeWindow native_window = widget_->GetNativeWindow();
diff --git a/ui/views/controls/label.cc b/ui/views/controls/label.cc index f389c326..ad6af149 100644 --- a/ui/views/controls/label.cc +++ b/ui/views/controls/label.cc
@@ -598,10 +598,6 @@ return render_text; } -void Label::PaintFocusRing(gfx::Canvas* canvas) const { - // No focus ring by default. -} - gfx::Rect Label::GetTextBounds() const { MaybeBuildDisplayText(); @@ -645,8 +641,6 @@ void Label::OnPaint(gfx::Canvas* canvas) { View::OnPaint(canvas); PaintText(canvas); - if (HasFocus()) - PaintFocusRing(canvas); } void Label::OnThemeChanged() {
diff --git a/ui/views/controls/label.h b/ui/views/controls/label.h index a95ecdf9..dc690b2 100644 --- a/ui/views/controls/label.h +++ b/ui/views/controls/label.h
@@ -267,9 +267,6 @@ // Create a single RenderText instance to actually be painted. virtual std::unique_ptr<gfx::RenderText> CreateRenderText() const; - // Draw a focus ring. The default implementation does nothing. - virtual void PaintFocusRing(gfx::Canvas* canvas) const; - // Returns the preferred size and position of the text in local coordinates, // which may exceed the local bounds of the label. gfx::Rect GetTextBounds() const;
diff --git a/ui/views/debug_utils.cc b/ui/views/debug_utils.cc index d176fd4..63355b3 100644 --- a/ui/views/debug_utils.cc +++ b/ui/views/debug_utils.cc
@@ -144,12 +144,16 @@ void PrintViewHierarchy(const View* view) { std::ostringstream out; - out << "View hierarchy:\n"; - PrintViewHierarchyImp(view, 0, &out); + PrintViewHierarchy(view, &out); // Error so users in the field can generate and upload logs. LOG(ERROR) << out.str(); } +void PrintViewHierarchy(const View* view, std::ostringstream* out) { + *out << "View hierarchy:\n"; + PrintViewHierarchyImp(view, 0, out); +} + void PrintFocusHierarchy(const View* view) { std::ostringstream out; out << "Focus hierarchy:\n";
diff --git a/ui/views/debug_utils.h b/ui/views/debug_utils.h index 3051359a..6d0d9cd0 100644 --- a/ui/views/debug_utils.h +++ b/ui/views/debug_utils.h
@@ -16,6 +16,9 @@ // Log the view hierarchy. VIEWS_EXPORT void PrintViewHierarchy(const View* view); +// Print the view hierarchy to |out|. +VIEWS_EXPORT void PrintViewHierarchy(const View* view, std::ostringstream* out); + // Log the focus traversal hierarchy. VIEWS_EXPORT void PrintFocusHierarchy(const View* view);
diff --git a/url/android/gurl_android.cc b/url/android/gurl_android.cc index 00cfe102..c19a63f 100644 --- a/url/android/gurl_android.cc +++ b/url/android/gurl_android.cc
@@ -75,6 +75,11 @@ return j_gurl; } +// static +ScopedJavaLocalRef<jobject> GURLAndroid::EmptyGURL(JNIEnv* env) { + return Java_GURL_emptyGURL(env); +} + static void JNI_GURL_GetOrigin(JNIEnv* env, const JavaParamRef<jstring>& j_spec, jboolean is_valid,
diff --git a/url/android/gurl_android.h b/url/android/gurl_android.h index 733ba06..7113a01 100644 --- a/url/android/gurl_android.h +++ b/url/android/gurl_android.h
@@ -20,6 +20,7 @@ static base::android::ScopedJavaLocalRef<jobject> FromNativeGURL( JNIEnv* env, const GURL& gurl); + static base::android::ScopedJavaLocalRef<jobject> EmptyGURL(JNIEnv* env); }; } // namespace url
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java index 5042bbdd..b9d0788 100644 --- a/url/android/java/src/org/chromium/url/GURL.java +++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -58,6 +58,7 @@ private static class Holder { private static GURL sEmptyGURL = new GURL(""); } + @CalledByNative public static GURL emptyGURL() { return Holder.sEmptyGURL; }
diff --git a/weblayer/browser/navigation_browsertest.cc b/weblayer/browser/navigation_browsertest.cc index 516cc01..d1d2f5d8 100644 --- a/weblayer/browser/navigation_browsertest.cc +++ b/weblayer/browser/navigation_browsertest.cc
@@ -4,7 +4,9 @@ #include "weblayer/test/weblayer_browser_test.h" +#include "base/callback.h" #include "base/files/file_path.h" +#include "base/test/bind_test_util.h" #include "content/public/test/url_loader_interceptor.h" #include "net/test/embedded_test_server/controllable_http_response.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -20,33 +22,49 @@ namespace { -class StopNavigationObserver : public NavigationObserver { +// NavigationObserver that allows registering a callback for various +// NavigationObserver functions. +class NavigationObserverImpl : public NavigationObserver { public: - StopNavigationObserver(NavigationController* controller, bool stop_in_start) - : controller_(controller), stop_in_start_(stop_in_start) { + explicit NavigationObserverImpl(NavigationController* controller) + : controller_(controller) { controller_->AddObserver(this); } - ~StopNavigationObserver() override { controller_->RemoveObserver(this); } + ~NavigationObserverImpl() override { controller_->RemoveObserver(this); } - void WaitForNavigation() { run_loop_.Run(); } + using Callback = base::OnceCallback<void(Navigation*)>; + + void SetStartedCallback(Callback callback) { + started_callback_ = std::move(callback); + } + + void SetRedirectedCallback(Callback callback) { + redirected_callback_ = std::move(callback); + } + + void SetFailedClosure(base::OnceClosure closure) { + failed_closure_ = std::move(closure); + } // NavigationObserver: void NavigationStarted(Navigation* navigation) override { - if (stop_in_start_) - controller_->Stop(); + if (started_callback_) + std::move(started_callback_).Run(navigation); } void NavigationRedirected(Navigation* navigation) override { - if (!stop_in_start_) - controller_->Stop(); + if (redirected_callback_) + std::move(redirected_callback_).Run(navigation); } - void NavigationFailed(Navigation* navigation) override { run_loop_.Quit(); } + void NavigationFailed(Navigation* navigation) override { + if (failed_closure_) + std::move(failed_closure_).Run(); + } private: NavigationController* controller_; - // If true Stop() is called in NavigationStarted(), otherwise Stop() is - // called in NavigationRedirected(). - const bool stop_in_start_; - base::RunLoop run_loop_; + Callback started_callback_; + Callback redirected_callback_; + base::OnceClosure failed_closure_; }; class OneShotNavigationObserver : public NavigationObserver { @@ -95,13 +113,18 @@ } // namespace -using NavigationBrowserTest = WebLayerBrowserTest; +class NavigationBrowserTest : public WebLayerBrowserTest { + public: + NavigationController* GetNavigationController() { + return shell()->tab()->GetNavigationController(); + } +}; IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, NoError) { EXPECT_TRUE(embedded_test_server()->Start()); OneShotNavigationObserver observer(shell()); - shell()->tab()->GetNavigationController()->Navigate( + GetNavigationController()->Navigate( embedded_test_server()->GetURL("/simple_page.html")); observer.WaitForNavigation(); @@ -116,7 +139,7 @@ EXPECT_TRUE(embedded_test_server()->Start()); OneShotNavigationObserver observer(shell()); - shell()->tab()->GetNavigationController()->Navigate( + GetNavigationController()->Navigate( embedded_test_server()->GetURL("/non_existent.html")); observer.WaitForNavigation(); @@ -131,7 +154,7 @@ EXPECT_TRUE(embedded_test_server()->Start()); OneShotNavigationObserver observer(shell()); - shell()->tab()->GetNavigationController()->Navigate( + GetNavigationController()->Navigate( embedded_test_server()->GetURL("/echo?status=500")); observer.WaitForNavigation(); @@ -153,7 +176,7 @@ ASSERT_TRUE(https_server_mismatched.Start()); OneShotNavigationObserver observer(shell()); - shell()->tab()->GetNavigationController()->Navigate( + GetNavigationController()->Navigate( https_server_mismatched.GetURL("/simple_page.html")); observer.WaitForNavigation(); @@ -169,7 +192,7 @@ url, net::ERR_NAME_NOT_RESOLVED); OneShotNavigationObserver observer(shell()); - shell()->tab()->GetNavigationController()->Navigate(url); + GetNavigationController()->Navigate(url); observer.WaitForNavigation(); EXPECT_FALSE(observer.completed()); @@ -179,71 +202,34 @@ } IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, StopInOnStart) { - EXPECT_TRUE(embedded_test_server()->Start()); - StopNavigationObserver observer(shell()->tab()->GetNavigationController(), - true); - shell()->tab()->GetNavigationController()->Navigate( + ASSERT_TRUE(embedded_test_server()->Start()); + base::RunLoop run_loop; + NavigationObserverImpl observer(GetNavigationController()); + observer.SetStartedCallback(base::BindLambdaForTesting( + [&](Navigation*) { GetNavigationController()->Stop(); })); + observer.SetFailedClosure( + base::BindOnce(&base::RunLoop::Quit, base::Unretained(&run_loop))); + GetNavigationController()->Navigate( embedded_test_server()->GetURL("/simple_page.html")); - observer.WaitForNavigation(); + run_loop.Run(); } IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, StopInOnRedirect) { - EXPECT_TRUE(embedded_test_server()->Start()); - StopNavigationObserver observer(shell()->tab()->GetNavigationController(), - false); + ASSERT_TRUE(embedded_test_server()->Start()); + base::RunLoop run_loop; + NavigationObserverImpl observer(GetNavigationController()); + observer.SetRedirectedCallback(base::BindLambdaForTesting( + [&](Navigation*) { GetNavigationController()->Stop(); })); + observer.SetFailedClosure( + base::BindOnce(&base::RunLoop::Quit, base::Unretained(&run_loop))); const GURL original_url = embedded_test_server()->GetURL("/simple_page.html"); - shell()->tab()->GetNavigationController()->Navigate( - embedded_test_server()->GetURL("/server-redirect?" + - original_url.spec())); + GetNavigationController()->Navigate(embedded_test_server()->GetURL( + "/server-redirect?" + original_url.spec())); - observer.WaitForNavigation(); + run_loop.Run(); } -namespace { - -class HeaderInjectorNavigationObserver : public NavigationObserver { - public: - HeaderInjectorNavigationObserver(Shell* shell, - const std::string& header_name, - const std::string& header_value, - bool inject_in_start) - : tab_(shell->tab()), - header_name_(header_name), - header_value_(header_value), - inject_in_start_(inject_in_start) { - tab_->GetNavigationController()->AddObserver(this); - } - - ~HeaderInjectorNavigationObserver() override { - tab_->GetNavigationController()->RemoveObserver(this); - } - - private: - // NavigationObserver implementation: - void NavigationStarted(Navigation* navigation) override { - if (inject_in_start_) - InjectHeaders(navigation); - } - - void NavigationRedirected(Navigation* navigation) override { - if (!inject_in_start_) - InjectHeaders(navigation); - } - - void InjectHeaders(Navigation* navigation) { - navigation->SetRequestHeader(header_name_, header_value_); - } - - Tab* tab_; - const std::string header_name_; - const std::string header_value_; - // If true, header is set in start, otherwise header is set in redirect. - const bool inject_in_start_; -}; - -} // namespace - IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, SetRequestHeader) { net::test_server::ControllableHttpResponse response_1(embedded_test_server(), "", true); @@ -253,8 +239,11 @@ const std::string header_name = "header"; const std::string header_value = "value"; - HeaderInjectorNavigationObserver observer(shell(), header_name, header_value, - true); + NavigationObserverImpl observer(GetNavigationController()); + observer.SetStartedCallback( + base::BindLambdaForTesting([&](Navigation* navigation) { + navigation->SetRequestHeader(header_name, header_value); + })); shell()->LoadURL(embedded_test_server()->GetURL("/simple_page.html")); response_1.WaitForRequest(); @@ -279,8 +268,11 @@ const std::string header_name = "header"; const std::string header_value = "value"; - HeaderInjectorNavigationObserver observer(shell(), header_name, header_value, - false); + NavigationObserverImpl observer(GetNavigationController()); + observer.SetRedirectedCallback( + base::BindLambdaForTesting([&](Navigation* navigation) { + navigation->SetRequestHeader(header_name, header_value); + })); shell()->LoadURL(embedded_test_server()->GetURL("/simple_page.html")); response_1.WaitForRequest();